From ff9f0eb35d80c251e9a54162eae18f44349ae59d Mon Sep 17 00:00:00 2001 From: "taesub.kim" Date: Mon, 16 Nov 2015 17:28:24 +0900 Subject: [PATCH] Imported Upstream version 7.40.0 Change-Id: I744943f451cb7db8f796a53f10dd6f57c297287d --- CHANGES | 7909 ++++++++-------- CMake/CurlCheckCSourceCompiles.cmake | 75 - CMake/CurlCheckCSourceRuns.cmake | 83 - CMake/CurlTests.c | 316 +- CMake/FindGSS.cmake | 289 + CMake/FindOpenSSL.cmake | 21 - CMake/FindZLIB.cmake | 10 - CMake/Macros.cmake | 95 + CMake/OtherTests.cmake | 207 +- CMake/Platforms/WindowsCache.cmake | 8 +- CMakeLists.txt | 691 +- COPYING | 2 +- Makefile | 298 +- Makefile.am | 464 +- Makefile.in | 699 +- RELEASE-NOTES | 246 +- acinclude.m4 | 77 +- aclocal.m4 | 160 +- buildconf | 50 +- config.guess | 198 +- config.sub | 41 +- configure | 1351 +-- configure.ac | 445 +- docs/BINDINGS | 5 + docs/CONTRIBUTE | 4 + docs/DISTRO-DILEMMA | 8 +- docs/FAQ | 214 +- docs/FEATURES | 48 +- docs/HISTORY | 242 +- docs/INSTALL | 152 +- docs/INTERNALS | 31 +- docs/KNOWN_BUGS | 90 +- docs/LIBCURL-STRUCTS | 10 +- docs/LICENSE-MIXING | 18 +- docs/MAIL-ETIQUETTE | 39 +- docs/MANUAL | 51 +- docs/Makefile.am | 5 +- docs/Makefile.in | 13 +- docs/README.netware | 2 +- docs/RELEASE-PROCEDURE | 94 + docs/SECURITY | 107 + docs/SSL-PROBLEMS | 67 + docs/SSLCERTS | 131 +- docs/THANKS | 198 +- docs/TODO | 248 +- docs/TheArtOfHttpScripting | 301 +- docs/curl-config.pdf | Bin 6016 -> 6016 bytes docs/curl.1 | 566 +- docs/curl.html | 215 +- docs/curl.pdf | Bin 93881 -> 104875 bytes docs/examples/10-at-a-time.c | 1 - docs/examples/Makefile.in | 482 +- docs/examples/Makefile.inc | 40 +- docs/examples/Makefile.m32 | 8 +- docs/examples/Makefile.netware | 9 +- docs/examples/asiohiper.cpp | 135 +- docs/examples/cacertinmem.c | 8 +- docs/examples/evhiperfifo.c | 3 +- docs/examples/externalsocket.c | 4 +- docs/examples/fopen.c | 35 +- docs/examples/ftp-wildcard.c | 16 +- docs/examples/ftpgetresp.c | 2 +- docs/examples/getinmemory.c | 6 +- docs/examples/ghiper.c | 3 +- docs/examples/hiperfifo.c | 3 +- docs/examples/href_extractor.c | 2 +- docs/examples/httpcustomheader.c | 25 +- docs/examples/httpput.c | 7 +- docs/examples/imap-append.c | 116 + docs/examples/imap-copy.c | 65 + docs/examples/imap-create.c | 61 + docs/examples/imap-delete.c | 61 + docs/examples/imap-examine.c | 61 + docs/examples/{imap.c => imap-fetch.c} | 24 +- docs/examples/imap-list.c | 60 + docs/examples/imap-lsub.c | 62 + docs/examples/imap-multi.c | 167 + docs/examples/imap-noop.c | 61 + docs/examples/imap-search.c | 65 + docs/examples/{pop3slist.c => imap-ssl.c} | 48 +- docs/examples/imap-store.c | 76 + docs/examples/imap-tls.c | 84 + docs/examples/multi-app.c | 35 +- docs/examples/multi-debugcallback.c | 35 +- docs/examples/multi-double.c | 35 +- docs/examples/multi-post.c | 35 +- docs/examples/multi-single.c | 79 +- docs/examples/multi-uv.c | 82 +- docs/examples/pop3-dele.c | 64 + docs/examples/pop3-list.c | 58 + docs/examples/pop3-multi.c | 167 + docs/examples/pop3-noop.c | 64 + docs/examples/pop3-retr.c | 58 + docs/examples/{pop3s.c => pop3-ssl.c} | 48 +- docs/examples/pop3-stat.c | 64 + docs/examples/pop3-tls.c | 84 + docs/examples/pop3-top.c | 61 + docs/examples/pop3-uidl.c | 61 + docs/examples/postinmemory.c | 111 + docs/examples/rtsp.c | 2 +- docs/examples/sepheaders.c | 19 +- docs/examples/sessioninfo.c | 105 + docs/examples/simplesmtp.c | 87 - docs/examples/simplessl.c | 2 +- docs/examples/smtp-expn.c | 73 + docs/examples/smtp-mail.c | 137 + docs/examples/smtp-multi.c | 214 +- docs/examples/smtp-ssl.c | 161 + docs/examples/smtp-tls.c | 85 +- docs/examples/smtp-vrfy.c | 73 + docs/examples/synctime.c | 19 +- docs/examples/url2file.c | 5 +- docs/examples/usercertinmem.c | 19 +- docs/libcurl/ABI | 19 +- docs/libcurl/Makefile.am | 11 +- docs/libcurl/Makefile.in | 309 +- docs/libcurl/curl_easy_cleanup.3 | 36 +- docs/libcurl/curl_easy_cleanup.html | 30 +- docs/libcurl/curl_easy_cleanup.pdf | Bin 4280 -> 4477 bytes docs/libcurl/curl_easy_duphandle.3 | 7 +- docs/libcurl/curl_easy_duphandle.html | 7 +- docs/libcurl/curl_easy_duphandle.pdf | Bin 4029 -> 4028 bytes docs/libcurl/curl_easy_escape.3 | 25 +- docs/libcurl/curl_easy_escape.html | 26 +- docs/libcurl/curl_easy_escape.pdf | Bin 4043 -> 4193 bytes docs/libcurl/curl_easy_getinfo.3 | 69 +- docs/libcurl/curl_easy_getinfo.html | 32 +- docs/libcurl/curl_easy_getinfo.pdf | Bin 16660 -> 17534 bytes docs/libcurl/curl_easy_init.3 | 38 +- docs/libcurl/curl_easy_init.html | 25 +- docs/libcurl/curl_easy_init.pdf | Bin 4064 -> 4197 bytes docs/libcurl/curl_easy_pause.3 | 20 +- docs/libcurl/curl_easy_pause.html | 11 +- docs/libcurl/curl_easy_pause.pdf | Bin 6984 -> 7373 bytes docs/libcurl/curl_easy_perform.3 | 60 +- docs/libcurl/curl_easy_perform.html | 27 +- docs/libcurl/curl_easy_perform.pdf | Bin 4398 -> 4987 bytes docs/libcurl/curl_easy_recv.3 | 4 +- docs/libcurl/curl_easy_recv.html | 8 +- docs/libcurl/curl_easy_recv.pdf | Bin 5447 -> 5445 bytes docs/libcurl/curl_easy_reset.3 | 5 +- docs/libcurl/curl_easy_reset.html | 4 +- docs/libcurl/curl_easy_reset.pdf | Bin 3683 -> 3701 bytes docs/libcurl/curl_easy_send.3 | 4 +- docs/libcurl/curl_easy_send.html | 8 +- docs/libcurl/curl_easy_send.pdf | Bin 5179 -> 5174 bytes docs/libcurl/curl_easy_setopt.3 | 2667 +----- docs/libcurl/curl_easy_setopt.html | 953 +- docs/libcurl/curl_easy_setopt.pdf | Bin 144027 -> 24241 bytes docs/libcurl/curl_easy_strerror.3 | 9 +- docs/libcurl/curl_easy_strerror.html | 5 +- docs/libcurl/curl_easy_strerror.pdf | Bin 3411 -> 3667 bytes docs/libcurl/curl_easy_unescape.3 | 4 +- docs/libcurl/curl_easy_unescape.html | 8 +- docs/libcurl/curl_easy_unescape.pdf | Bin 4140 -> 4179 bytes docs/libcurl/curl_escape.html | 6 +- docs/libcurl/curl_escape.pdf | Bin 4014 -> 4014 bytes docs/libcurl/curl_formadd.3 | 25 +- docs/libcurl/curl_formadd.html | 19 +- docs/libcurl/curl_formadd.pdf | Bin 12196 -> 12395 bytes docs/libcurl/curl_formfree.3 | 6 +- docs/libcurl/curl_formfree.html | 8 +- docs/libcurl/curl_formfree.pdf | Bin 3769 -> 3767 bytes docs/libcurl/curl_formget.html | 6 +- docs/libcurl/curl_formget.pdf | Bin 4410 -> 4410 bytes docs/libcurl/curl_free.3 | 6 +- docs/libcurl/curl_free.html | 4 +- docs/libcurl/curl_free.pdf | Bin 3283 -> 3356 bytes docs/libcurl/curl_getdate.3 | 29 +- docs/libcurl/curl_getdate.html | 10 +- docs/libcurl/curl_getdate.pdf | Bin 6936 -> 6462 bytes docs/libcurl/curl_getenv.html | 2 +- docs/libcurl/curl_getenv.pdf | Bin 4188 -> 4188 bytes docs/libcurl/curl_global_cleanup.html | 10 +- docs/libcurl/curl_global_cleanup.pdf | Bin 3860 -> 3860 bytes docs/libcurl/curl_global_init.3 | 13 +- docs/libcurl/curl_global_init.html | 8 +- docs/libcurl/curl_global_init.pdf | Bin 5093 -> 5107 bytes docs/libcurl/curl_global_init_mem.html | 6 +- docs/libcurl/curl_global_init_mem.pdf | Bin 4083 -> 4083 bytes docs/libcurl/curl_mprintf.pdf | Bin 5924 -> 5924 bytes docs/libcurl/curl_multi_add_handle.3 | 38 +- docs/libcurl/curl_multi_add_handle.html | 20 +- docs/libcurl/curl_multi_add_handle.pdf | Bin 4406 -> 4737 bytes docs/libcurl/curl_multi_assign.3 | 16 +- docs/libcurl/curl_multi_assign.html | 12 +- docs/libcurl/curl_multi_assign.pdf | Bin 4593 -> 4570 bytes docs/libcurl/curl_multi_cleanup.html | 10 +- docs/libcurl/curl_multi_cleanup.pdf | Bin 3812 -> 3812 bytes docs/libcurl/curl_multi_fdset.3 | 39 +- docs/libcurl/curl_multi_fdset.html | 13 +- docs/libcurl/curl_multi_fdset.pdf | Bin 5180 -> 5480 bytes docs/libcurl/curl_multi_info_read.html | 6 +- docs/libcurl/curl_multi_info_read.pdf | Bin 4915 -> 4915 bytes docs/libcurl/curl_multi_init.html | 4 +- docs/libcurl/curl_multi_init.pdf | Bin 3423 -> 3423 bytes docs/libcurl/curl_multi_perform.3 | 7 +- docs/libcurl/curl_multi_perform.html | 12 +- docs/libcurl/curl_multi_perform.pdf | Bin 5655 -> 5668 bytes docs/libcurl/curl_multi_remove_handle.3 | 17 +- docs/libcurl/curl_multi_remove_handle.html | 8 +- docs/libcurl/curl_multi_remove_handle.pdf | Bin 3877 -> 3980 bytes docs/libcurl/curl_multi_setopt.3 | 184 +- docs/libcurl/curl_multi_setopt.html | 72 +- docs/libcurl/curl_multi_setopt.pdf | Bin 11487 -> 4596 bytes docs/libcurl/curl_multi_socket.html | 24 +- docs/libcurl/curl_multi_socket.pdf | Bin 9402 -> 9402 bytes docs/libcurl/curl_multi_socket_action.html | 20 +- docs/libcurl/curl_multi_socket_action.pdf | Bin 9638 -> 9638 bytes docs/libcurl/curl_multi_strerror.html | 2 +- docs/libcurl/curl_multi_strerror.pdf | Bin 3433 -> 3433 bytes docs/libcurl/curl_multi_timeout.html | 10 +- docs/libcurl/curl_multi_timeout.pdf | Bin 4628 -> 4628 bytes docs/libcurl/curl_multi_wait.3 | 10 +- docs/libcurl/curl_multi_wait.html | 8 +- docs/libcurl/curl_multi_wait.pdf | Bin 4952 -> 4944 bytes docs/libcurl/curl_share_cleanup.html | 2 +- docs/libcurl/curl_share_cleanup.pdf | Bin 3630 -> 3630 bytes docs/libcurl/curl_share_init.3 | 8 +- docs/libcurl/curl_share_init.html | 4 +- docs/libcurl/curl_share_init.pdf | Bin 3819 -> 3839 bytes docs/libcurl/curl_share_setopt.html | 2 +- docs/libcurl/curl_share_setopt.pdf | Bin 5585 -> 5585 bytes docs/libcurl/curl_share_strerror.html | 2 +- docs/libcurl/curl_share_strerror.pdf | Bin 3432 -> 3432 bytes docs/libcurl/curl_slist_append.html | 4 +- docs/libcurl/curl_slist_append.pdf | 22 +- docs/libcurl/curl_slist_free_all.html | 2 +- docs/libcurl/curl_slist_free_all.pdf | 22 +- docs/libcurl/curl_strequal.pdf | Bin 4148 -> 4148 bytes docs/libcurl/curl_unescape.3 | 6 +- docs/libcurl/curl_unescape.html | 8 +- docs/libcurl/curl_unescape.pdf | Bin 3977 -> 3967 bytes docs/libcurl/curl_version.3 | 4 +- docs/libcurl/curl_version.html | 5 +- docs/libcurl/curl_version.pdf | Bin 3311 -> 3490 bytes docs/libcurl/curl_version_info.3 | 45 +- docs/libcurl/curl_version_info.html | 21 +- docs/libcurl/curl_version_info.pdf | Bin 8435 -> 8849 bytes docs/libcurl/libcurl-easy.3 | 19 +- docs/libcurl/libcurl-easy.html | 12 +- docs/libcurl/libcurl-easy.pdf | Bin 4231 -> 4914 bytes docs/libcurl/libcurl-errors.3 | 37 +- docs/libcurl/libcurl-errors.html | 31 +- docs/libcurl/libcurl-errors.pdf | Bin 16998 -> 17578 bytes docs/libcurl/libcurl-multi.3 | 71 +- docs/libcurl/libcurl-multi.html | 44 +- docs/libcurl/libcurl-multi.pdf | Bin 9397 -> 11840 bytes docs/libcurl/libcurl-share.3 | 10 +- docs/libcurl/libcurl-share.html | 14 +- docs/libcurl/libcurl-share.pdf | Bin 4940 -> 4999 bytes docs/libcurl/libcurl-tutorial.3 | 473 +- docs/libcurl/libcurl-tutorial.html | 193 +- docs/libcurl/libcurl-tutorial.pdf | Bin 72192 -> 74083 bytes docs/libcurl/libcurl.3 | 153 +- docs/libcurl/libcurl.html | 43 +- docs/libcurl/libcurl.m4 | 23 +- docs/libcurl/libcurl.pdf | Bin 12687 -> 13825 bytes .../opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 | 48 + .../opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html | 60 + .../opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf | Bin 0 -> 4079 bytes .../opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 | 47 + .../opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html | 60 + .../opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf | Bin 0 -> 4035 bytes docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 | 62 + docs/libcurl/opts/CURLMOPT_MAXCONNECTS.html | 66 + docs/libcurl/opts/CURLMOPT_MAXCONNECTS.pdf | Bin 0 -> 4199 bytes docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 | 54 + .../opts/CURLMOPT_MAX_HOST_CONNECTIONS.html | 61 + .../libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.pdf | Bin 0 -> 4209 bytes docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 | 51 + .../libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.html | 61 + docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.pdf | 111 + docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 | 50 + .../opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.html | 60 + .../opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf | Bin 0 -> 4098 bytes docs/libcurl/opts/CURLMOPT_PIPELINING.3 | 57 + docs/libcurl/opts/CURLMOPT_PIPELINING.html | 61 + docs/libcurl/opts/CURLMOPT_PIPELINING.pdf | Bin 0 -> 4003 bytes docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 | 60 + .../opts/CURLMOPT_PIPELINING_SERVER_BL.html | 72 + .../libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.pdf | Bin 0 -> 4046 bytes docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 | 56 + docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.html | 71 + docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.pdf | Bin 0 -> 3790 bytes docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 | 49 + docs/libcurl/opts/CURLMOPT_SOCKETDATA.html | 64 + docs/libcurl/opts/CURLMOPT_SOCKETDATA.pdf | Bin 0 -> 3836 bytes docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 | 62 + docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.html | 70 + docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.pdf | Bin 0 -> 4421 bytes docs/libcurl/opts/CURLMOPT_TIMERDATA.3 | 48 + docs/libcurl/opts/CURLMOPT_TIMERDATA.html | 64 + docs/libcurl/opts/CURLMOPT_TIMERDATA.pdf | Bin 0 -> 3792 bytes docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 | 63 + docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.html | 69 + docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.pdf | Bin 0 -> 4481 bytes docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 | 44 + docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.html | 60 + docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.pdf | Bin 0 -> 3663 bytes docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 | 63 + docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.html | 64 + docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.pdf | Bin 0 -> 4671 bytes docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 | 44 + docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.html | 60 + docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.pdf | Bin 0 -> 3515 bytes docs/libcurl/opts/CURLOPT_APPEND.3 | 44 + docs/libcurl/opts/CURLOPT_APPEND.html | 60 + docs/libcurl/opts/CURLOPT_APPEND.pdf | Bin 0 -> 3599 bytes docs/libcurl/opts/CURLOPT_AUTOREFERER.3 | 45 + docs/libcurl/opts/CURLOPT_AUTOREFERER.html | 60 + docs/libcurl/opts/CURLOPT_AUTOREFERER.pdf | Bin 0 -> 3603 bytes docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 | 50 + docs/libcurl/opts/CURLOPT_BUFFERSIZE.html | 61 + docs/libcurl/opts/CURLOPT_BUFFERSIZE.pdf | Bin 0 -> 4047 bytes docs/libcurl/opts/CURLOPT_CAINFO.3 | 56 + docs/libcurl/opts/CURLOPT_CAINFO.html | 63 + docs/libcurl/opts/CURLOPT_CAINFO.pdf | Bin 0 -> 4306 bytes docs/libcurl/opts/CURLOPT_CAPATH.3 | 54 + docs/libcurl/opts/CURLOPT_CAPATH.html | 61 + docs/libcurl/opts/CURLOPT_CAPATH.pdf | Bin 0 -> 4289 bytes docs/libcurl/opts/CURLOPT_CERTINFO.3 | 48 + docs/libcurl/opts/CURLOPT_CERTINFO.html | 60 + docs/libcurl/opts/CURLOPT_CERTINFO.pdf | Bin 0 -> 3942 bytes docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 | 69 + docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.html | 71 + docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.pdf | Bin 0 -> 4558 bytes docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 | 45 + docs/libcurl/opts/CURLOPT_CHUNK_DATA.html | 60 + docs/libcurl/opts/CURLOPT_CHUNK_DATA.pdf | Bin 0 -> 3765 bytes docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 | 54 + docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.html | 67 + docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.pdf | Bin 0 -> 3885 bytes docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 | 45 + docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.html | 60 + docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.pdf | Bin 0 -> 3813 bytes docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 | 56 + docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.html | 63 + docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.pdf | Bin 0 -> 4160 bytes docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 | 50 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.html | 61 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.pdf | Bin 0 -> 3907 bytes docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 | 50 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.html | 61 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.pdf | Bin 0 -> 3893 bytes docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 | 51 + docs/libcurl/opts/CURLOPT_CONNECT_ONLY.html | 61 + docs/libcurl/opts/CURLOPT_CONNECT_ONLY.pdf | Bin 0 -> 4060 bytes .../opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 | 82 + .../opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.html | 75 + .../opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf | Bin 0 -> 5150 bytes .../libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 | 81 + .../opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.html | 75 + .../opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf | Bin 0 -> 5050 bytes .../opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 | 82 + .../opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.html | 75 + .../opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf | Bin 0 -> 5129 bytes docs/libcurl/opts/CURLOPT_COOKIE.3 | 62 + docs/libcurl/opts/CURLOPT_COOKIE.html | 64 + docs/libcurl/opts/CURLOPT_COOKIE.pdf | Bin 0 -> 4379 bytes docs/libcurl/opts/CURLOPT_COOKIEFILE.3 | 59 + docs/libcurl/opts/CURLOPT_COOKIEFILE.html | 64 + docs/libcurl/opts/CURLOPT_COOKIEFILE.pdf | Bin 0 -> 4173 bytes docs/libcurl/opts/CURLOPT_COOKIEJAR.3 | 58 + docs/libcurl/opts/CURLOPT_COOKIEJAR.html | 62 + docs/libcurl/opts/CURLOPT_COOKIEJAR.pdf | Bin 0 -> 4607 bytes docs/libcurl/opts/CURLOPT_COOKIELIST.3 | 71 + docs/libcurl/opts/CURLOPT_COOKIELIST.html | 81 + docs/libcurl/opts/CURLOPT_COOKIELIST.pdf | Bin 0 -> 4195 bytes docs/libcurl/opts/CURLOPT_COOKIESESSION.3 | 51 + docs/libcurl/opts/CURLOPT_COOKIESESSION.html | 61 + docs/libcurl/opts/CURLOPT_COOKIESESSION.pdf | 106 + docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 | 70 + docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.html | 74 + docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.pdf | Bin 0 -> 4668 bytes docs/libcurl/opts/CURLOPT_CRLF.3 | 47 + docs/libcurl/opts/CURLOPT_CRLF.html | 61 + docs/libcurl/opts/CURLOPT_CRLF.pdf | Bin 0 -> 3753 bytes docs/libcurl/opts/CURLOPT_CRLFILE.3 | 60 + docs/libcurl/opts/CURLOPT_CRLFILE.html | 63 + docs/libcurl/opts/CURLOPT_CRLFILE.pdf | Bin 0 -> 4541 bytes docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 | 95 + docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.html | 81 + docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.pdf | Bin 0 -> 6299 bytes docs/libcurl/opts/CURLOPT_DEBUGDATA.3 | 45 + docs/libcurl/opts/CURLOPT_DEBUGDATA.html | 60 + docs/libcurl/opts/CURLOPT_DEBUGDATA.pdf | Bin 0 -> 3822 bytes docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 | 184 + docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.html | 179 + docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.pdf | Bin 0 -> 7759 bytes docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 | 61 + docs/libcurl/opts/CURLOPT_DIRLISTONLY.html | 64 + docs/libcurl/opts/CURLOPT_DIRLISTONLY.pdf | Bin 0 -> 4586 bytes docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 | 56 + docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.html | 62 + docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.pdf | Bin 0 -> 4454 bytes docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 | 48 + docs/libcurl/opts/CURLOPT_DNS_INTERFACE.html | 60 + docs/libcurl/opts/CURLOPT_DNS_INTERFACE.pdf | Bin 0 -> 3946 bytes docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 | 51 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.html | 61 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.pdf | Bin 0 -> 4048 bytes docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 | 51 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.html | 61 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.pdf | Bin 0 -> 4060 bytes docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 | 56 + docs/libcurl/opts/CURLOPT_DNS_SERVERS.html | 64 + docs/libcurl/opts/CURLOPT_DNS_SERVERS.pdf | Bin 0 -> 4081 bytes docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 | 50 + .../libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.html | 61 + docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.pdf | Bin 0 -> 4015 bytes docs/libcurl/opts/CURLOPT_EGDSOCKET.3 | 45 + docs/libcurl/opts/CURLOPT_EGDSOCKET.html | 60 + docs/libcurl/opts/CURLOPT_EGDSOCKET.pdf | Bin 0 -> 3736 bytes docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 | 72 + docs/libcurl/opts/CURLOPT_ERRORBUFFER.html | 75 + docs/libcurl/opts/CURLOPT_ERRORBUFFER.pdf | Bin 0 -> 4609 bytes docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 | 49 + .../opts/CURLOPT_EXPECT_100_TIMEOUT_MS.html | 64 + .../libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.pdf | Bin 0 -> 3851 bytes docs/libcurl/opts/CURLOPT_FAILONERROR.3 | 53 + docs/libcurl/opts/CURLOPT_FAILONERROR.html | 62 + docs/libcurl/opts/CURLOPT_FAILONERROR.pdf | Bin 0 -> 4046 bytes docs/libcurl/opts/CURLOPT_FILETIME.3 | 47 + docs/libcurl/opts/CURLOPT_FILETIME.html | 60 + docs/libcurl/opts/CURLOPT_FILETIME.pdf | Bin 0 -> 3849 bytes docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 | 46 + docs/libcurl/opts/CURLOPT_FNMATCH_DATA.html | 64 + docs/libcurl/opts/CURLOPT_FNMATCH_DATA.pdf | Bin 0 -> 3756 bytes docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 | 56 + docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.html | 69 + docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.pdf | Bin 0 -> 3948 bytes docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 | 70 + docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.html | 73 + docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.pdf | Bin 0 -> 4656 bytes docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 | 50 + docs/libcurl/opts/CURLOPT_FORBID_REUSE.html | 61 + docs/libcurl/opts/CURLOPT_FORBID_REUSE.pdf | Bin 0 -> 3990 bytes docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 | 52 + docs/libcurl/opts/CURLOPT_FRESH_CONNECT.html | 62 + docs/libcurl/opts/CURLOPT_FRESH_CONNECT.pdf | Bin 0 -> 4013 bytes docs/libcurl/opts/CURLOPT_FTPPORT.3 | 72 + docs/libcurl/opts/CURLOPT_FTPPORT.html | 72 + docs/libcurl/opts/CURLOPT_FTPPORT.pdf | Bin 0 -> 4725 bytes docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 | 53 + docs/libcurl/opts/CURLOPT_FTPSSLAUTH.html | 67 + docs/libcurl/opts/CURLOPT_FTPSSLAUTH.pdf | Bin 0 -> 4065 bytes docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 | 46 + docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.html | 60 + docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.pdf | Bin 0 -> 3777 bytes .../libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 | 50 + .../opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.html | 64 + .../opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf | Bin 0 -> 3933 bytes .../libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 | 70 + .../opts/CURLOPT_FTP_CREATE_MISSING_DIRS.html | 72 + .../opts/CURLOPT_FTP_CREATE_MISSING_DIRS.pdf | Bin 0 -> 4696 bytes docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 | 62 + docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.html | 72 + docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.pdf | Bin 0 -> 4441 bytes docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 | 50 + .../libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.html | 60 + docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.pdf | Bin 0 -> 4087 bytes docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 | 52 + docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.html | 62 + docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.pdf | Bin 0 -> 4127 bytes docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 | 54 + docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.html | 66 + docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.pdf | Bin 0 -> 3918 bytes docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 | 47 + docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.html | 61 + docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.pdf | Bin 0 -> 3999 bytes docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 | 48 + docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.html | 61 + docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.pdf | Bin 0 -> 3956 bytes docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 | 46 + docs/libcurl/opts/CURLOPT_FTP_USE_PRET.html | 60 + docs/libcurl/opts/CURLOPT_FTP_USE_PRET.pdf | Bin 0 -> 3708 bytes docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 | 48 + docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.html | 60 + docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.pdf | Bin 0 -> 4142 bytes docs/libcurl/opts/CURLOPT_HEADER.3 | 46 + docs/libcurl/opts/CURLOPT_HEADER.html | 59 + docs/libcurl/opts/CURLOPT_HEADER.pdf | Bin 0 -> 3815 bytes docs/libcurl/opts/CURLOPT_HEADERDATA.3 | 50 + docs/libcurl/opts/CURLOPT_HEADERDATA.html | 62 + docs/libcurl/opts/CURLOPT_HEADERDATA.pdf | Bin 0 -> 3901 bytes docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 | 89 + docs/libcurl/opts/CURLOPT_HEADERFUNCTION.html | 67 + docs/libcurl/opts/CURLOPT_HEADERFUNCTION.pdf | Bin 0 -> 6359 bytes docs/libcurl/opts/CURLOPT_HEADEROPT.3 | 57 + docs/libcurl/opts/CURLOPT_HEADEROPT.html | 62 + docs/libcurl/opts/CURLOPT_HEADEROPT.pdf | Bin 0 -> 4412 bytes docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 | 56 + docs/libcurl/opts/CURLOPT_HTTP200ALIASES.html | 66 + docs/libcurl/opts/CURLOPT_HTTP200ALIASES.pdf | Bin 0 -> 4152 bytes docs/libcurl/opts/CURLOPT_HTTPAUTH.3 | 116 + docs/libcurl/opts/CURLOPT_HTTPAUTH.html | 90 + docs/libcurl/opts/CURLOPT_HTTPAUTH.pdf | Bin 0 -> 7475 bytes docs/libcurl/opts/CURLOPT_HTTPGET.3 | 59 + docs/libcurl/opts/CURLOPT_HTTPGET.html | 72 + docs/libcurl/opts/CURLOPT_HTTPGET.pdf | Bin 0 -> 4043 bytes docs/libcurl/opts/CURLOPT_HTTPHEADER.3 | 83 + docs/libcurl/opts/CURLOPT_HTTPHEADER.html | 67 + docs/libcurl/opts/CURLOPT_HTTPHEADER.pdf | Bin 0 -> 5350 bytes docs/libcurl/opts/CURLOPT_HTTPPOST.3 | 78 + docs/libcurl/opts/CURLOPT_HTTPPOST.html | 88 + docs/libcurl/opts/CURLOPT_HTTPPOST.pdf | Bin 0 -> 4474 bytes docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 | 51 + docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.html | 61 + docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.pdf | Bin 0 -> 3964 bytes docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 | 49 + .../opts/CURLOPT_HTTP_CONTENT_DECODING.html | 64 + .../libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.pdf | Bin 0 -> 3785 bytes docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 | 48 + .../opts/CURLOPT_HTTP_TRANSFER_DECODING.html | 64 + .../opts/CURLOPT_HTTP_TRANSFER_DECODING.pdf | Bin 0 -> 3635 bytes docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 | 57 + docs/libcurl/opts/CURLOPT_HTTP_VERSION.html | 69 + docs/libcurl/opts/CURLOPT_HTTP_VERSION.pdf | Bin 0 -> 4178 bytes docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 | 51 + .../opts/CURLOPT_IGNORE_CONTENT_LENGTH.html | 65 + .../libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.pdf | Bin 0 -> 3904 bytes docs/libcurl/opts/CURLOPT_INFILESIZE.3 | 58 + docs/libcurl/opts/CURLOPT_INFILESIZE.html | 64 + docs/libcurl/opts/CURLOPT_INFILESIZE.pdf | Bin 0 -> 4254 bytes docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 | 59 + docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.html | 68 + docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.pdf | Bin 0 -> 4224 bytes docs/libcurl/opts/CURLOPT_INTERFACE.3 | 55 + docs/libcurl/opts/CURLOPT_INTERFACE.html | 61 + docs/libcurl/opts/CURLOPT_INTERFACE.pdf | Bin 0 -> 4392 bytes docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 | 45 + docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.html | 60 + docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.pdf | Bin 0 -> 3852 bytes docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 | 68 + docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.html | 68 + docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.pdf | Bin 0 -> 4939 bytes docs/libcurl/opts/CURLOPT_IOCTLDATA.3 | 44 + docs/libcurl/opts/CURLOPT_IOCTLDATA.html | 60 + docs/libcurl/opts/CURLOPT_IOCTLDATA.pdf | Bin 0 -> 3781 bytes docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 | 76 + docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.html | 79 + docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.pdf | Bin 0 -> 4728 bytes docs/libcurl/opts/CURLOPT_IPRESOLVE.3 | 51 + docs/libcurl/opts/CURLOPT_IPRESOLVE.html | 66 + docs/libcurl/opts/CURLOPT_IPRESOLVE.pdf | Bin 0 -> 3784 bytes docs/libcurl/opts/CURLOPT_ISSUERCERT.3 | 58 + docs/libcurl/opts/CURLOPT_ISSUERCERT.html | 62 + docs/libcurl/opts/CURLOPT_ISSUERCERT.pdf | Bin 0 -> 4457 bytes docs/libcurl/opts/CURLOPT_KEYPASSWD.3 | 48 + docs/libcurl/opts/CURLOPT_KEYPASSWD.html | 60 + docs/libcurl/opts/CURLOPT_KEYPASSWD.pdf | 112 + docs/libcurl/opts/CURLOPT_KRBLEVEL.3 | 48 + docs/libcurl/opts/CURLOPT_KRBLEVEL.html | 60 + docs/libcurl/opts/CURLOPT_KRBLEVEL.pdf | Bin 0 -> 3969 bytes docs/libcurl/opts/CURLOPT_LOCALPORT.3 | 46 + docs/libcurl/opts/CURLOPT_LOCALPORT.html | 60 + docs/libcurl/opts/CURLOPT_LOCALPORT.pdf | Bin 0 -> 3868 bytes docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 | 50 + docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.html | 60 + docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.pdf | Bin 0 -> 4116 bytes docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 | 53 + docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.html | 62 + docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.pdf | Bin 0 -> 4083 bytes docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 | 46 + docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.html | 60 + docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.pdf | Bin 0 -> 3822 bytes docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 | 45 + docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.html | 60 + docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.pdf | Bin 0 -> 3763 bytes docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 | 58 + docs/libcurl/opts/CURLOPT_MAIL_AUTH.html | 62 + docs/libcurl/opts/CURLOPT_MAIL_AUTH.pdf | Bin 0 -> 4377 bytes docs/libcurl/opts/CURLOPT_MAIL_FROM.3 | 51 + docs/libcurl/opts/CURLOPT_MAIL_FROM.html | 62 + docs/libcurl/opts/CURLOPT_MAIL_FROM.pdf | Bin 0 -> 3879 bytes docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 | 60 + docs/libcurl/opts/CURLOPT_MAIL_RCPT.html | 67 + docs/libcurl/opts/CURLOPT_MAIL_RCPT.pdf | Bin 0 -> 4289 bytes docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 | 59 + docs/libcurl/opts/CURLOPT_MAXCONNECTS.html | 63 + docs/libcurl/opts/CURLOPT_MAXCONNECTS.pdf | Bin 0 -> 4258 bytes docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 | 52 + docs/libcurl/opts/CURLOPT_MAXFILESIZE.html | 62 + docs/libcurl/opts/CURLOPT_MAXFILESIZE.pdf | Bin 0 -> 4081 bytes docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 | 52 + docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.html | 65 + docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.pdf | Bin 0 -> 4083 bytes docs/libcurl/opts/CURLOPT_MAXREDIRS.3 | 64 + docs/libcurl/opts/CURLOPT_MAXREDIRS.html | 75 + docs/libcurl/opts/CURLOPT_MAXREDIRS.pdf | Bin 0 -> 4129 bytes docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 | 49 + .../libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.html | 65 + docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.pdf | Bin 0 -> 3970 bytes docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 | 50 + .../libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.html | 65 + docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.pdf | Bin 0 -> 4011 bytes docs/libcurl/opts/CURLOPT_NETRC.3 | 73 + docs/libcurl/opts/CURLOPT_NETRC.html | 73 + docs/libcurl/opts/CURLOPT_NETRC.pdf | Bin 0 -> 4768 bytes docs/libcurl/opts/CURLOPT_NETRC_FILE.3 | 48 + docs/libcurl/opts/CURLOPT_NETRC_FILE.html | 60 + docs/libcurl/opts/CURLOPT_NETRC_FILE.pdf | Bin 0 -> 3990 bytes docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 | 48 + docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.html | 64 + docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.pdf | Bin 0 -> 4091 bytes docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 | 48 + docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.html | 64 + docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.pdf | Bin 0 -> 4053 bytes docs/libcurl/opts/CURLOPT_NOBODY.3 | 59 + docs/libcurl/opts/CURLOPT_NOBODY.html | 72 + docs/libcurl/opts/CURLOPT_NOBODY.pdf | Bin 0 -> 3883 bytes docs/libcurl/opts/CURLOPT_NOPROGRESS.3 | 42 + docs/libcurl/opts/CURLOPT_NOPROGRESS.html | 58 + docs/libcurl/opts/CURLOPT_NOPROGRESS.pdf | Bin 0 -> 3733 bytes docs/libcurl/opts/CURLOPT_NOPROXY.3 | 51 + docs/libcurl/opts/CURLOPT_NOPROXY.html | 60 + docs/libcurl/opts/CURLOPT_NOPROXY.pdf | 111 + docs/libcurl/opts/CURLOPT_NOSIGNAL.3 | 55 + docs/libcurl/opts/CURLOPT_NOSIGNAL.html | 59 + docs/libcurl/opts/CURLOPT_NOSIGNAL.pdf | Bin 0 -> 4514 bytes docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 | 44 + docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.html | 60 + docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.pdf | Bin 0 -> 3816 bytes docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 | 90 + docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.html | 86 + docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.pdf | Bin 0 -> 6058 bytes docs/libcurl/opts/CURLOPT_PASSWORD.3 | 50 + docs/libcurl/opts/CURLOPT_PASSWORD.html | 62 + docs/libcurl/opts/CURLOPT_PASSWORD.pdf | Bin 0 -> 3952 bytes docs/libcurl/opts/CURLOPT_PORT.3 | 51 + docs/libcurl/opts/CURLOPT_PORT.html | 62 + docs/libcurl/opts/CURLOPT_PORT.pdf | Bin 0 -> 3981 bytes docs/libcurl/opts/CURLOPT_POST.3 | 77 + docs/libcurl/opts/CURLOPT_POST.html | 67 + docs/libcurl/opts/CURLOPT_POST.pdf | Bin 0 -> 5251 bytes docs/libcurl/opts/CURLOPT_POSTFIELDS.3 | 84 + docs/libcurl/opts/CURLOPT_POSTFIELDS.html | 79 + docs/libcurl/opts/CURLOPT_POSTFIELDS.pdf | Bin 0 -> 5674 bytes docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 | 62 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.html | 73 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.pdf | 116 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 | 64 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.html | 77 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.pdf | Bin 0 -> 3880 bytes docs/libcurl/opts/CURLOPT_POSTQUOTE.3 | 48 + docs/libcurl/opts/CURLOPT_POSTQUOTE.html | 61 + docs/libcurl/opts/CURLOPT_POSTQUOTE.pdf | 114 + docs/libcurl/opts/CURLOPT_POSTREDIR.3 | 73 + docs/libcurl/opts/CURLOPT_POSTREDIR.html | 78 + docs/libcurl/opts/CURLOPT_POSTREDIR.pdf | Bin 0 -> 4682 bytes docs/libcurl/opts/CURLOPT_PREQUOTE.3 | 47 + docs/libcurl/opts/CURLOPT_PREQUOTE.html | 60 + docs/libcurl/opts/CURLOPT_PREQUOTE.pdf | Bin 0 -> 3868 bytes docs/libcurl/opts/CURLOPT_PRIVATE.3 | 46 + docs/libcurl/opts/CURLOPT_PRIVATE.html | 60 + docs/libcurl/opts/CURLOPT_PRIVATE.pdf | Bin 0 -> 3895 bytes docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 | 44 + docs/libcurl/opts/CURLOPT_PROGRESSDATA.html | 60 + docs/libcurl/opts/CURLOPT_PROGRESSDATA.pdf | Bin 0 -> 3809 bytes docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 | 84 + docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.html | 69 + docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.pdf | Bin 0 -> 5873 bytes docs/libcurl/opts/CURLOPT_PROTOCOLS.3 | 92 + docs/libcurl/opts/CURLOPT_PROTOCOLS.html | 104 + docs/libcurl/opts/CURLOPT_PROTOCOLS.pdf | Bin 0 -> 5240 bytes docs/libcurl/opts/CURLOPT_PROXY.3 | 85 + docs/libcurl/opts/CURLOPT_PROXY.html | 69 + docs/libcurl/opts/CURLOPT_PROXY.pdf | Bin 0 -> 6395 bytes docs/libcurl/opts/CURLOPT_PROXYAUTH.3 | 55 + docs/libcurl/opts/CURLOPT_PROXYAUTH.html | 61 + docs/libcurl/opts/CURLOPT_PROXYAUTH.pdf | Bin 0 -> 4289 bytes docs/libcurl/opts/CURLOPT_PROXYHEADER.3 | 57 + docs/libcurl/opts/CURLOPT_PROXYHEADER.html | 67 + docs/libcurl/opts/CURLOPT_PROXYHEADER.pdf | Bin 0 -> 4117 bytes docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 | 49 + docs/libcurl/opts/CURLOPT_PROXYPASSWORD.html | 61 + docs/libcurl/opts/CURLOPT_PROXYPASSWORD.pdf | Bin 0 -> 4050 bytes docs/libcurl/opts/CURLOPT_PROXYPORT.3 | 47 + docs/libcurl/opts/CURLOPT_PROXYPORT.html | 61 + docs/libcurl/opts/CURLOPT_PROXYPORT.pdf | Bin 0 -> 3853 bytes docs/libcurl/opts/CURLOPT_PROXYTYPE.3 | 54 + docs/libcurl/opts/CURLOPT_PROXYTYPE.html | 62 + docs/libcurl/opts/CURLOPT_PROXYTYPE.pdf | Bin 0 -> 4194 bytes docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 | 53 + docs/libcurl/opts/CURLOPT_PROXYUSERNAME.html | 66 + docs/libcurl/opts/CURLOPT_PROXYUSERNAME.pdf | Bin 0 -> 4059 bytes docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 | 50 + docs/libcurl/opts/CURLOPT_PROXYUSERPWD.html | 61 + docs/libcurl/opts/CURLOPT_PROXYUSERPWD.pdf | Bin 0 -> 4166 bytes docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 | 48 + docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.html | 60 + docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.pdf | Bin 0 -> 4042 bytes docs/libcurl/opts/CURLOPT_PUT.3 | 48 + docs/libcurl/opts/CURLOPT_PUT.html | 61 + docs/libcurl/opts/CURLOPT_PUT.pdf | Bin 0 -> 3830 bytes docs/libcurl/opts/CURLOPT_QUOTE.3 | 86 + docs/libcurl/opts/CURLOPT_QUOTE.html | 84 + docs/libcurl/opts/CURLOPT_QUOTE.pdf | Bin 0 -> 5637 bytes docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 | 45 + docs/libcurl/opts/CURLOPT_RANDOM_FILE.html | 60 + docs/libcurl/opts/CURLOPT_RANDOM_FILE.pdf | Bin 0 -> 3574 bytes docs/libcurl/opts/CURLOPT_RANGE.3 | 66 + docs/libcurl/opts/CURLOPT_RANGE.html | 73 + docs/libcurl/opts/CURLOPT_RANGE.pdf | Bin 0 -> 4492 bytes docs/libcurl/opts/CURLOPT_READDATA.3 | 52 + docs/libcurl/opts/CURLOPT_READDATA.html | 62 + docs/libcurl/opts/CURLOPT_READDATA.pdf | Bin 0 -> 4177 bytes docs/libcurl/opts/CURLOPT_READFUNCTION.3 | 78 + docs/libcurl/opts/CURLOPT_READFUNCTION.html | 69 + docs/libcurl/opts/CURLOPT_READFUNCTION.pdf | Bin 0 -> 5073 bytes docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 | 92 + docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.html | 104 + docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.pdf | Bin 0 -> 5208 bytes docs/libcurl/opts/CURLOPT_REFERER.3 | 47 + docs/libcurl/opts/CURLOPT_REFERER.html | 60 + docs/libcurl/opts/CURLOPT_REFERER.pdf | Bin 0 -> 3916 bytes docs/libcurl/opts/CURLOPT_RESOLVE.3 | 82 + docs/libcurl/opts/CURLOPT_RESOLVE.html | 82 + docs/libcurl/opts/CURLOPT_RESOLVE.pdf | Bin 0 -> 4987 bytes docs/libcurl/opts/CURLOPT_RESUME_FROM.3 | 72 + docs/libcurl/opts/CURLOPT_RESUME_FROM.html | 77 + docs/libcurl/opts/CURLOPT_RESUME_FROM.pdf | Bin 0 -> 4411 bytes docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 | 74 + docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.html | 82 + docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.pdf | Bin 0 -> 4323 bytes docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 | 45 + docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.html | 60 + docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.pdf | Bin 0 -> 3654 bytes docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 | 101 + docs/libcurl/opts/CURLOPT_RTSP_REQUEST.html | 82 + docs/libcurl/opts/CURLOPT_RTSP_REQUEST.pdf | Bin 0 -> 7519 bytes docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 | 45 + docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.html | 60 + docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.pdf | 110 + docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 | 49 + docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.html | 60 + docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.pdf | Bin 0 -> 4028 bytes docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 | 53 + docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.html | 60 + docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.pdf | Bin 0 -> 4313 bytes docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 | 49 + docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.html | 64 + docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.pdf | Bin 0 -> 3874 bytes docs/libcurl/opts/CURLOPT_SASL_IR.3 | 56 + docs/libcurl/opts/CURLOPT_SASL_IR.html | 62 + docs/libcurl/opts/CURLOPT_SASL_IR.pdf | Bin 0 -> 3862 bytes docs/libcurl/opts/CURLOPT_SEEKDATA.3 | 43 + docs/libcurl/opts/CURLOPT_SEEKDATA.html | 60 + docs/libcurl/opts/CURLOPT_SEEKDATA.pdf | 112 + docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 | 73 + docs/libcurl/opts/CURLOPT_SEEKFUNCTION.html | 73 + docs/libcurl/opts/CURLOPT_SEEKFUNCTION.pdf | Bin 0 -> 4883 bytes docs/libcurl/opts/CURLOPT_SHARE.3 | 59 + docs/libcurl/opts/CURLOPT_SHARE.html | 63 + docs/libcurl/opts/CURLOPT_SHARE.pdf | Bin 0 -> 4248 bytes docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 | 44 + docs/libcurl/opts/CURLOPT_SOCKOPTDATA.html | 60 + docs/libcurl/opts/CURLOPT_SOCKOPTDATA.pdf | 116 + docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 | 88 + docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.html | 80 + docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.pdf | Bin 0 -> 6183 bytes docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 | 47 + docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.html | 60 + docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.pdf | Bin 0 -> 3684 bytes docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 | 46 + .../opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.html | 60 + .../libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf | Bin 0 -> 3841 bytes docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 | 50 + docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.html | 61 + docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.pdf | Bin 0 -> 4003 bytes .../libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 | 48 + .../opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html | 64 + .../opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf | Bin 0 -> 3812 bytes docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 | 44 + docs/libcurl/opts/CURLOPT_SSH_KEYDATA.html | 60 + docs/libcurl/opts/CURLOPT_SSH_KEYDATA.pdf | Bin 0 -> 3792 bytes docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 | 105 + docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.html | 101 + docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.pdf | Bin 0 -> 6709 bytes docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 | 49 + docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.html | 60 + docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.pdf | 116 + docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 | 51 + docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.html | 65 + docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.pdf | Bin 0 -> 4210 bytes docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 | 53 + docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.html | 65 + docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.pdf | Bin 0 -> 4321 bytes docs/libcurl/opts/CURLOPT_SSLCERT.3 | 55 + docs/libcurl/opts/CURLOPT_SSLCERT.html | 62 + docs/libcurl/opts/CURLOPT_SSLCERT.pdf | Bin 0 -> 4341 bytes docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 | 48 + docs/libcurl/opts/CURLOPT_SSLCERTTYPE.html | 60 + docs/libcurl/opts/CURLOPT_SSLCERTTYPE.pdf | Bin 0 -> 3933 bytes docs/libcurl/opts/CURLOPT_SSLENGINE.3 | 48 + docs/libcurl/opts/CURLOPT_SSLENGINE.html | 61 + docs/libcurl/opts/CURLOPT_SSLENGINE.pdf | Bin 0 -> 3954 bytes docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 | 48 + docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.html | 61 + docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.pdf | Bin 0 -> 3981 bytes docs/libcurl/opts/CURLOPT_SSLKEY.3 | 50 + docs/libcurl/opts/CURLOPT_SSLKEY.html | 61 + docs/libcurl/opts/CURLOPT_SSLKEY.pdf | Bin 0 -> 4171 bytes docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 | 50 + docs/libcurl/opts/CURLOPT_SSLKEYTYPE.html | 61 + docs/libcurl/opts/CURLOPT_SSLKEYTYPE.pdf | Bin 0 -> 4186 bytes docs/libcurl/opts/CURLOPT_SSLVERSION.3 | 78 + docs/libcurl/opts/CURLOPT_SSLVERSION.html | 89 + docs/libcurl/opts/CURLOPT_SSLVERSION.pdf | Bin 0 -> 4783 bytes docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 | 65 + docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.html | 66 + docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.pdf | Bin 0 -> 4476 bytes docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 | 45 + docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.html | 60 + docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.pdf | Bin 0 -> 3824 bytes docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 | 70 + docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.html | 69 + docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.pdf | Bin 0 -> 4965 bytes docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 | 45 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.html | 60 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.pdf | Bin 0 -> 3662 bytes docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 | 45 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.html | 60 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.pdf | Bin 0 -> 3663 bytes docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 | 51 + docs/libcurl/opts/CURLOPT_SSL_OPTIONS.html | 61 + docs/libcurl/opts/CURLOPT_SSL_OPTIONS.pdf | Bin 0 -> 4100 bytes docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 | 49 + docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.html | 64 + docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.pdf | Bin 0 -> 3844 bytes docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 | 77 + docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.html | 69 + docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.pdf | Bin 0 -> 4993 bytes docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 | 71 + docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.html | 65 + docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.pdf | Bin 0 -> 4932 bytes docs/libcurl/opts/CURLOPT_STDERR.3 | 45 + docs/libcurl/opts/CURLOPT_STDERR.html | 60 + docs/libcurl/opts/CURLOPT_STDERR.pdf | Bin 0 -> 3672 bytes docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 | 47 + docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.html | 60 + docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.pdf | Bin 0 -> 3872 bytes docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 | 45 + docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.html | 60 + docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.pdf | Bin 0 -> 3761 bytes docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 | 43 + docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.html | 60 + docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.pdf | Bin 0 -> 3608 bytes docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 | 56 + docs/libcurl/opts/CURLOPT_TCP_NODELAY.html | 62 + docs/libcurl/opts/CURLOPT_TCP_NODELAY.pdf | Bin 0 -> 4246 bytes docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 | 47 + docs/libcurl/opts/CURLOPT_TELNETOPTIONS.html | 60 + docs/libcurl/opts/CURLOPT_TELNETOPTIONS.pdf | Bin 0 -> 3661 bytes docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 | 48 + docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.html | 60 + docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.pdf | Bin 0 -> 3830 bytes docs/libcurl/opts/CURLOPT_TIMECONDITION.3 | 51 + docs/libcurl/opts/CURLOPT_TIMECONDITION.html | 61 + docs/libcurl/opts/CURLOPT_TIMECONDITION.pdf | Bin 0 -> 4165 bytes docs/libcurl/opts/CURLOPT_TIMEOUT.3 | 60 + docs/libcurl/opts/CURLOPT_TIMEOUT.html | 63 + docs/libcurl/opts/CURLOPT_TIMEOUT.pdf | Bin 0 -> 4495 bytes docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 | 64 + docs/libcurl/opts/CURLOPT_TIMEOUT_MS.html | 64 + docs/libcurl/opts/CURLOPT_TIMEOUT_MS.pdf | Bin 0 -> 4623 bytes docs/libcurl/opts/CURLOPT_TIMEVALUE.3 | 45 + docs/libcurl/opts/CURLOPT_TIMEVALUE.html | 60 + docs/libcurl/opts/CURLOPT_TIMEVALUE.pdf | Bin 0 -> 3732 bytes docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 | 47 + docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.html | 60 + docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.pdf | Bin 0 -> 3940 bytes docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 | 52 + docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.html | 63 + docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.pdf | Bin 0 -> 4117 bytes docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 | 47 + docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.html | 60 + docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.pdf | Bin 0 -> 3922 bytes docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 | 51 + docs/libcurl/opts/CURLOPT_TRANSFERTEXT.html | 61 + docs/libcurl/opts/CURLOPT_TRANSFERTEXT.pdf | Bin 0 -> 3972 bytes docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 | 54 + docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.html | 62 + docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.pdf | Bin 0 -> 4111 bytes docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 | 78 + docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.html | 79 + docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.pdf | Bin 0 -> 5029 bytes docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 | 48 + docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.html | 64 + docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.pdf | Bin 0 -> 3808 bytes docs/libcurl/opts/CURLOPT_UPLOAD.3 | 78 + docs/libcurl/opts/CURLOPT_UPLOAD.html | 80 + docs/libcurl/opts/CURLOPT_UPLOAD.pdf | Bin 0 -> 4742 bytes docs/libcurl/opts/CURLOPT_URL.3 | 310 + docs/libcurl/opts/CURLOPT_URL.html | 155 + docs/libcurl/opts/CURLOPT_URL.pdf | Bin 0 -> 14943 bytes docs/libcurl/opts/CURLOPT_USERAGENT.3 | 47 + docs/libcurl/opts/CURLOPT_USERAGENT.html | 60 + docs/libcurl/opts/CURLOPT_USERAGENT.pdf | Bin 0 -> 4014 bytes docs/libcurl/opts/CURLOPT_USERNAME.3 | 71 + docs/libcurl/opts/CURLOPT_USERNAME.html | 70 + docs/libcurl/opts/CURLOPT_USERNAME.pdf | Bin 0 -> 4731 bytes docs/libcurl/opts/CURLOPT_USERPWD.3 | 76 + docs/libcurl/opts/CURLOPT_USERPWD.html | 67 + docs/libcurl/opts/CURLOPT_USERPWD.pdf | Bin 0 -> 5037 bytes docs/libcurl/opts/CURLOPT_USE_SSL.3 | 69 + docs/libcurl/opts/CURLOPT_USE_SSL.html | 81 + docs/libcurl/opts/CURLOPT_USE_SSL.pdf | Bin 0 -> 4371 bytes docs/libcurl/opts/CURLOPT_VERBOSE.3 | 63 + docs/libcurl/opts/CURLOPT_VERBOSE.html | 73 + docs/libcurl/opts/CURLOPT_VERBOSE.pdf | Bin 0 -> 4253 bytes docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 | 87 + docs/libcurl/opts/CURLOPT_WILDCARDMATCH.html | 83 + docs/libcurl/opts/CURLOPT_WILDCARDMATCH.pdf | Bin 0 -> 5926 bytes docs/libcurl/opts/CURLOPT_WRITEDATA.3 | 58 + docs/libcurl/opts/CURLOPT_WRITEDATA.html | 62 + docs/libcurl/opts/CURLOPT_WRITEDATA.pdf | Bin 0 -> 4668 bytes docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 | 81 + docs/libcurl/opts/CURLOPT_WRITEFUNCTION.html | 72 + docs/libcurl/opts/CURLOPT_WRITEFUNCTION.pdf | Bin 0 -> 5273 bytes docs/libcurl/opts/CURLOPT_XFERINFODATA.3 | 46 + docs/libcurl/opts/CURLOPT_XFERINFODATA.html | 61 + docs/libcurl/opts/CURLOPT_XFERINFODATA.pdf | Bin 0 -> 3814 bytes docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 | 81 + docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.html | 68 + docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.pdf | Bin 0 -> 5111 bytes docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 | 49 + docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.html | 61 + docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.pdf | Bin 0 -> 4044 bytes docs/libcurl/opts/Makefile.am | 346 + docs/libcurl/opts/Makefile.in | 929 ++ docs/libcurl/symbols-in-versions | 52 +- docs/mk-ca-bundle.html | 21 +- docs/mk-ca-bundle.pdf | Bin 4957 -> 7056 bytes include/Makefile.in | 8 +- include/curl/Makefile.in | 12 +- include/curl/curl.h | 196 +- include/curl/curlbuild.h | 4 +- include/curl/curlbuild.h.cmake | 85 +- include/curl/curlver.h | 12 +- include/curl/multi.h | 4 +- include/curl/typecheck-gcc.h | 10 +- install-sh | 14 +- lib/CMakeLists.txt | 23 +- lib/Makefile.Watcom | 207 +- lib/Makefile.am | 13 +- lib/Makefile.b32 | 13 +- lib/Makefile.in | 842 +- lib/Makefile.inc | 113 +- lib/Makefile.m32 | 48 +- lib/Makefile.netware | 35 +- lib/Makefile.vc10 | 33 +- lib/Makefile.vc6 | 33 +- lib/Makefile.vc8 | 33 +- lib/Makefile.vc9 | 33 +- lib/Makefile.vxworks | 4 +- lib/README.hostip | 24 +- lib/asyn-ares.c | 92 +- lib/asyn-thread.c | 127 +- lib/base64.c | 191 +- lib/config-dos.h | 1 - lib/config-os400.h | 22 +- lib/config-symbian.h | 11 +- lib/config-tpf.h | 11 +- lib/config-vxworks.h | 3 - lib/config-win32.h | 123 +- lib/conncache.c | 29 +- lib/conncache.h | 4 +- lib/connect.c | 515 +- lib/connect.h | 27 +- lib/cookie.c | 250 +- lib/curl_addrinfo.c | 43 +- lib/curl_addrinfo.h | 4 + lib/curl_base64.h | 5 +- lib/curl_config.h.cmake | 527 +- lib/curl_config.h.in | 74 +- lib/curl_endian.c | 230 + lib/curl_endian.h | 70 + lib/curl_gssapi.c | 63 +- lib/curl_gssapi.h | 19 +- lib/curl_md4.h | 12 +- lib/curl_multibyte.c | 7 +- lib/curl_multibyte.h | 12 +- lib/curl_ntlm.c | 56 +- lib/curl_ntlm.h | 10 +- lib/curl_ntlm_core.c | 358 +- lib/curl_ntlm_core.h | 70 +- lib/curl_ntlm_msgs.c | 501 +- lib/curl_ntlm_msgs.h | 37 +- lib/curl_ntlm_wb.c | 84 +- lib/curl_ntlm_wb.h | 7 +- lib/curl_rtmp.c | 22 +- lib/curl_sasl.c | 943 +- lib/curl_sasl.h | 132 +- lib/curl_sasl_gssapi.c | 398 + lib/curl_sasl_sspi.c | 1209 +++ lib/{krb4.h => curl_sec.h} | 20 +- lib/curl_setup.h | 55 +- lib/curl_setup_once.h | 2 +- lib/curl_sspi.c | 145 +- lib/curl_sspi.h | 211 +- lib/curl_threads.c | 33 +- lib/curl_threads.h | 13 +- lib/dict.c | 5 +- lib/dotdot.c | 4 +- lib/dotdot.h | 4 +- lib/easy.c | 655 +- lib/easyif.h | 8 +- lib/escape.c | 22 +- lib/file.c | 121 +- lib/formdata.c | 84 +- lib/ftp.c | 731 +- lib/ftp.h | 6 + lib/ftplistparser.c | 55 +- lib/getinfo.c | 92 +- lib/gopher.c | 6 +- lib/gskit.c | 906 -- lib/hostasyn.c | 12 +- lib/hostcheck.c | 74 +- lib/hostip.c | 81 +- lib/hostip.h | 34 +- lib/hostip4.c | 12 +- lib/hostip6.c | 14 +- lib/hostsyn.c | 38 +- lib/http.c | 961 +- lib/http.h | 62 +- lib/http2.c | 1051 +++ lib/http2.h | 51 + lib/http_chunks.c | 126 +- lib/http_chunks.h | 47 +- lib/http_digest.c | 545 +- lib/http_digest.h | 21 +- lib/http_negotiate.c | 222 +- lib/http_negotiate.h | 4 +- lib/http_negotiate_sspi.c | 215 +- lib/http_proxy.c | 104 +- lib/http_proxy.h | 4 +- lib/idn_win32.c | 29 +- lib/if2ip.c | 83 +- lib/if2ip.h | 13 +- lib/imap.c | 1043 ++- lib/imap.h | 20 +- lib/krb4.c | 440 - lib/krb5.c | 14 +- lib/ldap.c | 635 +- lib/libcurl.plist | 6 +- lib/md4.c | 8 +- lib/md5.c | 2 +- lib/memdebug.c | 13 +- lib/mk-ca-bundle.pl | 313 +- lib/mk-ca-bundle.vbs | 13 +- lib/mprintf.c | 64 +- lib/multi.c | 1181 +-- lib/multihandle.h | 5 +- lib/multiif.h | 11 +- lib/netrc.c | 62 +- lib/netrc.h | 16 +- lib/non-ascii.c | 55 +- lib/openldap.c | 144 +- lib/parsedate.c | 23 +- lib/pingpong.c | 73 +- lib/pipeline.c | 47 +- lib/pipeline.h | 4 +- lib/pop3.c | 1095 ++- lib/pop3.h | 10 +- lib/progress.c | 71 +- lib/progress.h | 5 +- lib/qssl.c | 521 -- lib/qssl.h | 61 - lib/rtsp.c | 72 +- lib/security.c | 71 +- lib/select.c | 74 +- lib/sendf.c | 205 +- lib/sendf.h | 6 +- lib/setup-os400.h | 29 +- lib/setup-vms.h | 33 +- lib/share.c | 4 +- lib/sigpipe.h | 78 + lib/smb.c | 970 ++ lib/smb.h | 271 + lib/smtp.c | 1399 ++- lib/smtp.h | 13 +- lib/socks.c | 52 +- lib/socks.h | 2 +- lib/socks_gssapi.c | 78 +- lib/socks_sspi.c | 99 +- lib/speedcheck.c | 6 +- lib/splay.c | 6 +- lib/ssh.c | 286 +- lib/ssh.h | 30 +- lib/strdup.c | 31 +- lib/strdup.h | 3 +- lib/strerror.c | 18 +- lib/strtoofft.h | 11 +- lib/telnet.c | 78 +- lib/tftp.c | 89 +- lib/timeval.c | 10 +- lib/transfer.c | 278 +- lib/url.c | 1245 ++- lib/url.h | 8 +- lib/urldata.h | 226 +- lib/version.c | 45 +- lib/{ => vtls}/axtls.c | 63 +- lib/{ => vtls}/axtls.h | 17 +- lib/{ => vtls}/curl_darwinssl.c | 732 +- lib/{ => vtls}/curl_darwinssl.h | 21 +- lib/{ => vtls}/curl_schannel.c | 238 +- lib/{ => vtls}/curl_schannel.h | 39 +- lib/{ => vtls}/cyassl.c | 119 +- lib/{ => vtls}/cyassl.h | 15 +- lib/vtls/gskit.c | 1078 +++ lib/{ => vtls}/gskit.h | 11 +- lib/{ => vtls}/gtls.c | 446 +- lib/{ => vtls}/gtls.h | 25 +- lib/{ => vtls}/nss.c | 848 +- lib/{ => vtls}/nssg.h | 32 +- lib/{ssluse.c => vtls/openssl.c} | 697 +- lib/{ssluse.h => vtls/openssl.h} | 28 +- lib/{ => vtls}/polarssl.c | 281 +- lib/{ => vtls}/polarssl.h | 20 +- lib/{ => vtls}/polarssl_threadlock.c | 0 lib/{ => vtls}/polarssl_threadlock.h | 0 lib/{sslgen.c => vtls/vtls.c} | 285 +- lib/{sslgen.h => vtls/vtls.h} | 55 +- lib/warnless.c | 35 +- lib/warnless.h | 19 +- lib/x509asn1.c | 195 +- lib/x509asn1.h | 10 +- ltmain.sh | 4 +- m4/curl-compilers.m4 | 6 +- m4/curl-functions.m4 | 2 +- m4/libtool.m4 | 12 +- maketgz | 6 +- mkinstalldirs | 4 +- packages/AIX/Makefile.in | 8 +- packages/AIX/RPM/Makefile.in | 8 +- packages/Android/Android.mk | 2 +- packages/DOS/common.dj | 2 +- packages/EPM/Makefile.in | 8 +- packages/EPM/README | 2 +- packages/Linux/Makefile.in | 8 +- packages/Linux/RPM/Makefile.in | 8 +- packages/Makefile.in | 8 +- packages/OS400/README.OS400 | 15 +- packages/OS400/ccsidcurl.c | 93 +- packages/OS400/ccsidcurl.h | 4 +- packages/OS400/curl.inc.in | 126 +- packages/OS400/initscript.sh | 109 +- packages/OS400/make-include.sh | 52 +- packages/OS400/make-lib.sh | 52 +- packages/OS400/make-tests.sh | 6 +- packages/OS400/os400sys.c | 472 +- packages/OS400/os400sys.h | 2 + packages/Solaris/Makefile.in | 8 +- packages/Symbian/group/curl.pkg | 2 +- packages/Symbian/group/libcurl.mmp | 38 +- packages/Symbian/group/libcurl.pkg | 2 +- packages/Win32/Makefile.in | 8 +- packages/Win32/cygwin/Makefile.in | 8 +- packages/vms/Makefile.in | 8 +- packages/vms/backup_gnv_curl_src.com | 6 +- packages/vms/build_curl-config_script.com | 346 +- packages/vms/build_gnv_curl_release_notes.com | 12 + packages/vms/build_libcurl_pc.com | 2 +- packages/vms/build_vms.com | 30 +- packages/vms/clean_gnv_curl.com | 21 + packages/vms/config_h.com | 2 +- packages/vms/curl_crtl_init.c | 4 +- packages/vms/curl_gnv_build_steps.txt | 53 +- packages/vms/generate_config_vms_h_curl.com | 39 + packages/vms/gnv_curl_configure.sh | 2 +- packages/vms/gnv_link_curl.com | 11 +- packages/vms/make_gnv_curl_install.sh | 2 +- packages/vms/pcsi_product_gnv_curl.com | 30 +- projects/README | 125 + projects/Windows/VC10/curl.sln | 258 + projects/Windows/VC10/lib/libcurl.sln | 157 + projects/Windows/VC10/lib/libcurl.vcxproj | 2588 ++++++ projects/Windows/VC10/src/curlsrc.sln | 157 + projects/Windows/VC10/src/curlsrc.vcxproj | 2782 ++++++ projects/Windows/VC11/curl.sln | 258 + projects/Windows/VC11/lib/libcurl.sln | 157 + projects/Windows/VC11/lib/libcurl.vcxproj | 2636 ++++++ projects/Windows/VC11/src/curlsrc.sln | 157 + projects/Windows/VC11/src/curlsrc.vcxproj | 2830 ++++++ projects/Windows/VC12/curl.sln | 258 + projects/Windows/VC12/lib/libcurl.sln | 157 + projects/Windows/VC12/lib/libcurl.vcxproj | 2636 ++++++ projects/Windows/VC12/src/curlsrc.sln | 157 + projects/Windows/VC12/src/curlsrc.vcxproj | 2830 ++++++ .../vc6curl.dsw => projects/Windows/VC6/curl.dsw | 4 +- projects/Windows/VC6/lib/libcurl.dsp | 1645 ++++ .../Windows/VC6/lib/libcurl.dsw | 2 +- projects/Windows/VC6/src/curlsrc.dsp | 1058 +++ .../Windows/VC6/src/curlsrc.dsw | 2 +- projects/Windows/VC7.1/curl.sln | 140 + projects/Windows/VC7.1/lib/libcurl.sln | 87 + projects/Windows/VC7.1/lib/libcurl.vcproj | 1960 ++++ projects/Windows/VC7.1/src/curlsrc.sln | 87 + projects/Windows/VC7.1/src/curlsrc.vcproj | 1652 ++++ projects/Windows/VC7/curl.sln | 138 + projects/Windows/VC7/lib/libcurl.sln | 87 + projects/Windows/VC7/lib/libcurl.vcproj | 1814 ++++ projects/Windows/VC7/src/curlsrc.sln | 87 + projects/Windows/VC7/src/curlsrc.vcproj | 1506 +++ projects/Windows/VC8/curl.sln | 258 + projects/Windows/VC8/lib/libcurl.sln | 157 + projects/Windows/VC8/lib/libcurl.vcproj | 4759 ++++++++++ projects/Windows/VC8/src/curlsrc.sln | 157 + projects/Windows/VC8/src/curlsrc.vcproj | 4655 ++++++++++ projects/Windows/VC9/curl.sln | 258 + projects/Windows/VC9/lib/libcurl.sln | 157 + projects/Windows/VC9/lib/libcurl.vcproj | 4740 ++++++++++ projects/Windows/VC9/src/curlsrc.sln | 157 + projects/Windows/VC9/src/curlsrc.vcproj | 4608 ++++++++++ projects/build-openssl.bat | 328 + projects/checksrc.bat | 81 + src/CMakeLists.txt | 50 +- src/Makefile.Watcom | 206 +- src/Makefile.am | 5 +- src/Makefile.b32 | 4 +- src/Makefile.in | 298 +- src/Makefile.inc | 19 +- src/Makefile.m32 | 51 +- src/Makefile.netware | 24 +- src/Makefile.vc10 | 28 +- src/Makefile.vc6 | 28 +- src/Makefile.vc8 | 28 +- src/Makefile.vc9 | 28 +- src/macos/MACINSTALL.TXT | 2 +- src/makefile.amiga | 2 +- src/mkhelp.pl | 6 +- src/tool_binmode.c | 4 +- src/tool_cb_dbg.c | 12 +- src/tool_cb_prg.c | 26 +- src/tool_cb_prg.h | 8 +- src/tool_cb_wrt.c | 4 +- src/tool_cfgable.c | 55 +- src/tool_cfgable.h | 71 +- src/tool_doswin.c | 6 +- src/tool_doswin.h | 5 +- src/tool_easysrc.c | 10 +- src/tool_easysrc.h | 5 +- src/tool_formparse.c | 10 +- src/tool_formparse.h | 4 +- src/tool_getparam.c | 359 +- src/tool_getparam.h | 19 +- src/tool_getpass.c | 2 +- src/tool_help.c | 211 +- src/tool_help.h | 4 +- src/tool_helpers.c | 5 +- src/tool_helpers.h | 5 +- src/tool_hugehelp.c | 9594 +++++++++++--------- src/tool_hugehelp.h | 2 +- src/tool_libinfo.c | 4 +- src/tool_main.c | 177 +- src/tool_metalink.c | 94 +- src/tool_metalink.h | 13 +- src/tool_msgs.c | 14 +- src/tool_msgs.h | 4 +- src/tool_operate.c | 626 +- src/tool_operate.h | 4 +- src/tool_operhlp.c | 101 +- src/tool_operhlp.h | 18 +- src/tool_paramhlp.c | 78 +- src/tool_paramhlp.h | 14 +- src/tool_parsecfg.c | 77 +- src/tool_parsecfg.h | 5 +- src/tool_sdecls.h | 12 +- src/tool_setopt.c | 21 +- src/tool_setopt.h | 36 +- src/tool_setup.h | 5 +- src/tool_sleep.c | 4 +- src/{version.h => tool_strdup.c} | 36 +- src/tool_strdup.h | 30 + src/tool_urlglob.c | 613 +- src/tool_urlglob.h | 32 +- src/tool_util.c | 13 +- src/tool_version.h | 2 +- src/tool_writeout.c | 2 +- src/tool_xattr.c | 22 +- tests/CMakeLists.txt | 1 + tests/FILEFORMAT | 109 +- tests/Makefile.in | 8 +- tests/README | 7 +- tests/certs/Makefile.am | 8 +- tests/certs/Makefile.in | 16 +- tests/certs/Server-localhost-sv.pub.der | Bin 0 -> 162 bytes tests/certs/Server-localhost-sv.pub.pem | 6 + tests/certs/Server-localhost.nn-sv.pub.der | Bin 0 -> 162 bytes tests/certs/Server-localhost.nn-sv.pub.pem | 6 + tests/certs/Server-localhost0h-sv.pub.der | Bin 0 -> 162 bytes tests/certs/Server-localhost0h-sv.pub.pem | 6 + tests/certs/scripts/Makefile.in | 8 +- tests/certs/scripts/genserv.sh | 6 + tests/data/DISABLED | 4 + tests/data/Makefile.am | 122 +- tests/data/Makefile.in | 85 +- tests/data/Makefile.inc | 164 + tests/data/test100 | 9 +- tests/data/test1001 | 5 +- tests/data/test1002 | 5 +- tests/data/test1008 | 6 +- tests/data/test101 | 2 +- tests/data/test1010 | 2 +- tests/data/test1021 | 6 +- tests/data/test1029 | 22 +- tests/data/test1030 | 1 + tests/data/test1032 | 2 +- tests/data/test1041 | 2 +- tests/data/test1042 | 6 +- tests/data/test1047 | 2 +- tests/data/test1048 | 2 + tests/data/test1060 | 1 + tests/data/test1061 | 1 + tests/data/test1071 | 1 + tests/data/test1079 | 1 + tests/data/test1080 | 2 +- tests/data/test1081 | 2 +- tests/data/test1086 | 1 + tests/data/test1095 | 1 + tests/data/test1097 | 1 + tests/data/test1098 | 26 +- tests/data/test1099 | 2 +- tests/data/test1100 | 4 +- tests/data/test1105 | 3 +- tests/data/test1112 | 2 +- tests/data/test1113 | 5 +- tests/data/test1114 | 2 +- tests/data/test1115 | 3 - tests/data/test1119 | 1 + tests/data/test1123 | 1 + tests/data/test1124 | 2 +- tests/data/test1132 | 1 + tests/data/test1133 | 4 +- tests/data/test1134 | 65 + tests/data/test116 | 1 + tests/data/test1212 | 5 +- tests/data/test1215 | 4 +- tests/data/test1220 | 7 + tests/data/test1221 | 9 +- tests/data/test1222 | 11 +- tests/data/test1228 | 2 +- tests/data/test1229 | 1 + tests/data/test1230 | 5 +- tests/data/test1234 | 33 + tests/data/test1235 | 95 + tests/data/test1236 | 33 + tests/data/test1237 | 47 + tests/data/test1238 | 49 + tests/data/test1239 | 68 + tests/data/test1240 | 48 + tests/data/test130 | 2 +- tests/data/test1309 | 2 +- tests/data/test131 | 2 +- tests/data/test1316 | 5 +- tests/data/test1319 | 3 + tests/data/test132 | 2 +- tests/data/test1320 | 14 +- tests/data/test1321 | 3 + tests/data/test1325 | 2 +- tests/data/test1328 | 3 +- tests/data/test133 | 2 +- tests/data/test1330 | 2 +- tests/data/test1331 | 2 +- tests/data/test1332 | 2 +- tests/data/test1334 | 34 +- tests/data/test1335 | 32 +- tests/data/test1336 | 38 +- tests/data/test1337 | 36 +- tests/data/test1338 | 34 +- tests/data/test1339 | 32 +- tests/data/test134 | 2 +- tests/data/test1340 | 36 +- tests/data/test1341 | 36 +- tests/data/test1342 | 48 +- tests/data/test1343 | 46 +- tests/data/test1344 | 54 +- tests/data/test1345 | 52 +- tests/data/test1346 | 32 +- tests/data/test1347 | 36 +- tests/data/test1348 | 4 +- tests/data/test1349 | 2 +- tests/data/test1350 | 2 +- tests/data/test1351 | 2 +- tests/data/test1352 | 2 +- tests/data/test1353 | 2 +- tests/data/test1354 | 2 +- tests/data/test1356 | 36 +- tests/data/test1357 | 2 +- tests/data/test1358 | 2 +- tests/data/test1359 | 2 +- tests/data/test1360 | 2 +- tests/data/test1361 | 2 +- tests/data/test1362 | 2 +- tests/data/test1363 | 36 +- tests/data/test1364 | 34 +- tests/data/test1365 | 32 +- tests/data/test1366 | 38 +- tests/data/test1367 | 36 +- tests/data/test1368 | 34 +- tests/data/test1369 | 32 +- tests/data/test1370 | 38 +- tests/data/test1371 | 36 +- tests/data/test1372 | 48 +- tests/data/test1373 | 46 +- tests/data/test1374 | 54 +- tests/data/test1375 | 52 +- tests/data/test1376 | 32 +- tests/data/test1377 | 36 +- tests/data/test1378 | 4 +- tests/data/test1379 | 2 +- tests/data/test1380 | 2 +- tests/data/test1381 | 2 +- tests/data/test1382 | 2 +- tests/data/test1383 | 2 +- tests/data/test1384 | 2 +- tests/data/test1385 | 4 +- tests/data/test1386 | 36 +- tests/data/test1387 | 38 +- tests/data/test1388 | 38 +- tests/data/test1389 | 38 +- tests/data/test1390 | 38 +- tests/data/test1391 | 38 +- tests/data/test1392 | 38 +- tests/data/test1393 | 36 +- tests/data/test1397 | 27 + tests/data/test1398 | 26 + tests/data/test1404 | 2 +- tests/data/test1405 | 3 +- tests/data/test1406 | 25 +- tests/data/test1407 | 5 +- tests/data/test1408 | 2 +- tests/data/test1411 | 60 + tests/data/test1412 | 1 + tests/data/test1415 | 75 + tests/data/test1416 | 63 + tests/data/test1417 | 78 + tests/data/test1418 | 108 + tests/data/test1419 | 69 + tests/data/test1420 | 108 + tests/data/test1428 | 81 + tests/data/test1429 | 69 + tests/data/test1430 | 53 + tests/data/test1431 | 53 + tests/data/test1432 | 54 + tests/data/test1433 | 69 + tests/data/test1434 | 90 + tests/data/test1435 | 46 + tests/data/test1436 | 85 + tests/data/test150 | 11 +- tests/data/test1500 | 14 +- tests/data/test1502 | 22 +- tests/data/test1503 | 22 +- tests/data/test1504 | 22 +- tests/data/test1505 | 22 +- tests/data/test1506 | 41 +- tests/data/test1507 | 4 +- tests/data/test1508 | 2 +- tests/data/test1509 | 28 +- tests/data/test1510 | 41 +- tests/data/test1511 | 6 +- tests/data/test1512 | 40 +- tests/data/test1513 | 42 + tests/data/test1514 | 48 + tests/data/test1515 | 58 + tests/data/test1516 | 58 + tests/data/test1520 | 63 + tests/data/test1525 | 76 + tests/data/test1526 | 76 + tests/data/test1527 | 76 + tests/data/test1528 | 60 + tests/data/test1529 | 43 + tests/data/test153 | 1 + tests/data/test154 | 1 + tests/data/test155 | 6 +- tests/data/test159 | 5 +- tests/data/test162 | 1 + tests/data/test167 | 1 + tests/data/test168 | 1 + tests/data/test169 | 6 +- tests/data/test170 | 1 + tests/data/test172 | 2 +- tests/data/test176 | 2 + tests/data/test18 | 1 + tests/data/test1800 | 55 + tests/data/test1801 | 66 + tests/data/test1900 | 4 + tests/data/test1901 | 5 + tests/data/test1902 | 5 + tests/data/test1903 | 5 + tests/data/test194 | 18 +- tests/data/test199 | 1 + tests/data/test2013 | 2 +- tests/data/test2014 | 2 +- tests/data/test2015 | 2 +- tests/data/test2016 | 2 +- tests/data/test2017 | 2 +- tests/data/test2018 | 2 +- tests/data/test2019 | 2 +- tests/data/test2020 | 2 +- tests/data/test2021 | 2 +- tests/data/test2022 | 2 +- tests/data/test2024 | 4 + tests/data/test2025 | 1 + tests/data/test2026 | 4 + tests/data/test2027 | 4 + tests/data/test2028 | 1 + tests/data/test2029 | 1 + tests/data/test2030 | 1 + tests/data/test2031 | 1 + tests/data/test2032 | 109 +- tests/data/test2033 | 109 +- tests/data/test2034 | 58 + tests/data/test2035 | 44 + tests/data/test2036 | 39 + tests/data/test2037 | 58 + tests/data/test2038 | 44 + tests/data/test206 | 1 + tests/data/test207 | 2 + tests/data/test209 | 6 +- tests/data/test212 | 1 + tests/data/test213 | 6 +- tests/data/test215 | 2 +- tests/data/test22 | 2 +- tests/data/test227 | 1 - tests/data/test239 | 6 +- tests/data/test243 | 6 +- tests/data/test245 | 1 + tests/data/test246 | 1 + tests/data/test250 | 2 +- tests/data/test251 | 2 +- tests/data/test258 | 1 + tests/data/test259 | 1 + tests/data/test265 | 6 +- tests/data/test267 | 4 +- tests/data/test273 | 1 + tests/data/test280 | 2 +- tests/data/test294 | 2 +- tests/data/test31 | 55 +- tests/data/test320 | 26 +- tests/data/test321 | 2 +- tests/data/test322 | 2 +- tests/data/test324 | 2 +- tests/data/test325 | 66 + tests/data/test33 | 2 +- tests/data/test350 | 2 +- tests/data/test351 | 2 +- tests/data/test352 | 2 +- tests/data/test353 | 2 +- tests/data/test500 | 26 +- tests/data/test502 | 2 +- tests/data/test506 | 56 +- tests/data/test508 | 21 +- tests/data/test509 | 10 +- tests/data/test510 | 14 +- tests/data/test512 | 2 +- tests/data/test514 | 24 +- tests/data/test515 | 12 +- tests/data/test516 | 12 +- tests/data/test517 | 8 +- tests/data/test518 | 22 +- tests/data/test519 | 42 +- tests/data/test521 | 2 +- tests/data/test522 | 18 +- tests/data/test523 | 18 +- tests/data/test528 | 10 +- tests/data/test530 | 40 +- tests/data/test535 | 28 +- tests/data/test536 | 28 +- tests/data/test537 | 22 +- tests/data/test539 | 4 +- tests/data/test540 | 1 + tests/data/test543 | 2 +- tests/data/test544 | 12 +- tests/data/test545 | Bin 802 -> 798 bytes tests/data/test547 | 6 +- tests/data/test548 | 6 +- tests/data/test549 | 18 +- tests/data/test550 | 18 +- tests/data/test551 | 2 + tests/data/test552 | Bin 143232 -> 142985 bytes tests/data/test553 | 2 - tests/data/test554 | 14 +- tests/data/test555 | 6 +- tests/data/test556 | 12 +- tests/data/test557 | 8 +- tests/data/test558 | 2 +- tests/data/test560 | 10 +- tests/data/test561 | 18 +- tests/data/test565 | 4 + tests/data/test566 | 26 +- tests/data/test567 | 10 +- tests/data/test568 | 40 +- tests/data/test570 | 36 +- tests/data/test571 | 44 +- tests/data/test572 | 60 +- tests/data/test573 | 23 +- tests/data/test574 | 4 +- tests/data/test575 | 2 +- tests/data/test576 | 4 +- tests/data/test578 | 26 +- tests/data/test579 | 80 +- tests/data/test580 | 16 +- tests/data/test581 | 16 +- tests/data/test582 | 3 + tests/data/test583 | 3 + tests/data/test584 | 66 +- tests/data/test585 | 28 +- tests/data/test588 | 2 +- tests/data/test590 | 4 +- tests/data/test591 | 2 +- tests/data/test592 | 2 +- tests/data/test593 | 2 +- tests/data/test594 | 2 +- tests/data/test595 | 2 +- tests/data/test596 | 2 +- tests/data/test598 | 38 +- tests/data/test599 | 66 +- tests/data/test604 | 3 + tests/data/test61 | 1 + tests/data/test623 | 3 + tests/data/test627 | 2 +- tests/data/test64 | 1 + tests/data/test640 | 41 + tests/data/test641 | 41 + tests/data/test65 | 1 + tests/data/test67 | 4 +- tests/data/test68 | 4 +- tests/data/test69 | 4 +- tests/data/test70 | 1 + tests/data/test72 | 1 + tests/data/test74 | 1 + tests/data/test75 | 5 +- tests/data/test77 | 1 + tests/data/test78 | 1 + tests/data/test8 | 3 +- tests/data/test800 | 3 +- tests/data/test801 | 3 +- tests/data/test802 | 1 + tests/data/test803 | 1 + tests/data/test804 | 3 +- tests/data/test805 | 5 +- tests/data/test806 | 5 +- tests/data/test807 | 16 +- tests/data/test808 | 5 +- tests/data/test809 | 3 +- tests/data/test81 | 4 +- 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/test820 | 57 + tests/data/test821 | 59 + tests/data/test822 | 71 + tests/data/test823 | 63 + tests/data/test824 | 56 + tests/data/test825 | 56 + tests/data/test826 | 57 + tests/data/test827 | 71 + tests/data/test828 | 56 + tests/data/{test1324 => test829} | 2 +- tests/data/test83 | 4 +- tests/data/test830 | 56 + tests/data/test831 | 67 + tests/data/test832 | 58 + tests/data/test833 | 65 + tests/data/test834 | 76 + tests/data/test835 | 67 + tests/data/test836 | 59 + tests/data/test850 | 3 +- tests/data/test851 | 1 + tests/data/test852 | 1 + tests/data/test853 | 3 +- tests/data/test854 | 1 + tests/data/test855 | 1 + tests/data/test856 | 7 +- tests/data/test857 | 3 +- tests/data/test858 | 41 + tests/data/test859 | 41 + tests/data/test86 | 1 + 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 | 72 + tests/data/test869 | 64 + tests/data/test87 | 39 +- tests/data/test870 | 57 + tests/data/test871 | 56 + tests/data/test872 | 57 + tests/data/test873 | 71 + tests/data/test874 | 56 + tests/data/{test1322 => test875} | 2 +- tests/data/test876 | 57 + tests/data/test877 | 68 + tests/data/test878 | 59 + tests/data/test879 | 66 + tests/data/test88 | 2 +- tests/data/test880 | 77 + tests/data/test881 | 68 + tests/data/test882 | 58 + tests/data/test89 | 6 +- tests/data/test90 | 6 +- tests/data/test900 | 9 +- tests/data/test901 | 8 +- tests/data/test902 | 11 +- tests/data/test903 | 17 +- tests/data/test904 | 23 +- tests/data/test905 | 19 +- tests/data/test906 | 46 +- tests/data/test907 | 30 +- tests/data/test908 | 24 +- tests/data/test909 | 13 +- tests/data/test91 | 4 +- tests/data/test910 | 9 +- tests/data/test911 | 9 +- 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/test920 | 56 + tests/data/test921 | 70 + tests/data/test922 | 55 + tests/data/test923 | 40 + 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/test930 | 38 + tests/data/{test1323 => test931} | 2 +- tests/data/test932 | 56 + tests/data/test933 | 67 + tests/data/test934 | 58 + tests/data/test935 | 65 + tests/data/test936 | 76 + tests/data/test937 | 67 + tests/data/test938 | 63 + tests/data/test939 | 50 + tests/data/test940 | 45 + tests/data/test941 | 66 + tests/data/test96 | 4 +- tests/ftpserver.pl | 1698 +++- tests/getpart.pm | 14 +- tests/http_pipe.py | 66 +- tests/httpserver.pl | 15 +- tests/libtest/Makefile.in | 2228 +++-- tests/libtest/Makefile.inc | 41 +- tests/libtest/first.c | 29 +- tests/libtest/lib1500.c | 4 +- tests/libtest/lib1506.c | 15 +- tests/libtest/lib1507.c | 21 +- tests/libtest/lib1509.c | 7 +- tests/libtest/lib1510.c | 9 +- tests/libtest/lib1512.c | 6 +- tests/libtest/lib1513.c | 73 + tests/libtest/lib1514.c | 80 + tests/libtest/lib1515.c | 151 + tests/libtest/lib1520.c | 114 + tests/libtest/lib1525.c | 97 + tests/libtest/lib1526.c | 103 + tests/libtest/lib1527.c | 98 + tests/libtest/lib1528.c | 72 + tests/libtest/lib1529.c | 59 + tests/libtest/lib1900.c | 26 +- tests/libtest/lib500.c | 71 +- tests/libtest/lib505.c | 10 +- tests/libtest/lib506.c | 88 +- tests/libtest/lib508.c | 2 +- tests/libtest/lib510.c | 2 +- tests/libtest/lib513.c | 2 +- tests/libtest/lib541.c | 10 +- tests/libtest/lib544.c | 19 +- tests/libtest/lib556.c | 3 +- tests/libtest/lib557.c | 4 +- tests/libtest/lib579.c | 2 +- tests/libtest/lib599.c | 12 + tests/libtest/libauthretry.c | 3 +- tests/libtest/sethostname.h | 8 +- tests/libtest/test.h | 4 +- tests/libtest/test1013.pl | 3 +- tests/runtests.1 | 14 +- tests/runtests.html | 8 +- tests/runtests.pdf | Bin 7225 -> 7639 bytes tests/runtests.pl | 834 +- tests/secureserver.pl | 97 +- tests/server/Makefile.in | 1538 ++-- tests/server/getpart.c | 88 +- tests/server/resolve.c | 10 +- tests/server/server_sockaddr.h | 9 +- tests/server/sockfilt.c | 305 +- tests/server/sws.c | 291 +- tests/server/tftpd.c | 116 +- tests/serverhelp.pm | 4 +- tests/sshhelp.pm | 4 +- tests/sshserver.pl | 65 +- tests/stunnel.pem | 72 +- tests/symbol-scan.pl | 16 +- tests/testcurl.pdf | Bin 7224 -> 7224 bytes tests/testcurl.pl | 70 +- tests/unit/Makefile.in | 476 +- tests/unit/Makefile.inc | 9 +- tests/unit/unit1302.c | 55 +- tests/unit/unit1303.c | 4 +- tests/unit/unit1304.c | 93 +- tests/unit/unit1305.c | 1 - tests/unit/unit1394.c | 1 - tests/unit/unit1395.c | 11 +- tests/unit/unit1396.c | 20 +- tests/unit/unit1397.c | 51 + tests/unit/unit1398.c | 91 + tests/valgrind.supp | 73 + vs/t/README | 8 - vs/t/lib/vc6_libcurl_dsp.foot | 10 - vs/t/lib/vc6_libcurl_dsp.head | 147 - vs/t/lib/vc8_libcurl_prj.foot | 7 - vs/t/lib/vc8_libcurl_prj.head | 101 - vs/vc6/lib/vc6libcurl.dsp | 1041 --- vs/vc6/src/vc6curltool.dsp | 498 - vs/vc8/lib/vc8libcurl.vcproj | 331 - winbuild/BUILD.WINDOWS.txt | 18 +- winbuild/Makefile.vc | 22 +- winbuild/MakefileBuild.vc | 35 +- winbuild/gen_resp_file.bat | 10 +- 1841 files changed, 140314 insertions(+), 36722 deletions(-) delete mode 100644 CMake/CurlCheckCSourceCompiles.cmake delete mode 100644 CMake/CurlCheckCSourceRuns.cmake create mode 100644 CMake/FindGSS.cmake delete mode 100644 CMake/FindOpenSSL.cmake delete mode 100644 CMake/FindZLIB.cmake create mode 100644 CMake/Macros.cmake create mode 100644 docs/RELEASE-PROCEDURE create mode 100644 docs/SECURITY create mode 100644 docs/SSL-PROBLEMS create mode 100644 docs/examples/imap-append.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 rename docs/examples/{imap.c => imap-fetch.c} (67%) 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 rename docs/examples/{pop3slist.c => imap-ssl.c} (64%) create mode 100644 docs/examples/imap-store.c create mode 100644 docs/examples/imap-tls.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 rename docs/examples/{pop3s.c => pop3-ssl.c} (64%) 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/postinmemory.c create mode 100644 docs/examples/sessioninfo.c delete mode 100644 docs/examples/simplesmtp.c create mode 100644 docs/examples/smtp-expn.c create mode 100644 docs/examples/smtp-mail.c create mode 100644 docs/examples/smtp-ssl.c create mode 100644 docs/examples/smtp-vrfy.c create mode 100644 docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 create mode 100644 docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html create mode 100644 docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 create mode 100644 docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html create mode 100644 docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAXCONNECTS.html create mode 100644 docs/libcurl/opts/CURLMOPT_MAXCONNECTS.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.html create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.html create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.html create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING.html create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.html create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.html create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETDATA.html create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETDATA.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.html create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERDATA.3 create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERDATA.html create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERDATA.pdf create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.html create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.html create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.html create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.pdf create mode 100644 docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.html create mode 100644 docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_APPEND.3 create mode 100644 docs/libcurl/opts/CURLOPT_APPEND.html create mode 100644 docs/libcurl/opts/CURLOPT_APPEND.pdf create mode 100644 docs/libcurl/opts/CURLOPT_AUTOREFERER.3 create mode 100644 docs/libcurl/opts/CURLOPT_AUTOREFERER.html create mode 100644 docs/libcurl/opts/CURLOPT_AUTOREFERER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_BUFFERSIZE.html create mode 100644 docs/libcurl/opts/CURLOPT_BUFFERSIZE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CAINFO.3 create mode 100644 docs/libcurl/opts/CURLOPT_CAINFO.html create mode 100644 docs/libcurl/opts/CURLOPT_CAINFO.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CAPATH.3 create mode 100644 docs/libcurl/opts/CURLOPT_CAPATH.html create mode 100644 docs/libcurl/opts/CURLOPT_CAPATH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CERTINFO.3 create mode 100644 docs/libcurl/opts/CURLOPT_CERTINFO.html create mode 100644 docs/libcurl/opts/CURLOPT_CERTINFO.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_DATA.html create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_DATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.html create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.html create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECT_ONLY.html create mode 100644 docs/libcurl/opts/CURLOPT_CONNECT_ONLY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COOKIE.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIE.html create mode 100644 docs/libcurl/opts/CURLOPT_COOKIE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEFILE.html create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEFILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEJAR.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEJAR.html create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEJAR.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COOKIELIST.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIELIST.html create mode 100644 docs/libcurl/opts/CURLOPT_COOKIELIST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COOKIESESSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIESESSION.html create mode 100644 docs/libcurl/opts/CURLOPT_COOKIESESSION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 create mode 100644 docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.html create mode 100644 docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CRLF.3 create mode 100644 docs/libcurl/opts/CURLOPT_CRLF.html create mode 100644 docs/libcurl/opts/CURLOPT_CRLF.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CRLFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_CRLFILE.html create mode 100644 docs/libcurl/opts/CURLOPT_CRLFILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 create mode 100644 docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.html create mode 100644 docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 create mode 100644 docs/libcurl/opts/CURLOPT_DIRLISTONLY.html create mode 100644 docs/libcurl/opts/CURLOPT_DIRLISTONLY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_INTERFACE.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_INTERFACE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_SERVERS.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_SERVERS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.html create mode 100644 docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_EGDSOCKET.3 create mode 100644 docs/libcurl/opts/CURLOPT_EGDSOCKET.html create mode 100644 docs/libcurl/opts/CURLOPT_EGDSOCKET.pdf create mode 100644 docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 create mode 100644 docs/libcurl/opts/CURLOPT_ERRORBUFFER.html create mode 100644 docs/libcurl/opts/CURLOPT_ERRORBUFFER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.html create mode 100644 docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FAILONERROR.3 create mode 100644 docs/libcurl/opts/CURLOPT_FAILONERROR.html create mode 100644 docs/libcurl/opts/CURLOPT_FAILONERROR.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FILETIME.3 create mode 100644 docs/libcurl/opts/CURLOPT_FILETIME.html create mode 100644 docs/libcurl/opts/CURLOPT_FILETIME.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_DATA.html create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_DATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 create mode 100644 docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.html create mode 100644 docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 create mode 100644 docs/libcurl/opts/CURLOPT_FORBID_REUSE.html create mode 100644 docs/libcurl/opts/CURLOPT_FORBID_REUSE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FRESH_CONNECT.html create mode 100644 docs/libcurl/opts/CURLOPT_FRESH_CONNECT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTPPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTPPORT.html create mode 100644 docs/libcurl/opts/CURLOPT_FTPPORT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTPSSLAUTH.html create mode 100644 docs/libcurl/opts/CURLOPT_FTPSSLAUTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.pdf create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_PRET.html create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_PRET.pdf create mode 100644 docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 create mode 100644 docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.html create mode 100644 docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADER.html create mode 100644 docs/libcurl/opts/CURLOPT_HEADER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HEADERDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADERDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_HEADERDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADERFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_HEADERFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HEADEROPT.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADEROPT.html create mode 100644 docs/libcurl/opts/CURLOPT_HEADEROPT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP200ALIASES.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTP200ALIASES.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTPAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPAUTH.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTPAUTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTPGET.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPGET.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTPGET.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTPHEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPHEADER.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTPHEADER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPOST.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPOST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.pdf create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_VERSION.html create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_VERSION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.html create mode 100644 docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE.html create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_INTERFACE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERFACE.html create mode 100644 docs/libcurl/opts/CURLOPT_INTERFACE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_IPRESOLVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_IPRESOLVE.html create mode 100644 docs/libcurl/opts/CURLOPT_IPRESOLVE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_ISSUERCERT.3 create mode 100644 docs/libcurl/opts/CURLOPT_ISSUERCERT.html create mode 100644 docs/libcurl/opts/CURLOPT_ISSUERCERT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_KEYPASSWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_KEYPASSWD.html create mode 100644 docs/libcurl/opts/CURLOPT_KEYPASSWD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_KRBLEVEL.3 create mode 100644 docs/libcurl/opts/CURLOPT_KRBLEVEL.html create mode 100644 docs/libcurl/opts/CURLOPT_KRBLEVEL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORT.html create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.html create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.html create mode 100644 docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.html create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.html create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_AUTH.html create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_AUTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_FROM.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_FROM.html create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_FROM.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_RCPT.html create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_RCPT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXCONNECTS.html create mode 100644 docs/libcurl/opts/CURLOPT_MAXCONNECTS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE.html create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAXREDIRS.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXREDIRS.html create mode 100644 docs/libcurl/opts/CURLOPT_MAXREDIRS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NETRC.3 create mode 100644 docs/libcurl/opts/CURLOPT_NETRC.html create mode 100644 docs/libcurl/opts/CURLOPT_NETRC.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NETRC_FILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_NETRC_FILE.html create mode 100644 docs/libcurl/opts/CURLOPT_NETRC_FILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.html create mode 100644 docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.html create mode 100644 docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NOBODY.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOBODY.html create mode 100644 docs/libcurl/opts/CURLOPT_NOBODY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NOPROGRESS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOPROGRESS.html create mode 100644 docs/libcurl/opts/CURLOPT_NOPROGRESS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NOPROXY.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOPROXY.html create mode 100644 docs/libcurl/opts/CURLOPT_NOPROXY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_NOSIGNAL.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOSIGNAL.html create mode 100644 docs/libcurl/opts/CURLOPT_NOSIGNAL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PASSWORD.html create mode 100644 docs/libcurl/opts/CURLOPT_PASSWORD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PORT.html create mode 100644 docs/libcurl/opts/CURLOPT_PORT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POST.3 create mode 100644 docs/libcurl/opts/CURLOPT_POST.html create mode 100644 docs/libcurl/opts/CURLOPT_POST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDS.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDS.html create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.html create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POSTQUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTQUOTE.html create mode 100644 docs/libcurl/opts/CURLOPT_POSTQUOTE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_POSTREDIR.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTREDIR.html create mode 100644 docs/libcurl/opts/CURLOPT_POSTREDIR.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PREQUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PREQUOTE.html create mode 100644 docs/libcurl/opts/CURLOPT_PREQUOTE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PRIVATE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PRIVATE.html create mode 100644 docs/libcurl/opts/CURLOPT_PRIVATE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROTOCOLS.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROTOCOLS.html create mode 100644 docs/libcurl/opts/CURLOPT_PROTOCOLS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYAUTH.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYAUTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYHEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYHEADER.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYHEADER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPASSWORD.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPASSWORD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPORT.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPORT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYTYPE.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYTYPE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERNAME.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERNAME.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERPWD.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERPWD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.html create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_PUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PUT.html create mode 100644 docs/libcurl/opts/CURLOPT_PUT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_QUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_QUOTE.html create mode 100644 docs/libcurl/opts/CURLOPT_QUOTE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RANDOM_FILE.html create mode 100644 docs/libcurl/opts/CURLOPT_RANDOM_FILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RANGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RANGE.html create mode 100644 docs/libcurl/opts/CURLOPT_RANGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_READDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_READDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_READDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_READFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_READFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_READFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 create mode 100644 docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.html create mode 100644 docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_REFERER.3 create mode 100644 docs/libcurl/opts/CURLOPT_REFERER.html create mode 100644 docs/libcurl/opts/CURLOPT_REFERER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVE.html create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM.html create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.html create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_REQUEST.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_REQUEST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.pdf create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.html create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SASL_IR.3 create mode 100644 docs/libcurl/opts/CURLOPT_SASL_IR.html create mode 100644 docs/libcurl/opts/CURLOPT_SASL_IR.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SEEKDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SEEKDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_SEEKDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SEEKFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_SEEKFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SHARE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SHARE.html create mode 100644 docs/libcurl/opts/CURLOPT_SHARE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.html create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.html create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERT.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERTTYPE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERTTYPE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEY.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEY.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEYTYPE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEYTYPE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSLVERSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLVERSION.html create mode 100644 docs/libcurl/opts/CURLOPT_SSLVERSION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_OPTIONS.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_OPTIONS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.pdf create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.html create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.pdf create mode 100644 docs/libcurl/opts/CURLOPT_STDERR.3 create mode 100644 docs/libcurl/opts/CURLOPT_STDERR.html create mode 100644 docs/libcurl/opts/CURLOPT_STDERR.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.html create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.html create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.html create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_NODELAY.html create mode 100644 docs/libcurl/opts/CURLOPT_TCP_NODELAY.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TELNETOPTIONS.html create mode 100644 docs/libcurl/opts/CURLOPT_TELNETOPTIONS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.html create mode 100644 docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TIMECONDITION.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMECONDITION.html create mode 100644 docs/libcurl/opts/CURLOPT_TIMECONDITION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT.html create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT_MS.html create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT_MS.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TIMEVALUE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEVALUE.html create mode 100644 docs/libcurl/opts/CURLOPT_TIMEVALUE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.html create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.html create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.html create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFERTEXT.html create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFERTEXT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.html create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.pdf create mode 100644 docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 create mode 100644 docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.html create mode 100644 docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.html create mode 100644 docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_UPLOAD.3 create mode 100644 docs/libcurl/opts/CURLOPT_UPLOAD.html create mode 100644 docs/libcurl/opts/CURLOPT_UPLOAD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_URL.3 create mode 100644 docs/libcurl/opts/CURLOPT_URL.html create mode 100644 docs/libcurl/opts/CURLOPT_URL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_USERAGENT.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERAGENT.html create mode 100644 docs/libcurl/opts/CURLOPT_USERAGENT.pdf create mode 100644 docs/libcurl/opts/CURLOPT_USERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERNAME.html create mode 100644 docs/libcurl/opts/CURLOPT_USERNAME.pdf create mode 100644 docs/libcurl/opts/CURLOPT_USERPWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERPWD.html create mode 100644 docs/libcurl/opts/CURLOPT_USERPWD.pdf create mode 100644 docs/libcurl/opts/CURLOPT_USE_SSL.3 create mode 100644 docs/libcurl/opts/CURLOPT_USE_SSL.html create mode 100644 docs/libcurl/opts/CURLOPT_USE_SSL.pdf create mode 100644 docs/libcurl/opts/CURLOPT_VERBOSE.3 create mode 100644 docs/libcurl/opts/CURLOPT_VERBOSE.html create mode 100644 docs/libcurl/opts/CURLOPT_VERBOSE.pdf create mode 100644 docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 create mode 100644 docs/libcurl/opts/CURLOPT_WILDCARDMATCH.html create mode 100644 docs/libcurl/opts/CURLOPT_WILDCARDMATCH.pdf create mode 100644 docs/libcurl/opts/CURLOPT_WRITEDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_WRITEDATA.html create mode 100644 docs/libcurl/opts/CURLOPT_WRITEDATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_WRITEFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_WRITEFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFODATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFODATA.html create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFODATA.pdf create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.html create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.pdf create mode 100644 docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 create mode 100644 docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.html create mode 100644 docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.pdf create mode 100644 docs/libcurl/opts/Makefile.am create mode 100644 docs/libcurl/opts/Makefile.in create mode 100644 lib/curl_endian.c create mode 100644 lib/curl_endian.h create mode 100644 lib/curl_sasl_gssapi.c create mode 100644 lib/curl_sasl_sspi.c rename lib/{krb4.h => curl_sec.h} (82%) delete mode 100644 lib/gskit.c create mode 100644 lib/http2.c create mode 100644 lib/http2.h delete mode 100644 lib/krb4.c delete mode 100644 lib/qssl.c delete mode 100644 lib/qssl.h create mode 100644 lib/sigpipe.h create mode 100644 lib/smb.c create mode 100644 lib/smb.h rename lib/{ => vtls}/axtls.c (91%) rename lib/{ => vtls}/axtls.h (78%) rename lib/{ => vtls}/curl_darwinssl.c (74%) rename lib/{ => vtls}/curl_darwinssl.h (83%) rename lib/{ => vtls}/curl_schannel.c (88%) rename lib/{ => vtls}/curl_schannel.h (80%) rename lib/{ => vtls}/cyassl.c (87%) rename lib/{ => vtls}/cyassl.h (81%) create mode 100644 lib/vtls/gskit.c rename lib/{ => vtls}/gskit.h (87%) rename lib/{ => vtls}/gtls.c (74%) rename lib/{ => vtls}/gtls.h (80%) rename lib/{ => vtls}/nss.c (68%) rename lib/{ => vtls}/nssg.h (74%) rename lib/{ssluse.c => vtls/openssl.c} (81%) rename lib/{ssluse.h => vtls/openssl.h} (82%) rename lib/{ => vtls}/polarssl.c (74%) rename lib/{ => vtls}/polarssl.h (77%) rename lib/{ => vtls}/polarssl_threadlock.c (100%) rename lib/{ => vtls}/polarssl_threadlock.h (100%) rename lib/{sslgen.c => vtls/vtls.c} (73%) rename lib/{sslgen.h => vtls/vtls.h} (74%) create mode 100644 projects/README create mode 100644 projects/Windows/VC10/curl.sln create mode 100644 projects/Windows/VC10/lib/libcurl.sln create mode 100644 projects/Windows/VC10/lib/libcurl.vcxproj create mode 100644 projects/Windows/VC10/src/curlsrc.sln create mode 100644 projects/Windows/VC10/src/curlsrc.vcxproj create mode 100644 projects/Windows/VC11/curl.sln create mode 100644 projects/Windows/VC11/lib/libcurl.sln create mode 100644 projects/Windows/VC11/lib/libcurl.vcxproj create mode 100644 projects/Windows/VC11/src/curlsrc.sln create mode 100644 projects/Windows/VC11/src/curlsrc.vcxproj create mode 100644 projects/Windows/VC12/curl.sln create mode 100644 projects/Windows/VC12/lib/libcurl.sln create mode 100644 projects/Windows/VC12/lib/libcurl.vcxproj create mode 100644 projects/Windows/VC12/src/curlsrc.sln create mode 100644 projects/Windows/VC12/src/curlsrc.vcxproj rename vs/vc6/vc6curl.dsw => projects/Windows/VC6/curl.dsw (79%) create mode 100644 projects/Windows/VC6/lib/libcurl.dsp rename vs/vc6/lib/vc6libcurl.dsw => projects/Windows/VC6/lib/libcurl.dsw (83%) create mode 100644 projects/Windows/VC6/src/curlsrc.dsp rename vs/vc6/src/vc6curltool.dsw => projects/Windows/VC6/src/curlsrc.dsw (83%) create mode 100644 projects/Windows/VC7.1/curl.sln create mode 100644 projects/Windows/VC7.1/lib/libcurl.sln create mode 100644 projects/Windows/VC7.1/lib/libcurl.vcproj create mode 100644 projects/Windows/VC7.1/src/curlsrc.sln create mode 100644 projects/Windows/VC7.1/src/curlsrc.vcproj create mode 100644 projects/Windows/VC7/curl.sln create mode 100644 projects/Windows/VC7/lib/libcurl.sln create mode 100644 projects/Windows/VC7/lib/libcurl.vcproj create mode 100644 projects/Windows/VC7/src/curlsrc.sln create mode 100644 projects/Windows/VC7/src/curlsrc.vcproj create mode 100644 projects/Windows/VC8/curl.sln create mode 100644 projects/Windows/VC8/lib/libcurl.sln create mode 100644 projects/Windows/VC8/lib/libcurl.vcproj create mode 100644 projects/Windows/VC8/src/curlsrc.sln create mode 100644 projects/Windows/VC8/src/curlsrc.vcproj create mode 100644 projects/Windows/VC9/curl.sln create mode 100644 projects/Windows/VC9/lib/libcurl.sln create mode 100644 projects/Windows/VC9/lib/libcurl.vcproj create mode 100644 projects/Windows/VC9/src/curlsrc.sln create mode 100644 projects/Windows/VC9/src/curlsrc.vcproj create mode 100644 projects/build-openssl.bat create mode 100644 projects/checksrc.bat rename src/{version.h => tool_strdup.c} (66%) create mode 100644 src/tool_strdup.h 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.pub.der create mode 100644 tests/certs/Server-localhost.nn-sv.pub.pem create mode 100644 tests/certs/Server-localhost0h-sv.pub.der create mode 100644 tests/certs/Server-localhost0h-sv.pub.pem create mode 100644 tests/data/Makefile.inc create mode 100644 tests/data/test1134 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/test1240 create mode 100644 tests/data/test1397 create mode 100644 tests/data/test1398 create mode 100644 tests/data/test1411 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/test1420 create mode 100644 tests/data/test1428 create mode 100644 tests/data/test1429 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/test1513 create mode 100644 tests/data/test1514 create mode 100644 tests/data/test1515 create mode 100644 tests/data/test1516 create mode 100644 tests/data/test1520 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/test1800 create mode 100644 tests/data/test1801 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/test325 create mode 100644 tests/data/test640 create mode 100644 tests/data/test641 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/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 rename tests/data/{test1324 => test829} (88%) 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/test858 create mode 100644 tests/data/test859 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/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 rename tests/data/{test1322 => test875} (88%) 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/test880 create mode 100644 tests/data/test881 create mode 100644 tests/data/test882 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/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/test930 rename tests/data/{test1323 => test931} (88%) 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/test940 create mode 100644 tests/data/test941 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/lib1520.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/unit/unit1397.c create mode 100644 tests/unit/unit1398.c delete mode 100644 vs/t/README delete mode 100644 vs/t/lib/vc6_libcurl_dsp.foot delete mode 100644 vs/t/lib/vc6_libcurl_dsp.head delete mode 100644 vs/t/lib/vc8_libcurl_prj.foot delete mode 100644 vs/t/lib/vc8_libcurl_prj.head delete mode 100644 vs/vc6/lib/vc6libcurl.dsp delete mode 100644 vs/vc6/src/vc6curltool.dsp delete mode 100644 vs/vc8/lib/vc8libcurl.vcproj diff --git a/CHANGES b/CHANGES index 44c9792..ddcd07e 100644 --- a/CHANGES +++ b/CHANGES @@ -6,5888 +6,5321 @@ Changelog -Version 7.32.0 (11 Aug 2013) +Version 7.40.0 (7 Jan 2015) -Daniel Stenberg (11 Aug 2013) -- THANKS: added contributors from the 7.32.0 release notes +Daniel Stenberg (7 Jan 2015) +- RELEASE-NOTES: version 7.40.0 -- [Fabian Keil brought this change] - - test1228: add 'HTTP proxy' to the keywords - -- [Fabian Keil brought this change] - - tests: add keywords for a couple of FILE tests - -- [Fabian Keil brought this change] - - tests: add 'FAILURE' keywords to tests 1409 and 1410 - -- [Fabian Keil brought this change] - - tests: add keywords for a couple of HTTP tests - -- [Fabian Keil brought this change] - - tests: add keywords for a couple of FTP tests - -- [Fabian Keil brought this change] - - test1511: consistently terminate headers with CRLF - -- DISABLED: shut of test 1512 for now +- darwinssl: fix session ID keys to only reuse identical sessions - It shows intermittent failures and I haven't been able to track them - down yet. Disable this test for now. - -- curl_multi_add_handle.3: ... that timer callback is for event-based - -- comments: remove old and wrong multi/easy interface statements - -- curl_multi_add_handle.3: mention the CURLMOPT_TIMERFUNCTION use - -- [John E. Malmberg brought this change] - - KNOWN_BUGS: 22 and 57 have been fixed and committed - -- RELEASE-NOTES: synced with d20def20462e7 - -- global dns cache: fix memory leak + ...to avoid a session ID getting cached without certificate checking and + then after a subsequent _enabling_ of the check libcurl could still + re-use the session done without cert checks. - The take down of the global dns cache didn't take CURLOPT_RESOLVE names - into account. + Bug: http://curl.haxx.se/docs/adv_20150108A.html + Reported-by: Marc Hesse -- global dns cache: didn't work [regression] +- tests: make sure CRLFs can't be used in URLs passed to proxy - CURLOPT_DNS_USE_GLOBAL_CACHE broke in commit c43127414d89ccb (been - broken since the libcurl 7.29.0 release). While this option has been - documented as deprecated for almost a decade and nobody even reported - this bug, it should remain functional. + Bug: http://curl.haxx.se/docs/adv_20150108B.html + +- url-parsing: reject CRLFs within URLs - Added test case 1512 to verify + Bug: http://curl.haxx.se/docs/adv_20150108B.html + Reported-by: Andrey Labunets -Yang Tse (8 Aug 2013) -- [John Malmberg brought this change] +Steve Holme (7 Jan 2015) +- ldap: Convert attribute output to UTF-8 when Unicode - packages/vms: update VMS build files - - VMS modified files either missing from a previous commit and changes - to remove references to CVS repositories. +- ldap: Convert DN output to UTF-8 when Unicode -Daniel Stenberg (8 Aug 2013) -- FTP: renamed several local functions - - The previous naming scheme ftp_state_post_XXXX() wasn't really helpful - as it wasn't always immediately after 'xxxx' and it wasn't easy to - understand what it does based on such a name. +Daniel Stenberg (7 Jan 2015) +- hostip: remove 'stale' argument from Curl_fetch_addr proto - This new one is instead ftp_state_yyyy() where yyyy describes what it - does or sends. + Also, remove the log output of the resolved name is NOT in the cache in + the spirit of only telling when something is actually happening. -- mk-ca-bundle.1: don't install on make install +Steve Holme (7 Jan 2015) +- ldap/imap: Fixed spelling mistake in comments and variable names - Since the mk-ca-bundle tool itself isn't installed with make install, - there's no point in installing its documentation. - - Bug: http://curl.haxx.se/mail/lib-2013-08/0057.html - Reported-by: Guenter Knauf + Reported-by: Michael Osipov -Yang Tse (7 Aug 2013) -- packages/vms/Makefile.am: add latest file additions to EXTRA_DIST +Daniel Stenberg (7 Jan 2015) +- RELEASE-NOTES: updated with ./contributors.sh output -- [John Malmberg brought this change] +Dan Fandrich (5 Jan 2015) +- curl_multibyte.h: Eliminated some trailing whitespace - Building_vms_pcsi_kit - - These are the files needed to build VMS distribution packages known as - PCSI kits. - - Also minor update to the existing files, mainly to the documentation and - file clean up code. +Steve Holme (4 Jan 2015) +- RELEASE-NOTES: Synced with ea93252ef1 -Daniel Stenberg (6 Aug 2013) -- LIBCURL-STRUCTS: new document - - This is the first version of this new document, detailing the seven - perhaps most important internal structs in libcurl source code: +- ldap: Fixed Unicode usage for all Win32 builds - 1.1 SessionHandle - 1.2 connectdata - 1.3 Curl_multi - 1.4 Curl_handler - 1.5 conncache - 1.6 Curl_share - 1.7 CookieInfo + Otherwise, the fixes in the previous commits would only be applicable + to IDN and SSPI based builds and not others such as OpenSSL with LDAP + enabled. -- CONTRIBUTE: minor language polish +- ldap: Fixed memory leak from commit efb64fdf80 -- FTP: when EPSV gets a 229 but fails to connect, retry with PASV - - This is a regression as this logic used to work. It isn't clear when it - broke, but I'm assuming in 7.28.0 when we went all-multi internally. - - This likely never worked with the multi interface. As the failed - connection is detected once the multi state has reached DO_MORE, the - Curl_do_more() function was now expanded somewhat so that the - ftp_do_more() function can request to go "back" to the previous state - when it makes another attempt - using PASV. - - Added test case 1233 to verify this fix. It has the little issue that it - assumes no service is listening/accepting connections on port 1... - - Reported-by: byte_bucket in the #curl IRC channel +- ldap: Fix memory leak from commit 3a805c5cc1 -Nick Zitzmann (5 Aug 2013) -- md5: remove use of CommonCrypto-to-OpenSSL macros for the benefit of Leopard +- ldap: Fixed attribute variable warnings when Unicode is enabled - For some reason, OS X 10.5's GCC suddenly stopped working correctly with - macros that change MD5_Init etc. in the code to CC_MD5_Init etc., so I - worked around this by removing use of the macros and inserting static - functions that just call CommonCrypto's implementations of the functions - instead. + Use 'TCHAR *' for local attribute variable rather than 'char *'. -Guenter Knauf (5 Aug 2013) -- Simplify check for trusted certificates. +- ldap: Fixed DN variable warnings when Unicode is enabled - This changes the previous check for untrusted certs to a check for - certs explicitely marked as trusted. - The change is backward-compatible (tested with certdata.txt v1.80). + Use 'TCHAR *' for local DN variable rather than 'char *'. -Daniel Stenberg (5 Aug 2013) -- configure: warn on bad env variable use, don't error +- ldap: Remove the unescape_elements() function - Use XC_CHECK_BUILD_FLAGS instead XC_CHECK_USER_FLAGS. + Due to the recent modifications this function is no longer used. -- Revert "configure: don't error out on variable confusions, just warn" +- ldap.c: Fixed compilation warning - This reverts commit 6b27703b5f525eccdc0a8409f51de8595c75132a. + ldap.c:98: warning: extra tokens at end of #endif directive -- formadd: wrong pointer for file name when CURLFORM_BUFFERPTR used - - The internal function that's used to detect known file extensions for - the default Content-Type got the the wrong pointer passed in when - CURLFORM_BUFFER + CURLFORM_BUFFERPTR were used. This had the effect that - strlen() would be used which could lead to an out-of-bounds read (and - thus segfault). In most cases it would only lead to it not finding or - using the correct default content-type. - - It also showed that test 554 and test 587 were testing for the - previous/wrong behavior and now they're updated as well. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1262 - Reported-by: Konstantin Isakov +- ldap: Fixed support for Unicode filter in Win32 search call -Guenter Knauf (4 Aug 2013) -- Skip more untrusted certificates. +- ldap.c: Fixed compilation warning - Christian Heimes brought to our attention that the certdata.txt - format has recently changed [1], causing ca-bundle.crt created - with mk-ca-bundle.[pl|vbs] to include untrusted certs. - - [1] http://lists.debian.org/debian-release/2012/11/msg00411.html + ldap.c:802: warning: comparison between signed and unsigned integer + expressions -Daniel Stenberg (4 Aug 2013) -- configure: don't error out on variable confusions, just warn +- ldap: Fixed support for Unicode attributes in Win32 search call -- configure: rephrase the notice in _XC_CHECK_VAR_* +- ldap: Fixed memory leak from commit efb64fdf80 - Instead of claiming it is an error, we call it a "note" to reduce the - severity level. But the following text now says the [variable] "*should* - only be used to specify"... instead of previously having said "may". + The unescapped DN was not freed after a successful character conversion. -- multi: remove data->state.current_conn struct field +- ldap.c: Fixed compilation error - Not needed + ldap.c:738: error: macro "LDAP_TRACE" passed 2 arguments, but takes + just 1 -- multi: remove the one_easy struct field +- ldap.c: Fixed compilation warning - Since the merge of SessionHandle with Curl_one_easy, this indirection - isn't used anymore. + ldap.c:89: warning: extra tokens at end of #endif directive -- multi: rename all Curl_one_easy to SessionHandle +- ldap: Fixed support for Unicode DN in Win32 search call -- multi: remove the multi_pos struct field - - Since Curl_one_easy is really a SessionHandle now, this indirection - doesn't exist anymore. +- ldap: Fixed Unicode user and password in Win32 bind calls -- multi: remove easy_handle struct field - - It isn't needed anymore +- ldap: Fixed Unicode host name in Win32 initialisation calls -- multi: remove 'Curl_one_easy' struct, phase 1 - - The motivation for having a separate struct that keep track of an easy - handle when using the multi handle was removed when we switched to - always using the multi interface internally. Now they were just two - separate struct that was always allocated for each easy handle. - - This first step just moves the Curl_one_easy struct members into the - SessionHandle struct and hides this somehow (== keeps the source code - changes to a minimum) by defining Curl_one_easy to SessionHandle - - The biggest changes in this commit are: - - 1 - the linked list of easy handles had to be changed somewhat due - to the new struct layout. This made the main linked list pointer - get renamed to 'easyp' and there's also a new pointer to the last - node, called easylp. It is no longer circular but ends with ->next - pointing to NULL. New nodes are still added last. +- ldap: Use host.dispname for infof() connection failure messages - 2 - easy->state is now called easy->mstate to avoid name collision + As host.name may be encoded use dispname for infof() failure messages. -Steve Holme (2 Aug 2013) -- Revert "DOCS: Added IMAP URL example for listing new messages" - - This reverts commit 82ab5f1b0c7c3f as this was the wrong place to - document the complexity of IMAP URLs and Custom Requests. +- ldap: Prefer 'CURLcode result' for curl result codes -- DOCS: Added IMAP URL example for listing new messages +- ldap: Pass write length in all Curl_client_write() calls - In addition to listing the folder contents, in the URL examples, added - an example to list the new messages waiting in the user's inbox. - -Yang Tse (1 Aug 2013) -- packages/vms/Makefile.am: add latest file additions to EXTRA_DIST + As we get the length for the DN and attribute variables, and we know + the length for the line terminator, pass the length values rather than + zero as this will save Curl_client_write() from having to perform an + additional strlen() call. -- [John Malmberg brought this change] - - Add in the files needed to build libcurl shared images on VMS. - - Update the packages/vms/readme file to be current. - - Also some files for the GNV based build were either missing or needed an - update. - - curl_crtl_init.c is a special file that is run before main() to - set up the proper C runtime behavior. - - generate_vax_transfer.com generates the VAX transfer vector modules from - the gnv_libcurl_symbols.opt file. - - gnv_conftest.c_first is a helper file needed for configure scripts to - come up with the expected answers on VMS. - - gnv_libcurl_symbols.opt is the public symbols for the libcurl shared - image. +- ldap: Fixed attribute memory leaks on failed client write - gnv_link_curl.com builds the shared libcurl image and rebuilds other - programs to use it. - - macro32_exactcase.patch is a hack to make a local copy of the VMS Macro32 - assembler case sensitive, which is needed to build the VAX transfer modules. - - report_openssl_version.c is a tool for help verify that the libcurl - shared image is being built for a minium version of openssl. + Fixed memory leaks from commit 086ad79970 as was noted in the commit + comments. -- curl: second follow-up for commit 5af2bfb9 +- ldap: Fixed DN memory leaks on failed client write - Display progress-bar unconditionally on first call + Fixed memory leaks from commit 086ad79970 as was noted in the commit + comments. -- curl: follow-up for commit 5af2bfb9 +- curl_ntlm_core.c: Fixed compilation warning from commit 1cb17b2a5d - Use tvnow() and tvdiff() to avoid introducing new linkage issues - -Daniel Stenberg (31 Jul 2013) -- curl: --progress-bar max update frequency now at 5Hz + curl_ntlm_core.c:146: warning: passing 'DES_cblock' (aka 'unsigned char + [8]') to parameter of type 'char *' converts + between pointers to integer types with different + sign -- curl: make --progress-bar update the line less frequently - - Also, use memset() instead of a lame loop. - - The previous logic that tried to avoid too many updates were very - ineffective for really fast transfers, as then it could easily end up - doing hundreds of updates per second that would make a significant - impact in transfer performance! +- ntlm: Use extend_key_56_to_64() for all cryptography engines - Bug: http://curl.haxx.se/mail/archive-2013-07/0031.html - Reported-by: Marc Doughty + Rather than duplicate the code in setup_des_key() for OpenSSL and in + extend_key_56_to_64() for non-OpenSSL based crypto engines, as it is + the same, use extend_key_56_to_64() for all engines. -Nick Zitzmann (30 Jul 2013) -- darwinssl: added LFs to some strings passed into infof() - - (This doesn't need to appear in the release notes.) I noticed a few places - where infof() was called, and there should've been an LF at the end of the - string, but there wasn't. +- RELEASE-NOTES: Synced with 34f0bd110f -- darwinssl: fix build error in crypto authentication under Snow Leopard - - It turns out Snow Leopard not only has SecItemCopyMatching() defined in - a header not included by the omnibus header, but it won't work for our - purposes, because searching for SecIdentityRef objects wasn't added - to that API until Lion. So we now use the old SecKeychainSearch API - instead if the user is building under, or running under, Snow Leopard. +- curl_ntlm_core.c: Fixed compilation warning - Bug: http://sourceforge.net/p/curl/bugs/1255/ - Reported by: Edward Rudd + curl_ntlm_core.c:458: warning: 'ascii_uppercase_to_unicode_le' defined + but not used -- md5 & metalink: use better build macros on Apple operating systems +- endian: Fixed bit-shift in 64-bit integer read functions - Previously we used __MAC_10_X and __IPHONE_X to mark digest-generating - code that was specific to OS X and iOS. Now we use - __MAC_OS_X_VERSION_MAX_ALLOWED and __IPHONE_OS_VERSION_MAX_ALLOWED - instead of those macros. + From commit 43792592ca and 4bb5a351b2. - Bug: http://sourceforge.net/p/curl/bugs/1255/ - Reported by: Edward Rudd + Reported-by: Michael Osipov -Yang Tse (29 Jul 2013) -- tool_operhlp.c: fix add_file_name_to_url() OOM handling +- smb: Use endian functions for reading NBT and message size values -- tool_operate.c: fix brace placement for vi/emacs delimiter matching +- endian: Added big endian read functions -- tool_operate.c: move header inclusion location +- endian: Added 64-bit integer read function -Daniel Stenberg (29 Jul 2013) -- RELEASE-NOTES: synced with b5478a0e033e7 +- COPYING: Bumped copyright year to 2015 -- curl_easy_pause: on unpause, trigger mulit-socket handling - - When the multi-socket API is used, we need the handle to be checked - again when it gets unpaused. +- version: Bump copyright year to 2015 + +- smb.c: Fixed compilation warnings - Bug: http://curl.haxx.se/mail/lib-2013-07/0239.html - Reported-by: Justin Karneges + smb.c:780: warning: passing 'char *' to parameter of type 'unsigned + char *' converts between pointers to integer types with + different sign + smb.c:781: warning: passing 'char *' to parameter of type 'unsigned + char *' converts between pointers to integer types with + different sign + smb.c:804: warning: passing 'char *' to parameter of type 'unsigned + char *' converts between pointers to integer types with + different sign -- [John E. Malmberg brought this change] +- smb: Use endian functions for reading length and offset values - curl_formadd: fix file upload on VMS - - For the standard VMS text file formats, VMS needs to read the file to - get the actual file size. - - For the standard VMS binary file formats, VMS needs a special format of - fopen() call so that it stops reading at the logical end of file instead - of at the end of the blocks allocated to the file. - - I structured the patch this way as I was not sure about changing the - structures or parameters to the routines, but would prefer to only call - the stat() function once and pass the information to where the fopen() - call is made. - - Bug: https://sourceforge.net/p/curl/bugs/758/ +- endian: Added 16-bit integer write function -- formadd: CURLFORM_FILECONTENT wrongly rejected some option combos - - The code for CURLFORM_FILECONTENT had its check for duplicate options - wrong so that it would reject CURLFORM_PTRNAME if used in combination - with it (but not CURLFORM_COPYNAME)! The flags field used for this - purpose cannot be interpreted that broadly. +- endian: Fixed Linux compilation issues - Bug: http://curl.haxx.se/mail/lib-2013-07/0258.html - Reported-by: Byrial Jensen + Having files named endian.[c|h] seemed to cause issues under Linux so + renamed them both to have the curl_ prefix in the filenames. -Yang Tse (25 Jul 2013) -- packages/vms/Makefile.am: add latest file additions to EXTRA_DIST +- [Julien Nabet brought this change] -- [John E. Malmberg brought this change] + lib1900.c: Fixed cppcheck error + + lib1900.c:182: (style) Array index 'handlenum' is used before limits + check + + Bug: https://github.com/bagder/curl/pull/133 - VMS: intial set of files to allow building using GNV toolkit. +- endian: Added standard function descriptions -- string formatting: fix too many arguments for format +- endian: Renamed functions for curl API naming convention -- string formatting: fix zero-length printf format string +- endian: Moved write functions to new module -- easy.c: curl_easy_getinfo() fix va_start/va_end matching +- endian: Moved read functions to new module -- imap.c: imap_sendf() fix va_start/va_end matching +- endian: Introduced endian module + + To allow the little endian functions, currently used in two of the NTLM + source files, to be used by other modules such as the SMB module. -- string formatting: fix 15+ printf-style format strings +- sepheaders.c: Applied curl oding standards -Patrick Monnerat (24 Jul 2013) -- OS400: sync ILE/RPG binding with current curl.h +- [Julien Nabet brought this change] -Yang Tse (24 Jul 2013) -- string formatting: fix 25+ printf-style format strings + sepheaders.c: Fixed resource leak on failure -Daniel Stenberg (23 Jul 2013) -- Makefile.am: use LDFLAGS as well when linking libcurl +- vtls: Use '(void) arg' for unused parameters - Linking on Solaris 10 x86 with Sun Studio 12 failed when we upgraded - automake for the release builds. + Prefer void for unused parameters, rather than assigning an argument to + itself as a) unintelligent compilers won't optimize it out, b) it can't + be used for const parameters, c) it will cause compilation warnings for + clang with -Wself-assign and d) is inconsistent with other areas of the + curl source code. + +- smb.c: Fixed compilation warning - Bug: http://curl.haxx.se/bug/view.cgi?id=1217 - Reported-by: Dagobert Michelsen + smb.c:586: warning: conversion to 'short unsigned int' from 'int' may + alter its value -- [Fabian Keil brought this change] +- [Bill Nagel brought this change] - url.c: Fix dot file path cleanup when using an HTTP proxy + smb: Use the connection's upload buffer - Previously the path was cleaned, but the URL wasn't properly updated. + Use the connection's upload buffer instead of allocating our own send + buffer. -- [Fabian Keil brought this change] +- RELEASE-NOTES: Synced with 1933f9d33c - tests: test1232 verifies dotdot removal from path with proxy - -- [Fabian Keil brought this change] +- schannel: Moved the ISC return flag definitions to the SSPI module + + Moved our Initialize Security Context return attribute definitions to + the SSPI module, as a) these can be used by other SSPI based providers + and b) the ISC required attributes are defined there. - dotdot.c: Fix a RFC section number in a comment for Curl_dedotdotify() +- [Bill Nagel brought this change] -- [John E. Malmberg brought this change] + smb: Close the connection after a failed client write - build_vms.com: fix debug and float options +- darwinssl: Fixed compilation warning - In the reorganization of the build_vms.com the debug and float options - were not fixed up correctly. + vtls.c:683:43: warning: unused parameter 'data' -- [John E. Malmberg brought this change] - - curl: fix upload of a zip file in OpenVMS +- sockfilt.c: Fixed compilation warnings - Two fixes: + sockfilt.c:288: warning: conversion to 'DWORD' from 'size_t' may alter + its value + sockfilt.c:291: warning: conversion to 'DWORD' from 'size_t' may alter + its value + sockfilt.c:323: warning: conversion to 'DWORD' from 'size_t' may alter + its value + sockfilt.c:326: warning: conversion to 'DWORD' from 'size_t' may alter + its value + +- test1509: Fixed compilation warning - 1. Force output file format to be stream-lf so that partial downloads - can be continued. + lib1509.c:93:18: warning: conversion to 'long int' from 'size_t' may + alter its value + +- test556: Fixed compilation warning - This should have minor impact as if the file does not exist, it was - created with stream-lf format. The only time this was an issue is if - there was already an existing file with a different format. + lib556.c:90: warning: conversion to 'unsigned int' from 'size_t' may + alter its value + +- sasl_gssapi: Fixed use of dummy username with real username + +- vtls: Fixed compilation warning and an ignored return code - 2. Fix file uploads are now fixed. + curl_schannel.h:123: warning: right-hand operand of comma expression + has no effect - a. VMS binary files such as ZIP archives are now uploaded - correctly. + Some instances of the curlssl_close_all() function were declared with a + void return type whilst others as int. The schannel version returned + CURLE_NOT_BUILT_IN and others simply returned zero, but in all cases the + return code was ignored by the calling function Curl_ssl_close_all(). - b. VMS text files are read once to get the correct size - and then converted to line-feed terminated records as - they are read into curl. + For the time being and to keep the internal API consistent, changed all + declarations to use a void return type. - The default VMS text formats do not contain either line-feed or - carriage-return terminated records. Those delimiters are added by the - operating system file read calls if the application requests them. + To reduce code we might want to consider removing the unimplemented + versions and use a void #define like schannel does. + +Daniel Stenberg (28 Dec 2014) +- TODO: 2.3 Better support for same name resolves + +Steve Holme (28 Dec 2014) +- test1520: Fixed initial teething problems - Bug: http://curl.haxx.se/bug/view.cgi?id=496 + * Missing initialisation of upload status caused a seg fault + * Missing data termination caused corrupt data to be uploaded + * Data verification should be performed in element + * Added missing recipient list cleanup -Yang Tse (22 Jul 2013) -- libtest: fix data type of some *_setopt() 'long' arguments +- test1520: Fixed compilation errors -- curl: fix symbolic names for CURL_NETRC_* enum in --libcurl output +- tests: Added test for bug #1456 -- curl: fix symbolic names for CURLUSESSL_* enum in --libcurl output +- checksrc.bat: Fixed a problem opening files with spaces in the filename -- tool_operate.c: fix passing curl_easy_setopt long arg on some x64 ABIs - - We no longer pass our 'bool' data type variables nor constants as - an argument to my_setopt(), instead we use proper 1L or 0L values. - - This also fixes macro used to pass string argument for CURLOPT_SSLCERT, - CURLOPT_SSLKEY and CURLOPT_EGDSOCKET using my_setopt_str() instead of - my_setopt(). - - This also casts enum or int argument data types to long when passed to - my_setopt_enum(). +- openldap: Prefer use of 'CURLcode result' -Daniel Stenberg (21 Jul 2013) -- curl_multi_wait: fix revents - - Commit 6d30f8ebed34e7276 didn't work properly. First, it used the wrong - array index, but this fix also: - - 1 - only does the copying if indeed there was any activity +- openldap: Use 'LDAPMessage *msg' for messages - 2 - makes sure to properly translate between internal and external - bitfields, which are not guaranteed to match - - Reported-by: Evgeny Turnaev + This frees up the 'result' variable for CURLcode based result codes. -- RELEASE-NOTES: synced with d529f3882b9bca +- nss: Don't ignore Curl_extract_certinfo() OOM failure -- curl_easy_perform: gradually increase the delay time - - Instead of going 50,100,150 etc millisecond delay time when nothing has - been found to do or wait for, we now start lower and double each loop as - in 4,8,16,32 etc. - - This lowers the minimum wait without sacrifizing the longer wait too - much with unnecessary CPU cycles burnt. - - Bug: http://curl.haxx.se/mail/lib-2013-07/0103.html - Reported-by: Andreas Malzahn +- nss: Don't ignore Curl_ssl_init_certinfo() OOM failure -- ftp_do_more: consider DO_MORE complete when server connects back - - In the case of an active connection when ftp_do_more() detects that the - server has connected back, it must make sure to mark it as complete so - that the multi_runsingle() function will detect this and move on to the - next state. +- nss: Use 'CURLcode result' for curl result codes - Bug: http://curl.haxx.se/mail/lib-2013-07/0115.html - Reported-by: Clemens Gruber + ...and don't use CURLE_OK in failure/success comparisons. -Yang Tse (19 Jul 2013) -- Makefile.b32: Borland makefile adjustments. Tested with BCC 5.5.1 +- getinfo: Code style policing -- WIN32 MemoryTracking: require UNICODE for wide strdup code support +- getinfo: Use 'CURLcode result' for curl result codes -Daniel Stenberg (18 Jul 2013) -- CURLOPT_XFERINFOFUNCTION: introducing a new progress callback - - CURLOPT_XFERINFOFUNCTION is now the preferred progress callback function - and CURLOPT_PROGRESSFUNCTION is considered deprecated. - - This new callback uses pure 'curl_off_t' arguments to pass on full - resolution sizes. It otherwise retains the same characteristics: the - same call rate, the same meanings for the arguments and the return code - is used the same way. - - The progressfunc.c example is updated to show how to use the new - callback for newer libcurls while supporting the older one if built with - an older libcurl or even built with a newer libcurl while running with - an older. +- darwinssl: Use 'CURLcode result' for curl result codes -Yang Tse (18 Jul 2013) -- Reinstate "WIN32 MemoryTracking: track wcsdup() _wcsdup() and _tcsdup() usage". - - This reverts commit 7ed25cc, reinstating commit 8ec2cb5. - - As of 18-jul-2013 we still do have code in libcurl that makes use of these - memory functions. Commit 8ec2cb5 comment still applies and is yet valid. - - These memory functions are solely used in Windows builds, so all related - code is protected with '#ifdef WIN32' preprocessor conditional compilation - directives. +- polarssl: Use 'CURLcode result' for curl result codes + +- docs: Updated following the addition of SASL GSSAPI via GSS-API libraries - Specifically, wcsdup() _wcsdup() are used when building a Windows target with - UNICODE and USE_WINDOWS_SSPI preprocessor symbols defined. This is the case - when building a Windows UNICODE target with Windows native SSL/TLS support - enabled. + As this feature has been implemented for 7.40.0. + +- asiohiper.cpp: No need to initialise members of ConnInfo - Realizing that wcsdup() _wcsdup() are used is a bit tricky given that usage - of these is hidden behind _tcsdup() which is MS way of dealing with code - that must tolerate UNICODE and non-UNICODE compilation. Additionally, MS - header files and those compatible from other compilers use this preprocessor - conditional compilation directive in order to select at compilation time - whether 'wide' or 'ansi' MS API functions are used. + ...as calloc() automatically clears the area of memory with zeros. + +- asiohiper.cpp: Updated for curl coding standards - Without this code, Windows build targets with Windows native SSL/TLS support - enabled and MemoryTracking support enabled misbehave in tracking memory usage, - regardless of being a UNICODE enabled build or not. + ...with the exception of the start of block statement curly brackets. -- xc-am-iface.m4: comments refinement +- code/docs: Use correct case for IPv4 and IPv6 + + For consistency, as we seem to have a bit of a mixed bag, changed all + instances of ipv4 and ipv6 in comments and documentations to use the + correct case. -- configure: fix 'subdir-objects' distclean related issue +- runtests: Fixed detection of Unix Sockets feature - See XC_AMEND_DISTCLEAN comments for details. + ...following change in curl --version output. -Daniel Stenberg (18 Jul 2013) -- [Evgeny Turnaev brought this change] +- code/docs: Use Unix rather than UNIX to avoid use of the trademark + + Use Unix when generically writing about Unix based systems as UNIX is + the trademark and should only be used in a particular product's name. - curl_multi_wait: set revents for extra fds +- ip2ip.c: Fixed compilation warning when IPv6 Scope ID not supported - Pass back the revents that happened for the user-provided file - descriptors. + if2ip.c:119: warning: unused parameter 'remote_scope_id' + + ...and some minor code style policing in the same function. -- [Ben Greear brought this change] +- vtls: Don't set cert info count until memory allocation is successful + + Otherwise Curl_ssl_init_certinfo() can fail and set the num_of_certs + member variable to the requested count, which could then be used + incorrectly as libcurl closes down. - asyn-ares: Don't blank ares servers if none configured. +- vtls: Use CURLcode for Curl_ssl_init_certinfo() return type - Best to just let c-ares use it's defaults if none are configured - in (lib)curl. + The return type for this function was 0 on success and 1 on error. This + was then examined by the calling functions and, in most cases, used to + return CURLE_OUT_OF_MEMORY. - Signed-off-by: Ben Greear + Instead use CURLcode for the return type and return the out of memory + error directly, propagating it up the call stack. -- [Sergei Nikulov brought this change] - - cmake: Fix for MSVC2010 project generation +- configure: Use camel case for UNIX sockets feature output - Fixed issue with static build for MSVC2010. + To match the curl --version output. + +Marc Hoersken (26 Dec 2014) +- sockfilt.c: Reduce the number of individual memory allocations - After some investigation I've discovered known issue - http://public.kitware.com/Bug/view.php?id=11240 When .rc file is linked - to static lib it fails with following linker error + Merge multiple internal arrays into one, even if some variables + will not not be used. They are all created with the number of + file descriptors as their size. - LINK : warning LNK4068: /MACHINE not specified; defaulting to X86 - file.obj : fatal error LNK1112: module machine type 'x64' conflicts with - target machine type 'X86' + Also fix possible thread handle leak in CloseHandle-loop. + +- sockfilt.c: Replace 100ms sleep with thread throttle - Fix add target property /MACHINE: for MSVC generation. + Improves performance of test cases 574 and 575 by 50%. - Also removed old workarounds - it caused errors during msvc build. + A value of zero causes the thread to relinquish the remainder + of its time slice to any other thread of equal priority that is + ready to run. If there are no other threads of equal priority + ready to run, the function returns immediately, and the thread + continues execution. - Bug: http://curl.haxx.se/mail/lib-2013-07/0046.html - -- mk-ca-bundle.1: point out certdata.txt format docs - -Yang Tse (16 Jul 2013) -- slist.c: Curl_slist_append_nodup() OOM handling fix + http://msdn.microsoft.com/library/windows/desktop/ms686307.aspx -Daniel Stenberg (16 Jul 2013) -- test1414: FTP PORT download without SIZE support +Steve Holme (25 Dec 2014) +- tool_help: Use camel case for UNIX sockets feature output + + In line with the other features listed in the --version output, + capitalise the UNIX socket feature. -Yang Tse (16 Jul 2013) -- tests/Makefile.am: add configurehelp.pm to DISTCLEANFILES +- vtls: Use bool for Curl_ssl_getsessionid() return type + + The return type of this function is a boolean value, and even uses a + bool internally, so use bool in the function declaration as well as + the variables that store the return value, to avoid any confusion. -Patrick Monnerat (15 Jul 2013) -- curl_slist_append(): fix error detection +- schannel: Minor code style policing for casts -- slist.c: fix indentation +- schannel: Prefer 'CURLcode result' for curl result codes -- OS400: new SSL backend GSKit +- cyassl: Prefer 'CURLcode result' for curl result codes -- OS400: add slist and certinfo EBCDIC support +- tool_xattr: Use 'CURLcode result' for curl result codes -- config-os400.h: enable system strdup(), strcmpi(), etc. +- curl_ntlm_core.c: Fixed compilation warnings + + curl_ntlm_core.c:301: warning: pointer targets in passing argument 2 of + 'CryptImportKey' differ in signedness + curl_ntlm_core.c:310: warning: passing argument 6 of 'CryptEncrypt' from + incompatible pointer type + curl_ntlm_core.c:540: warning: passing argument 4 of 'CryptGetHashParam' + from incompatible pointer type -- x509asn1.c,x509asn1.h: new module to support ASN.1/X509 parsing & info extract - Use from qssl backend +- RELEASE-NOTES: Synced with 8830df8b66 -- ssluse.c,sslgen.c,sslgen.h: move certinfo support to generic SSL +- gtls: Use preferred 'CURLcode result' -- Merge branch 'master' of github.com:bagder/curl +- openldap: Use standard naming for setup connection function - Merge for resync + Renamed ldap_setup() to ldap_setup_connection() to follow more widely + used function naming. -- slist.c, slist.h, cookie.c: new internal procedure Curl_slist_append_nodup() - -Yang Tse (15 Jul 2013) -- sslgen.c: fix Curl_rand() compiler warning +- rtmp: Use standard naming for setup connection function - Use simple seeding method upon RANDOM_FILE seeding method failure. - -- sslgen.c: fix unreleased Curl_rand() infinite recursion + Renamed rtmp_setup() to rtmp_setup_connection() to follow more widely + used function naming. -Daniel Stenberg (14 Jul 2013) -- [Dave Reisner brought this change] - - src/tool: allow timeouts to accept decimal values - - Implement wrappers around strtod to convert the user argument to a - double with sane error checking. Use this to allow --max-time and - --connect-timeout to accept decimal values instead of strictly integers. +- smb: Use standard naming for setup connection function - The manpage is updated to make mention of this feature and, - additionally, forewarn that the actual timeout of the operation can - vary in its precision (particularly as the value increases in its - decimal precision). - -- [Dave Reisner brought this change] + Renamed smb_setup() to smb_setup_connection() to follow more widely + used function naming. - curl.1: fix long line, found by checksrc.pl +- config-win32.h: Fixed line length > 79 columns -- [Dave Reisner brought this change] +- openssl: Prefer we don't use NULL in comparisons - src/tool_paramhlp: try harder to catch negatives +- build: Removed WIN32 definition from the Visual Studio projects - strto* functions happily chomp off leading whitespace, so simply - checking for str[0] can lead to false negatives. Do the full parse and - check the out value instead. - -- [John E. Malmberg brought this change] + As this pre-processor definition is defined in curl_setup.h there is no + need to include it in the Visual Studio project files. - build_vms.com: detect and use zlib shared image +- build: Removed WIN64 definition from the libcurl Visual Studio projects - Update the build_vms.com to detect and use zlib shared image installed - by the ZLIB kit produced by Jean-Francois Pieronne, and the also the - future ZLIB 1.2.8 kit in addition to the older ZLIB kits. + Removed the WIN64 pre-processor definition from the libcurl project + files as: - Also fix the indentation to match one of the common standards used for - VMS DCL command files and removed the hard tab characters. + * WIN64 is not used in our source code + * The curl projects files don't define it + * It isn't required by or used in the platform SDK + * For backwards compatability curl_setup.h defines WIN32 + * The compiler automatically defines _WIN64 for x64 builds - Tested on OpenVMS 8.4 Alpha and IA64, and OpenVMS 7.3 VAX. - -Yang Tse (14 Jul 2013) -- url.c: fix parse_url_login() OOM handling - -- http_digest.c: SIGSEGV and OOM handling fixes - -- url.c: fix parse_login_details() OOM handling - -- [John E. Malmberg brought this change] - - setup-vms.h: sk_pop symbol tweak + Historically Visual Studio projects have defined WIN32, in addition to + the compiler defined _WIN32 definition, and I had incorrectly changed + that to WIN64 for the x64 libcurl builds but not in the curl projects. - Newer versions of curl are referencing a sk_pop symbol while the HP - OpenSSL library has the symbol in uppercase only. - -- getinfo.c: fix enumerated type mixed with another type - -- test 1511: fix enumerated type mixed with another type - -- url.c: fix SIGSEGV - -- dotdot.c: fix global declaration shadowing - -- easy.c: fix global declaration shadowing - -Kamil Dudka (9 Jul 2013) -- Revert "curl.1: document the --time-cond option in the man page" + As such, it is questionable whether this should be defined or not. For + more information see the following cache of a discussion that took + place on the microsoft.public.vc.mfc newsgroup: - This reverts commit 3a0e931fc715a80004958794a96b12cf90503f99 because - the documentation of --time-cond was duplicated by mistake. - - Reported by: Dave Reisner - -- curl.1: document the --sasl-ir option in the man page - -- curl.1: document the --post303 option in the man page + http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2008-06/msg00074.html -- curl.1: document the --time-cond option in the man page - -Yang Tse (9 Jul 2013) -- configure: automake 1.14 compatibility tweak (use XC_AUTOMAKE) +- openssl.c Fix for compilation errors with older versions of OpenSSL + + openssl.c:1408: error: 'TLS1_1_VERSION' undeclared + openssl.c:1411: error: 'TLS1_2_VERSION' undeclared -- xc-am-iface.m4: provide XC_AUTOMAKE macro +Daniel Stenberg (22 Dec 2014) +- [John Malmberg brought this change] -Guenter Knauf (8 Jul 2013) -- Added winssl-zlib target to VC builds. + Fix comment edit in vms/backup_gnv_curl_src.com + + packages/vms/backup_gnv_curl_src.com: Originally copied from Bash port. -- Synced Makefile.vc6 with recent changes. +- curl: show size of inhibited data when using -v - Issue posted to the list by malinowsky AT FTW DOT at. + To offer some more info and yet it doesn't use more lines. -- Added libmetalink URL; added Android versions. +- openssl: fix SSL/TLS versions in verbose output -Dan Fandrich (3 Jul 2013) -- examples: Moved usercertinmem.c to COMPLICATED_EXAMPLES - - This prevents it from being built during a "make check" since it - depends on OpenSSL. +- openssl: make it compile against openssl 1.1.0-DEV master branch -Nick Zitzmann (2 Jul 2013) -- Merge branch 'master' of https://github.com/bagder/curl +Marc Hoersken (22 Dec 2014) +- sshserver.pl: clarify and streamline variable names -- darwinssl: SSLv2 connections are aborted if unsupported by the OS +Daniel Stenberg (21 Dec 2014) +- openssl: warn for SRP set if SSLv3 is used, not for TLS version - I just noticed that OS X no longer supports SSLv2. Other TLS engines return - an error if the requested protocol isn't supported by the underlying - engine, so we do that now for SSLv2 if the framework returns an error - when trying to turn on SSLv2 support. (Note: As always, SSLv2 support is - only enabled in curl when starting the app with the -2 argument; it's off - by default. SSLv2 is really old and insecure.) - -Marc Hoersken (1 Jul 2013) -- lib506.c: Fixed possible use of uninitialized variables + ... as it requires TLS and it was was left to warn on the default from + when default was SSL... -Kamil Dudka (30 Jun 2013) -- url: restore the functionality of 'curl -u :' +- smb: use memcpy() instead of strncpy() - This commit fixes a regression introduced in - fddb7b44a79d78e05043e1c97e069308b6b85f79. + ... as it never copies the trailing zero anyway and always just the four + bytes so let's not mislead anyone into thinking it is actually treated + as a string. - Reported by: Markus Moeller - Bug: http://curl.haxx.se/mail/archive-2013-06/0052.html + Coverity CID: 1260214 -Daniel Stenberg (25 Jun 2013) -- digest: append the timer to the random for the nonce +- [John E. Malmberg brought this change] -- digest: improve nonce generation + VMS: Updates for 0740-0D1220 - Use the new improved Curl_rand() to generate better random nonce for - Digest auth. - -- curl.1: fix typo in --xattr description + lib/setup-vms.h : VAX HP OpenSSL port is ancient, needs help. + More defines to set symbols to uppercase. - Bug: http://curl.haxx.se/bug/view.cgi?id=1252 - Reported-by: Jean-Noël Rouvignac - -- RELEASE-NOTES: synced with 365c5ba39591 - - The 10 first bug fixes for the pending release... - -- formpost: better random boundaries + src/tool_main.c : Fix parameter to vms_special_exit() call. - When doing multi-part formposts, libcurl used a pseudo-random value that - was seeded with time(). This turns out to be bad for users who formpost - data that is provided with users who then can guess how the boundary - string will look like and then they can forge a different formpost part - and trick the receiver. + packages/vms/ : + backup_gnv_curl_src.com : Fix the error message to have the correct package. - My advice to such implementors is (still even after this change) to not - rely on the boundary strings being cryptographically strong. Fix your - code and logic to not depend on them that much! + build_curl-config_script.com : Rewrite to be more accurate. - I moved the Curl_rand() function into the sslgen.c source file now to be - able to take advantage of the SSL library's random function if it - provides one. If not, try to use the RANDOM_FILE for seeding and as a - last resort keep the old logic, just modified to also add microseconds - which makes it harder to properly guess the exact seed. + build_libcurl_pc.com : Use tool_version.h now. - The formboundary() function in formdata.c is now using 64 bit entropy - for the boundary and therefore the string of dashes was reduced by 4 - letters and there are 16 hex digits following it. The total length is - thus still the same. + build_vms.com : Fix to handle lib/vtls directory. - Bug: http://curl.haxx.se/bug/view.cgi?id=1251 - Reported-by: "Floris" - -- printf: make sure %x are treated unsigned + curl_gnv_build_steps.txt : Updated build procedure documentation. - When using %x, the number must be treated as unsigned as otherwise it - would get sign-extended on for example 64bit machines and do wrong - output. This problem showed when doing printf("%08x", 0xffeeddcc) on a - 64bit host. - -- tests: add test1395 to the tarball - -- SIGPIPE: don't use 'data' in sigpipe restore + generate_config_vms_h_curl.com : + * VAX does not support 64 bit ints, so no NTLM support for now. + * VAX HP SSL port is ancient, needs some help. + * Disable NGHTTP2 for now, not ported to VMS. + * Disable UNIX_SOCKETS, not available on VMS yet. + * HP GSSAPI port does not have gss_nt_service_name. - Follow-up fix from 7d80ed64e43515. + gnv_link_curl.com : Update for new curl structure. - The SessionHandle may not be around to use when we restore the sigpipe - sighandler so we store the no_signal boolean in the local struct to know - if/how to restore. + pcsi_product_gnv_curl.com : Set up to optionally do a complete build. -- TODO: 1.8 Modified buffer size approach +Marc Hoersken (21 Dec 2014) +- sockfilt.c: use non-Ex functions that are available before WinXP - Thoughts around buffer sizes and what might be possible to do... + It was initially reported by Guenter that GetFileSizeEx + requires (_WIN32_WINNT >= 0x0500) to be true. -- c-ares: improve error message on failed resolve +- tests: use Cygwin-style paths in SSH, SSHD and SFTP config files - When the c-ares based resolver backend failed to resolve a name, it - tried to show the name that failed from existing structs. This caused - the wrong output and shown hostname when for example --interface - [hostname] was used and that name resolving failed. + Second patch to enable Windows support using Cygwin-based OpenSSH. - Now we use the hostname used in the actual resolve attempt in the error - message as well. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1191 - Reported-by: Kim Vandry + Tested with CopSSH 5.0.0 free edition using an msys shell on Windows 7. -- ossl_recv: check for an OpenSSL error, don't assume - - When we recently started to treat a zero return code from SSL_read() as - an error we also got false positives - which primarily looks to be - because the OpenSSL documentation is wrong and a zero return code is not - at all an error case in many situations. +- tests: support spaces in paths to SSH, SSHD and SFTP binaries - Now ossl_recv() will check with ERR_get_error() to see if there is a - stored error and only then consider it to be a true error if SSL_read() - returned zero. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1249 - Reported-by: Nach M. S. - Patch-by: Nach M. S. - -Nick Zitzmann (22 Jun 2013) -- Merge branch 'master' of https://github.com/bagder/curl + First patch to enable Windows support using Cygwin-based OpenSSH. -- darwinssl: fix crash that started happening in Lion +Steve Holme (20 Dec 2014) +- non-ascii: Reduce variable usage - Something (a recent security update maybe?) changed in Lion, and now it - has changed SSLCopyPeerTrust such that it may return noErr but also give - us a null trust, which caught us off guard and caused an eventual crash. + Removed 'next' variable in Curl_convert_form(). Rather than setting it + from 'form->next' and using that to set 'form' after the conversion + just use 'form = form->next' instead. -Daniel Stenberg (22 Jun 2013) -- SIGPIPE: ignored while inside the library - - ... and restore the ordinary handling again when it returns. This is - done for curl_easy_perform() and curl_easy_cleanup() only for now - and - only when built to use OpenSSL as backend as this is the known culprit - for the spurious SIGPIPEs people have received. +- non-ascii: Prefer while loop rather than a do loop - Bug: http://curl.haxx.se/bug/view.cgi?id=1180 - Reported by: Lluís Batlle i Rossell + This also removes the need to check that the 'form' argument is valid. -- KNOWN_BUGS: #83 unable to load non-default openssl engines - -- test1396: invoke the correct test tool! +- non-ascii: Reduce variable scope - This erroneously run unit test 1310 instead of 1396! + As 'result' isn't used out side the conversion callback code and + previously caused variable shadowing in the libiconv based code. -Kamil Dudka (22 Jun 2013) -- test1230: avoid using hard-wired port number +- non-ascii: We prefer 'CURLcode result' - ... to prevent failure when a non-default -b option is given - -- curl-config.in: replace tabs by spaces + This also fixes a variable shadowing issue when HAVE_ICONV is defined + as rc was declared for the result code of libiconv based functions. -Nick Zitzmann (22 Jun 2013) -- darwinssl: reform OS-specific #defines +Marc Hoersken (19 Dec 2014) +- secureserver.pl: clean up formatting of config and fix verbose output - This doesn't need to be in the release notes. I cleaned up a lot of the #if - lines in the code to use MAC_OS_X_VERSION_MIN_REQUIRED and - MAC_OS_X_VERSION_MAX_ALLOWED instead of checking for whether things like - __MAC_10_6 or whatever were defined, because for some SDKs Apple has released - they were defined out of place. + Verbose output was not matching the actual configuration file, + because FIPS and Windows conditions were ignored. -Daniel Stenberg (22 Jun 2013) -- [Alessandro Ghedini brought this change] - - docs: fix typo in curl_easy_getinfo manpage +- secureserver.pl: update Windows detection and fix path conversion -- dotdot: introducing dot file path cleanup - - RFC3986 details how a path part passed in as part of a URI should be - "cleaned" from dot sequences before getting used. The described - algorithm is now implemented in lib/dotdot.c with the accompanied test - case in test 1395. +- secureserver.pl: make OpenSSL CApath and cert absolute path values - Bug: http://curl.haxx.se/bug/view.cgi?id=1200 - Reported-by: Alex Vinnik + Recent stunnel versions (5.08) seem to have trouble with relative + paths on Windows. This turns the relative paths into absolute ones. -- bump: start working towards what most likely will become 7.32.0 +Patrick Monnerat (18 Dec 2014) +- if2ip: dummy scope parameter for Curl_if2ip() call in SIOCGIFADDR-enabled code. -- THANKS: added 24 new contributors from the 7.31.0 release +- [Kyle J. McKay brought this change] -Version 7.31.0 (22 Jun 2013) + parseurlandfillconn(): fix improper non-numeric scope_id stripping. + Fixes SF bug 1149: http://sourceforge.net/p/curl/bugs/1449/ -Daniel Stenberg (22 Jun 2013) -- RELEASE-NOTES: synced with 0de7249bb39a2 - 7.31.0 +- IPV6: address scope != scope id + There was a confusion between these: this commit tries to disambiguate them. + - Scope can be computed from the address itself. + - Scope id is scope dependent: it is currently defined as 1-based local + interface index for link-local scoped addresses, and as a site index(?) for + (obsolete) site-local addresses. Linux only supports it for link-local + addresses. + The URL parser properly parses a scope id as an interface index, but stores it + in a field named "scope": confusion. The field has been renamed into "scope_id". + Curl_if2ip() used the scope id as it was a scope. This caused failures + to bind to an interface. + Scope is now computed from the addresses and Curl_if2ip() matches them. + If redundantly specified in the URL, scope id is check for mismatch with + the interface index. + + This commit should fix SF bug #1451. -- unit1396: unit tests to verify curl_easy_(un)escape +- connect: singleipconnect(): properly try other address families after failure -- Curl_urldecode: no peeking beyond end of input buffer - - Security problem: CVE-2013-2174 +Daniel Stenberg (16 Dec 2014) +- SFTP: work-around servers that return zero size on STAT - If a program would give a string like "%FF" to curl_easy_unescape() but - ask for it to decode only the first byte, it would still parse and - decode the full hex sequence. The function then not only read beyond the - allowed buffer but it would also deduct the *unsigned* counter variable - for how many more bytes there's left to read in the buffer by two, - making the counter wrap. Continuing this, the function would go on - reading beyond the buffer and soon writing beyond the allocated target - buffer... + Bug: http://curl.haxx.se/mail/lib-2014-12/0103.html + Pathed-by: Marc Renault + +- glob_next_url: make the loop count upwards - Bug: http://curl.haxx.se/docs/adv_20130622.html - Reported-by: Timo Sirainen + As the former contruct apparently caused a compiler warning, mentioned + in d8efde07e556c. -Guenter Knauf (20 Jun 2013) -- Use opened body.out file and write content to it. +- tool_operate: we prefer 'CURLcode result' -Daniel Stenberg (20 Jun 2013) -- multi_socket: react on socket close immediately +- tool_urlglob: unify return codes to use CURLcode - As a remedy to the problem when a socket gets closed and a new one is - opened with the same file descriptor number and as a result - multi.c:singlesocket() doesn't detect the difference, the new function - Curl_multi_closed() gets told when a socket is closed so that it can be - removed from the socket hash. When the old one has been removed, a new - socket should be detected fine by the singlesocket() on next invoke. + There was a mix of GlobCode, CURLcode and ints and they were mostly + passing around CURLcode errors. This change makes the functions use only + CURLcode and removes the GlobCode type completely. + +- tool_urlglob.c: partly reverse dc19789444 - Bug: http://curl.haxx.se/bug/view.cgi?id=1248 - Reported-by: Erik Johansson + The loop in glob_next_url() needs to be done backwards to maintain the + logic. dc19789444 caused test 1235 to fail. -- RELEASE-NOTES: synced with e305f5ec715f +- KNOWN_BUGS: the SFTP code doesn't support CURLINFO_FILETIME -- TODO: mention the DANE patch from March +- [Jay Satiro brought this change] -- CURLOPT_COOKIELIST: take cookie share lock + opts: Warn CURLOPT_TIMEOUT overrides when set after CURLOPT_TIMEOUT_MS - When performing COOKIELIST operations the cookie lock needs to be taken - for the cases where the cookies are shared among multiple handles! + Change CURLOPT_TIMEOUT doc to warn that if CURLOPT_TIMEOUT and + CURLOPT_TIMEOUT_MS are both set whichever one is set last is the one + that will be used. - Verified by Benjamin Gilbert's updated test 506 + Prior to this change that behavior was only noted in the + CURLOPT_TIMEOUT_MS doc. + +Nick Zitzmann (15 Dec 2014) +- darwinssl: fix incorrect usage of aprintf() - Bug: http://curl.haxx.se/bug/view.cgi?id=1215 - Reported-by: Benjamin Gilbert + Commit b13923f changed an snprintf() to use aprintf(), but the API usage + wasn't correct, and was causing a crash to occur. This fixes it. -- [Benjamin Gilbert brought this change] +Steve Holme (14 Dec 2014) +- copyright: Updated the copyright year following recent updates - test506: verify that CURLOPT_COOKIELIST takes share lock +Daniel Stenberg (14 Dec 2014) +- tool_urlglob.c: reverse two loops - It doesn't right now: http://curl.haxx.se/bug/view.cgi?id=1215 + By counting from 0 and up instead of backwards like before, we remove + the need for the "funny" check of the unsigned variable when decreased + passed zero. Easier to read and less risk for compiler warnings. -- TODO: HTTP2/SPDY support +Marc Hoersken (14 Dec 2014) +- tool_urlglob.c: Added braces to clarify the conditions -- curl_easy_setopt.3: clarify CURLOPT_PROGRESSFUNCTION frequency +- tool_urlglob.c: Silence warning C6293: Ill-defined for-loop - Make it clearer that the CURLOPT_PROGRESSFUNCTION callback will be - called more frequently than once per second when things are happening. + The >= 0 is actually not required, since i underflows and + the for-loop is stopped using the < condition, but this + makes the VS2012 compiler and code analysis happy. -- RELEASE-NOTES: synced with 9c3e098259b82 +- tool_binmode.c: Explicitly ignore the return code of setmode - Mention 7 recent bug fixes and their associated contributors + Fixes code analysis warning C6031: + return value ignored: could return unexpected value -- curl_multi_wait.3: clarify the numfds counter - -- curl_easy_perform: avoid busy-looping +- lib: Fixed multiple code analysis warnings if SAL are available - When curl_multi_wait() finds no file descriptor to wait for, it returns - instantly and this must be handled gracefully within curl_easy_perform() - or cause a busy-loop. Starting now, repeated fast returns without any - file descriptors is detected and a gradually increasing sleep will be - used (up to a max of 1000 milliseconds) before continuing the loop. + warning C28252: Inconsistent annotation for function: + parameter has another annotation on this instance + +Steve Holme (14 Dec 2014) +- smb.c: Fixed code analysis warning - Bug: http://curl.haxx.se/bug/view.cgi?id=1238 - Reported-by: Miguel Angel + smb.c:320: warning C6297: Arithmetic overflow: 32-bit value is shifted, + then cast to 64-bit value. Result may not be an expected + value -- [YAMADA Yasuharu brought this change] +Marc Hoersken (14 Dec 2014) +- tool_util.c: Use GetTickCount64 if it is available - cookies: follow-up fix for path checking +Steve Holme (14 Dec 2014) +- smb: Use HAVE_PROCESS_H for process.h inclusion - The initial fix to only compare full path names were done in commit - 04f52e9b4db0 but found out to be incomplete. This takes should make the - change more complete and there's now two additional tests to verify - (test 31 and 62). + Rather than testing against _WIN32 use the preferred HAVE_PROCESS_H + pre-processor define when including process.h. -- [Sergei Nikulov brought this change] - - lib1900: use tutil_tvnow instead of gettimeofday +Daniel Stenberg (14 Dec 2014) +- darwinssl: aprintf() to allocate the session key - Makes it build on windows + ... to avoid using a fixed memory size that risks being too large or too + small. -- [Eric Hu brought this change] +Marc Hoersken (14 Dec 2014) +- curl_schannel: Improvements to memory re-allocation strategy + + - do not grow memory by doubling its size + - do not leak previously allocated memory if reallocation fails + - replace while-loop with a single check to make sure + that the requested amount of data fits into the buffer + + Bug: http://curl.haxx.se/bug/view.cgi?id=1450 + Reported-by: Warren Menzer - axtls: now done non-blocking +Steve Holme (14 Dec 2014) +- asyn-ares: We prefer use of 'CURLcode result' -- [Eric Hu brought this change] +Marc Hoersken (14 Dec 2014) +- curl_schannel.c: Data may be available before connection shutdown - test2033: requires NTLM support +Steve Holme (14 Dec 2014) +- http2: Use 'CURLcode result' for curl result codes -- KNOWN_BUGS: #82 failed build with Borland compiler +- asyn-thread: We prefer 'CURLcode result' -- Curl_output_digest: support auth-int for empty entity body +- smb: Fixed unnecessary initialisation of struct member variables - By always returning the md5 for an empty body when auth-int is asked - for, libcurl now at least sometimes does the right thing. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1235 - Patched-by: Nach M. S. + There is no need to set the 'state' and 'result' member variables to + SMB_REQUESTING (0) and CURLE_OK (0) after the allocation via calloc() + as calloc() initialises the contents to zero. -- multi_socket: reduce timeout inaccuracy margin - - Allow less room for "triggered too early" mistakes by applications / - timers on non-windows platforms. Starting now, we assume that a timeout - call is never made earlier than 3 milliseconds before the actual - timeout. This greatly improves timeout accuracy on Linux. +- ntlm: Fixed return code for bad type-2 Target Info - Bug: http://curl.haxx.se/bug/view.cgi?id=1228 - Reported-by: Hang Su + Use CURLE_BAD_CONTENT_ENCODING for bad type-2 Target Info security + buffers just like we do for bad decodes. -- cert_stuff: avoid double free in the PKCS12 code +- ntlm: Remove unnecessary casts in readshort_le() - In the pkcs12 code, we get a list of x509 records returned from - PKCS12_parse but when iterating over the list and passing each to - SSL_CTX_add_extra_chain_cert() we didn't also properly remove them from - the "stack", which made them get freed twice (both in sk_X509_pop_free() - and then later in SSL_CTX_free). - - This isn't really documented anywhere... + I don't think both of my fix ups from yesterday were needed to fix the + compilation warning, so remove the one that I think is unnecessary and + let the next Android autobuild prove/disprove it. + +- curl_ntlm_msgs.c: Another attempt to fix compilation warning - Bug: http://curl.haxx.se/bug/view.cgi?id=1236 - Reported-by: Nikaiw + curl_ntlm_msgs.c:170: warning: conversion to 'short unsigned int' from + 'int' may alter its value -- cert_stuff: remove code duplication in the pkcs12 logic +Guenter Knauf (13 Dec 2014) +- synctime.c: added own user-agent string. -- [Aleksey Tulinov brought this change] +Steve Holme (13 Dec 2014) +- smb.c: Fixed line longer than 79 columns - axtls: honor disabled VERIFYHOST +- curl_ntlm_msgs.c: Fixed compilation warning from commit 783b5c3b11 - When VERIFYHOST == 0, libcurl should let invalid certificates to pass. + curl_ntlm_msgs.c:169: warning: conversion to 'short unsigned int' from + 'int' may alter its value -- [Peter Gal brought this change] +Guenter Knauf (13 Dec 2014) +- mk-ca-bundle.pl: restored forced run again. - curl_easy_setopt.3: HTTP header with no content +- synctime.c: removed another timeserver URL. - Update the documentation on how to specify a HTTP header with no - content. + worldtimeserver.com seems also no longer available. -- RELEASE-NOTES: synced with 87cf677eca55 +- synctime.c: fixed timeserver URLs. - Added 11 bugs and 7 contributors + For getting the date header its not necessary to access special + pages or even CGI scripts - all pages including the main index + reply with the date header, therefore shortened URLs to domain. + Removed worldtime.com; added pool.ntp.org. -- lib1500: remove bad check - - After curl_multi_wait() returns, this test checked that we got exactly - one file descriptor told to read from, but we cannot be sure that is - true. curl_multi_wait() will sometimes return earlier without any file - descriptor to handle, just just because it is a suitable time to call - *perform(). +Steve Holme (13 Dec 2014) +- ftp.c: Fixed compilation warning when no verbose string support - This problem showed up with commit 29bf0598. - - Bug: http://curl.haxx.se/mail/lib-2013-06/0029.html - Reported-by: Fabian Keil + ftp.c:819: warning: unused parameter 'lineno' -- tests/Makefile: typo in the perlcheck target +- smb: Added state change functions to assist with debugging - Bug: http://curl.haxx.se/bug/view.cgi?id=1239 - Reported-by: Christian Weisgerber + For debugging purposes, and as per other protocols within curl, added + state change functions rather than changing the states directly. -- test1230: verify CONNECT to a numerical ipv6-address +- ntlm: Use short integer when decoding 16-bit values -- sws: support extracting test number from CONNECT ipv6-address! - - If an ipv6-address is provided to CONNECT, the last hexadecimal group in - the address will be used as the test number! For example the address - "[1234::ff]" would be treated as test case 255. +- RELEASE-NOTES: Synced with 6291a16b20 -- curl_multi_wait: only use internal timer if not -1 +- smtp.c: Fixed compilation warnings - commit 29bf0598aad5 introduced a problem when the "internal" timeout is - prefered to the given if shorter, as it didn't consider the case where - -1 was returned. Now the internal timeout is only considered if not -1. + smtp.c:2357 warning: adding 'size_t' (aka 'unsigned long') to a string + does not append to the string + smtp.c:2375 warning: adding 'size_t' (aka 'unsigned long') to a string + does not append to the string + smtp.c:2386 warning: adding 'size_t' (aka 'unsigned long') to a string + does not append to the string - Reported-by: Tor Arntsen - Bug: http://curl.haxx.se/mail/lib-2013-06/0015.html + Used array index notation instead. -Dan Fandrich (3 Jun 2013) -- libcurl-tutorial.3: added a section on IPv6 +- smb: Disable SMB when 64-bit integers are not supported - Also added a (correctly-escaped) backslash to the autoexec.bat - example file and a new Windows character device name with - a colon as examples of other characters that are special - and potentially dangerous (this reverts and reworks commit - 7d8d2a54). + This fixes compilation issues with compilers that don't support 64-bit + integers through long long or __int64. -Daniel Stenberg (3 Jun 2013) -- curl_multi_wait: reduce timeout if the multi handle wants to - - If the multi handle's pending timeout is less than what is passed into - this function, it will now opt to use the shorter time anyway since it - is a very good hint that the handle wants to process something in a - shorter time than what otherwise would happen. - - curl_multi_wait.3 was updated accordingly to clarify - - This is the reason for bug #1224 +- ntlm: Disable NTLM v2 when 64-bit integers are not supported - Bug: http://curl.haxx.se/bug/view.cgi?id=1224 - Reported-by: Andrii Moiseiev + This fixes compilation issues with compilers that don't support 64-bit + integers through long long or __int64 which was introduced in commit + 07b66cbfa4. -- multi_runsingle: switch an if() condition for readability +- ntlm: Allow NTLM2Session messages when USE_NTRESPONSES manually defined - ... because there's an identical check right next to it so using the - operators in the check in the same order increases readability. + Previously USE_NTLM2SESSION would only be defined automatically when + USE_NTRESPONSES wasn't already defined. Separated the two definitions + so that the user can manually set USE_NTRESPONSES themselves but + USE_NTLM2SESSION is defined automatically if they don't define it. -Marc Hoersken (2 Jun 2013) -- curl_schannel.c: Removed variable unused since 35874298e4 +- smtp.c: Fixed line longer than 79 columns -- curl_setup.h: Fixed redefinition warning using mingw-w64 - -Daniel Stenberg (30 May 2013) -- multi_runsingle: add braces to clarify the code - -- libcurl-tutorial.3: remove incorrect backslash - - A single backslash in the content is not legal nroff syntax. +- config-win32.h: Don't enable Windows Crypt API if using OpenSSL - Reported and fixed by: Eric S. Raymond - Bug: http://curl.haxx.se/bug/view.cgi?id=1234 + As the OpenSSL and NSS Crypto engines are prefered by the core NTLM + routines, to the Windows Crypt API, don't define USE_WIN32_CRYPT + automatically when either OpenSSL or NSS are in use - doing so would + disable NTLM2Session responses in NTLM type-3 messages. -- curl_formadd.3: fixed wrong "end-marker" syntax +- smtp: Fixed inappropriate free of the scratch buffer - Reported and fixed by: Eric S. Raymond - Bug: http://curl.haxx.se/bug/view.cgi?id=1233 - -- curl.1: clarify that --silent still outputs data - -- Digest auth: escape user names with \ or " in them + If the scratch buffer was allocated in a previous call to + Curl_smtp_escape_eob(), a new buffer not allocated in the subsequent + call and no action taken by that call, then an attempt would be made to + try and free the buffer which, by now, would be part of the data->state + structure. - When sending the HTTP Authorization: header for digest, the user name - needs to be escaped if it contains a double-quote or backslash. + This bug was introduced in commit 4bd860a001. + +- smtp: Fixed dot stuffing when EOL characters were at end of input buffers - Test 1229 was added to verify + Fixed a problem with the CRLF. detection when multiple buffers were + used to upload an email to libcurl and the line ending character(s) + appeared at the end of each buffer. This meant any lines which started + with . would not be escaped into .. and could be interpreted as the end + of transmission string instead. - Reported and fixed by: Nach M. S - Bug: http://curl.haxx.se/bug/view.cgi?id=1230 - -- [Mike Giancola brought this change] - - ossl_recv: SSL_read() returning 0 is an error too + This only affected libcurl based applications that used a read function + and wasn't reproducible with the curl command-line tool. - SSL_read can return 0 for "not successful", according to the open SSL - documentation: http://www.openssl.org/docs/ssl/SSL_read.html + Bug: http://curl.haxx.se/bug/view.cgi?id=1456 + Assisted-by: Patrick Monnerat -- [Mike Giancola brought this change] +Daniel Stenberg (11 Dec 2014) +- telnet: fix "cast increases required alignment of target type" - ossl_send: SSL_write() returning 0 is an error too +- ntlm_wb_response: fix "statement not reached" - We found that in specific cases if the connection is abruptly closed, - the underlying socket is listed in a close_wait state. We continue to - call the curl_multi_perform, curl_mutli_fdset etc. None of these APIs - report the socket closed / connection finished. Since we have cases - where the multi connection is only used once, this can pose a problem - for us. I've read that if another connection was to come in, curl would - see the socket as bad and attempt to close it at that time - - unfortunately, this does not work for us. + ... and I could use a break instead of a goto to end the loop. - I found that in specific situations, if SSL_write returns 0, curl did - not recognize the socket as closed (or errored out) and did not report - it to the application. I believe we need to change the code slightly, to - check if ssl_write returns 0. If so, treat it as an error - the same as - a negative return code. - - For OpenSSL - the ssl_write documentation is here: - http://www.openssl.org/docs/ssl/SSL_write.html + Bug: http://curl.haxx.se/mail/lib-2014-12/0089.html + Reported-by: Tor Arntsen -- KNOWN_BUGS: curl -OJC- fails to resume +Steve Holme (10 Dec 2014) +- RELEASE-NOTES: Synced with 1cc5194337 - Bug: http://curl.haxx.se/bug/view.cgi?id=1169 + Added some bug fixes that I had missed in previous synchronisations. -- Curl_cookie_add: handle IPv6 hosts +Daniel Stenberg (10 Dec 2014) +- Curl_unix2addr: avoid using the variable name 'sun' - 1 - don't skip host names with a colon in them in an attempt to bail out - on HTTP headers in the cookie file parser. It was only a shortcut anyway - and trying to parse a file with HTTP headers will still be handled, only - slightly slower. + I suspect this causes compile failures on Solaris: - 2 - don't skip domain names based on number of dots. The original - netscape cookie spec had this oddity mentioned and while our code - decreased the check to only check for two, the existing cookie spec has - no such dot counting required. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1221 - Reported-by: Stefan Neis - -- curl_easy_setopt.3: expand the PROGRESSFUNCTION section - - Explain the callback and its arguments better and with more descriptive - text. - -- tests: add test1394 file to the tarball - -- tarball: include the xmlstream example + Bug: http://curl.haxx.se/mail/lib-2014-12/0081.html -- [David Strauss brought this change] - - xmlstream: XML stream parsing example source code +Steve Holme (10 Dec 2014) +- url.c: Fixed compilation warning when USE_NTLM is not defined - Add an XML stream parsing example using Expat. Add missing ignore for - the binary from an unrelated example. - -- [YAMADA Yasuharu brought this change] + url.c:3078: warning: variable 'credentialsMatch' set but not used - cookies: only consider full path matches - - I found a bug which cURL sends cookies to the path not to aim at. - For example: - - cURL sends a request to http://example.fake/hoge/ - - server returns cookie which with path=/hoge; - the point is there is NOT the '/' end of path string. - - cURL sends a request to http://example.fake/hogege/ with the cookie. +- parsedate.c: Fixed compilation warning - The reason for this old "feature" is because that behavior is what is - described in the original netscape cookie spec: - http://curl.haxx.se/rfc/cookie_spec.html + parsedate.c:548: warning: 'parsed' may be used uninitialized in this + function - The current cookie spec (RFC6265) clarifies the situation: - http://tools.ietf.org/html/rfc6265#section-5.2.4 - -- [Eric Hu brought this change] - - axtls: prevent memleaks on SSL handshake failures + As curl_getdate() returns -1 when parsedate() fails we can initialise + parsed to -1. -- Revert "WIN32 MemoryTracking: track wcsdup() _wcsdup() and _tcsdup() usage" +Daniel Stenberg (10 Dec 2014) +- TODO: Cache negative name resolves - This reverts commit 8ec2cb5544b86306b702484ea785b6b9596562ab. - - We don't have any code anywhere in libcurl (or the curl tool) that use - wcsdup so there's no such memory use to track. It seems to cause mild - problems with the Borland compiler though that we may avoid by reverting - this change again. - - Bug: http://curl.haxx.se/mail/lib-2013-05/0070.html - -- RELEASE-NOTES: synced with ae26ee3489588f0 + Worth exploring -Guenter Knauf (11 May 2013) -- Updated zlib version in build files. - -Daniel Stenberg (9 May 2013) -- [Renaud Guillard brought this change] +- ldap: check Curl_client_write() return codes + + There might be one or two memory leaks left in the error paths. - OS X framework: fix invalid symbolic link +- ldap: rename variables to comply to curl standards -Kamil Dudka (9 May 2013) -- [Daniel Stenberg brought this change] +Dan Fandrich (10 Dec 2014) +- sws.c: Fixed 'rc' may be used uninitialized warning - nss: give PR_INTERVAL_NO_WAIT instead of -1 to PR_Recv/PR_Send +- cookies: Improved OOM handling in cookies - Reported by: David Strauss - Bug: http://curl.haxx.se/mail/lib-2013-05/0088.html + This fixes the test 506 torture test. The internal cookie API really + ought to be improved to separate cookie parsing errors (which may be + ignored) with OOM errors (which should be fatal). -Daniel Stenberg (8 May 2013) -- libtest: gitignore more binary files - -- servercert: allow empty subject +Guenter Knauf (9 Dec 2014) +- synctime.c: fixed user-agent setting. - Bug: http://curl.haxx.se/bug/view.cgi?id=1220 - Patch by: John Gardiner Myers - -- [Steve Holme brought this change] - - tests: Added new SMTP tests to verify commit 99b40451836d + Some websites meanwhile refuse to reply to requests from ancient + browsers like IE6, therefore I've comment out this setting, but + also fixed the string to now fake IE8 if someone enables it. -- runtests.pl: support nonewline="yes" in client/stdin sections +Daniel Stenberg (9 Dec 2014) +- smb: fix unused return code warning -- build: fixed unit1394 for debug and metlink builds +Patrick Monnerat (9 Dec 2014) +- Curl_client_write() & al.: chop long data, convert data only once. -Kamil Dudka (6 May 2013) -- unit1394.c: plug the curl tool unit test in +Guenter Knauf (9 Dec 2014) +- VC build: added sspi define for winssl-zlib builds. -- [Jared Jennings brought this change] +Daniel Stenberg (9 Dec 2014) +- schannel_recv: return the correct code + + Bug: http://curl.haxx.se/bug/view.cgi?id=1462 + Reported-by: Tae Hyoung Ahn - unit1394.c: basis of a unit test for parse_cert_parameter() +- http2: avoid logging neg "failure" if h2 was not requested -- src/Makefile.am: build static lib for unit tests if enabled +- openldap: do not ignore Curl_client_write() return codes -- tool_getparam: ensure string termination in parse_cert_parameter() +- compile: warn on unused return code from Curl_client_write() -- tool_getparam: fix memleak in handling the -E option +Patrick Monnerat (8 Dec 2014) +- SMB: Fix a data size mismatch that broke SMB on big-endian platforms -- tool_getparam: describe what parse_cert_parameter() does +Steve Holme (7 Dec 2014) +- smb: Fixed Windows autoconf builds following commit eb88d778e7 - ... and de-duplicate the code initializing *passphrase - -- curl.1: document escape sequences recognized by -E + As Windows based autoconf builds don't yet define USE_WIN32_CRYPTO + either explicitly through --enable-win32-cypto or automatically on + _WIN32 based platforms, subsequent builds broke with the following + error message: + + "Can't compile NTLM support without a crypto library." -- [Jared Jennings brought this change] +- RELEASE-NOTES: Synced with 526603ff05 - curl -E: allow to escape ':' in cert nickname +- [Bill Nagel brought this change] -Marc Hoersken (5 May 2013) -- curl_schannel.c: Fixed invalid memory access during SSL shutdown + smb: Build with SSPI enabled + + Build SMB/CIFS protocol support when SSPI is enabled. -Steve Holme (4 May 2013) -- smtp: Fix trailing whitespace warning +- [Bill Nagel brought this change] -- smtp: Fix compilation warning + ntlm: Use Windows Crypt API - comparison between signed and unsigned integer expressions - -- RELEASE-NOTES: synced with 92ef5f19c801 + Allow the use of the Windows Crypt API for NTLMv1 functions. -- smtp: Updated RFC-2821 references to RFC-5321 +Dan Fandrich (7 Dec 2014) +- cookie.c: Refactored cleanup code to simplify + + Also, fixed the outdated comments on the cookie API. -- smtp: Fixed sending of double CRLF caused by first in EOB +- get_url_file_name: Fixed crash on OOM on debug build - If the mail sent during the transfer contains a terminating then - we should not send the first of the EOB as specified in RFC-5321. + This caused a null-pointer dereference which caused a few dozen + torture tests to fail. + +Steve Holme (6 Dec 2014) +- sws.c: Fixed compilation warning - Additionally don't send the if there is "no mail data" as the - DATA command already includes it. + sws.c:2191 warning: 'rc' may be used uninitialized in this function -- tests: Corrected MAIL SIZE for CRLF line endings +- ftp.c: Fixed compilation warnings when proxy support disabled - ... which was missed in commit: f5c3d9538452 + ftp.c:1827 warning: unused parameter 'newhost' + ftp.c:1827 warning: unused parameter 'newport' -- tests: Corrected infilesize for CRLF line endings +- smb: Fixed a problem with large file transfers - ... which was missed in commit: f5c3d9538452 + Fixed an issue with the message size calculation where the raw bytes + from the buffer were interpreted as signed values rather than unsigned + values. + + Reported-by: Gisle Vanem + Assisted-by: Bill Nagel -- tests: Corrected test1406 to be RFC2821 compliant +- smb: Moved the URL decoding into a separate function -- tests: Corrected test1320 to be RFC2821 compliant +- smb: Fixed URL encoded URLs not working -- tests: Corrected typo in test909 - - Introduced in commit: 514817669e9e +- Makefile.inc: Added our standard header and updated file formatting -- tests: Corrected test909 to be RFC2821 compliant +- Makefile.inc: Updated file formatting + + Aligned continuation character and used space as the separator + character as per other makefile files. -- tests: Updated test references to 909 from 1411 +- curl_md4.h: Updated copyright year following recent edit - ...and removed references to libcurl and test1406. + ...and minor layout adjustment. -- tests: Renamed test1411 to test909 as this is a main SMTP test +Patrick Monnerat (5 Dec 2014) +- SMB: Fix big endian problems. Make it OS/400 aware. -Daniel Stenberg (1 May 2013) -- [Lars Johannesen brought this change] +- OS400: enable NTLM authentication - bindlocal: move brace out of #ifdef - - The code within #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID wrongly had two - closing braces when it should only have one, so builds without that - define would fail. +Steve Holme (5 Dec 2014) +- multi.c: Fixed compilation warning - Bug: http://curl.haxx.se/mail/lib-2013-05/0000.html + multi.c:2695: warning: declaration of `exp' shadows a global declaration -Steve Holme (30 Apr 2013) -- smtp: Tidy up to move the eob counter to the per-request structure - - Move the eob counter from the smtp_conn structure to the SMTP structure - as it is associated with a SMTP payload on a per-request basis. +Guenter Knauf (5 Dec 2014) +- build: updated dependencies in makefiles. -- TODO: Updated following the addition of CURLOPT_SASL_IR +Steve Holme (5 Dec 2014) +- sasl: Corrected formatting of function descriptions -- smtp: Fixed unknown percentage complete in progress bar - - The curl command line utility would display the the completed progress - bar with a percentage of zero as the progress routines didn't know the - size of the transfer. +- sasl_gssapi: Added missing function description -Daniel Stenberg (29 Apr 2013) -- ftpserver: silence warnings +- RELEASE-NOTES: Provided better descriptions - Fix regressions in commit b56e3d43e5d. Make @data local and filter off - non-numerical digits from $testno in STATUS_imap. + As it is often difficult to choose the best description for a single + feature when it spans many commits, updated the descriptions for the + recent SMB/CIFS protocol and GSS-API additions. -Steve Holme (29 Apr 2013) -- ftpserver.pl: Corrected the imap LOGIN response - - ...to be more realistic and consistent with the other imap responses. +- sasl_sspi: Corrected some typos -- tests: Added imap STATUS command test - -- tests: Corrected the SMTP tests to be RFC2821 compliant - - The emails that are sent to the server during these tests were - incorrectly formatted as they contained one or more LF terminated lines - rather than being CRLF terminated as per Section 2.3.7 of RFC-2821. +- sasl_sspi: Don't use hard coded sizes in Kerberos V5 security data - This wasn't a problem for the test suite as the data matched the - data but anyone using these tests as reference would be sending - incorrect data to a server. + Don't use a hard coded size of 4 for the security layer and buffer size + in Curl_sasl_create_gssapi_security_message(), instead, use sizeof() as + we have done in the sasl_gssapi module. -- email: Tidy up of *_perform_authenticate() +- sasl_sspi: Free the Kerberos V5 challenge as soon as we're done with it - Removed the hard returns from imap and pop3 by using the same style for - sending the authentication string as smtp. Moved the "Other mechanisms - not supported" check in smtp to match that of imap and pop3 to provide - consistency between the three email protocols. + Reduced the amount of free's required for the decoded challenge message + in Curl_sasl_create_gssapi_security_message() as a result of coding it + differently in the sasl_gssapi module. -- smtp: Updated limit check to be more readable like the check in pop3 +- gssapi: Corrected typo in comments -- pop3: Added 255 octet limit check when sending initial response - - Added 255 octet limit check as per Section 4. Paragraph 8 of RFC-5034. +- sasl_gssapi: Added body to Curl_sasl_create_gssapi_security_message() -- DOCS: Corrected line length of recent Secure Transport changes +Daniel Stenberg (4 Dec 2014) +- [Stefan Bühler brought this change] -Nick Zitzmann (27 Apr 2013) -- darwinssl: add TLS crypto authentication + http_perhapsrewind: don't abort CONNECT requests - Users using the Secure Transport (darwinssl) back-end can now use a - certificate and private key to authenticate with a site using TLS. Because - Apple's security system is based around the keychain and does not have any - non-public function to create a SecIdentityRef data structure from data - loaded outside of the Keychain, the certificate and private key have to be - loaded into the Keychain first (using the certtool command line tool or - the Security framework's C API) before we can find it and use it. + ...they never have a body -Steve Holme (27 Apr 2013) -- Corrected version numbers after bump +- [Stefan Bühler brought this change] -Daniel Stenberg (27 Apr 2013) -- bump version + HTTP: Free (proxy)userpwd for NTLM/Negotiate after sending a request - Since we're adding new stuff, the next release will bump the minor - version and we're looking forward to 7.31.0 + Sending NTLM/Negotiate header again after successful authentication + breaks the connection with certain Proxies and request types (POST to MS + Forefront). -Steve Holme (27 Apr 2013) -- RELEASE-NOTES: synced with f4e6e201b146 +- [Stefan Bühler brought this change] -- DOCS: Updated following the addition of CURLOPT_SASL_IR + HTTP: don't abort connections with pending Negotiate authentication - Documented the the option in curl_easy_setopt() and added it to - symbols-in-versions. + ... similarly to how NTLM works as Negotiate is in fact often NTLM with + another name. -- tests: Corrected command line arguments in test907 and test908 +- [Stefan Bühler brought this change] -- tests: Added SMTP AUTH with initial response tests + fix gdb libtool invocation path -- tests: Updated SMTP tests to decouple client initial response - - Updated test903 and test904 following the addition of CURLOPT_SASL_IR - as the default behaviour of SMTP AUTH responses is now to not include - the initial response. New tests with --sasl-ir support to follow. +Steve Holme (4 Dec 2014) +- sasl_gssapi: Fixed missing include from commit d3cca934ee -- imap: Added support for overriding the SASL initial response - - In addition to checking for the SASL-IR capability the user can override - the sending of the client's initial response in the AUTHENTICATION - command with the use of CURLOPT_SASL_IR should the server erroneously - not report SASL-IR when it does support it. - -- smtp: Added support for disabling the SASL initial response - - Updated the default behaviour of sending the client's initial response in the AUTH - command to not send it and added support for CURLOPT_SASL_IR to allow the user to - specify including the response. - - Related Bug: http://curl.haxx.se/mail/lib-2012-03/0114.html - Reported-by: Gokhan Sengun +Daniel Stenberg (4 Dec 2014) +- [Jay Satiro brought this change] -- pop3: Added support for enabling the SASL initial response + examples: remove sony.com from 10-at-a-time - Allowed the user to specify whether to send the client's intial response - in the AUTH command via CURLOPT_SASL_IR. + Prior to this change the 10-at-a-time example showed CURLE_RECV_ERROR + for the sony website because it ends the connection when the request is + missing a user agent. -- sasl-ir: Added --sasl-ir option to curl command line tool +Steve Holme (4 Dec 2014) +- sasl_gssapi: Fixed missing decoding debug failure message -- sasl-ir: Added CURLOPT_SASL_IR to enable/disable the SASL initial response +- sasl_gssapi: Fixed honouring of no mutual authentication -Daniel Stenberg (26 Apr 2013) -- curl_easy_init: use less mallocs - - By introducing an internal alternative to curl_multi_init() that accepts - parameters to set the hash sizes, easy handles will now use tiny socket - and connection hash tables since it will only ever add a single easy - handle to that multi handle. - - This decreased the number mallocs in test 40 (which is a rather simple - and typical easy interface use case) from 1142 to 138. The maximum - amount of memory allocated used went down from 118969 to 78805. +- sasl_sspi: Added more Kerberos V5 decoding debug failure messages -Steve Holme (26 Apr 2013) -- ftpserver.pl: Fixed imap logout confirmation data - - An IMAP server should response with the BYE continuation response before - confirming the LOGOUT command was successful. +Daniel Stenberg (4 Dec 2014) +- [Anthon Pang brought this change] -Daniel Stenberg (26 Apr 2013) -- ftp_state_pasv_resp: connect through proxy also when set by env - - When connecting back to an FTP server after having sent PASV/EPSV, - libcurl sometimes didn't use the proxy properly even though the proxy - was used for the initial connect. + docs: Fix FAILONERROR typos - The function wrongly checked for the CURLOPT_PROXY variable to be set, - which made it act wrongly if the proxy information was set with an - environment variable. + It returns error for >= 400 HTTP responses. - Added test case 711 to verify (based on 707 which uses --socks5). Also - added test712 to verify another variation of setting the proxy: with - --proxy socks5:// - - Bug: http://curl.haxx.se/bug/view.cgi?id=1218 - Reported-by: Zekun Ni + Bug: https://github.com/bagder/curl/pull/129 -Kamil Dudka (26 Apr 2013) -- [Zdenek Pavlas brought this change] +- [Peter Wu brought this change] - url: initialize speed-check data for file:// protocol + tool: fix CURLOPT_UNIX_SOCKET_PATH in --libcurl output - ... in order to prevent an artificial timeout event based on stale - speed-check data from a previous network transfer. This commit fixes - a regression caused by 9dd85bced56f6951107f69e581c872c1e7e3e58e. + Mark CURLOPT_UNIX_SOCKET_PATH as string to ensure that it ends up as + option in the file generated by --libcurl. - Bug: https://bugzilla.redhat.com/906031 + Signed-off-by: Peter Wu -Daniel Stenberg (25 Apr 2013) -- test709: clarify the test in the name +- [Peter Wu brought this change] -- sshserver: disable StrictHostKeyChecking + opts: fix CURLOPT_UNIX_SOCKET_PATH formatting - I couldn't figure out why the host key logic isn't working, but having - it set to yes prevents my SSH-based test cases to run. I also don't see - a strong need to use strict host key checking on this test server. + Add .nf and .fi such that the code gets wrapped in a pre on the web. + Fixed grammar, fixed formatting of the "See also" items. - So I disabled it. + Signed-off-by: Peter Wu -- runtests: log more commands in verbose mode - - ... to aid tracking down failures +Patrick Monnerat (4 Dec 2014) +- OS400: enable Unix sockets. -Steve Holme (25 Apr 2013) -- TODO: Corrected copy/paste typo +Daniel Stenberg (3 Dec 2014) +- RELEASE-NOTES: synced with b216427e73b5e9 -- TODO: Added new ideas for future SMTP, POP3 and IMAP features +- opts: added CURLOPT_UNIX_SOCKET_PATH to Makefile.am -- TODO: Updated following the addition of ;auth= support +- updateconninfo: clear destination struct before getsockname() + + Otherwise we may read uninitialized bytes later in the unix-domain + sockets case. -- DOCS: Minor rewording / clarification of host name protocol detection +- curl.1: added --unix-socket -- RELEASE-NOTES: synced with a8c92cb60890 +- [Peter Wu brought this change] -- DOCS: Added reference to IETF draft for SMTP URL Interface + tool: add --unix-socket option - ...when mentioning login options. Additional minor clarification of - "Windows builds" to be "Windows builds with SSPI"as a way of enabling - NTLM as Windows builds may be built with OpenSSL to enable NTLM or - without NTLM support altogether. - -Linus Nielsen Feltzing (23 Apr 2013) -- HISTORY: Fix spelling error. - -Steve Holme (23 Apr 2013) -- DOCS: Reworked the scheme calculation explanation under CURLOPT_URL + Signed-off-by: Peter Wu -- url: Added smtp and pop3 hostnames to the protocol detection list +- [Peter Wu brought this change] -Daniel Stenberg (23 Apr 2013) -- HISTORY: correct some years/dates + libcurl: add UNIX domain sockets support - Thanks to archive.org's wayback machine I updated this document with - some facts from the early httpget/urlget web page: + The ability to do HTTP requests over a UNIX domain socket has been + requested before, in Apr 2008 [0][1] and Sep 2010 [2]. While a + discussion happened, no patch seems to get through. I decided to give it + a go since I need to test a nginx HTTP server which listens on a UNIX + domain socket. - http://web.archive.org/web/19980216125115/http://www.inf.ufrgs.br/~sagula/urlget.html - -- [Alessandro Ghedini brought this change] - - tests: add test1511 to check timecond clean-up + One patch [3] seems to make it possible to use the + CURLOPT_OPENSOCKETFUNCTION function to gain a UNIX domain socket. + Another person wrote a Go program which can do HTTP over a UNIX socket + for Docker[4] which uses a special URL scheme (though the name contains + cURL, it has no relation to the cURL library). - Verifies the timecond fix in commit c49ed0b6c0f - -- [Alessandro Ghedini brought this change] - - getinfo.c: reset timecond when clearing session-info variables + This patch considers support for UNIX domain sockets at the same level + as HTTP proxies / IPv6, it acts as an intermediate socket provider and + not as a separate protocol. Since this feature affects network + operations, a new feature flag was added ("unix-sockets") with a + corresponding CURL_VERSION_UNIX_SOCKETS macro. - Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=705783 - Reported-by: Ludovico Cavedon - -Steve Holme (22 Apr 2013) -- DOCS: Added information about login options to CURLOPT_USERPWD - -- DOCS: Added information about login options in the URL - -- url: Fixed missing length check in parse_proxy() + A new CURLOPT_UNIX_SOCKET_PATH option is added and documented. This + option enables UNIX domain sockets support for all requests on the + handle (replacing IP sockets and skipping proxies). - Commit 11332577b3cb removed the length check that was performed by the - old scanf() code. - -- url: Fixed crash when no username or password supplied for proxy + A new configure option (--enable-unix-sockets) and CMake option + (ENABLE_UNIX_SOCKETS) can disable this optional feature. Note that I + deliberately did not mark this feature as advanced, this is a + feature/component that should easily be available. - Fixed an issue in parse_proxy(), introduced in commit 11332577b3cb, - where an empty username or password (For example: http://:@example.com) - would cause a crash. - -- url: Removed unused text length constants + [0]: http://curl.haxx.se/mail/lib-2008-04/0279.html + [1]: http://daniel.haxx.se/blog/2008/04/14/http-over-unix-domain-sockets/ + [2]: http://sourceforge.net/p/curl/feature-requests/53/ + [3]: http://curl.haxx.se/mail/lib-2008-04/0361.html + [4]: https://github.com/Soulou/curl-unix-socket + + Signed-off-by: Peter Wu -- url: Updated proxy URL parsing to use parse_login_details() +- [Peter Wu brought this change] -- url: Tidy up of setstropt_userpwd() parameters + tests: add two HTTP over UNIX socket tests - Updated the naming convention of the login parameters to match those of - other functions. - -- url: Tidy up of code and comments following recent changes + test1435: a simple test that checks whether a HTTP request can be + performed over the UNIX socket. The hostname/port are interpreted + by sws and should be ignored by cURL. - Tidy up of variable names and comments in setstropt_userpwd() and - parse_login_details(). - -- url: Simplified setstropt_userpwd() following recent changes + test1436: test for the ability to do two requests to the same host, + interleaved with one to a different hostname. - There is no need to perform separate clearing of data if a NULL option - pointer is passed in. Instead this operation can be performed by simply - not calling parse_login_details() and letting the rest of the code do - the work. + Signed-off-by: Peter Wu -- url: Correction to scope of if statements when setting data +- [Peter Wu brought this change] -- url: Fixed memory leak in setstropt_userpwd() + tests: add HTTP UNIX socket server testing support - setstropt_userpwd() was calling setstropt() in commit fddb7b44a79d to - set each of the login details which would duplicate the strings and - subsequently cause a memory leak. - -- RELEASE-NOTES: synced with d535c4a2e1f7 + The variable `$ipvnum` can now contain "unix" besides the integers 4 + and 6 since the variable. Functions which receive this parameter + have their `$port` parameter renamed to `$port_or_path` to support a + path to the UNIX domain socket (as a "port" is only meaningful for TCP). + + Signed-off-by: Peter Wu -- url: Added overriding of URL login options from CURLOPT_USERPWD +- [Peter Wu brought this change] -- tool_paramhlp: Fixed options being included in username + sws: try to remove socket and retry bind - Fix to prevent the options from being displayed when curl requests the - user's password if the following command line is specified: + If sws is killed it might leave a stale socket file on the filesystem + which would cause an EADDRINUSE error. After this patch, it is checked + whether the socket is really stale and if so, the socket file gets + removed and another bind is executed. - --user username;options + Signed-off-by: Peter Wu + +- [Peter Wu brought this change] -- url: Added support for parsing login options from the CURLOPT_USERPWD + sws: add UNIX domain socket support - In addition to parsing the optional login options from the URL, added - support for parsing them from CURLOPT_USERPWD, to allow the following - supported command line: + This extends sws with a --unix-socket option which causes the port to + be ignored (as the server now listens on the path specified by + --unix-socket). This feature will be available in the following patch + that enables checking for UNIX domain socket support. - --user username:password;options - -- url: Added bounds checking to parse_login_details() + Proxy support (CONNECT) is not considered nor tested. It does not make + sense anyway, first connecting through a TCP proxy, then let that TCP + proxy connect to a UNIX socket. - Added bounds checking when searching for the separator characters within - the login string as this string may not be NULL terminated (For example - it is the login part of a URL). We do this in preference to allocating a - new string to copy the login details into which could then be passed to - parse_login_details() for performance reasons. - -- url: Added size_t cast to pointer based length calculations + Signed-off-by: Peter Wu -- url: Corrected minor typo in comment +- [Peter Wu brought this change] -Daniel Stenberg (18 Apr 2013) -- CURL_CHECK_CA_BUNDLE: don't check for paths when cross-compiling + sws: restrict TCP_NODELAY to IP sockets - When cross-compiling we can't scan and detect existing files or paths. + TCP_NODELAY does not make sense for Unix sockets, so enable it only if + the socket is using IP. - Bug: http://curl.haxx.se/mail/lib-2013-04/0294.html + Signed-off-by: Peter Wu -- [Ishan SinghLevett brought this change] +Dan Fandrich (3 Dec 2014) +- [Dave Reisner brought this change] - usercertinmem.c: add example showing user cert in memory - - Relies on CURLOPT_SSL_CTX_FUNCTION, which is OpenSSL specific + curl.1: fix trivial typo -Steve Holme (18 Apr 2013) -- url: Fix chksrc longer than 79 columns warning +Steve Holme (3 Dec 2014) +- sasl_gssapi: Added body to Curl_sasl_create_gssapi_user_message() -- url: Fix incorrect variable type for result code +- sasl_gssapi: Added body to Curl_sasl_gssapi_cleanup() -- url: Fix compiler warning +- sasl_gssapi: Added Curl_sasl_build_gssapi_spn() function - signed and unsigned type in conditional expression + Added helper function for returning a GSS-API compatible SPN. -- url: Moved parsing of login details out of parse_url_login() +Daniel Stenberg (3 Dec 2014) +- NSS: enable the CAPATH option - Separated the parsing of login details from the processing of them in - parse_url_login() ready for use by setstropt_userpwd(). + Bug: http://curl.haxx.se/bug/view.cgi?id=1457 + Patch-by: Tomasz Kojm -- url: Re-factored set_userpass() and parse_url_userpass() - - Re-factored these functions to reflect their new behaviour following the - addition of login options. +Steve Holme (3 Dec 2014) +- sasl_gssapi: Enable USE_KERBEROS5 for GSS-API based builds -- url: Reworked URL parsing to allow overriding by CURLOPT_USERPWD +- sasl_gssapi: Added GSS-API based Kerberos V5 variables -Daniel Stenberg (18 Apr 2013) -- maketgz: make bzip2 creation work with Parallel BZIP2 too +- sws.c: Fixed compilation warning when IPv6 is disabled - Apparently the previous usage didn't work with that implementation, - while this updated version works with at least both Parallel BZIP2 - v1.1.8 and regular bzip "Version 1.0.6, 6-Sept-2010". + sws.c:69: warning: comma at end of enumerator list -Linus Nielsen Feltzing (18 Apr 2013) -- Add tests/http_pipe.py to the tarball build +- sasl_gssapi: Made log_gss_error() a common GSS-API function + + Made log_gss_error() a common function so that it can be used in both + the http_negotiate code as well as the curl_sasl_gssapi code. -Steve Holme (16 Apr 2013) -- smtp: Re-factored all perform based functions +- sasl_gssapi: Introduced GSS-API based SASL module - Standardised the naming of all perform based functions to be in the form - smtp_perform_something(). + Added the initial version of curl_sasl_gssapi.c and updated the project + files in preparation for adding GSS-API based Kerberos V5 support. -- smtp: Added description comments to all perform based functions +- smb: Don't try to connect with empty credentials + + On some platforms curl would crash if no credentials were used. As such + added detection of such a use case to prevent this from happening. + + Reported-by: Gisle Vanem -- smtp: Moved smtp_quit() to be with the other perform functions +- smb.c: Coding policing of pointer usage -- smtp: Moved smtp_rcpt_to() to be with the other perform functions +- configure: Fixed inclusion of SMB when no crypto engines available -- smtp: Moved smtp_mail() to be with the other perform functions +Guenter Knauf (1 Dec 2014) +- build: in Makefile.m32 simplified autodetection. -Daniel Stenberg (16 Apr 2013) -- [Wouter Van Rooy brought this change] +Daniel Stenberg (30 Nov 2014) +- [Peter Wu brought this change] - curl-config: don't output static libs when they are disabled + sws: move away from IPv4/IPv4-only assumption - Curl-config outputs static libraries even when they are disabled in - configure. + Instead of depending the socket domain type on use_ipv6, specify the + domain type (AF_INET / AF_INET6) as variable. An enum is used here with + switch to avoid compiler warnings in connect_to, complaining that rc + is possibly undefined (which is not possible as socket_domain is + always set). - This causes problems with the build of pycurl. - -- [Dave Reisner brought this change] - - docs/libcurl: fix formatting in manpage + Besides abstracting the socket type, make the debugging messages be + independent on IP (introduce location_str which points to "port XXXXX"). + Rename "ipv_inuse" to "socket_type" and tighten the scope (main). - Commit c3ea3eb6 introduced some minor cosmetic errors in - curl_mutli_socket_action(3). + Signed-off-by: Peter Wu -- [Paul Howarth brought this change] +- [Peter Wu brought this change] - Add extra libs for lib1900 and lib2033 test programs + lib/connect: restrict IP/TCP options to said sockets - These are needed in cases where clock_gettime is used, from librt. - -Dan Fandrich (15 Apr 2013) -- FAQ: mention that the network connection can be monitored + This patch prepares for adding UNIX domain sockets support. - Also note the prohibition on sharing handles across threads. - -Steve Holme (15 Apr 2013) -- pop3: Added missing comment for pop3_state_apop_resp() - -- smtp: Updated the coding style of smtp_state_servergreet_resp() + TCP_NODELAY and TCP_KEEPALIVE are specific to TCP/IP sockets, so do not + apply these to other socket types. bindlocal only works for IP sockets + (independent of TCP/UDP), so filter that out too for other types. - Updated the coding style, in this function, to be consistant with other - response functions rather then performing a hard return on failure. + Signed-off-by: Peter Wu -- pop3: Updated the coding style of pop3_state_servergreet_resp() +- smb.c: use size_t as input argument types for msg sizes - Updated the coding style, in this function, to be consistent with other - response functions rather then performing a hard return on failure. + This fixes warnings about conversions to int -- pop3: Re-factored all perform based functions - - Standardised the naming of all perform based functions to be in the form - pop3_perform_something() following the changes made to IMAP. +Steve Holme (30 Nov 2014) +- version: The next release will become 7.40.0 -- pop3: Added description comments to all perform based functions +- [Bill Nagel brought this change] -- pop3: Moved pop3_quit() to be with the other perform functions + docs: Updated for the SMB protocol + + This patch updates the documentation for the SMB/CIFS protocol. -- pop3: Moved pop3_command() to be with the other perform functions +- curl tool: Exclude SMB from the protocol redirect - Started to apply the same tidy up to the POP3 code as applied to the - IMAP code in the 7.30.0 release. + As local files could be accessed through \\localhost\c$. -- RELEASE-NOTES: Removed erroneous spaces +- [Bill Nagel brought this change] -- RELEASE-NOTES: synced with 8723cade21fb + curl tool: Enable support for the SMB protocol + + This patch enables SMB/CIFS support in the curl command-line tool. -- smtp: Added support for ;auth= in the URL +- smb.c: Fixed compilation warnings - Added support for specifying the preferred authentication mechanism in - the URL as per Internet-Draft 'draft-earhart-url-smtp-00'. + smb.c:398: warning: comparison of integers of different signs: + 'ssize_t' (aka 'long') and 'unsigned long' + smb.c:443: warning: comparison of integers of different signs: + 'ssize_t' (aka 'long') and 'unsigned long' -- pop3: Reworked authentication type constants +- libcurl: Exclude SMB from the protocol redirect - ... to use left-shifted values, like those defined in curl.h, rather - than 16-bit hexadecimal values. + As local files could be accessed through \\localhost\c$. -- pop3: Small consistency tidy up +- [Bill Nagel brought this change] -- pop3: Added support for ;auth= in the URL + libcurl: Enable support for the SMB protocol - Added support for specifying the preferred authentication type and SASL - mechanism in the URL as per RFC-2384. + This patch enables SMB/CIFS support in libcurl. -- imap: Added support for ;auth= in the URL +- smb.c: Fixed compilation warnings - Added support for specifying the preferred authentication mechanism in - the URL as per RFC-5092. + smb.c:322: warning: conversion to 'short unsigned int' from 'unsigned + int' may alter its value + smb.c:323: warning: conversion to 'short unsigned int' from 'unsigned + int' may alter its value + smb.c:482: warning: conversion to 'short unsigned int' from 'int' may + alter its value + smb.c:521: warning: conversion to 'unsigned int' from 'curl_off_t' may + alter its value + smb.c:549: warning: conversion to 'unsigned int' from 'curl_off_t' may + alter its value + smb.c:550: warning: conversion to 'short unsigned int' from 'int' may + alter its value -- sasl: Reworked SASL mechanism constants +- smb.c: Renamed SMB command message variables to avoid compiler warnings - ... to use left-shifted values, like those defined in curl.h, rather - than 16-bit hexadecimal values. + smb.c:489: warning: declaration of 'close' shadows a global declaration + smb.c:511: warning: declaration of 'read' shadows a global declaration + smb.c:528: warning: declaration of 'write' shadows a global declaration -- sasl: Added predefined preferred mechanism values +- smb.c: Fixed compilation warnings - In preparation for the upcoming changes to IMAP, POP3 and SMTP added - preferred mechanism values. + smb.c:212: warning: unused parameter 'done' + smb.c:380: warning: ISO C does not allow extra ';' outside of a function + smb.c:812: warning: unused parameter 'premature' + smb.c:822: warning: unused parameter 'dead' -- url: Added support for parsing login options from the URL - - As well as parsing the username and password from the URL, added support - for parsing the optional options part from the login details, to allow - the following supported URL format: +- smb.c: Fixed compilation warnings - schema://username:password;options@example.com/path?q=foobar + smb.c:311: warning: conversion from 'unsigned __int64' to 'u_short', + possible loss of data + smb.c:425: warning: conversion from '__int64' to 'unsigned short', + possible loss of data + smb.c:452: warning: conversion from '__int64' to 'unsigned short', + possible loss of data + +- smb.c: Fixed compilation warnings - This will only be used by IMAP, POP3 and SMTP at present but any - protocol that may be given login options in the URL will be able to - add support for them. + smb.c:162: error: comma at end of enumerator list + smb.c:469: warning: conversion from 'size_t' to 'unsigned short', + possible loss of data + smb.c:517: warning: conversion from 'curl_off_t' to 'unsigned int', + possible loss of data + smb.c:545: warning: conversion from 'curl_off_t' to 'unsigned int', + possible loss of data -- smtp: Fix compiler warning +- [Bill Nagel brought this change] + + smb: Added initial SMB functionality - warning: unused variable 'smtp' introduced in commit 73cbd21b5ee6. + Initial implementation of the SMB/CIFS protocol. -- smtp: Moved parsing of url path into separate function +- [Bill Nagel brought this change] -Daniel Stenberg (12 Apr 2013) -- FTP: handle a 230 welcome response + smb: Added SMB handler interfaces - ...instead of the 220 we otherwise expect. + Added the SMB and SMBS handler interface structures and associated + functions required for SMB/CIFS operation. + +- transfer: Code style policing - Made the ftpserver.pl support sending a custom "welcome" and then - created test 1219 to verify this fix with such a 230 welcome. + Prefer ! rather than NULL in if statements, added comments and updated + function spacing, argument spacing and line spacing to be more readble. + +- transfer: Fixed existing scratch buffer being checked for NULL twice - Bug: http://curl.haxx.se/mail/lib-2013-02/0102.html - Reported by: Anders Havn + If the scratch buffer already existed when the CRLF conversion was + performed then the buffer pointer would be checked twice for NULL. This + second check is only necessary if the call to malloc() was performed by + the first check. -- configure: try pthread_create without -lpthread +- smtp: Fixed dot stuffing being performed when no new data read - For libc variants without a spearate pthread lib (like bionic), try - using pthreads without the pthreads lib first and only if that fails try - the -lpthread linker flag. + Whilst I had moved the dot stuffing code from being performed before + CRLF conversion takes place to after it, in commit 4bd860a001, I had + moved it outside the 'when something read' block of code when meant + it could perform the dot stuffing twice on partial send if nread + happened to contain the right values. It also meant the function could + potentially read past the end of buffer. This was highlighted by the + following warning: - Bug: http://curl.haxx.se/bug/view.cgi?id=1216 - Reported by: Duncan + warning: `nread' might be used uninitialized in this function -- FTP: access files in root dir correctly - - Accessing a file with an absolute path in the root dir but with no - directory specified was not handled correctly. This fix comes with four - new test cases that verify it. +Daniel Stenberg (29 Nov 2014) +- smb.h: fixed picky compiler warning - Bug: http://curl.haxx.se/mail/lib-2013-04/0142.html - Reported by: Sam Deane + smb.h:30:16: error: comma at end of enumerator list [-Werror=pedantic] -Steve Holme (12 Apr 2013) -- pop3: Reworked the function description for Curl_pop3_write() +Steve Holme (29 Nov 2014) +- tests: Disable test 1013 until SMB is fully added -- pop3: Added function description to pop3_parse_custom_request() +- [Bill Nagel brought this change] -- pop3: Moved utility functions to end of pop3.c + smb: Added SMB protocol and port definitions + + Added the necessary protocol and port definitions in order to support + SMB/CIFS. -Nick Zitzmann (12 Apr 2013) -- darwinssl: add TLS session resumption +- [Bill Nagel brought this change] + + smb: Added internal SMB definitions and structures - This ought to speed up additional TLS handshakes, at least in theory. + Added the internal definitions and structures necessary for SMB/CIFS + support. -Steve Holme (12 Apr 2013) -- imap: Added function description to imap_parse_custom_request() +- [Bill Nagel brought this change] -- imap: Moved utility functions to end of imap.c (Part 3/3) + smb: Added SMB connection structure - Moved imap_is_bchar() be with the other utility based functions. + Added the connection structure that will be required in urldata.h for + SMB/CIFS based connections. + +- [Bill Nagel brought this change] -- imap: Moved utility functions to end of imap.c (Part 2/3) + smb: Added initial source files for SMB - Moved imap_parse_url_path() and imap_parse_custom_request() to the end of the - file allowing all utility functions to be grouped together. + Added the initial source files and updated the relevant project files in + order to support SMB/CIFS. -- imap: Moved utility functions to end of imap.c (Part 1/3) +- [Bill Nagel brought this change] + + smb: Added configuration options for SMB - Moved imap_atom() and imap_sendf() to the end of the file allowing all - utility functions to be grouped together. + Added --enable-smb and --disable-smb configuration options for the + upcoming SMB/CIFS protocol support. -- imap: Corrected function description for imap_connect() +Daniel Stenberg (28 Nov 2014) +- [Peter Wu brought this change] -Kamil Dudka (12 Apr 2013) -- tests: prevent test206, test1060, and test1061 from failing + runtests.pl: fix startup of IPv6 servers + + Commit curl-7_23_1-143-g8218064 changed the parameter of + responsive_http_server to accept types other than IPv6 (converting + from a boolean to a string), but only considered the lower-case "ipv6" + and not the "IPv6" variant. This caused all servers to start in IPv4 + mode instead. - ... in case runtests.pl is invoked with non-default -b option + This patch converts the remaining cases to "ipv6". While not strictly + necessary for the run*server variants, these got also converted for + consistency and to prevent future errors. - Fixes a regression caused by 1e29d275c643ef6aab7948f0f55a7a9397e56b42. + Signed-off-by: Peter Wu -Daniel Stenberg (12 Apr 2013) -- [David Strauss brought this change] +- [Peter Wu brought this change] - libcurl-share.3: update what it does and does not share. + runtests.pl: fix warning message, remove duplicate value - Update sharing interface documentation to provide exhaustive list of - what it does and does not share. + Signed-off-by: Peter Wu -- THANKS: remove duplicated names +Steve Holme (27 Nov 2014) +- http.c: Fixed compilation warnings from features being disabled + + warning: unused variable 'data' + warning: variable 'addcookies' set but not used + + ...and some very minor coding style policing. -- bump: start working towards next release +- RELEASE-NOTES: Synced with c5399c827d -- THANKS: added people from the 7.30.0 RELEASE-NOTES +- tests: Added SMTP with --crlf test case -Version 7.30.0 (12 Apr 2013) +- docs: Updated for commit 4bd860a001 and SMTP Unix line ending conversion -Daniel Stenberg (12 Apr 2013) -- RELEASE-NOTES: cleaned up for 7.30 (synced with 5c5e1a1cd20) +- smtp: Fixed const'ness of nread parameter in Curl_smtp_escape_eob() - Most notable the security advisory: - http://curl.haxx.se/docs/adv_20130412.html + ...and some comment typos! -- test1218: another cookie tailmatch test +- smtp: Added support for the conversion of Unix newlines during mail send - ... and make 1216 also verify it with a file input + Added support for the automatic conversion of Unix newlines to CRLF + during mail uploads. - These tests verify commit 3604fde3d3c9b0d, the fix for the "cookie - domain tailmatch" vulnerability. See - http://curl.haxx.se/docs/adv_20130412.html + Feature: http://curl.haxx.se/bug/view.cgi?id=1456 -- [YAMADA Yasuharu brought this change] +- CURLOPT_CRLF.3: Fixed inclusion of SMTP in listed protocols - cookie: fix tailmatching to prevent cross-domain leakage - - Cookies set for 'example.com' could accidentaly also be sent by libcurl - to the 'bexample.com' (ie with a prefix to the first domain name). +Daniel Stenberg (25 Nov 2014) +- curl*3: added small examples - This is a security vulnerabilty, CVE-2013-1944. - - Bug: http://curl.haxx.se/docs/adv_20130412.html + and some minor edits -Guenter Knauf (11 Apr 2013) -- Enabled MinGW sync resolver builds. +- libcurl.3: fix formatting + + refer to functions with the man page section properly -Yang Tse (10 Apr 2013) -- if2ip.c: fix compiler warning +- man pages: SEE ALSO curl_multi_wait -Guenter Knauf (10 Apr 2013) -- Fixed lost OpenSSL output with "-t" - followup. - - The previously applied patch didnt work on Windows; we cant rely - on shell commands like 'echo' since they act diffently on each - platform and each shell. - In order to keep this script platform-independent the code must - only use pure Perl. +- curl_multi_wait.3: clarify numfds being used if not NULL -Daniel Stenberg (9 Apr 2013) -- test1217: verify parsing 257 responses with "rubbish" before path +- multi-single.c: switch to use curl_multi_wait - Test 1217 verifies commit e0fb2d86c9f78, and without that change this - test fails. + Makes the example much easier and straight-forward! -- [Bill Middlecamp brought this change] +- testcurl: bump the version of this script! - FTP: handle "rubbish" in front of directory name in 257 responses +- testcurl: skip reading the setup file if given enough cmdline info - When doing PWD, there's a 257 response which apparently some servers - prefix with a comment before the path instead of after it as is - otherwise the norm. - - Failing to parse this, several otherwise legitimate use cases break. + This makes it much easier to run multiple tests in the same directory, + just altering the command lines used. + +- select.c: fix compilation for VxWorks - Bug: http://curl.haxx.se/mail/lib-2013-04/0113.html + Reported-by: Brian + Bug: http://curl.haxx.se/bug/view.cgi?id=1455 -Guenter Knauf (9 Apr 2013) -- Fixed ares-enabled builds with static makefiles. +Patrick Monnerat (24 Nov 2014) +- [moparisthebest brought this change] -- Fixed lost OpenSSL output with "-t". - - The OpenSSL pipe wrote to the final CA bundle file, but the encoded PEM - output wrote to a temporary file. Consequently, the OpenSSL output was - lost when the temp file was renamed to the final file at script finish - (overwriting the final file written earlier by openssl). - Patch posted to the list by Richard Michael (rmichael edgeofthenet org). + SSL: Add PEM format support for public key pinning -Daniel Stenberg (9 Apr 2013) -- test1216: test tailmatching cookie domains +Kamil Dudka (24 Nov 2014) +- Revert "repository: ignore patch files generated by git" - This test is an attempt to repeat the problem YAMADA Yasuharu reported - at http://curl.haxx.se/mail/lib-2013-04/0108.html - -- RELEASe-NOTES: synced with 29fdb2700f797 + This reverts commit 217024a687ce86eb6d2317822ed81c7e5abc4b61. - added "tcpkeepalive on Mac OS X" + Bug: https://github.com/bagder/curl/commit/217024a6#commitcomment-8693738 -Nick Zitzmann (8 Apr 2013) -- darwinssl: disable insecure ciphers by default +Steve Holme (23 Nov 2014) +- multi.c: Fixed compilation warnings when no verbose string support - I noticed that aria2's SecureTransport code disables insecure ciphers such - as NULL, anonymous, IDEA, and weak-key ciphers used by SSLv3 and later. - That's a good idea, and now we do the same thing in order to prevent curl - from accessing a "secure" site that only negotiates insecure ciphersuites. + warning: variable 'connection_id' set but not used + warning: unused parameter 'lineno' + +- RELEASE-NOTES: Synced with 1450712e76 + +- sasl: Tidied up some parameter comments -Daniel Stenberg (8 Apr 2013) -- [Robert Wruck brought this change] +- sasl: Reduced the need for two sets of NTLM functions - tcpkeepalive: Support CURLOPT_TCP_KEEPIDLE on OSX - - MacOS X doesn't have TCP_KEEPIDLE/TCP_KEEPINTVL but only a single - TCP_KEEPALIVE (see - http://developer.apple.com/library/mac/#DOCUMENTATION/Darwin/Reference/ManPages/man4/tcp.4.html). - Here is a patch for CURLOPT_TCP_KEEPIDLE on OSX platforms. +- ntlm: Moved NSS initialisation to base decode function -- configure: remove CURL_CHECK_FUNC_RECVFROM - - 1 - We don't use the results from the test and we never did. recvfrom() - is only used by the TFTP code and it has not caused any problems. +- http_ntlm: Fixed additional NSS initialisation call when decoding type-2 - 2 - the CURL_CHECK_FUNC_RECVFROM function is extremely slow + After commit 48d19acb7c the HTTP code would call Curl_nss_force_init() + twice when decoding a NTLM type-2 message, once directly and the other + through the call to Curl_sasl_decode_ntlm_type2_message(). -Steve Holme (8 Apr 2013) -- RELEASE-NOTES: Corrected duplicate NTLM memory leaks +- ntlm: Fixed static'ness of local decode function -- RELEASE-NOTES: Removed trailing full stop +- ntlm: Corrected some parameter names and comments -Daniel Stenberg (8 Apr 2013) -- [Fabian Keil brought this change] +- runtests.pl: Re-aligned feature support comments - proxy: make ConnectionExists() check credential of proxyconnections too +- runtests.pl: Use Kerberos and SPNEGO as proxies for the crypto feature - Previously it only compared credentials if the requested needle - connection wasn't using a proxy. This caused NTLM authentication - failures when using proxies as the authentication code wasn't send on - the connection where the challenge arrived. + In addition to NTLM, use Kerberos and SPNEGO as proxies to the crypto + feature. - Added test 1215 to verify: NTLM server authentication through a proxy - (This is a modified copy of test 67) + ...and converted tab characters, from commit 4b4e8a5853, to spaces. -- RELEASE-NOTES: sync with 704a5dfca9 +- runtests.pl: Added support for SPNEGO -- TODO-RELEASE: cleaned up, not really maintained lately +- runtests.pl: Added Kerberos detection -Marc Hoersken (7 Apr 2013) -- if2ip.c: Fixed another warning: unused parameter 'remote_scope' +- runtests.pl: Added GSS-API detection -Daniel Stenberg (7 Apr 2013) -- [Marc Hoersken brought this change] +- FILEFORMAT: Added SSPI, GSS-API and Kerberos to the features list - cookie.c: Made cookie sort function more deterministic +- FILEFORMAT: Added test requires feature not present information - Since qsort implementations vary with regards to handling the order - of similiar elements, this change makes the internal sort function - more deterministic by comparing path length first, then domain length - and finally the cookie name. Spotted with testcase 62 on Windows. + Such as !SSPI as we do for the NTLM and Digest tests. -Marc Hoersken (7 Apr 2013) -- curl_schannel.c: Follow up on memory leak fix ae4558d +Daniel Stenberg (20 Nov 2014) +- http.c: log if it notices HTTP 1.1 after a upgrade to http2 -- Revert "getpart.pm: Strip carriage returns to fix Windows support" - - This reverts commit e51b23c925a2721cf7c29b2b376d3d8903cfb067. - As discussed on the mailinglist, this was not the correct approach. +- test1801: first real http2 test case -- http_negotiate.c: Fixed passing argument from incompatible pointer type +- sws: initial tiny steps toward http2 support -- ftp.c: Added missing brackets around ABOR command logic +- FILEFORMAT: mention the new upgrade support -- sockfilt.c: Fixed detection of client-side connection close +- test1800: first plain-text http2 test case - WINSOCK only: - Since FD_CLOSE is only signaled once, it may trigger at the same - time as FD_READ. Data actually being available makes it impossible - to detect that the connection was closed by checking that recv returns - zero. Another recv attempt could block the connection if it was - not closed. This workaround abuses exceptfds in conjunction with - readfds to signal that the connection has actually closed. + Verifies the upgrade request, but gets a plain 1.1 response -- curl_schannel.c: Fixed memory leak if connection was not successful +- [Tatsuhiro Tsujikawa brought this change] -- if2ip.c: Fixed warning: unused parameter 'remote_scope' + http: Disable pipelining for HTTP/2 and upgraded connections + + This commit disables pipelining for HTTP/2 or upgraded connections. For + HTTP/2, we do not support multiplexing. In general, requests cannot be + pipelined in an upgraded connection, since it is now different protocol. + +- [Brad Harder brought this change] -- runtests.pl: Fixed --verbose parameter passed to http_pipe.py + CURLOPT_POSTFIELDS.3: mention the COPYPOSTFIELDS option -- sockfilt.c: Reduce CPU load while running under a Windows PIPE +Steve Holme (19 Nov 2014) +- multi-uv.c: Updated for curl coding standards -- tftpd.c: Apply sread timeout to the whole data transfer session +- conncache: Fixed specifiers in infof() for long and size_t variables -- getpart.pm: Strip carriage returns to fix Windows support +- [Peter Wu brought this change] -Daniel Stenberg (6 Apr 2013) -- ftp tests: libcurl returns CURLE_FTP_ACCEPT_FAILED better now + cmake: add Kerberos to the supported features - Since commit 57aeabcc1a20f, it handles errors on the control connection - while waiting for the data connection better. + Updated following commit eda919f and a4b7f71. - Test 591 and 592 are updated accordingly. + Acked-by: Brad King + Signed-off-by: Peter Wu -- FTP: wait on both connections during active STOR state +- [Peter Wu brought this change] + + cmake: fix NTLM detection when CURL_DISABLE_HTTP defined + + Updated following changes in commit f0d860d. - When doing PORT and upload (STOR), this function needs to extract the - file descriptor for both connections so that it will respond immediately - when the server eventually connects back. + Acked-by: Brad King + Signed-off-by: Peter Wu + +Daniel Stenberg (19 Nov 2014) +- RELEASE-NOTES: synced with cb13fad733e + +- [Jay Satiro brought this change] + + examples: Wait recommended 100ms when no file descriptors are ready - This flaw caused active connections to become unnecessary slow but they - would still often work due to the normal polling on a timeout. The bug - also would not occur if the server connected back very fast, like when - testing on local networks. + Prior to this change when no file descriptors were ready on platforms + other than Windows the multi examples would sleep whatever was in + timeout, which may or may not have been less than the minimum + recommended value [1] of 100ms. - Bug: http://curl.haxx.se/bug/view.cgi?id=1183 - Reported by: Daniel Theron + [1]: http://curl.haxx.se/libcurl/c/curl_multi_fdset.html + +- [Waldek Kozba brought this change] -Marc Hoersken (6 Apr 2013) -- tftpd.c: Follow up cleanup and restore of previous sockopt + multi-uv.c: close the file handle after download -Daniel Stenberg (6 Apr 2013) -- [Kim Vandry brought this change] +- [Jon Spencer brought this change] - connect: treat an interface bindlocal() problem as a non-fatal error + multi: inform about closed sockets before they are closed - I am using curl_easy_setopt(CURLOPT_INTERFACE, "if!something") to force - transfers to use a particular interface but the transfer fails with - CURLE_INTERFACE_FAILED, "Failed binding local connection end" if the - interface I specify has no IPv6 address. The cause is as follows: + When the connection code decides to close a socket it informs the multi + system via the Curl_multi_closed function. The multi system may, in + turn, invoke the CURLMOPT_SOCKETFUNCTION function with + CURL_POLL_REMOVE. This happens after the socket has already been + closed. Reorder the code so that CURL_POLL_REMOVE is called before the + socket is closed. + +Guenter Knauf (19 Nov 2014) +- build: in Makefile.m32 moved target autodetection. - The remote hostname resolves successfully and has an IPv6 address and an - IPv4 address. + Moved target autodetection block after defining CC macro. + +- build: in Makefile.m32 simplify platform flags. + +- build: in Makefile.m32 try to detect 64bit target. + +Daniel Stenberg (19 Nov 2014) +- [Brad King brought this change] + + CMake: Simplify if() conditions on check result variables - cURL attempts to connect to the IPv6 address first. + Remove use of an old hack that takes advantage of the auto-dereference + behavior of the if() command to detect if a variable is defined. The + hack has the form: - bindlocal (in lib/connect.c) fails because Curl_if2ip cannot find an - IPv6 address on the interface. + if("${VAR} MATCHES "^${VAR}$") - This is a fatal error in singleipconnect() + where "${VAR}" is a macro argument reference. Use if(DEFINED) instead. + This also avoids warnings for CMake Policy CMP0054 in CMake 3.1. + +- TODO-RELEASE: removed + +- [Carlo Wood brought this change] + + debug: added new connection cache output, plus fixups - This change will make cURL try the next IP address in the list. + Debug output 'typo' fix. - Also included are two changes related to IPv6 address scope: + Don't print an extra "0x" in + * Pipe broke: handle 0x0x2546d88, url = / - - Filter the choice of address in Curl_if2ip to only consider addresses - with the same scope ID as the connection address (mismatched scope for - local and remote address does not result in a working connection). + Add debug output. + Print the number of connections in the connection cache when + adding one, and not only when one is removed. - - bindlocal was ignoring the scope ID of addresses returned by - Curl_if2ip . Now it uses them. + Fix typos in comments. + +- multi: move the ending condition into the loop as well - Bug: http://curl.haxx.se/bug/view.cgi?id=1189 + ... as it was before I changed the loop in commit e04ccbd50. It caused + test 2030 and 2032 to fail. -Marc Hoersken (6 Apr 2013) -- tftpd.c: Fixed sread timeout on Windows by setting it manually +Steve Holme (18 Nov 2014) +- multi: Prefer we don't use CURLE_OK and NULL in comparisons -- ftp.pm: Added tskill to support Windows XP Home +Daniel Stenberg (18 Nov 2014) +- multi_runsingle: use 'result' for local CURLcode storage + + ... and assign data->result only at the end. Makes the code more compact + (easier to read) and more similar to other code. -- runtests.pl: Modularization of MinGW/Msys compatibility functions +- multi_runsingle: rename result to rc + + save 'result' for CURLcode types -- ftp.pm: Made Perl testsuite able to handle Windows processes +- multi: make multi_runsingle loop internally + + simplifies the use of this function at little cost. -- util.c: Revert workaround eeefcdf, 6eb56e7 and e3787e8 +- [Carlo Wood brought this change] -- ftp.pm: Made Perl testsuite able to kill Windows processes + multi: when leaving for timeout, close accordingly + + Fixes the problem when a transfer in a pipeline times out. -- util.c: Follow up cleanup on eeefcdf +Guenter Knauf (18 Nov 2014) +- build: in Makefile.m32 add -m32 flag for 32bit. -Daniel Stenberg (6 Apr 2013) -- cpp: use #ifdef __MINGW32__ to avoid compiler complaints - - ... instead of just #if +- mk-ca-bundle.vbs: update copyright year. -Marc Hoersken (6 Apr 2013) -- util.c: Made write_pidfile write the correct PID on MinGW/Msys - - This workaround fixes an issue on MinGW/Msys regarding the Perl - testsuite scripts not being able to signal or control the server - processes. The MinGW Perl runtime only sees the Msys processes and - their corresponding PIDs, but sockfilt (and other servers) wrote the - Windows PID into their PID-files. Since this PID is useless to the - testsuite, the write_pidfile function was changed to search for the - Msys PID and write that into the PID-file. +- build: in Makefile.m32 pass -F flag to windres. -Daniel Stenberg (5 Apr 2013) -- RELEASE-NOTES: synced with 5e722b2d09087 +Steve Holme (17 Nov 2014) +- config-win32: Fixed build targets for the VS2012+ Windows XP toolset - 3 more bug fixes, 6 more contributors + Even though commit 23e70e1cc6 mentioned the v110_xp toolset, I had + forgotten to include the relevant pre-processor definitions. -Marc Hoersken (5 Apr 2013) -- sockfilt.c: Fixed handling of multiple fds being signaled +- sasl_sspi: Removed note about the NTLM functions being a wrapper -Kamil Dudka (5 Apr 2013) -- curl_global_init.3: improve description of CURL_GLOBAL_ALL +- connect.c: Fixed compilation warning when no verbose string support - Reported by: Tomas Mlcoch + warning: unused parameter 'reason' -- examples/multi-single.c: fix the order of destructions - - ... so that it adheres to the API documentation. +- easy.c: Fixed compilation warning when no verbose string support - Reported by: Tomas Mlcoch + warning: unused parameter 'easy' -Daniel Stenberg (5 Apr 2013) -- Curl_open: restore default MAXCONNECTS to 5 +- win32: Updated some legacy APIs to use the newer extended versions - At some point recently we lost the default value for the easy handle's - connection cache, and this change puts it back to 5 - which is the - former default value and it is documented in the curl_easy_setopt.3 man - page. - -Marc Hoersken (4 Apr 2013) -- sockfilt.c: Added wrapper functions to fix Windows console issues + Updated the usage of some legacy APIs, that are preventing curl from + compiling for Windows Store and Windows Phone build targets. - The new read and write wrapper functions support reading from stdin - and writing to stdout/stderr on Windows by using the appropriate - Windows API functions and data types. - -Yang Tse (4 Apr 2013) -- lib1509.c: fix compiler warnings + Suggested-by: Stefan Neis + Feature: http://sourceforge.net/p/curl/feature-requests/82/ -- easy.c: fix compiler warning - -Daniel Stenberg (4 Apr 2013) -- --engine: spellfix the help message +- config-win32: Introduce build targets for VS2012+ - Reported by: Fredrik Thulin + Visual Studio 2012 introduced support for Windows Store apps as well as + supporting Windows Phone 8. Introduced build targets that allow more + modern APIs to be used as certain legacy ones are not available on these + new platforms. -Yang Tse (4 Apr 2013) -- http_negotiate.c: follow-up for commit 3dcc1a9c +- sasl_sspi: Fixed compilation warnings when no verbose string support -Linus Nielsen Feltzing (4 Apr 2013) -- easy: Fix the broken CURLOPT_MAXCONNECTS option - - Copy the CURLOPT_MAXCONNECTS option to CURLMOPT_MAXCONNECTS in - curl_easy_perform(). +- sasl_sspi: Added base64 decoding debug failure messages - Bug: http://curl.haxx.se/bug/view.cgi?id=1212 - Reported-by: Steven Gu + Just like in the NTLM code, added infof() failure messages for + DIGEST-MD5 and GSSAPI authentication when base64 decoding fails. -Guenter Knauf (4 Apr 2013) -- Updated copyright date. +- ntlm: Moved the SSPI based Type-3 message generation into the SASL module -- Another small output fix for --help and --version. +- ntlm: Moved the SSPI based Type-2 message decoding into the SASL module -Yang Tse (4 Apr 2013) -- http_negotiate.c: fix several SPNEGO memory handling issues +- ntlm: Moved the SSPI based Type-1 message generation into the SASL module -Guenter Knauf (4 Apr 2013) -- Added a cont to specify base64 line wrap. +- [Michael Osipov brought this change] -- Fixed version output. + kerberos: Use symbol qualified with _KERBEROS5 + + For consistency renamed USE_KRB5 to USE_KERBEROS5. -- Added support for --help and --version options. +Daniel Stenberg (15 Nov 2014) +- [Jay Satiro brought this change] -- Added option to specify length of base64 output. + examples: Don't call select() to sleep on windows + + Windows does not support using select() for sleeping without a dummy + socket. Instead use Windows' Sleep() and sleep for 100ms which is the + minimum suggested value in the curl_multi_fdset() doc. - Based on a patch posted to the list by Richard Michael. + Prior to this change the multi examples would exit prematurely since + select() would error instead of sleeping when called without an fd. + + Reported-by: Johan Lantz + Bug: http://curl.haxx.se/mail/lib-2014-11/0221.html -Daniel Stenberg (3 Apr 2013) -- curl_easy_setopt.3: CURLOPT_HTTPGET disables CURLOPT_UPLOAD +- [Tatsuhiro Tsujikawa brought this change] -- [Yasuharu Yamada brought this change] + http2: Don't send Upgrade headers when we already do HTTP/2 - Curl_cookie_add: only increase numcookies for new cookies +Steve Holme (15 Nov 2014) +- sasl: Corrected Curl_sasl_build_spn() function description - Count up numcookies in Curl_cookie_add() only when cookie is new one + There was a mismatch in function parameter names. -- SO_SNDBUF: don't set SNDBUF for win32 versions vista or later - - The Microsoft knowledge-base article - http://support.microsoft.com/kb/823764 describes how to use SNDBUF to - overcome a performance shortcoming in winsock, but it doesn't apply to - Windows Vista and later versions. If the described SNDBUF magic is - applied when running on those more recent Windows versions, it seems to - instead have the reversed effect in many cases and thus make libcurl - perform less good on those systems. +- tool: Removed krb4 from the supported features - This fix thus adds a run-time version-check that does the SNDBUF magic - conditionally depending if it is deemed necessary or not. - - Bug: http://curl.haxx.se/bug/view.cgi?id=1188 - Reported by: Andrew Kurushin - Tested by: Christian Hägele + Although libcurl would never return CURL_VERSION_KERBEROS4 after 7.33, + so would not be output with --version, removed krb4 from the supported + features output. -Nick Zitzmann (1 Apr 2013) -- darwinssl: additional descriptive messages of SSL handshake errors - - (This doesn't need to appear in the release notes.) +- [Michael Osipov brought this change] -Guenter Knauf (1 Apr 2013) -- Added dns and connect time to output. + tool: Use Kerberos for supported features -Daniel Stenberg (1 Apr 2013) -- RELEASE-NOTES: synced with 0614b902136 +- urldata: Don't define sec_complete when no GSS-API support present + + This variable is only used with HAVE_GSSAPI is defined by the FTP code + so let's place the definition with the other GSS-API based variables. -- code-policed +- [Michael Osipov brought this change] -- tcpkeepalive: support TCP_KEEPIDLE/TCP_KEEPINTVL on win32 - - Patch by: Robert Wruck - Bug: http://curl.haxx.se/bug/view.cgi?id=1209 + docs: Use consistent naming for Kerberos -- BINDINGS: BBHTTP is a cocoa binding, Julia has a binding +- TODO: Lets support QOP options in GSSAPI authentication -- ftp_sendquote: use PPSENDF, not FTPSENDF +- sasl_sspi: Corrected a couple of comment typos + +- sasl: Moved Curl_sasl_gssapi_cleanup() definition into header file - The last remaining code piece that still used FTPSENDF now uses PPSENDF. - In the problematic case, a PREQUOTE series was done on a re-used - connection when Curl_pp_init() hadn't been called so it had messed up - pointers. The init call is done properly from Curl_pp_sendf() so this - change fixes this particular crash. + Rather than define the function as extern in the source files that use + it, moved the function declaration into the SASL header file just like + the Digest and NTLM clean-up functions. - Bug: http://curl.haxx.se/mail/lib-2013-03/0319.html - Reported by: Sam Deane + Additionally, added a function description comment block. -Steve Holme (27 Mar 2013) -- RELEASE-NOTES: Corrected typo +- sasl_sspi: Added missing RFC reference for HTTP Digest authentication -Daniel Stenberg (27 Mar 2013) -- [Clemens Gruber brought this change] +- ntlm: Clean-up and standardisation of base64 decoding - multi-uv.c: remove unused variable +- ntlm: We prefer 'CURLcode result' -- RELEASE-NOTES: add two references +Daniel Stenberg (13 Nov 2014) +- [Brad King brought this change] -- test1509: verify proxy header response headers count + CMake: Restore order-dependent library checks - Modified sws to support and use custom CONNECT responses instead of the - previously naive hard-coded version. Made the HTTP test server able to - extract test case number from the host name in a CONNECT request by - finding the number after the last dot. It makes 'machine.moo.123' use - test case 123. + Revert commit 2257deb502 (Cmake: Avoid cycle directory dependencies, + 2014-08-22) and add a comment explaining the purpose of the original + code. - Adapted a larger amount of tests to the new style. + The check_library_exists_concat macro is intended to be called multiple + times on a sequence of possibly dependent libraries. Later libraries + may depend on earlier libraries when they are static. They cannot be + safely linked in reverse order on some platforms. - Bug: http://curl.haxx.se/bug/view.cgi?id=1204 - Reported by: Martin Jansen - -- [Clemens Gruber brought this change] + Signed-off-by: Brad King - Added libuv example multi-uv.c +- [Brad King brought this change] -Yang Tse (25 Mar 2013) -- NTLM: fix several NTLM code paths memory leaks - -- WIN32 MemoryTracking: track wcsdup() _wcsdup() and _tcsdup() usage - - As of 25-mar-2013 wcsdup() _wcsdup() and _tcsdup() are only used in - WIN32 specific code, so tracking of these has not been extended for - other build targets. Without this fix, memory tracking system on - WIN32 builds, when using these functions, would provide misleading - results. + CMake: Restore order-dependent header checks - In order to properly extend this support for all targets curl.h - would have to define curl_wcsdup_callback prototype and consequently - wchar_t should be visible before that in curl.h. IOW curl_wchar_t - defined in curlbuild.h and this pulling whatever system header is - required to get wchar_t definition. + Revert commit 1269df2e3b (Cmake: Don't check for all headers each + time, 2014-08-15) and add a comment explaining the purpose of the + original code. - Additionally a new curl_global_init_mem() function that also receives - user defined wcsdup() callback would be required. - -- curl_ntlm_msgs.c: revert commit 463082bea4 + The check_include_file_concat macro is intended to be called multiple + times on a sequence of possibly dependent headers. Later headers + may depend on earlier headers to provide declarations. They cannot + be safely included independently on some platforms. - reverts unreleased invalid memory leak fix - -Daniel Stenberg (23 Mar 2013) -- RELEASE-NOTES: synced with bc6037ed3ec02 + For example, many POSIX APIs document including sys/types.h before some + other headers. Also on some OS X versions sys/socket.h must be included + before net/if.h or the check for the latter will fail. - More changes, bugfixes and contributors! + Signed-off-by: Brad King -- [Martin Jansen brought this change] +- [Peter Wu brought this change] - Curl_proxyCONNECT: count received headers + test22: expand a backtick command - Proxy servers tend to add their own headers at the beginning of - responses. The size of these headers was not taken into account by - CURLINFO_HEADER_SIZE before this change. + This is the only user of the backtick operator in the command. As the + commands will soon not be executed by a shell anymore (but by perl), + replace the command with its output. - Bug: http://curl.haxx.se/bug/view.cgi?id=1204 + Signed-off-by: Peter Wu -Steve Holme (21 Mar 2013) -- sasl: Corrected a few violations of the curl coding standards - - Corrected some incorrectly positioned pointer variable declarations to - be "char *" rather than "char* ". +- RELEASE-NOTES: synced with 2ee3c63b13 -- multi.c: Corrected a couple of violations of the curl coding standards - - Corrected some incorrectly positioned pointer variable declarations to - be "type *" rather than "type* ". +- http2: fix switched macro when http2 is not enabled -- imap-tests: Added CRLF to reply data to be compliant with RFC-822 - - Updated the reply data in tests: 800, 801, 802, 804 and 1321 to possess - the CRLF as per RFC-822. +- [Tatsuhiro Tsujikawa brought this change] -- multi.c: Fix compilation warning + http2: Deal with HTTP/2 data inside response header buffer - warning: an enumerated type is mixed with another type + Previously if HTTP/2 traffic is appended to HTTP Upgrade response header + (thus they are in the same buffer), the trailing HTTP/2 traffic is not + processed and lost. The appended data is most likely SETTINGS frame. + If it is lost, nghttp2 library complains server does not obey the HTTP/2 + protocol and issues GOAWAY frame and curl eventually drops connection. + This commit fixes this problem and now trailing data is processed. -- multi.c: fix compilation error +Steve Holme (11 Nov 2014) +- configure: Fixed inclusion of krb5 when CURL_DISABLE_CRYPTO_AUTH is defined - warning: conversion from enumeration type to different enumeration type + Commit fe0f8967bf fixed a problem with krb5 not being defined as a + supported feature when HAVE_GSSAPI is defined, however, it should + only be included if CURL_DISABLE_CRYPTO_AUTH is not set, like when + SPNEGO is listed as a feature. -- lib1900.c: fix compilation warning +Daniel Stenberg (10 Nov 2014) +- multi: removed Curl_multi_set_easy_connection + + It isn't used anywhere! - warning: declaration of 'time' shadows a global declaration + Reported-by: Carlo Wood -Yang Tse (20 Mar 2013) -- [John E. Malmberg brought this change] +- [Peter Wu brought this change] - build_vms.com: use existing curlbuild.h and parsing fix - - This patch removes building curlbuild.h from the build_vms.com procedure - and uses the one in the daily or release tarball instead. + symbol-scan.pl: do not require autotools - packages/vms/build_curlbuild_h.com is obsolete with this change. + Makes test1119 pass when building with cmake. - Accessing the library module name "tool_main" needs different handling - when the optional extended parsing is enabled. + configurehelp.pm is generated by configure (autotools). As cmake does + not provide a separate variable for the C preprocessor, default to cpp. + Before commit ef24ecde68a5f577a7f0f423a767620f09a0ab16 ("symbol-scan: + use configure script knowledge about how to run the C preprocessor"), + this tool would also use 'cpp'. - Tested on IA64/VMS 8.4 and VAX/VMS 7.3 + Signed-off-by: Peter Wu -Nick Zitzmann (19 Mar 2013) -- darwinssl: disable ECC ciphers under Mountain Lion by default - - I found out that ECC doesn't work as of OS X 10.8.3, so those ciphers are - turned off until the next point release of OS X. - -Steve Holme (18 Mar 2013) -- FEATURES: Small tidy up for constancy and grammar +- [Peter Wu brought this change] -Daniel Stenberg (18 Mar 2013) -- [Oliver Schindler brought this change] - - Curl_proxyCONNECT: clear 'rewindaftersend' on success - - After having done a POST over a CONNECT request, the 'rewindaftersend' - boolean could be holding the previous value which could lead to badness. + cmake: add ENABLE_THREADED_RESOLVER, rename ARES - This should be tested for in a new test case! + Fix detection of the AsynchDNS feature which not just depends on + pthreads support, but also on whether USE_POSIX_THREADS is set or not. + Caught by test 1014. - Bug: https://groups.google.com/d/msg/msysgit/B31LNftR4BI/KhRTz0iuGmUJ - -Steve Holme (18 Mar 2013) -- TODO: Reordered the protocol and security sections + This patch adds a new ENABLE_THREADED_RESOLVER option (corresponding to + --enable-threaded-resolver of autotools) which also needs a check for + HAVE_PTHREAD_H. - Moved SMTP, POP3, IMAP and New Protocol sections to be listed after the - other protocols (FTP, HTTP and TELNET) and SASL to be after SSL and - GnuTLS as these are all security related. + For symmetry with autotools, CURL_USE_ARES is renamed to ENABLE_ARES + (--enable-ares). Checks that test for the availability actually use + USE_ARES instead as that is the result of whether a-res is available or + not (in practice this does not matter as CARES is marked as required + package, but nevertheless it is better to write the intent). - Additionally fixed numbering of the SSL and GnuTLS sections as they - weren't consecutive. + Signed-off-by: Peter Wu -Yang Tse (18 Mar 2013) -- tests: specify 'text' mode for some output files in verify section +- [Peter Wu brought this change] -Steve Holme (17 Mar 2013) -- imap: Fixed incorrect initial response generation for SASL AUTHENTICATE + cmake: build libhostname for test suite - Fixed incorrect initial response generation for the NTLM and LOGIN SASL - authentication mechanisms when the SASL-IR was detected. + Used by some test cases via LD_PRELOAD in order to fake the host name. - Introduced in commit: 6da7dc026c14. - -- FEATURES: Expanded the supported enhanced IMAP command list - -- TODO: Corrected typo in TOC - -- TODO: Added IMAP section and removed unused Other protocols section - -- TODO: Added graceful base64 decoding failure to SMTP and POP3 - -- TODO: Corrected typo on section 10.2 heading - -Yang Tse (16 Mar 2013) -- tests: 96, 558, 1330: strip build subdirectory dependent leading path - -Steve Holme (15 Mar 2013) -- TODO: Added section 10.2 Initial response to POP3 to do list + Signed-off-by: Peter Wu -- imap-tests: Corrected copy/paste error in test808 reply data +- [Peter Wu brought this change] -Yang Tse (15 Mar 2013) -- unit1330.c: fix date - -- tests: add #96 #558 and #1330 + cmake: fix HAVE_GETHOSTNAME definition + + Otherwise Curl_gethostname always fails. Windows has gethostname + since Vista according to + http://msdn.microsoft.com/en-us/library/ms738527%28VS.85%29.aspx, but + accordings to byte_bucket's VC 2005 documentation, it is available even + in Windows 95. (possibly after installing a Platform SDK, the + Windows Server 2003 SP1 Platform SDK should be sufficient). - These verfy that the 'memory tracking' subsystem is actually doing its - job when using curl tool (#96), a test in libtest (#558) and also a unit - test (#1330), in order to prevent regressions in this functionallity. + Signed-off-by: Peter Wu -Steve Holme (15 Mar 2013) -- imap-tests: Added test808 for custom EXAMINE command +- [Peter Wu brought this change] -Daniel Stenberg (15 Mar 2013) -- HTTP proxy: insert slash in URL if missing + tests: fix libhostname visibility - curl has been accepting URLs using slightly wrong syntax for a long - time, such as when completely missing as slash "http://example.org" or - missing a slash when a query part is given - "http://example.org?q=foobar". + I noticed that a patched cmake build would pass tests with a fake local + hostname, but the autotools build skips them: - curl would translate these into a legitimate HTTP request to servers, - although as was shown in bug #1206 it was not adjusted properly in the - cases where a HTTP proxy was used. + got unexpected host name back, LD_PRELOAD failed - Test 1213 and 1214 were added to the test suite to verify this fix. + It turns out that -fvisibility=hidden hides the symbol, and since the + tests are not part of libcurl, it fails too. Just remove the LIBCURL + guard. - The test HTTP server was adjusted to allow us to specify test number in - the host name only without using any slashes in a given URL. + Broken since cURL 7.30 (commit 83a42ee20ea7fc25abb61c0b7ef56ebe712d7093, + "curl.h: stricter CURL_EXTERN linkage decorations logic"). - Bug: http://curl.haxx.se/bug/view.cgi?id=1206 - Reported by: ScottJi + Signed-off-by: Peter Wu -Steve Holme (14 Mar 2013) -- ftpserver.pl: Added EXAMINE_imap() for IMAP EXAMINE commands +- [Peter Wu brought this change] + + tests: fix memleak in server/resolve.c + + This makes LeakSanitizer happy. - Used hard coded data from RFC-3501 section 6.3.2. + Signed-off-by: Peter Wu -Yang Tse (14 Mar 2013) -- curl_memory.h: introduce CURLX_NO_MEMORY_CALLBACKS usage possibility +- configure: assume krb5 when gss-api works - This commit alone does not fix anything nor modifies existing - interfaces or behaviors, although it is a prerequisite for other - fixes. + To please test 1014 while we work out if this is truly the a correct + assumption. -- Makefile.vc6: add missing files +Steve Holme (9 Nov 2014) +- vtls.h: Fixed compiler warning when compiled without SSL + + vtls.c:185:46: warning: unused parameter 'data' -Linus Nielsen Feltzing (14 Mar 2013) -- pipelining: Remove dead code. +- RELEASE-NOTES: Synced with 2fbf23875f -- Multiple pipelines and limiting the number of connections. - - Introducing a number of options to the multi interface that - allows for multiple pipelines to the same host, in order to - optimize the balance between the penalty for opening new - connections and the potential pipelining latency. +- ntlm: Added separate SSPI based functions - Two new options for limiting the number of connections: + In preparation for moving the NTLM message code into the SASL module, + and separating the native code from the SSPI code, added functions that + simply call the functions in curl_ntlm_msg.c. + +- http_ntlm: Use the SASL functions instead - CURLMOPT_MAX_HOST_CONNECTIONS - Limits the number of running connections - to the same host. When adding a handle that exceeds this limit, - that handle will be put in a pending state until another handle is - finished, so we can reuse the connection. + In preparation for moving the NTLM message code into the SASL module + use the SASL functions in the HTTP code instead. + +Daniel Stenberg (9 Nov 2014) +- libssh2: detect features based on version, not configure checks - CURLMOPT_MAX_TOTAL_CONNECTIONS - Limits the number of connections in total. - When adding a handle that exceeds this limit, - that handle will be put in a pending state until another handle is - finished. The free connection will then be reused, if possible, or - closed if the pending handle can't reuse it. + ... so that non-configure builds get the correct functions too based on + the libssh2 version used. + +- [Nobuhiro Ban brought this change] + + SSH: use the port number as well for known_known checks - Several new options for pipelining: + ... if the libssh2 version is new enough. - CURLMOPT_MAX_PIPELINE_LENGTH - Limits the pipeling length. If a - pipeline is "full" when a connection is to be reused, a new connection - will be opened if the CURLMOPT_MAX_xxx_CONNECTIONS limits allow it. - If not, the handle will be put in a pending state until a connection is - ready (either free or a pipe got shorter). + Bug: http://curl.haxx.se/bug/view.cgi?id=1448 + +Steve Holme (9 Nov 2014) +- INSTALL: Updated pre-processor references to the old VC6 project files - CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE - A pipelined connection will not - be reused if it is currently processing a transfer with a content - length that is larger than this. + Reworked the two sections that discuss modifying the Visual Studio pre- + processor settings, and vc6libcurl.dsw/vc6libcurl.dsp, to remove the + project files references as they have been superseded by a more thorough + set of project files for VC6 through VC12, but to also give the correct + reference to this setting in later versions of Visual Studio. + +- INSTALL: Added email protocols to the "Disabling in Win32 builds" section + +- configure: Fixed NTLM missing from features when CURL_DISABLE_HTTP defined + +- build: Fixed no NTLM support for email when CURL_DISABLE_HTTP is defined - CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE - A pipelined connection will not - be reused if it is currently processing a chunk larger than this. + USE_NTLM would only be defined if: HTTP support was enabled, NTLM and + cryptography weren't disabled, and either a supporting cryptography + library or Windows SSPI was being compiled against. - CURLMOPT_PIPELINING_SITE_BL - A blacklist of hosts that don't allow - pipelining. + This means it was not possible to build libcurl without HTTP support + and use NTLM for other protocols such as IMAP, POP3 and SMTP. Rather + than introduce a new SASL pre-processor definition, removed the HTTP + prerequisite just like USE_SPNEGO and USE_KRB5. - CURLMOPT_PIPELINING_SERVER_BL - A blacklist of server types that don't allow - pipelining. + Note: Winbind support still needs to be dependent on CURL_DISABLE_HTTP + as it is only available to HTTP at present. - See the curl_multi_setopt() man page for details. + This bug dates back to August 2011 when I started to add support for + NTLM to SMTP. -Yang Tse (13 Mar 2013) -- tool_main.c: remove redundant vms_show storage-class specifier +- ntlm: Removed an unnecessary free of native Target Info - vms_show 'extern' storage-class specifier removed from tool_main.c due to... - - - Advice from Tor Arntsen: http://curl.haxx.se/mail/lib-2013-03/0164.html - - - HP OpenVMS docs stating that 'Extern is the default storage class for - variables declared outside a function.' - http://h71000.www7.hp.com/commercial/c/docs/dec_c_help_5.html - (Storage_Classes section) + Due to commit 40ee1ba0dc the free in Curl_ntlm_decode_type2_target() is + longer required. -- test509: libcurl initialization with memory callbacks and actual usage +- ntlm: Moved the native Target Info clean-up from HTTP specific function -Steve Holme (13 Mar 2013) -- pop3: Removed unnecessary transfer cancellation - - Following commit e450f66a02d8 and the changes in the multi interface - being used internally, from 7.29.0, the transfer cancellation in - pop3_dophase_done() is no longer required. +- ntlm: Moved SSPI clean-up code into SASL module -Yang Tse (13 Mar 2013) -- Makefile.am: add VMS files not being included in tarball +- Makefile.dist: Added support for WinIDN -- [Tom Grace brought this change] +- Makefile.vc6: Added support for WinIDN - build_vms.com: VMS build fixes - - Added missing slash in cc_full_list. - Removed unwanted extra quotes inside symbol tool_main - for non-VAX architectures that triggered link failure. - Replaced curl_sys_inc with sys_inc. +- Makefile.dist: Added some missing SSPI configurations -- [Tom Grace brought this change] +- Makefile.dist: Separated the groups of SSL configurations from each other - tool_main.c: fix VMS global variable storage-class specifier - - An extern submits a psect and a global reference to the linker to point - to it. Using "extern int vms_show = 0" also creates a globaldef. +- Makefile.dist: Grouped the x64 configurations next to their x86 counterparts + +- curl.h: Tidy up of CURL_VERSION_* flags - The use of the extern by itself does declare a psect but does not declare - a globalsymbol. It does declare a globalref. But the linker needs one and - only one globaldef or there is an error. + As the list has gotten a little messy and hard to read, especially with + the introduction of deprecated items, aligned the values and comments + into clean columns and reworked some of the comments in the process. -Patrick Monnerat (12 Mar 2013) -- OS400: synchronize RPG binding +- curl_tool: Added krb5 to the supported features -Steve Holme (12 Mar 2013) -- pop3: Fixed continuous wait when using --ftp-list - - Don't initiate a transfer when using --ftp-list. +- configure: Added krb5 to the supported features + +- version info: Added Kerberos V5 to the supported features -Kamil Dudka (12 Mar 2013) -- [Zdenek Pavlas brought this change] +Guenter Knauf (7 Nov 2014) +- mk-ca-bundle.vbs: switch to new certdata.txt url. - curl_global_init: accept the CURL_GLOBAL_ACK_EINTR flag +Steve Holme (7 Nov 2014) +- RELEASE-NOTES: Synced with dcad09e125 + +- http_digest: Fixed some memory leaks introduced in commit 6f8d8131b1 - The flag can be used in pycurl-based applications where using the multi - interface would not be acceptable because of the performance lost caused - by implementing the select() loop in python. + Fixed a couple of memory leaks as a result of moving code that used to + populate allocuserpwd and relied on it's clean up. + +- docs: Updated following the addition of SSPI based HTTP digest auth + +- sasl_sspi: Tidy up of the existing digest code - Bug: http://curl.haxx.se/bug/view.cgi?id=1168 - Downstream Bug: https://bugzilla.redhat.com/919127 + Following the addition of SSPI support for HTTP digest, synchronised + elements of the email digest code with that of the new HTTP code. -- easy: do not ignore poll() failures other than EINTR +- http_digest: Post SSPI support tidy up + + Post tidy up to ensure commonality of code style and variable names. -Yang Tse (12 Mar 2013) -- curl.h: stricter CURL_EXTERN linkage decorations logic +Dan Fandrich (6 Nov 2014) +- test552: Don't run HTTP digest tests for SSPI based builds - No API change involved. + Technical difficulties prevented this from going into the + previous commit. + +Steve Holme (6 Nov 2014) +- tests: Don't run HTTP digest tests for SSPI based builds - Info: http://curl.haxx.se/mail/lib-2013-02/0234.html + Added !SSPI to the features list of the HTTP digest tests, as SSPI + based builds now use the Windows SSPI messaging API rather than the + internal functions, and we can't control the random numbers that get + used as part of the digest. -Daniel Stenberg (11 Mar 2013) -- THANKS: Latin-1'ified Jiri's name +Daniel Stenberg (6 Nov 2014) +- curl.1: show zone index use in a URL -Steve Holme (11 Mar 2013) -- test806: Added CRLF to reply data to be compliant with RFC-822 +Steve Holme (6 Nov 2014) +- http_digest: Fixed auth retry loop when SSPI based authentication fails -Daniel Stenberg (11 Mar 2013) -- test805: added crlf newlines to make data size match +- http_digest: Reworked the SSPI based input token storage - since mails sent are supposed to have CRLF line endings I added them and - now the data size after (\Seen) matches again properly + Reworked the input token (challenge message) storage as what is passed + to the buf and desc in the response generation are typically blobs of + data rather than strings, so this is more in keeping with other areas + of the SSPI code, such as the NTLM message functions. -- test: fix newline for the data check of 807 +- sasl_sspi: Fixed compilation warning from commit 2d2a62e3d9 + + Added void reference to unused 'data' parameter back to fix compilation + warning. -Yang Tse (11 Mar 2013) -- test801 to test807: fix protocol section line endings +- sspi: Align definition values to even columns as we use 2 char spacing -Steve Holme (10 Mar 2013) -- Makefile.am: Corrected a couple of spurious tab characters +- sspi: Fixed missing definition of ISC_REQ_USE_HTTP_STYLE - Corrected a couple of tab characters between test702 and test703, and - between test900 and test901 which should be spaces. + Some versions of Microsoft's sspi.h don't define this. -- [Jiri Hruska brought this change] +- sasl: Removed non-SSPI Digest functions and defines from SSPI based builds + + Introduced in commit 7e6d51a73c these functions and definitions are only + required by the internal challenge-response functions now. - imap: Added test807 for custom request functionality (STORE) +- sasl_sspi: Added HTTP digest response generation code -- [Jiri Hruska brought this change] +- http_digest: Added SSPI based challenge decoding code - imap: Added test806 for IMAP (folder) LIST command +- http_digest: Added SSPI based clean-up code -- [Jiri Hruska brought this change] +- http_digest: Added SSPI based authentication functions + + This temporarily breaks HTTP digest authentication in SSPI based builds, + causing CURLE_NOT_BUILT_IN to be returned. A follow up commit will + resume normal operation. - imap: Added test805 for APPEND functionality +- http_digest: Added required SSPI based variables to digest structure -- [Jiri Hruska brought this change] +Daniel Stenberg (6 Nov 2014) +- [Frank Gevaerts brought this change] - imap: Added test804 for skipping SELECT if in the same mailbox + contributors.sh: --releasenotes reads in names from RELEASE-NOTES + + This is very handy when updating the RELEASE-NOTES as then we sometimes + have names added manually in the existing list and we use this script to + update the set. -- [Jiri Hruska brought this change] +- RELEASE-NOTES: synced with 68542e72a9 - imap: Added test802 and test803 for UIDVALIDITY verification +- curl_easy_setopt.3: add CURLOPT_PINNEDPUBLICKEY - Added one test for a request with matching UIDVALIDITY and one which is - a mismatched request that will fail. + Reported-by: Christian Hägele + Bug: http://curl.haxx.se/mail/lib-2014-11/0078.html -- [Jiri Hruska brought this change] +Steve Holme (5 Nov 2014) +- build: Fixed Visual Studio project file generation of strdup.[c|h] + + As the curl command-line tool now includes it's own version of strdup(), + for platforms that don't have it, fixed up the git respository Visual + Studio project file generator to not include the version from lib in the + tool project files, rather than having both lib\strdup.[c|h] and + src\tool_strdup.[c|h] present. - imap: Added test801 for UID and SECTION URL parameters +Daniel Stenberg (5 Nov 2014) +- tool_strdup.c: include the tool strdup.h + + ... not the lib/ one that the tool no longer uses! -- [Jiri Hruska brought this change] +- THANKS-filter: added another Michał Górny version we've used - imap-tests: Accept quoted parameters in ftpserver.pl +- contributors.sh: split lists using " and " - Any IMAP parameter can come in escaped and in double quotes. Added a - simple function to unquote the command parameters and applied it to - the IMAP command handlers. + ... and require the space after the filtering to make the filter able to + remove names. -- [Jiri Hruska brought this change] +Steve Holme (5 Nov 2014) +- http_digest: Fixed memory leaks from commit 6f8d8131b1 - tests: Fix ftpserver.pl indentation +- sasl: Fixed compilation warning from commit 25264131e2 - The whole of FETCH_imap() had one extra space of indentation, whilst - APPEND_imap() used indentation of 2 instead of 4 in places. - -- Makefile.am: Corrected end of line filler character + Added forward declaration of digestdata to overcome the following + compilation warning: - The majority of lines, that specify a test file for inclusion, end with - a tab character before the slash whilst some end with a space. Corrected - those that end with a space to end with a tab character as well. - -- email-tests: Updated the test data that corresponds to the test number + warning: 'struct digestdata' declared inside parameter list - Finished segregating the email protocol tests, into their own protocol - based ranges, in preparation of adding more e-mail related tests to the - test suite. + Additionally made the ntlmdata forward declaration dependent on + USE_NTLM similar to how digestdata and kerberosdata are. -- email-tests: Renamed the IMAP test to be 800 +- sasl: Fixed HTTP digest challenges with spaces between auth parameters - Continued segregating the email protocol tests, into their own protocol - based ranges, in preparation of adding more e-mail related tests to the - test suite. + Broken as part of the rework, in commit 7e6d51a73c, to assist with the + addition of HTTP digest via Windows SSPI. -- email-tests: Renamed the SMTP tests to be in the range 900-906 +- http_digest: Fixed compilation errors from commit 6f8d8131b1 - Continued segregating the email protocol tests, into their own protocol - based ranges, in preparation of adding more e-mail related tests to the - test suite. + error: invalid operands to binary + warning: pointer targets in assignment differ in signedness -- email-tests: Renamed the POP3 tests to be in the range 850-857 - - Started segregating the email protocol tests, into their own protocol - based ranges, in preparation of adding more e-mail related tests to the - test suite. +- http_digest: Moved response generation into SASL module -Daniel Stenberg (10 Mar 2013) -- hiperfifo: updated to use current libevent API - - Patch by: Myk Taylor +- http_digest: Moved challenge decoding into SASL module -Steve Holme (10 Mar 2013) -- imap: Reworked some function descriptions +- http_digest: Moved clean-up function into SASL module -- imap: Added some missing comments to imap_sendf() +- http_digest: Moved algorithm definitions to SASL module -- email: Removed hard returns from init functions +- [Gisle Vanem brought this change] -Daniel Stenberg (9 Mar 2013) -- curl_multi_wait: avoid second loop if nothing to do + ssh: Fixed build on platforms where R_OK is not defined - ... hopefully this will also make clang-analyzer stop warning on - potentional NULL dereferences (which were false positives anyway). + Bug: http://curl.haxx.se/mail/lib-2014-11/0035.html + Reported-by: Jan Ehrhardt -- multi_runsingle: avoid NULL dereference +- strdup: Removed irrelevant comment - When Curl_do() returns failure, the connection pointer could be NULL so - the code path following needs to that that into account. - - Bug: http://curl.haxx.se/mail/lib-2013-03/0062.html - Reported by: Eric Hu + ...as Curl_memdup() duplicates an area of fix size memory, that may be + binary, and not a null terminated string. -Steve Holme (9 Mar 2013) -- imap: Re-factored all perform based functions +- url.c: Fixed compilation warning - Standardised the naming of all perform based functions to be in the form - imap_perform_something(). - -Daniel Stenberg (9 Mar 2013) -- [Cédric Deltheil brought this change] + conversion from 'curl_off_t' to 'size_t', possible loss of data - examples/getinmemory.c: abort the transfer if not enough memory +- http_digest: Use CURLcode instead of CURLdigest - No more use exit(3) but instead tell libcurl that no byte has been - written to let it return a `CURLE_WRITE_ERROR`. In addition, check - curl easy handle return code. + To provide consistent behaviour between the various HTTP authentication + functions use CURLcode based error codes for Curl_input_digest() + especially as the calling code doesn't use the specific error code just + that it failed. -- RELEASE-NOTES: synced with ca3c0ed3a9c +Daniel Stenberg (5 Nov 2014) +- contributors.sh: filter common alternative name spellings - 8 more bugfixes, one change and a bunch of contributors + docs/THANKS-filter is a new filter file for converting contributor names + we get or have recorded in alternative formats to the one we already use + in THANKS. To help us show individual contributors using a single + presentation of their names. -Yang Tse (9 Mar 2013) -- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility +- THANKS: added missing contributor from 2012 -Steve Holme (9 Mar 2013) -- imap: Added description comments to all perform based functions +- [Frank Gevaerts brought this change] -- imap: Removed the need for separate custom request functions + Remove duplicate names. - Moved the custom request processing into the LIST command as the logic - is the same. - -- imap: Corrected typo in comment - -Yang Tse (9 Mar 2013) -- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility + The removed names also appear as: + Andrés García, François Charlier, Gökhan Şengün, Michał Górny, Sébastien + Willemijns, Christopher Conroy, John E. Malmberg, Luca Altea, Peter Su, + S. Moonesamy, Samuel Listopad, Yasuharu Yamada, Karl Moerder -Steve Holme (9 Mar 2013) -- imap: Moved imap_logout() to be grouped with the other perform functions - -- email: Updated the function descriptions for the logout / quit functions +Steve Holme (5 Nov 2014) +- sspi: Define authentication package name constants + + These were previously hard coded, and whilst defined in security.h, + they may or may not be present in old header files given that these + defines were never used in the original code. - Updated the function description comments following commit 4838d196fdbf. + Not only that, but there appears to be some ambiguity between the ANSI + and UNICODE NTLM definition name in security.h. -- email: Simplified the logout / quit functions +Patrick Monnerat (5 Nov 2014) +- Adjust OS400-specific support to last release + +Daniel Stenberg (5 Nov 2014) +- THANKS: added two missing names and removed a duplicate - Moved the blocking state machine to the disconnect functions so that the - logout / quit functions are only responsible for sending the actual - command needed to logout or quit. + ./contributors.sh found these extra ones that somehow had fallen + through the cracks and never gotten added here. - Additionally removed the hard return on failure. + Reported-by: Frank Gevaerts -- email: Tidied up the *_regular_transfer() functions - - Added comments and simplified convoluted dophase_done comparison. +- bump: towards next release -- email: Simplified nesting of if statements in *_doing() functions +- THANKS: added names from 7.39.0 release notes -Daniel Stenberg (8 Mar 2013) -- RELEASE-NOTES: mention that krb4 is up for consideration +Version 7.39.0 (5 Nov 2014) -Steve Holme (8 Mar 2013) -- imap: Fixed handling of untagged responses for the STORE custom command - - Added an exception, for the STORE command, to the untagged response - processor in imap_endofresp() as servers will back respones containing - the FETCH keyword instead. +Daniel Stenberg (5 Nov 2014) +- RELEASE-NOTES: 7.39.0 release (commit b3875606925) -Yang Tse (8 Mar 2013) -- curlbuild.h.dist: enhance non-configure GCC ABI detection logic +- curl_easy_duphandle: CURLOPT_COPYPOSTFIELDS read out of bounds - GCC specific adjustments: + When duplicating a handle, the data to post was duplicated using + strdup() when it could be binary and contain zeroes and it was not even + zero terminated! This caused read out of bounds crashes/segfaults. - - check __ILP32__ before 32 and 64bit processor architectures in - order to detect ILP32 programming model on 64 bit processors - which, of course, also support LP64 programming model, when using - gcc 4.7 or newer. + Since the lib/strdup.c file no longer is easily shared with the curl + tool with this change, it now uses its own version instead. - - keep 32bit processor architecture checks in order to support gcc - versions older than 4.7 which don't define __ILP32__ + Bug: http://curl.haxx.se/docs/adv_20141105.html + CVE: CVE-2014-3707 + Reported-By: Symeon Paraschoudis + +- lib544.c: use duphandle for test 545 - - check __LP64__ for gcc 3.3 and newer, while keeping 64bit processor - architecture checks for older versions which don't define __LP64__ + To verify that curl_easy_duphandle() works fine on a handle that has + gotten data stored with *_COPYPOSTFIELDS. -- curlbuild.h.dist: fix GCC build on ARM systems without configure script +- tests: add new feature 'SSLpinning' - Bug: http://curl.haxx.se/bug/view.cgi?id=1205 - Reported by: technion + ... and make test 2034 and 2035 require it, and have it set when built + with OpenSSL or GnuTLS. -- [Gisle Vanem brought this change] +- buildconf: update copyright year - polarssl.c: fix header filename typo +Steve Holme (4 Nov 2014) +- INSTALL: Consistent spacing in section headings, paragraphs and examples -- configure: use XC_LIBTOOL for portability across libtool versions +Daniel Stenberg (4 Nov 2014) +- buildconf: stop checking for libtool + + As we only use libtoolize, only check for that! -- xc-lt-iface.m4: provide XC_LIBTOOL macro +Steve Holme (4 Nov 2014) +- INSTALL: Corrected MIT Kerberos and Heimdal package names -Steve Holme (7 Mar 2013) -- imap: Fixed SELECT not being performed for custom requests +- README: Corrected inconsistent use of --help -- email: Minor code tidy up following recent changes +- INSTALL: Use GSS-API rather than GSSAPI - Removed unwanted braces and added variable initialisation. + As implementations are refereed to GSS-API libraries as per the RFC and + GSSAPI typically refers to the SASL authentication mechanism. + + ...and minor rewording on the same paragraph. -- DOCS: Corrected the IMAP URL grammar of the UIDVALIDITY parameter +- README: Added note about using Visual Studio projects out of git repository -- FEATURES: Provided a little clarity in some IMAP features +Daniel Stenberg (4 Nov 2014) +- [K. R. Walker brought this change] -- email: Optimised block_statemach() functions + cmake: fix ZLIB_INCLUDE_DIRS use - Optimised the result test in each of the block_statemach() functions. - -- DOCS: Added the list command to the IMAP URL section + CMake 2.8's FindZLIB.cmake documents ZLIB_INCLUDE_DIRS, see + http://www.cmake.org/cmake/help/v2.8.0/cmake.html#module:FindZLIB - Added examples of the list command and clarified existing example URLs - following recent changes. + Bug: https://github.com/bagder/curl/pull/123 -- FEATURES: Updated for recent imap additions +- [Jay Satiro brought this change] + + SSL: PolarSSL default min SSL version TLS 1.0 - Updated the imap features list, corrected a typo in the smtp features - and clarified a pop3 feature. + - Prior to this change no SSL minimum version was set by default at + runtime for PolarSSL. Therefore in most cases PolarSSL would probably + have defaulted to a minimum version of SSLv3 which is no longer secure. -Daniel Stenberg (7 Mar 2013) -- version bump: the next release will be 7.30.0 +- opts-Makefile: put more man pages into dist and make hmtl+pdf -- checksrc: ban unsafe functions - - The list of unsafe functions currently consists of sprintf, vsprintf, - strcat, strncat and gets. +- curl_multi_setopt.3: refer to stand-alone pages - Subsequently, some existing code needed updating to avoid warnings on - this. + ... instead of duplicating info. -Steve Holme (7 Mar 2013) -- RELEASE-NOTES: Added missing imap fixes and additions +- opts: more multi options as stand-alone man pages + +- Makefile.am: two cmake files are gone - With all the recent imap changes it wasn't clear what new features and - fixes should be included in the release notes. + 8cb010144 removed the CurlCheckCSourceCompiles.cmake and + CurlCheckCSourceRuns.cmake files -Nick Zitzmann (6 Mar 2013) -- RELEASE-NOTES: brought this up-to-date with the latest changes +- opts: made stand-alone man-pages for several multi options -Steve Holme (6 Mar 2013) -- [Jiri Hruska brought this change] +- [Carlo Wood brought this change] - imap: Fixed test801 and test1321 to specify a message UID + Curl_single_getsock: fix hold/pause sock handling - Just a folder list would be retrieved if UID was not specified now. + The previous condition that checked if the socket was marked as readable + when also adding a writable one, was incorrect and didn't take the pause + bits properly into account. -- [Jiri Hruska brought this change] +- [Peter Wu brought this change] - imap: Fixed ftpserver.pl to allow verification even through LIST command + cmake: fix struct sockaddr_storage check - Commit 198012ee inadvertently broke LIST_imap(). - -- imap: Tidied up the APPEND and final APPEND response functions + CHECK_TYPE_SIZE_PREINCLUDE is an internal, undocumented variable which + was removed in cmake 2.8.1. According to the MSDN docs[1], inclusion + of winsock2.h is sufficient. WIN32_LEAN_AND_MEAN does not really seem + to affect the tests, so remove it too[2]. - Removed unnecessary state changes on failure and setting of result codes - on success. - -- imap: Tidied up the final FETCH response function + For the non-windows case, remove inet headers as POSIX only requires + sys/socket.h. - Removed unnecessary state change on failure and setting of result code on - success. - -- imap: Tidied up the LIST response function + [1]: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740504%28v=vs.85%29.aspx + [2]: http://stackoverflow.com/questions/11040133/what-does-defining-win32-lean-and-mean-exclude-exactly - Reworked comments as they referenced custom commands, removed - unnecessary state change on failure and setting of result code on - success. + Signed-off-by: Peter Wu -- imap: Removed the custom request response function +- [Peter Wu brought this change] + + cmake: clean OtherTests, fixing -Werror + + There were several -Wunused warnings and one duplicate macro definition. + The EXTRA_DEFINES variable of the CurlCheckCSources macro was being + abused ("__unused1\n#undef inline\n#define __unused2", seriously?) to + insert extra C code. Avoid this broken abstraction and use cmake's + check_c_source_compiles directly (works fine with CMake 2.8, maybe + even cmake 2.6). + + After cleaning up all related variables (EXTRA_DEFINES, + HEADER_INCLUDES, auxiliary headers_hack), also remove a duplicate + add_headers_include macro and remove duplicate header additions before + the struct timeval check. + + Oh, and now the code is converted to use CheckCSourceRuns and + CheckCSourceCompiles, the two curl-specific helpers can be removed. + Unfortunately, the cmake output is now slightly more verbose. Before: - Removed imap_state_custom_resp() as imap_state_list_resp() provides the - same functionality. + Performing Test int send(int, const void *, size_t, int) (curl_cv_func_send_test) + Performing Test int send(int, const void *, size_t, int) (curl_cv_func_send_test) - Failed + + Since check_c_source_compiles prints the varname, now you see: + + Performing Test curl_cv_func_send_test + Performing Test curl_cv_func_send_test - Failed + Tested: int send(int, const void *, size_t, int) + + Compared cmake output with each other using vimdiff, no functional + differences were found. Tested with GCC 4.9.1 and Clang 3.5.0. + + Signed-off-by: Peter Wu -- [Jiri Hruska brought this change] +- [Peter Wu brought this change] - imap: Updated ftpserver.pl to be more compliant, added new commands + cmake: fix gethostby{addr,name}_r in CurlTests - Enriched IMAP capabilities of ftpserver.pl in order to be able to - add tests for the new IMAP features. + This patch cleans up the automatically-generated (?) code and fixes one + case that will always fail due to syntax error. - * Added support for APPEND - Saves uploaded data to log/upload.$testno - * Added support for LIST - Returns the contents of section in - the current test, like e.g FETCH. - * Added support for STORE - Returns hardcoded updated flags - * Changed handling of SELECT - Returns much more information in the - usual set of untagged responses; uses hardcoded data from an example - in the IMAP RFC - * Changed handling of FETCH - Fixed response format - -- imap: Added check for empty UID in FETCH command + HAVE_GETHOSTBYADDR_R_5_REENTRANT always failed because of a trailing + character ("int length;q"). Several parameter type and unused variable + warnings popped up. This causes a detection failure with -Werror. - As the UID has to be specified by the user for the FETCH command to work - correctly, added a check to imap_fetch(), although strictly speaking it - is protected by the call from imap_perform(). - -Kamil Dudka (6 Mar 2013) -- nss: fix misplaced code enabling non-blocking socket mode + Observe that the REENTRANT cases are exactly the same as their + non-REENTRANT cases except for a `_REENTRANT` macro definition. + Merge all these pieces and build one big main function with different + cases, but reusing variables where logical. - The option needs to be set on the SSL socket. Setting it on the model - takes no effect. Note that the non-blocking mode is still not enabled - for the handshake because the code is not yet ready for that. - -Daniel Stenberg (6 Mar 2013) -- imap: fix compiler warning + For the cases where the parameters where NULL, I looked at + lib/hostip4.c to get an idea of the parameters types. - imap.c:694:21: error: unused variable 'imapc' [-Werror=unused-variable] - -Steve Holme (5 Mar 2013) -- imap: Added support for list command + void-cast variables such as 'rc' to avoid -Wuninitialized errors. + + Signed-off-by: Peter Wu -- imap: Added list perform and response handler functions +- [Peter Wu brought this change] -- imap: Introduced IMAP_LIST state + cmake: drop _BSD_SOURCE macro usage + + autotools does not use features.h nor _BSD_SOURCE. As this macro + triggers warnings since glibc 2.20, remove it. It should not have + functional differences. + + Signed-off-by: Peter Wu -- imap: Small tidy up of imap_select() to match imap_append() +Steve Holme (2 Nov 2014) +- RELEASE-NOTES: Synced with d71ea7c01e - Updated the style of imap_select() before adding the LIST command. + Additionally, updated "GSSAPI" to "GSS-API" for a Cmake related change + as GSSAPI can be confused with the authentication mechanism rather than + a GSS-API implementation library such as MIT or Heimdal. -- imap: Moved mailbox check from the imap_do() function +- build: Added WinIDN build configuration options - In preparation for the addition of the LIST command, moved the mailbox - check from imap_do() to imap_select() and imap_append(). + Added support for WinIDN build configurations to the VC6 project files. -- curl_setup.h: Added S_IRDIR() macro for compilers that don't support it +- build: Added WinIDN build configuration options - Commit 26eaa8383001 introduces the use of S_ISDIR() yet some compilers, - such as MSVC don't support it, so we must define a substitute using - file flags and mask. + Added support for WinIDN build configurations to the VC7 and VC7.1 + project files. -Daniel Stenberg (4 Mar 2013) -- AddFormData: prevent only directories from being posted +- build: Fixed the pre-processor separator in Visual Studio project files - Commit f4cc54cb4746ae5a6d (shipped as part of the 7.29.0 release) was a - bug fix that introduced a regression in that while trying to avoid - allowing directory names, it also forbade "special" files like character - devices and more. like "/dev/null" as was used by Oliver who reported - this regression. + A left over from the VC6 project files, so mainly cosmetic in Visual + Studio .NET as it can handle both comma and semi-colon characters for + separating multiple pre-processor definitions. - Reported by: Oliver Gondža - Bug: http://curl.haxx.se/mail/archive-2013-02/0040.html - -Nick Zitzmann (3 Mar 2013) -- darwinssl: fix infinite loop if server disconnected abruptly + However, the IDE uses semi-colons if the value is edited, and as such, + this may cause problems in future for anyone updating the files or + merging patches. - If the server hung up the connection without sending a closure alert, - then we'd keep probing the socket for data even though it's dead. Now - we're ready for this situation. + Used the Visual Studio IDE to correct the separator character. + +- build: Added optional specific version generation of VC project files - Bug: http://curl.haxx.se/mail/lib-2013-03/0014.html - Reported by: Aki Koskinen + ..when working from the git repository. This is particularly useful + for single development environments where the project files for all + supported versions of Visual Studio may not be required. + +- [Jay Satiro brought this change] -Steve Holme (3 Mar 2013) -- imap: Added comments to imap_append() + build-openssl.bat: Fix x64 release build + + Prior to this change if x64 release was specified a failed attempt was + made to build x86 release instead. -- [Jiri Hruska brought this change] +- CURLOPT_XOAUTH2_BEARER.3: Corrected the OAuth version number - imap: Added required mailbox check for FETCH and APPEND commands +- CURLOPT_SASL_IR.3: Added supported mechanism information + + ...and removed duplication of what protocols are supported from the + description text. -- pingpong.c: Fix enumerated type mixed with another type +- opts: Use common wording for MAIL related names -- smtp: Updated the coding style for state changes after a send operation +- opts: Use common wording for TLS user/password option names - Some state changes would be performed after a failure test that - performed a hard return, whilst others would be performed within a test - for success. Updated the code, for consistency, so all instances are - performed within a success test. + ...and revised the proxy wording a little as well. -- pop3: Updated the coding style for state changes after a send operation +- CURLOPT_MAXCONNECTS.3: Reworked the description to be less confusing - Some state changes would be performed after a failure test that - performed a hard return, whilst others would be performed within a test - for success. Updated the code, for consistency, so all instances are - performed within a success test. + ...and corrected a related typo in curl_easy_setopt.3. -- imap: Fixed typo in variable assignment +Guenter Knauf (2 Nov 2014) +- RELEASE-NOTES: removed obsolete entry; fixed entry. -- [Jiri Hruska brought this change] +Steve Holme (2 Nov 2014) +- RELEASE-NOTES: Synced with e7da67f5d3 - imap: Fixed custom request handling in imap_done() +- docs: Added mention of Kerberos for CURL_VERSION_SSPI - Fixed imap_done() so that neither the FINAL states are not entered when - a custom command has been performed. + As this has been present for SOCKSv5 proxy since v7.19.4 and for IMAP, + POP3 and SMTP authentication since v7.38.0. -- [Jiri Hruska brought this change] - - imap: Enabled custom requests in imap_select_resp() +- CURL_VERSION_KERBEROS4: Mark as deprecated - Changed imap_select_resp() to invoke imap_custom() instead of - imap_fetch() after the mailbox has been selected if a custom - command has been set. - -- [Jiri Hruska brought this change] + Support for Kerberos V4 was removed in v7.33.0. - imap: Enabled custom requests in imap_perform() +- sasl: Fixed Kerberos V5 inclusion when CURL_DISABLE_CRYPTO_AUTH is used - Modified imap_perform() to start with the custom command instead of - SELECT when a custom command is to be performed and no mailbox has - been given. + Typically the USE_WINDOWS_SSPI definition would not be used when the + CURL_DISABLE_CRYPTO_AUTH define is, however, it is still a valid build + configuration and, as such, the SASL Kerberos V5 (GSSAPI) authentication + data structures and functions would incorrectly be used when they + shouldn't be. + + Introduced a new USE_KRB5 definition that takes into account the use of + CURL_DISABLE_CRYPTO_AUTH like USE_SPNEGO and USE_NTLM do. -- [Jiri Hruska brought this change] +- openssl: Use 'CURLcode result' + + More CURLcode fixes. - imap: Added custom request perform and response handler functions +Daniel Stenberg (1 Nov 2014) +- resume: consider a resume from [content-length] to be OK - Added imap_custom(), which initiates the custom command processing, - and an associated response handler imap_state_custom_resp(), which - handles any responses by sending them to the client as body data. + Basically since servers often then don't respond well to this and + instead send the full contents and then libcurl would instead error out + with the assumption that the server doesn't support resume. As the data + is then already transfered, this is now considered fine. - All untagged responses with the same name as the first word of the - custom request string are accepted, with the exception of SELECT and - EXAMINE which have responses that cannot be easily identified. An - extra check has been provided for them so that any untagged responses - are accepted for them. - -- pop3: Fixed unnecessary parent structure reference + Test case 1434 added to verify this. Test case 1042 slightly modified. - Updated pop3 code following recent imap changes. - -- [Jiri Hruska brought this change] + Reported-by: hugo + Bug: http://curl.haxx.se/bug/view.cgi?id=1443 - imap: Added custom request parsing +Steve Holme (1 Nov 2014) +- openssl: Use 'CURLcode result' - Added imap_parse_custom_request() for parsing the CURLOPT_CUSTOMREQUEST - parameter which URL decodes the value and separates the request from - any parameters - This makes it easier to filter untagged responses - by the request command. + More standardisation of CURLcode usage and coding style. -- [Jiri Hruska brought this change] - - imap: Introduced custom request parameters +- openssl: Use 'CURLcode result' - Added custom request parameters to the per-request structure. + ...and some minor code style changes. -- [Jiri Hruska brought this change] +- ftplistparser: We prefer 'CURLcode result' - imap: Introduced IMAP_CUSTOM state +- opts: Use common wording for user/password option names -- imap: Minor code tidy up +- CURLOPT_CONNECT_ONLY.3: Removed "This option is implemented for..." text - Minor tidy up of code layout and comments following recent changes. + As this is covered by the PROTOCOLS section and saves having to update + two parts of the document with the same information in future. -- imap: Simplified the imap_state_append_resp() function +- CURLOPT_GSSAPI_DELEGATION.3: Use GSS-API rather than GSSAPI - Introduced the result code variable to simplify the state changes and - remove the hard returns. + As implementations are refereed to GSS-API libraries as per the RFC and + GSSAPI typically refers to an authentication mechanism. -- imap: Changed successful response logic in imap_state_append_resp() +- CURLOPT_CONNECT_ONLY.3: Fixed incomplete protocol list - For consistency changed the logic of the imap_state_append_resp() - function to test for an unsucessful continuation response rather than a - succesful one. + Added missing IMAP to the protocol list. + +- code cleanup: Use 'CURLcode result' -- imap: Standardised imapcode condition tests +- curl_easy_setopt.3: Fixed lots of typos + +- curl_easy_setopt.3: Moved CURLOPT_DIRLISTONLY into PROTOCOL OPTIONS - For consistency changed two if(constant != imapcode) tests to be - if(imapcode != constant). + ...as this option affects more that just FTP. -- imap: Moved imap_append() to be with the other perform functions +Guenter Knauf (30 Oct 2014) +- build: added Watcom support to build with WinSSL. -- [Jiri Hruska brought this change] +Daniel Stenberg (30 Oct 2014) +- CURLOPT_PINNEDPUBLICKEY.3: added details - imap: Enabled APPEND support in imap_perform() +Steve Holme (30 Oct 2014) +- CURLOPT_CUSTOMREQUEST.3: Fixed incomplete protocol list - Added logic in imap_perform() to perform an APPEND rather than SELECT - and FETCH if an upload has been specified. + Whilst the description included information about SMTP, the protocol + list only showed "TTP, FTP, IMAP, POP3". -- [Jiri Hruska brought this change] +- CURLOPT_DIRLISTONLY.3: Added information about the usage in POP3 - imap: Implemented APPEND final processing +Daniel Stenberg (29 Oct 2014) +- openssl: enable NPN separately from ALPN - The APPEND operation needs to be performed in several steps: - 1) We send " APPEND {}\r\n" - 2) Server responds with continuation respose "+ ...\r\n" - 3) We start the transfer and send bytes of data - 4) Only now we end the request command line by sending "\r\n" - 5) Server responds with " OK ...\r\n" + ... and allow building with nghttp2 but completely without NPN and ALPN, + as nghttp2 can still be used for plain-text HTTP. - This commit performs steps 4 and 5, in the DONE phase, as more - processing is required after the transfer. - -- [Jiri Hruska brought this change] + Reported-by: Lucas Pardue - imap: Added APPEND perform and response handler functions +- configure.ac: remove checks for OpenSSL NPN/ALPN funcs again - Added imap_append() function to initiate upload and imap_append_resp() - to handle the continuation response and start the transfer. + ... since the conditional in the code are now based on OpenSSL versions + instead to better support non-configure builds. -- [Jiri Hruska brought this change] +- opts: added some "SEE ALSO" references - imap: Introduced IMAP_APPEND and IMAP_APPEND_FINAL states +Steve Holme (29 Oct 2014) +- RELEASE-NOTES: Synced with 32913182dc -- [Jiri Hruska brought this change] +- vtls.c: Fixed compilation warning + + conversion from 'size_t' to 'unsigned int', possible loss of data - imap: Updated setting of transfer variables in imap_state_fetch_resp() +- sspi: Return CURLE_LOGIN_DENIED on AcquireCredentialsHandle() failure - Add number of bytes retrieved from the PP cache to req.bytecount and set - req.maxdownload only when starting a proper download. + Return a more appropriate error, rather than CURLE_OUT_OF_MEMORY when + acquiring the credentials handle fails. This is then consistent with + the code prior to commit f7e24683c4 when log-in credentials were empty. -- [Jiri Hruska brought this change] +- sasl_sspi: Allow DIGEST-MD5 to use current windows credentials + + Fixed the ability to use the current log-in credentials with DIGEST-MD5. + I had previously disabled this functionality in commit 607883f13c as I + couldn't get this to work under Windows 8, however, from testing HTTP + Digest authentication through Windows SSPI and then further testing of + this code I have found it works in Windows 7. + + Some further investigation is required to see what the differences are + between Windows 7 and 8, but for now enable this functionality as the + code will return an error when AcquireCredentialsHandle() fails. - imap: Improved FETCH response parsing +Kamil Dudka (29 Oct 2014) +- transfer: drop the code handling the ssl_connect_retry flag - Added safer parsing of the untagged FETCH response line and the size of - continuation data. + Its last use has been removed by the previous commit. -- imap: Fixed accidentally lossing the result code +- nss: drop the code for libcurl-level downgrade to SSLv3 - Accidentally lost the result code in imap_state_capability() and - imap_state_login() with commit b06a78622609. + This code was already deactivated by commit + ec783dc142129d3860e542b443caaa78a6172d56. -- imap: Another minor comment addition / tidy up +- openssl: fix a line length warning -- imap: Updated the coding style for state changes after a send operation - - Some state changes would be performed after a failure test that - performed a hard return, whilst others would be performed within a test - for success. Updated the code, for consistency, so all instances are - performed within a success test. +Guenter Knauf (29 Oct 2014) +- Added NetWare support to build with nghttp2. -- pop3 / smtp: Small comment tidy up +- Fixed error message since we require ALPN support. + +- Check for ALPN via OpenSSL version number. - Small tidy up to keep some comments consistant across each of the email - protocols. + This check works also with to non-configure platforms. -- [Jiri Hruska brought this change] +Steve Holme (28 Oct 2014) +- sasl_sspi: Fixed typo in comment - imap: FETCH response handler cleanup before further changes - - Removed superfluous NULL assignment after Curl_safefree() and rewrote - some comments and logging messages. +- code cleanup: We prefer 'CURLcode result' -- pop3: Small tidy up of function arguments +Daniel Stenberg (28 Oct 2014) +- TODO: consider supporting STAT -- imap: Small tidy up of function arguments +- mk-ca-bundle: spell fix "version" -- smtp: Corrected debug message for POP3_AUTH_FINAL constant +- HTTP: return larger than 3 digit response codes too - Following commit ad3177da24b8 corrected the debug message in state() - from AUTH to AUTH_FINAL. + HTTP 1.1 is clearly specified to only allow three digit response codes, + and libcurl used sscanf("%3d") for that purpose. This made libcurl + support smaller numbers but not larger. It does now, but we will not + make any specific promises nor document this further since it is going + outside of what HTTP is. + + Bug: http://curl.haxx.se/bug/view.cgi?id=1441 + Reported-by: Balaji -- pop3: Corrected debug message for POP3_AUTH_FINAL constant +- src/: remove version.h.dist from gitignore - Following commit afad1ce753a1 corrected the debug message in state() - from AUTH to AUTH_FINAL. + It has not been used since commit f7bfdbab in 2011 -- imap: Corrected debug message for IMAP_AUTHENTICATE_FINAL constant +Steve Holme (26 Oct 2014) +- ntlm: We prefer 'CURLcode result' - Following commit 13006f3de9ec corrected the debug message in state() - from AUTHENTICATE to AUTHENTICATE_FINAL. + Continuing commit 0eb3d15ccb more return code variable name changes. + +Guenter Knauf (26 Oct 2014) +- Cosmetics: lowercase non-special subroutine names. -- [Jiri Hruska brought this change] +Steve Holme (26 Oct 2014) +- RELEASE-NOTES: Synced with 07ac29a058 - imap: Fixed error code returned for invalid FETCH response +- http_negotiate: We prefer 'CURLcode result' - If the FETCH command does not result in an untagged response the the - UID is probably invalid. As such do not return CURLE_OK. + Continuing commit 0eb3d15ccb more return code variable name changes. -- [Jiri Hruska brought this change] +- http_negotiate: Fixed missing check for USE_SPNEGO - imap: Added processing of the final FETCH responses - - Not processing the final FETCH responses was not optimal, not only - because the response code would be ignored but it would also leave data - unread on the socket which would prohibit connection reuse. +- sspi: Synchronization of cleanup code between auth mechanisms -- [Jiri Hruska brought this change] +- sspi: Renamed max token length variables + + Code cleanup to try and synchronise code between the different SSPI + based authentication mechanisms. - imap: Introduced FETCH_FINAL state for processing final fetch responses +- sspi: Renamed expiry time stamp variables - A typical FETCH response can be broken down into four parts: + Code cleanup to try and synchronise code between the different SSPI + based authentication mechanisms. + +- sspi: Only call CompleteAuthToken() when complete is needed - 1) "* FETCH ( {}\r\n", using continuation syntax - 2) bytes of the actual message - 3) ")\r\n", finishing the untagged response - 4) " OK ...", finishing the command + Don't call CompleteAuthToken() after InitializeSecurityContext() has + returned SEC_I_CONTINUE_NEEDED as this return code only indicates the + function should be called again after receiving a response back from + the server. - Part 1 is read in imap_fetch_resp(), part 2 is consumed in the PERFORM - phase by the transfer subsystem, parts 3 and 4 are currently ignored. + This only affected the Digest and NTLM authentication code. -- imap: fix autobuild warning +Dan Fandrich (26 Oct 2014) +- Added the "flaky" keyword to a number of tests - Removed whitespace from imap_perform() + Each shows evidence of flakiness on at least one platform on + the autobuilds. Users can use this keyword to skip these tests + if desired. -- imap: fix compiler warning +Steve Holme (26 Oct 2014) +- ntlm: Return all errors from Curl_ntlm_core_mk_nt_hash() - error: declaration of 'imap' shadows a previous local + For consistency with other areas of the NTLM code propagate all errors + from Curl_ntlm_core_mk_nt_hash() up the call stack rather than just + CURLE_OUT_OF_MEMORY. + +- ntlm: Return CURLcode from Curl_ntlm_core_mk_lm_hash() -- smtp: Re-factored the final SMTP_AUTH constant +- ntlm: Use 'CURLcode result' - Changed the final SMTP_AUTH constant to SMTP_AUTH_FINAL for consistency - with the response function. + Continuing commit 0eb3d15ccb more return code variable name changes. -- pop3: Re-factored the final POP3_AUTH constant +- ntlm: Only define ntlm data structure when USE_NTLM is defined + +- ntlm: Changed handles to be dynamic like other SSPI handles - Changed the final POP3_AUTH constant to POP3_AUTH_FINAL for consistency - with the response function. + Code cleanup to try and synchronise code between the different SSPI + based authentication mechanisms. -- imap: Re-factored final IMAP_AUTHENTICATE constant +- ntlm: Renamed handle variables to match other SSPI structures - Changed the final IMAP_AUTHENTICATE constant to IMAP_AUTHENTICATE_FINAL - for consistency with the response function. + Code cleanup to try and synchronise code between the different SSPI + based authentication mechanisms. -- imap: Updated the coding style of imap_state_servergreet_resp() +- ntlm: Renamed SSPI based input token variables - Updated the coding style, in this function, to be consistant with other - response functions rather then performing a hard return on failure. + Code cleanup to try and synchronise code between the different SSPI + based authentication mechanisms. -- imap: Reversed the logic of the (un)successful tagged SELECT response +- ntlm: We prefer 'CURLcode result' - Reversed the logic of the unsuccessful vs successful tagged SELECT - response in imap_state_select_resp() to be more logical to read. + Continuing commit 0eb3d15ccb more return code variable name changes. -- imap: Reversed the logic of the (un)successful tagged CAPABILITY response +- build: Added WinIDN build configuration options - Reversed the logic of the unsuccessful vs successful tagged CAPABILITY - response in imap_state_capability_resp() to be more logical to read. + Added support for WinIDN build configurations to the VC8 and VC9 + project files. -- imap: Corrected char* references with char * +Nick Zitzmann (24 Oct 2014) +- darwinssl: detect possible future removal of SSLv3 from the framework - Corrected char* references made in commit: 709b3506cd9b. + If Apple ever drops SSLv3 support from the Security framework, we'll fail with an error if the user insists on using SSLv3. -- [Jiri Hruska brought this change] +Patrick Monnerat (24 Oct 2014) +- gskit.c: remove SSLv3 from SSL default. - imap: Added processing of more than one response when sent in same packet - - Added a loop to imap_statemach_act() in which Curl_pp_readresp() is - called until the cache is drained. Without this multiple responses - received in a single packet could result in a hang or delay. +- gskit.c: use 'CURLcode result' -- [Jiri Hruska brought this change] +Daniel Stenberg (24 Oct 2014) +- [Jay Satiro brought this change] - imap: Added skipping of SELECT command if already in the same mailbox + SSL: Remove SSLv3 from SSL default due to POODLE attack - Added storage and checking of the last mailbox userd to prevent - unnecessary switching. + - Remove SSLv3 from SSL default in darwinssl, schannel, cyassl, nss, + openssl effectively making the default TLS 1.x. axTLS is not affected + since it supports only TLS, and gnutls is not affected since it already + defaults to TLS 1.x. + + - Update CURLOPT_SSLVERSION doc -- [Jiri Hruska brought this change] +- pipelining: only output "is not blacklisted" in debug builds - imap: Introduced the mailbox variable - - Added the mailbox variable to the per-connection structure in - preparation for checking for an already selected mailbox. +- *.3: add/extend "SEE ALSO" sections -- email: Slight reordering of connection based variables - - Reordered the state and ssl_done variables in order to provide more - consistency between the email protocols as well as for for an upcoming - change. +- curl_easy_pause.3: minor wording edit -- imap: Tidied up comments for connection based variables +- curl_getdate.3: provide a "SEE ALSO" section -- DOCS: Added the IMAP UIDVALIDITY property to the CURLOPT_URL section +- curl_global_init.3: minor formatting fix, add version info -- [Jiri Hruska brought this change] +- url.c: use 'CURLcode result' - imap: Added verification of UIDVALIDITY mailbox attribute +- code cleanup: we prefer 'CURLcode result' + + ... for the local variable name in functions holding the return + code. Using the same name universally makes code easier to read and + follow. - Added support for checking the UIDVALIDITY, and aborting the request, if - it has been specified in the URL and the server response is different. + Also, unify code for checking for CURLcode errors with: + + if(result) or if(!result) + + instead of + + if(result == CURLE_OK), if(CURLE_OK == result) or if(result != CURLE_OK) -- [Jiri Hruska brought this change] +- Curl_add_timecondition: skip superfluous varible assignment + + Detected by cppcheck. - imap: Added support for parsing the UIDVALIDITY property +- Curl_pp_flushsend: skip superfluous assignment - Added support for parsing the UIDVALIDITY property from the SELECT - response and storing it in the per-connection structure. + Detected by cppcheck. -- [Jiri Hruska brought this change] +- Curl_pp_readresp: remove superfluous assignment + + Variable already assigned a few lines up. + + Detected by cppcheck. - imap: Introduced the mailbox_uidvalidity variable +- Curl_proxyCONNECT: remove superfluous statement - Added the mailbox_uidvalidity variable to the per-connection structure - in preparation for checking the UIDVALIDITY mailbox attribute. + The variable is already assigned, skip the duplicate assignment. + + Pointed out by cppcheck. -- imap: Corrected comment in imap_endofresp() +Guenter Knauf (24 Oct 2014) +- Added MinGW support to build with nghttp2. -- imap: Corrected whitespace +- Added VC ssh2 target to main Makefile. -- [Jiri Hruska brought this change] +- Some cosmetics and simplifies. - imap: Added filtering of CAPABILITY and FETCH untagged responses +- Remove dependency on openssl and cut. - Only responses that contain "CAPABILITY" and "FETCH", respectively, - will be sent to their response handler. + Prefer usage of Perl modules for sha1 calculation since there + might be systems where openssl is not installed or not in path. + If openssl is used for sha1 calculation then dont rely on cut + since it is usually not available on other systems than Linux. + +Daniel Stenberg (23 Oct 2014) +- RELEASE-NOTES: synced with e116d0a62 -- [Jiri Hruska brought this change] +- CURLOPT_RESOLVE.3: add an example - imap: Added a helper function for upcoming untagged response filtering +- gnutls: removed dead code - RFC 3501 states that "the client MUST be prepared to accept any response - at all times" yet we assume anything received with "* " at the beginning - is the untagged response we want. + Bug: http://curl.haxx.se/bug/view.cgi?id=1437 + Reported-by: Julien + +- Curl_rand: Uninitialized variable: r + + This is not actually used uninitialized but we silence warnings. - Introduced a helper function that checks whether the input looks like a - response to specified command, so that we may filter the ones we are - interested in according to the current state. + Bug: http://curl.haxx.se/bug/view.cgi?id=1437 + Reported-by: Julien -- [Jiri Hruska brought this change] +- opts: provide more and updated examples - imap: Moved CAPABILITY response handling to imap_state_capability_resp() +- CURLOPT_RANGE.3: works for SFTP as well - Introduced similar handling to the FETCH responses, where even the - untagged data responses are handled by the response handler of the - individual state. + ... and added a small example -Linus Nielsen Feltzing (26 Feb 2013) -- Remove unused variable in smtp_state_data_resp() +- curl.1: edited for clarity -Steve Holme (25 Feb 2013) -- email: Small tidy up following recent changes - -- smtp: Removed bytecountp from the per-request structure - - Removed this pointer to a downloaded bytes counter because it was set in - smtp_init() to point to the same variable the transfer functions keep - the count in (k->bytecount), effectively making the code in transfer.c - "*k->bytecountp = k->bytecount" a no-op. +- CURLOPT_SSLVERSION.3: provide an example -- pop3: Removed bytecountp from the per-request structure - - Removed this pointer to a downloaded bytes counter because it was set in - pop3_init() to point to the same variable the transfer functions keep - the count in (k->bytecount), effectively making the code in transfer.c - "*k->bytecountp = k->bytecount" a no-op. +- docs/libcurl/ABI: more markdown friendly -- [Jiri Hruska brought this change] +- docs: edited lots of libcurl docs for clarity - imap: Removed bytecountp from the per-request structure - - Removed this pointer to a downloaded bytes counter because it was set in - imap_init() to point to the same variable the transfer functions keep - the count in (k->bytecount), effectively making the code in transfer.c - "*k->bytecountp = k->bytecount" a no-op. +- opts: added examples -- [Jiri Hruska brought this change] +- HISTORY: two glimpses in 2014 - imap: Adjusted SELECT and FETCH function order +Kamil Dudka (20 Oct 2014) +- nss: reset SSL handshake state machine - Moved imap_select() and imap_fetch() to be grouped with the other - perform functions. + ... when the handshake succeeds + + This fixes a connection failure when FTPS handle is reused. -- [Jiri Hruska brought this change] +Daniel Stenberg (20 Oct 2014) +- [Peter Wu brought this change] - imap: Adjusted SELECT and FETCH state order in imap_statemach_act() + cmake: generate pkg-config and curl-config - Exchanged the position of these states in the switch statements to - match the state enum, execution and function order. - -- imap: Minor tidy up of comments in imap_parse_url_path() + Initial work to generate a pkg-config and curl-config script. Static + linking (`curl-config --static-libs` and `pkg-config --shared --libs + libcurl`) is broken and therefore disabled. - Tidy up of comments before next round of imap changes. - -- imap: Fixed incorrect comparison for STARTTLS in imap_endofresp() + CONFIGURE_OPTIONS does not make sense for CMake, use an empty string + for now. - Corrected the comparison type in addition to commit 1dac29fa83a9. - -- DOCS: Corrected IMAP URL examples according to RFC5092 + At least `curl-config --features` and `curl-config --protocols` work + which is needed by runtests.pl. - URL examples that included the UID weren't technically correct although - would pass the curl parser. + Signed-off-by: Peter Wu -Nick Zitzmann (24 Feb 2013) -- darwinssl: fix undefined $ssllib warning in runtests.pl +- [Peter Wu brought this change] + + cmake: use LIBCURL_VERSION from curlver.h + + This matches the behavior from autotools. The auxiliary major, minor + and patch components are not needed anymore and therefore removed. - I also added --with-darwinssl to the list of SSL options in configure. + Signed-off-by: Peter Wu -Steve Holme (24 Feb 2013) -- imap: Added check for new internal imap response code +- [Peter Wu brought this change] -- imap: Changed the order of the response types in imap_endofresp() + cmake: add SUPPORT_FEATURES and SUPPORT_PROTOCOLS - From a maintenance point of view the code reads better to view tagged - responses, then untagged followed by continuation responses. + For compatibility with autoconf, it will be used later for curl-config + and pkg-config. Not all features and or protocols can be enabled as + these are missing additional checks (see new TODOs). - Additionally, this matches the order of responses in POP3. + SUPPORT_PROTOCOLS is partially scripted (grep for SUPPORT_PROTOCOLS=) + and manually verified/modified. SUPPORT_FEATURES is manually added. + + Signed-off-by: Peter Wu -- [Jiri Hruska brought this change] +- cmake: add CMake/Macros.cmake to the release tarball - imap: Added stricter parsing of continuation responses +- test545: make it not use a trailing zero - Enhanced the parsing to only allow continuation responses in some - states. + CURLOPT_COPYPOSTFIELDS with a given CURLOPT_POSTFIELDSIZE does not + require a trailing zero of the data and by making sure this test doesn't + use one we know it works (combined with valgrind). -- imap: Simplified memcmp() in tagged response parsing +Steve Holme (16 Oct 2014) +- ntlm: Fixed empty type-2 decoded message info text + + Updated the info text when the base-64 decode of the type-2 message + returns a null buffer to be more specific. -- [Jiri Hruska brought this change] +- ntlm: Fixed empty/bad base-64 decoded buffer return codes - imap: Reworked the logic of untagged command responses +- ntlm: Avoid unnecessary buffer allocation for SSPI based type-2 token -- imap: Corrected spacing of trailing brace +Daniel Stenberg (16 Oct 2014) +- httpcustomheader.c: make use of more CURLOPT_HTTPHEADER features + + ... and only do a single request for clarity. -- [Jiri Hruska brought this change] +Steve Holme (15 Oct 2014) +- sasl_sspi: Fixed some typos - imap: Added stricter parsing of tagged command responses - - Enhanced the parsing of tagged responses which must start with "OK", - "NO" or "BAD" +- sasl_sspi: Fixed Kerberos response buffer not being allocated when using SSO -- [Jiri Hruska brought this change] +Daniel Stenberg (15 Oct 2014) +- [Bruno Thomsen brought this change] - imap: Simplified command response test in imap_endofresp() + mk-ca-bundle: added SHA-384 signature algorithm + + Certificates based on SHA-1 are being phased out[1]. + So we should expect a rise in certificates based on SHA-2. + Adding SHA-384 as a valid signature algorithm. + + [1] https://blog.mozilla.org/security/2014/09/23/phasing-out-certificates-with-sha-1-based-signature-algorithms/ + + Signed-off-by: Bruno Thomsen -- [Jiri Hruska brought this change] +Patrick Monnerat (14 Oct 2014) +- OS400: fix bugs in curl_*escape_ccsid() and reduce variables scope - imap: Corrected comment in imap_endofresp() +- Implement pinned public key in GSKit backend -- DOCS: Corrected layout of POP3 and IMAP URL examples - - Corrected layout issues with the POP3 and IMAP URL examples introduced - in commit cb3ae6894fb2. +Daniel Stenberg (14 Oct 2014) +- CURLOPT_TLSAUTH_*.3: fix reference typos -- DOCS: Updated CURLOPT_URL section following recent POP3 and IMAP changes +- cleanups: reduce variable scope - Updated the POP3 sub-section to refer to message ID rather than mailbox. - - Added an IMAP sub-section with example URLs depicting the specification - of mailbox, uid and section. + cppcheck pointed these out. -- pop3: Refactored the mailbox variable as it didn't reflect it's purpose +- singleipconnect: remove dead assignment never used - Updated the mailbox variable to correctly reflect it's purpose. The - name mailbox was a leftover from when IMAP and POP3 support was - initially added to curl. + cppcheck pointed this out. + +- pinning: minor code style policing + +Patrick Monnerat (13 Oct 2014) +- Factorize pinned public key code into generic file handling and backend specific + +- vtls: remove QsoSSL -- FEATURES: Updated following recent IMAP changes +- gskit: supply dummy randomization function -- [Jiri Hruska brought this change] +- vtls/*: deprecate have_curlssl_md5sum and set-up default md5sum implementation - imap: Added the ability to FETCH a specific UID and SECTION +Daniel Stenberg (13 Oct 2014) +- [Peter Wu brought this change] + + tests: move TESTCASES to Makefile.inc, add show for cmake + + This change allows runtests.pl to be run from the CMake builddir: - Updated the FETCH command to send the UID and SECTION parsed from the - URL. By default the BODY specifier doesn't include a section, BODY[] is - now sent whereas BODY[TEXT] was previously sent. In my opinion - retrieving just the message text is rarely useful when dealing with - emails, as the headers are required for example, so that functionality - is not retained. In can however be simulated by adding SECTION=TEXT to - the URL. + export srcdir=/tmp/curl/tests; + perl -I$srcdir $srcdir/runtests.pl -l - Also updated test801 and test1321 due to the BODY change. + In order to make this possible, all test cases have been moved from + Makefile.am to Makefile.inc. + + Signed-off-by: Peter Wu -- email: Additional tidy up of comments following recent changes +- [Peter Wu brought this change] -- smtp: Removed some FTP heritage leftovers + cmake: enable IPv6 by default if available - Removed user and passwd from the SMTP struct as these cannot be set on - a per-request basis and are leftover from legacy FTP code. + ENABLE_IPV6 depends on HAVE_GETADDRINFO or you will get a + Curl_getaddrinfo_ex error. Enable IPv6 by default, disabling it if + struct sockaddr_in6 is not found in netinet/in.h. - Changed some comments still using FTP terminology. - -- smtp: Moved the per-request variables to the per-request data structure + Note that HAVE_GETADDRINFO_THREADSAFE is still not set as it needs more + platform checks even though POSIX requires a thread-safe getaddrinfo. - Moved the rcpt variable from the per-connection struct smtp_conn to the - new per-request struct and fixed references accordingly. - -- pop3: Introduced a custom SMTP structure for per-request data + Verified on Arch Linux x86_64 with glibc 2.20-2 and Linux 3.16-rc7. - Created a new SMTP structure and changed the type of the smtp proto - variable in connectdata from FTP* to SMTP*. + Signed-off-by: Peter Wu -unknown (23 Feb 2013) -- [Steve Holme brought this change] +- [Peter Wu brought this change] - imap: Minor correction of comments for max line length + cmake: build tool_hugehelp (ENABLE_MANUAL) + + Rather than always outputting an empty manual page for the '-M' option, + generate a full manual page as done by autotools. For simplicity in + CMake, always generate the gzipped page as it will not be used anyway + when zlib is not available. + + Signed-off-by: Peter Wu -Daniel Stenberg (23 Feb 2013) -- strcasestr: remove check for this unused function +- [Peter Wu brought this change] -- pop3: fix compiler warning + tests/http_pipe.py: Python 3 support + + The 2to3 tool converted socketserver (which I manually fixed up with an + import fallback) and the print(e) line. The xrange option was converted + to range, but it seems better to use the '*' operator here for + simplicity. - error: declaration of 'pop3' shadows a previous local + Signed-off-by: Peter Wu -Steve Holme (23 Feb 2013) -- [Jiri Hruska brought this change] +- SECURITY: slightly nicer markdown format - imap: Added URL parsing of new variables +- RELEASE-PROCEDURE: better markdown, more content + +- RELEASE-NOTES: synced with 6637b237e6eb - Updated the imap_parse_url_path() function to parse uidvalidity, uid and - section parameters based on RFC-5092. + ... and bumped the planned release version. -- [Jiri Hruska brought this change] +- vtls: have vtls.h include the backend header files + + It turned out some features were not enabled in the build since for + example url.c #ifdefs on features that are defined on a per-backend + basis but vtls.h didn't include the backend headers. + + CURLOPT_CERTINFO was one such feature that was accidentally disabled. - imap: Introduced imap_is_bchar() function +- test2036: verify -O with no slash at all in the URL - Added imap_is_bchar() for testing if a given character is a valid bchar - or not. + Similar to test 76 but that test's URL has a slash just no file name + part. -- [Jiri Hruska brought this change] +- get_url_file_name: make no slash equal empty string - imap: Introduced new per-request veriables +- get_url_file_name: never return a NULL string *and* OK + + Change 987a4a73 assumes that as it simplifies life in the calling + function. - Added uidvalidity, uid and section variables to the per-request IMAP - structure in preparation for upcoming URL parsing. + Reported-by: Fabian Keil -- pingpong: Renamed curl_ftptransfer to curl_pp_transfer +- [Jakub Zakrzewski brought this change] -- pop3: Removed some FTP heritage leftovers + Cmake: Build with GSSAPI (MIT or Heimdal) - Removed user and passwd from the POP3 struct as these cannot be set on - a per-request basis and are leftover from legacy FTP code. + It tries hard to recognise SDK's on different platforms. On windows MIT + Kerberos installs SDK with other things and puts path into registry. + Heimdal have separate zip archive. On linux pkg-config is tried, then + krb5-config script and finally old-style libs and headers detection. - Changed some comments still using FTP terminology. + Command line args: + * CMAKE_USE_GSSAPI - enables GSSAPI detection + * GSS_ROOT_DIR - if set, should point to the root of GSSAPI installation + (the one with include and lib directories) -- pop3: Moved the per-request variables to the per-request data structure - - Moved the mailbox and custom request variables from the per-connection - struct pop3_conn to the new per-request struct and fixed references - accordingly. +- [Jakub Zakrzewski brought this change] -- pop3: Introduced a custom POP3 structure for per-request data + Cmake: Got rid of setup_curl_dependencies - Created a new POP3 structure and changed the type of the pop3 proto - variable in connectdata from FTP* to POP*. + There is no need for such function. Include_directories propagate by + themselves and having a function with one simple link statement makes + little sense. -- [Jiri Hruska brought this change] +- [Jakub Zakrzewski brought this change] - imap: Fixed escaping of mailbox names + Cmake: Avoid cycle directory dependencies. - Used imap_atom() to escape mailbox names in imap_select(). + Because we prepended libraries to list, CMake had troubles resolving + link directory order as it detected some cycles. Appending to list ensures + that dependencies will preceed dependees. -- pingpong: Moved curl_ftptransfer definition to pingpong.h - - Moved the ftp transfer structure into pingpong.h so other protocols that - require it don't have to include ftp.h. +- [Jakub Zakrzewski brought this change] -- urldata.h: Fixed comment for opt_no_body variable + Cmake: Fix library list provided to cURL tests. - Corrected comment for opt_no_body variable to CURLOPT_NOBODY. - -- email: Minor tidy up following IMAP changes + The list must be set after those nice CMake tests as we mess with + CMAKE_REQUIRED_LIBRARIES there. -- [Jiri Hruska brought this change] +- [Jakub Zakrzewski brought this change] - imap: Removed more FTP leftovers + Cmake: Check for OpenSSL before OpenLDAP. - Changed some variables and comments still using FTP terminology. + OpenLDAP might have been build with OpenSSL. Checking for OpenLDAP first + may result in undefined symbols. Of course, the found OpenSSL libraries + must also be linked whenever OpenLDAP is. -- [Jiri Hruska brought this change] +- curl_multi_fdset.3: improved the formatting slightly - imap: Removed some FTP heritage leftovers +- curl_multi_fdset: explain the fd_set arguments + +Kamil Dudka (8 Oct 2014) +- nss: do not fail if a CRL is already cached - Removed user and passwd from the IMAP struct as these cannot be set on - a per-request basis and are leftover from legacy FTP code. + This fixes a copy-paste mistake from commit 2968f957. -- [Jiri Hruska brought this change] +Patrick Monnerat (8 Oct 2014) +- OS400: upgrade interface for pinned public key (no implementation yet) - imap: Introduced a custom IMAP structure for per-request data +Daniel Stenberg (8 Oct 2014) +- FormAdd: precaution against memdup() of NULL pointer - Created a new IMAP structure and changed the type of the imap proto - variable in connectdata from FTP* to the new IMAP*. + Coverity CID 252518. This function is in general far too complicated for + its own good and really should be broken down into several smaller + funcitons instead - but I'm adding this protection here now since it + seems there's a risk the code flow can end up here and dereference a + NULL pointer. + +- operate: avoid NULL dereference - Moved the mailbox variable from the per-connection struct imap_conn to - the new per-request struct and fixed references accordingly. + Coverity CID 1241948. dumpeasysrc() would get called with + config->current set to NULL which could be dereferenced by a warnf() + call. -- pop3: Updated do phrase clean-up comment +- do_sec_send: remove dead code - Following commit 65644b833532 for the IMAP module updated the clean-up - comment in POP3. + Coverity CID 1241951. The condition 'len >= 0' would always be true at + that point and thus not necessary to check for. -- imap: Fixed memory leak when performing multiple selects +- krb5_encode: remove unused argument - Moved the clean-up of the mailbox variable from imap_disconnect() to - imap_done() as this variable is allocated in the do phase, yet would - have only been freed only once if multiple selects where preformed - on a single connection. + Coverity CID 1241957. Removed the unused argument. As this struct and + pointer now are used only for krb5, there's no need to keep unused + function arguments around. -Daniel Stenberg (22 Feb 2013) -- [Alexander Klauer brought this change] +- operate_do: skip superfluous check for NULL pointer + + Coverity CID 1243583. get_url_file_name() cannot fail and return a NULL + file name pointer so skip the check for that - it tricks coverity into + believing it can happen and it then warns later on when we use 'outfile' + without checking for NULL. - Documentation: Typo in docs/CONTRIBUTE +- curl_easy_getinfo.3: spell-fix - Fixes a typo get → git in docs/CONTRIBUTE. + Reported-By: Luan Cestari -- [Alexander Klauer brought this change] +- [moparisthebest brought this change] - repository: ignore patch files generated by git - - Ignores the patch files generated by the 'git format-patch' command. + GnuTLS: Implement public key pinning -- [Alexander Klauer brought this change] +- [moparisthebest brought this change] - libcurl documentation: clarifications and typos + SSL: implement public key pinning - * Elaborates on default values of some curl_easy_setopt() options. - * Reminds the user to cast variadic arguments to curl_easy_setopt() to - 'void *' where curl internally interprets them as such. - * Clarifies the working of the CURLOPT_SEEKFUNCTION option for - curl_easy_setopt(). - * Fixes typo 'forth' → 'fourth'. - * Elaborates on CURL_SOCKET_TIMEOUT. - * Adds some missing periods. - * Notes that the return value of curl_version() must not be passed to - free(). - -- [Alexander Klauer brought this change] + Option --pinnedpubkey takes a path to a public key in DER format and + only connect if it matches (currently only implemented with OpenSSL). + + Provides CURLOPT_PINNEDPUBLICKEY for curl_easy_setopt(). + + Extract a public RSA key from a website like so: + openssl s_client -connect google.com:443 2>&1 < /dev/null | \ + sed -n '/-----BEGIN/,/-----END/p' | openssl x509 -noout -pubkey \ + | openssl rsa -pubin -outform DER > google.com.der - lib/url.c: Generic read/write data pointers +- multi_runsingle: fix possible memory leak - Always interprets the pointer passed with the CURLOPT_WRITEDATA or - CURLOPT_READDATA options of curl_easy_setopt() as a void pointer in - order to avoid problems in environments where FILE and void pointers - have non-trivial conversion. + Coverity CID 1202837. 'newurl' can in fact be allocated even when + Curl_retry_request() returns failure so free it if need be. -- [Alexander Klauer brought this change] +- ares::Curl_resolver_cancel: skip checking for NULL conn + + Coverity CID 1243581. 'conn' will never be NULL here, and if it would be + the subsequent statement would dereference it! - libcurl documentation: updates HTML index +- parseconfig: skip a NULL check - * Adds several links to documentation of library functions which were - missing. - * Marks documentation of deprecated library functions "(deprecated)". - * Removes spurious .html suffixes. + Coverity CID 1154198. This NULL check implies that the pointer _can_ be + NULL at this point, which it can't. Thus it is dead code. It tricks + static analyzers to warn about dereferencing the pointer since the code + seems to imply it can be NULL. -- ossl_seed: avoid recursive seeding! +- [Waldek Kozba brought this change] -Steve Holme (22 Feb 2013) -- [Jiri Hruska brought this change] + multi-uv.c: call curl_multi_info_read() better + + Improves it for low-latency cases (like the communication with + localhost) - Fixed checking the socket if there is data waiting in the cache +- tool_go_sleep: use (void) to spell out we ignore the return value - Use Curl_pp_moredata() in Curl_pp_multi_statemach() to check if there is - more data to be received, rather than the socket state, as a task could - hang waiting for more data from the socket itself. + Coverity CID 1222080. -- imap.c: Fixed an incorrect variable reference +- ssh_statemach_act: split out assignment from check - Fixed an incorrect variable reference which was introduced in commit - a1701eea289f as a result of a copy and paste from SMTP/POP3. + just a minor code style thing to make the code clearer -- [Jiri Hruska brought this change] +Marc Hoersken (4 Oct 2014) +- curl_schannel.c: Fixed possible memory or handle leak + + First try to fix possible memory leaks, in this case: + Only connssl->ctxt xor onnssl->cred being initialized. - pingpong: Introduce Curl_pp_moredata() +Daniel Stenberg (4 Oct 2014) +- getparameter: remove dead code - A simple function to test whether the PP is not sending and there are - still more data in its receiver cache. This will be later utilized to: + Coverity CID 1061126. 'parse' will always be non-NULL here. + +- getparameter: comment a switch FALLTHROUGH - 1) Change Curl_pp_multi_statemach() and Curl_pp_easy_statemach() to - not test socket state and just call user's statemach_act() function - when there are more data to process, because otherwise the task would - just hang, waiting for more data from the socket. + Coverity CID 1061118. Point out that it is on purpose. + +- choose_mech: fix return code - 2) Allow PP users to read multiple responses by looping as long as there - are more data available and current phase is not finished. - (Currently needed for correct processing of IMAP SELECT responses.) + Coverity CID 1241950. The pointer is never NULL but it might point to + NULL. -Nick Zitzmann (19 Feb 2013) -- FEATURES: why yes, we do support metalink +- Curl_sec_read_msg: spell out that we ignore return code - I just noticed Metalink support wasn't listed as a feature of the tool. + Coverity CID 1241947. Since if sscanf() fails, the previously set value + remains set. -- metalink: fix improbable crash parsing metalink filename +- nonblock: call with (void) to show we ignore the return code - The this_url pointer wasn't being initialized, so if strdup() would return - null when copying the filename in a metalink file, then hilarity would - ensue during the cleanup phase. This change was brought to you by clang, - which noticed this and raised a warning. + Coverity pointed out several of these. -Yang Tse (19 Feb 2013) -- smtp.c: fix enumerated type mixed with another type +- parse_proxy: remove dead code. + + Coverity CID 982331. -- polarssl threadlock cleanup +- Curl_debug: document switch fallthroughs -Nick Zitzmann (18 Feb 2013) -- docs: schannel and darwinssl documentation improvements +- curl_multi_remove_handle: remove dead code - Schannel and darwinssl use the certificates built into the - OS to do vert verification instead of bundles. darwinssl - is thread-safe. Corrected typos in the NSS docs. + Coverify CID 1157776. Removed a superfluous if() that always evaluated + true (and an else clause that never ran), and then re-indented the + function accordingly. -Daniel Stenberg (18 Feb 2013) -- resolver_error: remove wrong error message output +- Curl_pipeline_server_blacklisted: handle a NULL server name - The attempt to use gai_strerror() or alternative function didn't work as - the 'sock_error' field didn't contain the proper error code. But since - this hasn't been reported and thus isn't really a big deal I decided to - just scrap the whole attempt to output the detailed resolver error and - instead remain with just stating that the resolving of the name failed. + Coverity CID 1215284. The server name is extracted with + Curl_copy_header_value() and passed in to this function, and + copy_header_value can actually can fail and return NULL. -- [Kim Vandry brought this change] +- ssh: comment "fallthrough" in switch statement - Curl_resolver_is_resolved: show proper host name on failed resolve +- [Jeremy Lin brought this change] -- Curl_resolver_is_resolved: fix compiler warning + ssh: improve key file search - conversion to 'int' from 'long int' may alter its value - -- compiler warning fix + For private keys, use the first match from: user-specified key file + (if provided), ~/.ssh/id_rsa, ~/.ssh/id_dsa, ./id_rsa, ./id_dsa + + Note that the previous code only looked for id_dsa files. id_rsa is + now generally preferred, as it supports larger key sizes. - follow-up to commit ed7174c6f66, rename 'wait' to 'block' + For public keys, use the user-specified key file, if provided. + Otherwise, try to extract the public key from the private key file. + This means that passing --pubkey is typically no longer required, + and makes the key-handling behavior more like OpenSSH. -- compiler warning fix: declaration of 'wait' shadows a global declaration +- CURLOPT_HTTPHEADER.3: libcurl doesn't copy the whole list + +- detect_proxy: fix possible single-byte memory leak - It seems older gcc installations (at least) will cause warnings if we - name a variable 'wait'. Now changed to 'block' instead. + Coverity CID 1202836. If the proxy environment variable returned an empty + string, it would be leaked. While an empty string is not really a proxy, other + logic in this function already allows a blank string to be returned so allow + that here to avoid the leak. + +- multi_runsingle: fix memory leak - Reported by: Jiří Hruška - Bug: http://curl.haxx.se/mail/lib-2013-02/0247.html + Coverity CID 1202837. There's a potential risk that 'newurl' gets + overwritten when it was already pointing to allocated memory. -Nick Zitzmann (17 Feb 2013) -- MacOSX-Framework: Make script work in Xcode 4.0 and later +- pop3_perform_authentication: fix memory leak - Apple made a number of changes to Xcode 4. The SDKs were moved, the entire - Developer folder was moved, and PowerPC support was removed. The script - will now adapt to those changes and should be future-proofed against - additional changes in case Apple moves the Developer folder ever again. - Also, the minimum OS X version compiler option was removed, so that the - framework can be built against the latest SDK but still run in older cats. + Coverity CID 1215287. There's a potential risk for a memory leak in + here, and moving the free call to be unconditional seems like a cheap + price to remove the risk. -Daniel Stenberg (17 Feb 2013) -- docs: refer to CURLOPT_ACCEPT_ENCODING instead of the old name +- imap_perform_authentication: fix memory leak + + Coverity CID 1215296. There's a potential risk for a memory leak in + here, and moving the free call to be unconditional seems like a cheap + price to remove the risk. -Steve Holme (16 Feb 2013) -- email: Tidied up result code variables +- wait_or_timeout: return failure when Curl_poll() fails - Tidied up result variables to be consistent in name, declaration order - and default values. + Coverity detected this. CID 1241954. When Curl_poll() returns a negative value + 'mcode' was uninitialized. Pretty harmless since this is debug code only and + would at worst cause an error to _not_ be returned... -Nick Zitzmann (16 Feb 2013) -- ntlm_core: fix compiler warning when building with clang +- curl.1: mention quoting in the URL section - Fixed a 64-to-32 compiler warning raised when building with - clang and the --with-darwinssl option. + and separate the example URLs with newlines -Daniel Stenberg (16 Feb 2013) -- Guile-curl: a new libcurl binding +Steve Holme (30 Sep 2014) +- [Bill Nagel brought this change] -- polarsslthreadlock: #include the proper memory and debug includes + smtp: Fixed intermittent "SSL3_WRITE_PENDING: bad write retry" error + + This patch fixes the "SSL3_WRITE_PENDING: bad write retry" error that + sometimes occurs when sending an email over SMTPS with OpenSSL. OpenSSL + appears to require the same pointer on a write that follows a retry + (CURLE_AGAIN) as discussed here: - Pointed out by Steve Holme + http://stackoverflow.com/questions/2997218/why-am-i-getting-error1409f07fssl-routinesssl3-write-pending-bad-write-retr -Steve Holme (16 Feb 2013) -- email: Removed unnecessary forward declaration +Daniel Stenberg (30 Sep 2014) +- RELEASE-NOTES: synced with 53cbea22310f15 + +- file: reject paths using embedded %00 + + Mostly because we use C strings and they end at a binary zero so we know + we can't open a file name using an embedded binary zero. - Due to the reordering of functions in commit 586f5d361474 the forward - declaration to state_upgrade_tls() are no longer required. + Reported-by: research@g0blin.co.uk -- pop3.c: Added reference to RFC-5034 +Dan Fandrich (26 Sep 2014) +- test506: Fixed a couple of memory leaks in test -Daniel Stenberg (15 Feb 2013) -- [Willem Sparreboom brought this change] +Daniel Stenberg (25 Sep 2014) +- [Yousuke Kimoto brought this change] - PolarSSL: Change to cURL coding style - - Repaired all curl/lib/checksrc.pl warnings in the previous four patches + CURLOPT_COOKIELIST: Added "RELOAD" command + +- [Michael Wallner brought this change] -- [Willem Sparreboom brought this change] + CURLOPT_POSTREDIR.3: Added availability for CURL_REDIR_POST_303 - PolarSSL: WIN32 threading support for entropy +- threaded-resolver: revert Curl_expire_latest() switch - Added WIN32 threading support for PolarSSL entropy if - --enable-threaded-resolver config flag is set and process.h can be found. + The switch to using Curl_expire_latest() in commit cacdc27f52b was a + mistake and was against the advice even mentioned in that commit. The + comparison in asyn-thread.c:Curl_resolver_is_resolved() makes + Curl_expire() the suitable function to use. + + Bug: http://curl.haxx.se/bug/view.cgi?id=1426 + Reported-By: graysky -- [Willem Sparreboom brought this change] +- libcurl docs: improvements all over - PolarSSL: pthread support for entropy +Steve Holme (19 Sep 2014) +- build: Added WinIDN build configuration options - Added pthread support for polarssl entropy if --enable-threaded-resolver - config flag is set and pthread.h can be found. + Added initial support for WinIDN build configurations to the VC10+ + project files. -- [Willem Sparreboom brought this change] +Daniel Stenberg (19 Sep 2014) +- tutorial: signals aren't used for the threaded resolver - PolarSSL: changes to entropy/ctr_drbg/HAVEGE_RANDOM +- FAQ: update the pronunciation section + + As we weren't using the correct phonetic description and doing it correctly + involves funny letters that I'm sure will cause problems for people in a text + document so I instead rephrased it and link to a WAV file with a person + actually saying 'curl'. - Add non-threaded entropy and ctr_drbg and removed HAVEGE_RANDOM define + Reported-By: Dimitar Boevski -- [Willem Sparreboom brought this change] +- CURLOPT_COOKIE*: added more cross-references - PolarSSL: added human readable error strings +- BINDINGS: add node-libcurl - Print out human readable error strings for PolarSSL related errors + Reported-By: Jonathan Cardoso Machado + URL: http://curl.haxx.se/mail/lib-2014-09/0102.html -Steve Holme (15 Feb 2013) -- pop3: Removed unnecessary state changes on failure +- README.http2: updated to reflect current status -- imap: Removed unnecessary state change on failure +- formdata: removed unnecessary USE_SSLEAY use -Daniel Stenberg (15 Feb 2013) -- metalink_cleanup: yet another follow-up fix +- curlssl: make tls backend symbols use curlssl in the name -- metalink_cleanup: define it without argument +- url: let the backend decide CURLOPT_SSL_CTX_ support - Since the function takes no argument, the macro shouldn't take one as - some compilers will error out on that. + ... to further remove specific TLS backend knowledge from url.c -- rename "easy" statemachines: call them block instead - - ... since they're not used by the easy interface really, I wanted to - remove the association. Also, I unified the pingpong statemachine driver - into a single function with a 'wait' argument: Curl_pp_statemach. +- vtls: have the backend tell if it supports CERTINFO -Yang Tse (15 Feb 2013) -- [Gisle Vanem brought this change] +- [Catalin Patulea brought this change] - curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s() + configure: allow --with-ca-path with PolarSSL too + + Missed this in af45542c. + + Signed-off-by: Catalin Patulea -- [Gisle Vanem brought this change] +- CURLOPT_CAPATH: return failure if set without backend support - config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32 +- [Tatsuhiro Tsujikawa brought this change] -- [Gisle Vanem brought this change] + http2: Fix busy loop when EOF is encountered + + Previously we did not handle EOF from underlying transport socket and + wrongly just returned error code CURL_AGAIN from http2_recv, which + caused busy loop since socket has been closed. This patch adds the + code to handle EOF situation and tells the upper layer that we got + EOF. - config-dos.h: define strerror() to strerror_s_() for High-C +Steve Holme (13 Sep 2014) +- build: Added batch wrapper to checksrc.pl -- [Gisle Vanem brought this change] +- RELEASE-NOTES: Synced with bd3df5ec6d - config-dos.h: define HAVE_TERMIOS_H only for djgpp +- [Marcel Raad brought this change] -Steve Holme (14 Feb 2013) -- smtp.c: Fixed a trailing whitespace + sasl_sspi: Fixed Unicode build - Remove tailing whitespace introduced in commit 7ed689d24a4e. + Bug: http://curl.haxx.se/bug/view.cgi?id=1422 + Verified-by: Steve Holme -- pop3: Fixed blocking SSL connect when connecting via POP3S +Daniel Stenberg (12 Sep 2014) +- libcurl-tutorial.3: fix GnuTLS link to thread-safety guidelines - A call to Curl_ssl_connect() was accidentally left in when the SSL/TLS - connection layer was reworked in 7.29. Not only would this cause the - connection to block but had the additional overhead of calling the - non-blocking connect a little bit later. - -- smtp: Refactored the smtp_state_auth_resp() function + The former link was turned into a 404 at some point. - Renamed smtp_state_auth_resp() function to match the implementations in - IMAP and POP3. + Reported-By: Askar Safin -Daniel Stenberg (14 Feb 2013) -- remove ifdefs +- contributors.sh: split list of names at comma - Clarify the code by reducing ifdefs + ... to support a list of names provided in a commit message. + +Steve Holme (12 Sep 2014) +- [Ulrich Telle brought this change] -- strlcat: remove function + ntlm: Fixed HTTP proxy authentication when using Windows SSPI - This function was only used twice, both in places where performance - isn't crucial (socks + if2ip). Removing the use of this function removes - the need to have our private version for systems without it == reduced - amount of code. + Removed ISC_REQ_* flags from calls to InitializeSecurityContext to fix + bug in NTLM handshake for HTTP proxy authentication. - Also, in the SOCKS case it is clearly better to fail gracefully rather - than to truncate the results. + NTLM handshake for HTTP proxy authentication failed with error + SEC_E_INVALID_TOKEN from InitializeSecurityContext for certain proxy + servers on generating the NTLM Type-3 message. - This work was triggered by a bug report on the strcal prototype in - strequal.h. + The flag ISC_REQ_CONFIDENTIALITY seems to cause the problem according + to the observations and suggestions made in a bug report for the + QT project (https://bugreports.qt-project.org/browse/QTBUG-17322). - strlcat was added in commit db70cd28 in February 2001! + Removing all the flags solved the problem. - Bug: http://curl.haxx.se/bug/view.cgi?id=1192 - Reported by: Jeremy Huddleston + Bug: http://curl.haxx.se/mail/lib-2014-08/0273.html + Reported-by: Ulrich Telle + Assisted-by: Steve Holme, Daniel Stenberg -- Curl_FormBoundary: made static +Daniel Stenberg (12 Sep 2014) +- [Ray Satiro brought this change] + + newlines: fix mixed newlines to LF-only + + I use the curl repo mainly on Windows with the typical Windows git + checkout which converts the LF line endings in the curl repo to CRLF + automatically on checkout. The automatic conversion is not done on files + in the repo with mixed line endings. I recently noticed some weird + output with projects/build-openssl.bat that I traced back to mixed line + endings, so I scanned the repo and there are files (excluding the + test data) that have mixed line endings. - As Curl_FormBoundary() is no longer used outside of this file (since - commit ad7291c1a9d), it is now renamed to formboundary() and is made - static. + I used this command below to do the scan. Unfortunately it's not as easy + as git grep, at least not on Windows. This gets the names of all the + files in the repo's HEAD, gets each of those files raw from HEAD, checks + for mixed line endings of both LF and CRLF, and prints the name if + mixed. I excluded path tests/data/test* because those can have mixed + line endings if I understand correctly. + + for f in `git ls-tree --name-only --full-tree -r HEAD`; + do if [ -n "${f##tests/data/test*}" ]; + then git show "HEAD:$f" | \ + perl -0777 -ne 'exit 1 if /([^\r]\n.*\r\n)|(\r\n.*[^\r]\n)/'; + if [ $? -ne 0 ]; + then echo "$f"; + fi; + fi; + done + +- [Viktor Szakáts brought this change] -- ossl_seed: fix the last resort PRNG seeding + mk-ca-bundle.pl: converted tabs to spaces, deleted trailing spaces + +- ROADMAP: markdown eats underscores - Instead of just abusing the pseudo-randomizer from Curl_FormBoundary(), - this now uses Curl_ossl_random() to get entropy. + It interprets them as italic indictors unless we backtick the word. + +- ROADMAP: tiny formatting edit for nicer web output + +Steve Holme (10 Sep 2014) +- ROADMAP.md: Updated GSSAPI authentication following 7.38.0 additions + +- INTERNALS: Added email and updated Kerberos details -Steve Holme (13 Feb 2013) -- email: Tidy up before additional IMAP work +- FEATURES: Updated Kerberos details - Replaced two explicit comparisons of CURLE_OK with boolean alternatives. + Added support for Kerberos 5 to the email protocols following the recent + additions in 7.38.0. - General tidy up of comments. + Removed Kerberos 4 as this has been gone for a while now. -- smtp: Removed duplicate pingpong structure initialisation - - The smtp_connect() function was setting the member variables of the - pingpong structure twice, once before calling Curl_pp_init() and once - after! +Daniel Stenberg (10 Sep 2014) +- [Paul Howarth brought this change] -Yang Tse (13 Feb 2013) -- move msvc IDE related files to 'vs' directory tree + openssl: build fix for versions < 0.9.8e - Use 'vs' directory tree given that 'vc' intended one clashes - with an already existing build target in file Makefile.dist. + Bug: http://curl.haxx.se/mail/lib-2014-09/0064.html -Daniel Stenberg (13 Feb 2013) -- install-sh: updated to support multiple source files as arguments +- mk-ca-bundle.pl: first, try downloading HTTPS with curl - Version 7.29.0 uses Makefiles generated with a newer version of the - autotools than the previous 7.28.1. These Makefiles try to install - e.g. header files by calling install-sh with multiple source files as - arguments. The bundled install-sh is to old and does not support this. + As a sort of step forward, this script will now first try to get the + data from the HTTPS URL using curl, and only if that fails it will + switch back to the HTTP transfer using perl's native LWP functionality. + To reduce the risk of this script being tricked. - The problem only occurs, if install-sh is actually being used, ie. the - platform install executable is to old or not usable. Example: Solaris - 10. + Using HTTPS to get a cert bundle introduces a chicken-and-egg problem so + we can't really ever completely disable HTTP, but chances are that most + users already have a ca cert bundle that trusts the mozilla.org site + that this script downloads from. - The files install-sh and mkinstalldirs are now updated with the automake - 1.11.3 versions. A better fix might be to completely remove them from - git and force the files to be added/created during buildconf. + A future version of this script will probably switch to require a + dedicated "insecure" command line option to allow downloading over HTTP + (or unverified HTTPS). + +- LICENSE-MIXING: removed krb4 info - Bug: http://curl.haxx.se/bug/view.cgi?id=1195 - Reported by: Rainer Jung + krb4 has been dropped since a while now + +- bump: on the 7.38.1-DEV train now! -Yang Tse (13 Feb 2013) -- move msvc IDE related files to 'vc' directory tree +- SSLCERTS: minor updates + + Edited format to look better on the web, added a "it is about trust" + section. -- msvc IDE 'vc' directory tree preparation +Version 7.38.0 (10 Sep 2014) -Steve Holme (12 Feb 2013) -- imap: Corrected a whitespace issue from previous commit +Daniel Stenberg (10 Sep 2014) +- dist: two cmake files are no more - Fixed a small whitespace issue that crept in there in commit - 508cdf4da4d7. + CMake/FindOpenSSL.cmake and FindZLIB.cmake are gone since 14aa8f0c117b -- email: Another post optimisation of endofresp() tidy up +- RELEASE-NOTES: final update for 7.38.0 -- sasl: Fixed null pointer reference when decoding empty digest challenge +- cookies: reject incoming cookies set for TLDs - Fixed a null pointer reference when an empty challenge is passed to the - Curl_sasl_create_digest_md5_message() function. + Test 61 was modified to verify this. - Bug: http://sourceforge.net/p/curl/bugs/1193/ - Reported by: Saran Neti - -- email: Post optimisation of endofresp() tidy up + CVE-2014-3620 - Removed unnecessary end of line check and return. + Reported-by: Tim Ruehsen + URL: http://curl.haxx.se/docs/adv_20140910B.html -Nick Zitzmann (12 Feb 2013) -- darwinssl: Fix send glitchiness with data > 32 or so KB +- [Tim Ruehsen brought this change] + + cookies: only use full host matches for hosts used as IP address + + By not detecting and rejecting domain names for partial literal IP + addresses properly when parsing received HTTP cookies, libcurl can be + fooled to both send cookies to wrong sites and to allow arbitrary sites + to set cookies for others. - An ambiguity in the SSLWrite() documentation lead to a bad inference in the - code where we assumed SSLWrite() returned the amount of bytes written to - the socket, when that is not actually true; it returns the amount of data - that is buffered for writing to the socket if it returns errSSLWouldBlock. - Now darwinssl_send() returns CURLE_AGAIN if data is buffered but not written. + CVE-2014-3613 - Reference URL: http://curl.haxx.se/mail/lib-2013-02/0145.html + Bug: http://curl.haxx.se/docs/adv_20140910A.html -Steve Holme (12 Feb 2013) -- pingpong.h: Fixed line length over 78 characters from b56c9eb48e3c +- HISTORY: fix the 1998 title position -- pingpong: Optimised the endofresp() function +- HISTORY: extended and now markdown + +- SSLCERTS: converted to markdown - Reworked the pp->endofresp() function so that the conndata, line and - line length are passed down to it just as with Curl_client_write() - rather than each implementation of the function having to query - these values. + Only minor edits to make it generate nice HTML output using markdown, as + this document serves both in source release tarballs as on the web site. - Additionally changed the int return type to bool as this is more - representative of the function's usage. + URL: http://curl.haxx.se/docs/sslcerts.html -- email: Post STARTLS capability code tidy up (Part Three) +- ftp-wildcard.c: spell fix - Corrected the order of the upgrade_tls() functions and moved the handler - upgrade and getsock() functions out from the middle of the state related - functions. + Reported-By: Frank Gevaerts -- email: Post STARTLS capability code tidy up (Part Two) - - Corrected the order of the pop3_state_capa() / imap_state_capability() - and the pop3_state_capa_resp() / imap_state_capability_resp() functions - to match the execution order. +- RELEASE-NOTES: synced with 921a0c22a6f -Daniel Stenberg (11 Feb 2013) -- [ulion brought this change] +- THANKS: synced with RELEASE-NOTES for 921a0c22a6f - SOCKS: fix socks proxy when noproxy matched - - Test 1212 added to verify +- polarassl: avoid memset() when clearing the first byte is enough + +- [Catalin Patulea brought this change] + + polarssl: support CURLOPT_CAPATH / --capath - Bug: http://curl.haxx.se/bug/view.cgi?id=1190 + Signed-off-by: Catalin Patulea + +- SECURITY: eh, make more sense! -Steve Holme (11 Feb 2013) -- ntlm: Updated comments for the addition of SASL support to IMAP in v7.29 +- SECURITY: how to join the curl-security list -- RELEASE-NOTES: Updated following the recent imap/pop3/smtp changes +- RELEASE-NOTES: fix the required nghttp2 version typo -Linus Nielsen Feltzing (10 Feb 2013) -- Fix NULL pointer reference when closing an unused multi handle. +- [Brandon Casey brought this change] -Steve Holme (10 Feb 2013) -- email: Post STARTLS capability code tidy up (Part One) + Ensure progress.size_dl/progress.size_ul are always >= 0 + + Historically the default "unknown" value for progress.size_dl and + progress.size_ul has been zero, since these values are initialized + implicitly by the calloc that allocates the curl handle that these + variables are a part of. Users of curl that install progress + callbacks may expect these values to always be >= 0. + + Currently it is possible for progress.size_dl and progress.size_ul + to by set to a value of -1, if Curl_pgrsSetDownloadSize() or + Curl_pgrsSetUploadSize() are passed a "size" of -1 (which a few + places currently do, and a following patch will add more). So + lets update Curl_pgrsSetDownloadSize() and Curl_pgrsSetUploadSize() + so they make sure that these variables always contain a value that + is >= 0. - Corrected the order of the CAPA / CAPABILITY state machine constants to - match the execution order. + Updates test579 and test599. + + Signed-off-by: Brandon Casey -- imap: Fixed memory leak following commit f6010d9a0359 +Steve Holme (7 Sep 2014) +- tests: Added test1420 to the makefile -- smtp: Added support for the STARTTLS capability (Part Two) - - Added honoring of the tls_supported flag when starting a TLS upgrade - rather than unconditionally attempting it. If the use_ssl flag is set - to CURLUSESSL_TRY and the server doesn't support TLS upgrades then the - connection will continue to authenticate. If this flag is set to - CURLUSESSL_ALL then the connection will complete with a failure as it - did previously. +- test1420: Removed unnecessary CURLOPT setting -- pop3: Added support for the STLS capability (Part Three) - - Added honoring of the tls_supported flag when starting a TLS upgrade - rather than unconditionally attempting it. If the use_ssl flag is set - to CURLUSESSL_TRY and the server doesn't support TLS upgrades then the - connection will continue to authenticate. If this flag is set to - CURLUSESSL_ALL then the connection will complete with a failure as it - did previously. +- tests: Added more "Clear Text" authentication keywords -- imap: Added support for the STARTTLS capability (Part Three) - - Added honoring of the tls_supported flag when starting a TLS upgrade - rather than unconditionally attempting it. If the use_ssl flag is set - to CURLUSESSL_TRY and the server doesn't support TLS upgrades then the - connection will continue to authenticate. If this flag is set to - CURLUSESSL_ALL then the connection will complete with a failure as it - did previously. +- tests: Updated "based on" text due to email test renumbering -Daniel Stenberg (10 Feb 2013) -- [Alessandro Ghedini brought this change] +- tests: For consistency added --libcurl to test name - htmltitle: fix suggested build command +- tests: Added --libcurl for IMAP test case -Steve Holme (10 Feb 2013) -- pop3: Added support for the STLS capability (Part Two) +- multi.c: Avoid invalid memory read after free() from commit 3c8c873252 - Added sending of initial CAPA command before STLS is sent. This allows - for the detection of the capability before trying to upgrade the - connection. + As the current element in the list is free()d by Curl_llist_remove(), + when the associated connection is pending, reworked the loop to avoid + accessing the next element through e->next afterward. -- imap: Added support for the STARTTLS capability (Part Two) +- multi.c: Fixed compilation warning from commit 3c8c873252 - Added sending of initial CAPABILITY command before STARTTLS is sent. - This allows for the detection of the capability before trying to - upgrade the connection. + warning: implicit conversion from enumeration type 'CURLMcode' to + different enumeration type 'CURLcode' -- smtp: Added support for the STLS capability (Part One) +- url.c: Use CURLAUTH_NONE constant rather than 0 - Introduced detection of the STARTTLS capability, in order to add support - for TLS upgrades without unconditionally sending the STARTTLS command. + Small follow up to commit 898808fa8c to use auth constants rather than + hard code value when clearing picked authentication mechanism. -- pop3: Added support for the STLS capability (Part One) - - Introduced detection of the STLS capability, in order to add support - for TLS upgrades without unconditionally sending the STLS command. +- RELEASE-NOTES: Synced with fd1ce3856a -- imap: Added support for the STARTTLS capability (Part One) +Nick Zitzmann (4 Sep 2014) +- [Vilmos Nebehaj brought this change] + + darwinssl: Use CopyCertSubject() to check CA cert. + + SecCertificateCopyPublicKey() is not available on iPhone. Use + CopyCertSubject() instead to see if the certificate returned by + SecCertificateCreateWithData() is valid. - Introduced detection of the STARTTLS capability, in order to add support - for TLS upgrades without unconditionally sending the STARTTLS command. + Reported-by: Toby Peterson -- RELEASE-NOTES: synced with 92f7606f29b704 +Steve Holme (4 Sep 2014) +- RELEASE-NOTES: Clarify email Kerberos support is currently via Windows SSPI -- smtp: Fixed an issue when processing EHLO failure responses (Part 3) - - Follow up fix to commit 62bd21746443 to cater for servers that don't - respond with a 250 in their EHLO responses. Additionally updated the - SMTP tests to respond with a 250 response code as per RFC5321. +Daniel Stenberg (4 Sep 2014) +- MAIL-ETIQUETTE: "1.8 I posted, now what?" -- pop3: Fixed SASL authentication capability detection +- CURLOPT_CA*: better refering between *CAINFO and *CAPATH - Fixed the SASL capability detection to include the space character - before the authentication mechanism list. Otherwise a capability such - as SASLSOMETHING would be interpreted as enabling SASL and potentially - trying to identify SOMETHING as a mechanism. + ... and a minor wording edit -- pop3: Fixed incorrect return value from pop3_endofresp() +- THANKS: added Dennis Clarke - Corrected an incorrect return value when -ERR is received from the - server - introduced in commit b5bb61ee697b (June 2012). + Dennis Clarke from Blastwave.org for ensuring that nightly builds run + smooth on Solaris! -- smtp: Fixed an issue when processing EHLO failure responses (Part 2) +- curl_multi_cleanup: remove superfluous NULL assigns - Follow up fix to commit 23d17190ee32 as EHLO capabilities can exist - within a positive response line. + ... as the struct is free()d in the end anyway. It was first pointed out + to me that one of the ->msglist assignments were supposed to have been + ->pending but was a copy and paste mistake when I realized none of the + clearing of pointers had to be there. -- smtp: Fixed an issue with missing capabilities after the AUTH line +- multi: convert CURLM_STATE_CONNECT_PEND handling to a list - Follow up to commit 40f9bb787f05 to fix missing capabilities after an - AUTH line. - -Nick Zitzmann (8 Feb 2013) -- darwinssl: Make certificate errors less techy + ... instead of scanning through all handles, stash only the actual + handles that are in that state in the new ->pending list and scan that + list only. It should be mostly empty or very short. And only used for + pipelining. + + This avoids a rather hefty slow-down especially notable if you add many + handles to the same multi handle. Regression introduced in commit + 0f147887 (version 7.30.0). - Previously if a problem was found with one of the server's certificates, - we'd log an OSStatus for the end user to look up. Now we explain what - was wrong with the site's certificate chain. Also un-did part of the - previous commit where the code wouldn't catch errSSLServerAuthCompleted - if built under Leopard. + Bug: http://curl.haxx.se/mail/lib-2014-07/0206.html + Reported-by: David Meyer -Guenter Knauf (9 Feb 2013) -- Updated dependency libs. +- RELEASE-NOTES: synced with e608324f9f9 -Steve Holme (9 Feb 2013) -- imap: Corrected some comments +- [Andre Heinecke brought this change] -- smtp: Fixed an issue when processing EHLO failure responses + polarssl: implement CURLOPT_SSLVERSION - Fixed a small issue where smtp_endofresp() would look for capabilities - in the description part of a failure response. In theory a server - shouldn't respond with SIZE or AUTH in an EHLO command's failure - response but if it did then capabilities would be unnecessarily set - before eventually failing. - -- pop3: Reworked pop3_endofresp() to simplify it little + Forwards the setting as minimum ssl version (if set) to polarssl. If + the server does not support the requested version the SSL Handshake will + fail. - Reworked pop3_endofresp() to simplify it and provide consistency between - imap and smtp. + Bug: http://curl.haxx.se/bug/view.cgi?id=1419 -- imap: Renamed state variables in imap_authenticate() - - Renamed the authstate1 and authstate2 variables in imap_authenticate() - as the old name was a left over from when there was only one state - variable which was named due to a clash with the state() function. +nickzman (1 Sep 2014) +- Merge pull request #115 from ldx/darwinsslfixpr - Additionally this provides consistency with the smtp module. + darwinssl: now accepts cacert bundles in PEM format in addition to single certs -- smtp: Reworked smtp_endofresp() to allow for extra capability detection - -- smtp: Renamed smtp_state_auth_passwd_resp() function +Vilmos Nebehaj (1 Sep 2014) +- Check CA certificate in curl_darwinssl.c. - Renamed the login password response function to better describe it's - purpose as well as for consistency with the imap and pop3 modules. - -Daniel Stenberg (8 Feb 2013) -- [Gisle Vanem brought this change] + SecCertificateCreateWithData() returns a non-NULL SecCertificateRef even + if the buffer holds an invalid or corrupt certificate. Call + SecCertificateCopyPublicKey() to make sure cacert is a valid + certificate. - ntlm: fix memory leak +Daniel Stenberg (31 Aug 2014) +- low-speed-limit: avoid timeout flood - Running tests\libtest\libntlmconnect.exe reveals a 1 byte (!) leak in - ./lib/curl_ntlm_msgs.c: + Introducing Curl_expire_latest(). To be used when we the code flow only + wants to get called at a later time that is "no later than X" so that + something can be checked (and another timeout be added). - perl ..\memanalyze.pl c:memdebug.curl - Leak detected: memory still allocated: 1 bytes - At 9771e8, there's 1 bytes. - allocated by curl_ntlm_msgs.c:399 + The low-speed logic for example could easily be made to set very many + expire timeouts if it would be called faster or sooner than what it had + set its own timer and this goes for a few other timers too that aren't + explictiy checked for timer expiration in the code. - Snippet from curl_ntlm_msgs.c: - /* setup ntlm identity's domain and length */ - dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1)); + If there's no condition the code that says if(time-passed >= TIME), then + Curl_expire_latest() is preferred to Curl_expire(). - (my domlen == 0). + If there exists such a condition, it is on the other hand important that + Curl_expire() is used and not the other. - 'dup_domain.tbyte_ptr' looks to be freed in Curl_ntlm_sspi_cleanup() via - 'ntlm->identity.Domain'. But I see no freeing of 'dup_domain.tchar_ptr'. + Bug: http://curl.haxx.se/mail/lib-2014-06/0235.html + Reported-by: Florian Weimer + +- [Michael Wallner brought this change] -- DONE: consider callback-aborted transfers premature + resolve: cache lookup for async resolvers - This bug report properly identified that when doing SMTP and aborting - the transfer with a callback, it must be considered aborted prematurely - by the code to avoid QUIT etc to be attempted as that would cause a - hang. + While waiting for a host resolve, check if the host cache may have + gotten the name already (by someone else), for when the same name is + resolved by several simultanoues requests. - The new test case 1507 verifies this behavior. + The resolver thread occasionally gets stuck in getaddrinfo() when the + DNS or anything else is crappy or slow, so when a host is found in the + DNS cache, leave the thread alone and let itself cleanup the mess. + +Vilmos Nebehaj (30 Aug 2014) +- Fix CA certificate bundle handling in darwinssl. - Reported by: Patricia Muscalu - Bug: http://curl.haxx.se/bug/view.cgi?id=1184 + If the --cacert option is used with a CA certificate bundle that + contains multiple CA certificates, iterate through it, adding each + certificate as a trusted root CA. -- FAQ: refreshed some phrases +Daniel Stenberg (29 Aug 2014) +- [Askar Safin brought this change] -Nick Zitzmann (7 Feb 2013) -- darwinssl: Fix build under Leopard - - It turns out that Leopard (OS X 10.5) doesn't have constants for the ECDH - ciphers in its headers, so the cases for them have been taken out of the - build when building under Leopard. Also added a standard function for - getting a string description of a SecCertificateRef. + getinfo-times: Typo fixed -Steve Holme (7 Feb 2013) -- RELEASE-NOTES: Added new imap features +- [Askar Safin brought this change] -- imap: Added support for SASL-IR extension (Part 2) - - Modified imap_authenticate() to add support for sending the initial - response with the AUTHENTICATE command, as per RFC4959. + libcurl.3: Typo fixed -- smtp: Updated SMTP_AUTH_PASSWD state constant - - Changed the SMTP_AUTH_PASSWD state constant to SMTP_AUTH_LOGIN_PASSWD to - better describe the state as the second part of an AUTH LOGIN command, - as well as for consistency with the imap and pop3 modules. +- curl_formadd.3: setting CURLFORM_CONTENTSLENGTH 0 zero means strlen + +- curl.1: add an example for -H + +- FAQ: mention -w in the 4.20 answer as well -- imap: Added support for SASL-IR extension (Part 1) +- FAQ: 4.20 curl doesn't return error for HTTP non-200 responses + +- CURLOPT_NOBODY.3: clarify this option is for downloads + + When enabling CURLOPT_NOBODY, libcurl effectively switches off upload + mode and will do a download (without a body). This is now better + explained in this man page. - Introduced detection of the SASL-IR capability, in order to add support - for sending the initial response with the AUTHENTICATE command, as per - RFC4959. + Bug: http://curl.haxx.se/mail/lib-2014-08/0236.html + Reported-by: John Coffey + +- INTERNALS: nghttp2 must be 0.6.0 or later + +- [Tatsuhiro Tsujikawa brought this change] -Daniel Stenberg (7 Feb 2013) -- Revert "vc: remove explicit MSVC6 IDE project file and documentation" + Compile with latest nghttp2 + +Dan Fandrich (26 Aug 2014) +- THANKS: removed a few more duplicates + +Daniel Stenberg (26 Aug 2014) +- RELEASE-NOTES: synced with 007242257683a - This reverts commit 0e66d5878edc3d7ffc445116d194b58bbc7504b9. + ... and bumped the contributor amount after recount -Steve Holme (7 Feb 2013) -- imap: Changed response tag generation to be completely unique +- THANKS: added 52 missing contributors - Updated the automatic response tag generation to follow the examples - given in RC3501, which list a 4 character string such as A001, A002, - etc. + I re-ran contributors.sh on all changes since 7.10 and I found these + contributors who are mentioned in the commits but never were added to + THANKS before! - As a unique identifier should be generated for each command the string - generation is based on the connection id and the incrementing command - id. + I also removed a couple of duplicates (mostly due to different + spellings). + +- contributors: grep and sort case insensitively + +- [Michael Osipov brought this change] -Dan Fandrich (6 Feb 2013) -- Tweak the Android.mk file for its new location + configure.ac: Add support for recent GSS-API implementations for HP-UX - This is untested, but ought to be enough to still allow it - to work automatically when the entire curl source tree is - dropped into a full Android source tree. + By default, configure script assumes that libcurl will use the + HP-supplied GSS-API implementation which does not have krb5-config. + If a dev needs a more recent version which has that config script, + the change will allow to pass an appropriate GSSAPI_ROOT. -Daniel Stenberg (6 Feb 2013) -- vc: remove explicit MSVC6 IDE project file and documentation +- CONNECT: close proxy connections that fail to CONNECT - VC6 is _very_ old and we provide working makefiles even for that - compiler. Users who build with the IDE never use that method and project - file anyway and it was just lingering in the root dir. + This is usually due to failed auth. There's no point in us keeping such + a connection alive since it shouldn't be re-used anyway. + + Bug: http://curl.haxx.se/bug/view.cgi?id=1381 + Reported-by: Marcel Raad -Steve Holme (6 Feb 2013) -- imap: Small variable rename in preparation for upcoming change +- RELEASE-NOTES: added two missing HTTP/2 bug fixes - Renamed a couple of variables and updated some comments in - preparation for upcoming command id / response tag change. + And renamed all http2 references to HTTP/2 in this file + +- RELEASE-NOTES: synced with f646e9075f47 -Daniel Stenberg (6 Feb 2013) -- msvc: move Makefile.msvc.names into winbuild/ +- [Jakub Zakrzewski brought this change] + + Cmake: Possibility to use OpenLDAP, OpenSSL, LibSSH2 on windows - In an attempt to clear up misc files from the root dir + At this point I can build libcurl on windows. It provides at least the same + list of protocols as for linux build and works with our software. -- build: move Android.mk to packages/Android/ +- [Jakub Zakrzewski brought this change] -- emacs files: remove from git and dist + Cmake: Removed repeated content from ending blocks - We don't need them and I doubt many people used them. We also don't have - any configs for other editors and we wouldn't want that. + They are unnecesary in modern CMake and removing them improves readability. + +- [Jakub Zakrzewski brought this change] -Steve Holme (6 Feb 2013) -- email: Moved starttls code in separate functions + Cmake: Removed some useless empty SET statements. - To help maintain the readability of the code in imap.c, pop3.c and - smtp.c moved the starttls code into state_starttls() functions. + Undefined variables resolve to empty strings and we do not ever test if + the variable is defined thus those SETs are superfluous. -- [Nick Zitzmann brought this change] +- [Jakub Zakrzewski brought this change] - FEATURES: More NTLM and SSL changes, added two others, fixed typo + Cmake: Removed useless comments from CMakeLists.txt - Added IDN and HTTP data compression as they were left out of the - document until now. + They look like some relics after changes. + +- [Jakub Zakrzewski brought this change] + + Cmake: Don't check for all headers each time - Added notes for qssl, schannel and Secure Transport supporting SSLv2, - Secure Transport supports NTLM, and axTLS does not support SSLv3. + One header at a time is the right way. Apart from that the output on + windows goes from: + ... + -- Looking for include files I:/src/libssh2-1.4.3/include/libssh2.h, ws2tcpip.h + -- Looking for include files I:/src/libssh2-1.4.3/include/libssh2.h, ws2tcpip.h + - found + -- Looking for 3 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wins + ock2.h + -- Looking for 3 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wins + ock2.h - found + -- Looking for 4 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., stdi + o.h + -- Looking for 4 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., stdi + o.h - found + -- Looking for 5 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wind + ows.h + -- Looking for 5 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wind + ows.h - found + -- Looking for 6 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wins + ock.h + -- Looking for 6 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., wins + ock.h - found + -- Looking for 7 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., sys/ + filio.h + -- Looking for 7 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., sys/ + filio.h - not found + -- Looking for 7 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., sys/ + ioctl.h + -- Looking for 7 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., sys/ + ioctl.h - not found + -- Looking for 7 include files I:/src/libssh2-1.4.3/include/libssh2.h, ..., sys/ + resource.h + ... - There was also a typo; "AUTH TSL" should be "AUTH TLS". + To much nicer: + ... + -- Looking for ws2tcpip.h + -- Looking for ws2tcpip.h - found + -- Looking for winsock2.h + -- Looking for winsock2.h - found + -- Looking for stdio.h + -- Looking for stdio.h - found + -- Looking for windows.h + -- Looking for windows.h - found + -- Looking for winsock.h + -- Looking for winsock.h - found + -- Looking for sys/filio.h + -- Looking for sys/filio.h - not found + -- Looking for sys/ioctl.h + -- Looking for sys/ioctl.h - not found + -- Looking for sys/resource.h -Kamil Dudka (6 Feb 2013) -- curl-config.in: do not randomly mix tabs and spaces +- [Jakub Zakrzewski brought this change] -Daniel Stenberg (6 Feb 2013) -- 7.29.1: onwards! + Cmake: Append OpenSSL include directory to search path + + At this point I can build libcurl with OpenSSL, OpenLDAP and LibSSH2. + Supported protocols are at least: + HTTP, HTTPS, FTP, SFTP, TFTP, LDAP, LDAPS, POP3, SMTP + (those are the ones we have regression tests for + in our product's testsuite) -- THANKS: 12 contributors from 7.29.0 +- [Jakub Zakrzewski brought this change] -Version 7.29.0 (6 Feb 2013) + Cmake: Search for liblber, LDAP SSL headers, swith for using OpenLDAP code. -Daniel Stenberg (6 Feb 2013) -- vms: config-vms.h is removed, no use trying to distribute it +- [Jakub Zakrzewski brought this change] -- RELEASE-NOTES: mention the SASL buffer overflow + Cmake: LibSSH2 detection and use. -- [Eldar Zaitov brought this change] +- [Jakub Zakrzewski brought this change] - Curl_sasl_create_digest_md5_message: fix buffer overflow - - When negotiating SASL DIGEST-MD5 authentication, the function - Curl_sasl_create_digest_md5_message() uses the data provided from the - server without doing the proper length checks and that data is then - appended to a local fixed-size buffer on the stack. - - This vulnerability can be exploited by someone who is in control of a - server that a libcurl based program is accessing with POP3, SMTP or - IMAP. For applications that accept user provided URLs, it is also - thinkable that a malicious user would feed an application with a URL to - a server hosting code targetting this flaw. - - Bug: http://curl.haxx.se/docs/adv_20130206.html + Cmake: Moved macros out of the main CMakeLists.txt -Steve Holme (6 Feb 2013) -- FEATURES: Removed erroneous whitespace - - Removed whitespace introduced in commit 5f8f20f5e65b that caused - formatting issues when generating the website docs. +- [Jakub Zakrzewski brought this change] -Yang Tse (6 Feb 2013) -- setup-vms.h: post VMS patch cleanup - III + Cmake: Added missing protocol-disable switches - - rename post-config-vms.h to setup-vms.h - - move its inclusion into proper location in curl_setup.h + They already have their defines in config.h. This makes it possible to + disable the protocols from command line during configure step. -- vms_show: post VMS patch cleanup - II - - - remove multiple declarations of vms_show and add comments +- [Jakub Zakrzewski brought this change] -- tool_main.c: post VMS patch cleanup - I + Cmake: Made boolean defines be defined to "1" instead of "ON" - - remove header inclusion already done in curl_setup_once.h + It's by convention, for compatibility and because the comments say so. + Just mabe someone have written a test like "#if HAVE_XX==1" -Steve Holme (6 Feb 2013) -- FEATURES: Added SSPI to list of NTLM libraries +- [Jakub Zakrzewski brought this change] -- FEATURES: Added Secure Transport and qssl to list of SSL libraries + Cmake: Require at least CMake 2.8. + + CMake 2.6 is already a bit old. Many bugs have been fixed since + its release. We use 2.8 in our company and we have no intention + of polluting our environment with old software, so 2.6 would + not be tested. This shouldn't be a problem since all one need + to build CMake from source is C and C++ compiler. -- FEATURES: Added email feature set +- disconnect: don't touch easy-related state on disconnects + + This was done to make sure NTLM state that is bound to a connection + doesn't survive and gets used for the subsequent request - but + disconnects can also be done to for example make room in the connection + cache and thus that connection is not strictly related to the easy + handle's current operation. - Added SMTP, SMTPS, POP3, POP3S, IMAP and IMAPS features. + The http authentication state is still kept in the easy handle since all + http auth _except_ NTLM is connection independent and thus survive over + multiple connections. + + Bug: http://curl.haxx.se/mail/lib-2014-08/0148.html + Reported-by: Paras S -- imap.h: Corrected incorrect comment clarification +- curl.1: clarify --limit-rate's effect on both directions - Corrected comment clarification made in commit 167717b8069a. + Bug: http://curl.haxx.se/bug/view.cgi?id=1414 + Reported-by: teo8976 -- COPYING: Updated copyright year to include 2013 +- curl.1: mention the --post30x options within the --location desc -Daniel Stenberg (5 Feb 2013) -- RELEASE-NOTES: synced with 25f351424b3538 - - 8 more bug fixes mentioned +Dan Fandrich (22 Aug 2014) +- sasl: Fixed a memory leak on OOM -- [John E. Malmberg brought this change] +Daniel Stenberg (22 Aug 2014) +- [Frank Meier brought this change] - VMS: fix and generate the VMS build config - - config_h.com is a new file that generates a config.h file based on the - curl_config.h.in file and a quick scan of the configure script. This is - actually a generic procedure that is shared with other VMS packages. + NTLM: ignore CURLOPT_FORBID_REUSE during NTLM HTTP auth - The existing pre-built config-vms.h had over 100 entries that were not - correct and in some cases conflicted with the build options available in - the build_vms.com. + Problem: if CURLOPT_FORBID_REUSE is set, requests using NTLM failed + since NTLM requires multiple requests that re-use the same connection + for the authentication to work - generate_config_vms_h_curl.com is a helper procedure to the - config_h.com. It covers the cases that the generic config_h.com is not - able to figure out, and accepts input from the build_vms.com procedure. + Solution: Ignore the forbid reuse flag in case the NTLM authentication + handshake is in progress, according to the NTLM state flag. - build_curlbuild_h.com is a new file to generate the curlbuild.h file - that Curl is now using when it is using a curl_config.h file. + Fixed known bug #77. + +Steve Holme (22 Aug 2014) +- openssl.c: Fixed longer than 79 columns + +- openssl.c: Fixed compilation warning - post-config-vms.h is a new file that is needed to provide VMS specific - definitions, and most of them need to be set before the system header - files are included. + warning: declaration of 'minor' shadows a global declaration + +Daniel Stenberg (21 Aug 2014) +- [Haris Okanovic brought this change] + + win32: Fixed WinSock 2 #if - The VMS build procedure is fixed: + A conditionally compiled block in connect.c references WinSock 2 + symbols, but used `#ifdef HAVE_WINSOCK_H` instead of `#ifdef + HAVE_WINSOCK2_H`. - 1. Fixed to link in the correct HP ssl library. - 2. Fixed to detect if HP Kerberos is installed. - 3. Fixed to detect if HP LDAP is installed. - 4. Fixed to detect if gnv$libzshr is installed. - 5. Simplified the input parameter parsing to not use a loop. - 6. Warn that 64 bit pointer option support is not complete - in comments. - 7. Default to IEEE floating if platform supports it so - resulting libcurl will be compatible with other - open source projects on VMS. - 8. Default to LARGEFILE if platform supports it. - 9. Default to enable SSL, LDAP, Kerberos, libz - if the libraries are present. - 10. Build with exact case global symbols for libcurl. - 11. Generate linker option file needed. - 12. Compiler list option only commonly needed items. - 13. fulllist option for those who really want it. - 14. Create debug symbol file on Alpha, IA64. + Bug: http://curl.haxx.se/mail/lib-2014-08/0155.html -- Curl_proxyCONNECT: return once CONNECT is sent +- Curl_disconnect: don't free the URL - By doing this unconditionally, we infer a simpler and more defined - behavior. This also has the upside that test 1021 no longer fails for me - even if I run with valgrind. + The URL is not a property of the connection so it should not be freed in + the connection disconnect but in the Curl_close() that frees the easy + handle. - Also fixed some wrong comments. + Bug: http://curl.haxx.se/mail/lib-2014-08/0148.html + Reported-by: Paras S -Steve Holme (5 Feb 2013) -- email: Reworked comments in the endofresp() functions +- help output: minor whitespace edits - Tidied up the comments in the endofresp() functions to be more - meaningful prior to release. + Should've been amended in the previous commit but wasn't due to a + mistake. -Marc Hoersken (5 Feb 2013) -- schannel: Removed extended error connection setup flag - - According KB975858 this flag may cause problems on Windows 7 and - Windows Server 2008 R2 systems. Extended error information is not - currently used by libcurl and therefore not a requirement. - - The flag may improve the SSL-connection shutdown in case of an - error. This means it might be a good improvement in the future. +- [Zearin brought this change] + + help output: use ≥2 spaces between option and description - Fixes bug/issue #1187 - thanks for the report + ... and some other cleanups -Daniel Stenberg (5 Feb 2013) -- [Tor Arntsen brought this change] +- FAQ: some actually sometimes get paid... - singleipconnect: Update *sockp for all CURLE_OK - - The 56b7c87c7 change left a case where a good sockfd was not copied to - *sockp before returning with CURLE_OK +Steve Holme (17 Aug 2014) +- sasl_sspi: Fixed a memory leak with the GSSAPI base-64 decoded challenge -- curl_easy_perform: Value stored to 'mcode' is never read +- sasl_sspi: Renamed GSSAPI mutual authentication parameter - pointed out by clang-analyzer + ...From "mutual" to "mutual_auth" which better describes what it is. -- singleipconnect: remove dead assignment +- sasl_sspi: Corrected some of the GSSAPI security message error codes - pointed out by clang-analyzer - -Linus Nielsen Feltzing (5 Feb 2013) -- CURLMOPT_MAXCONNECTS: restore functionality + Corrected a number of the error codes that can be returned from the + Curl_sasl_create_gssapi_security_message() function when things go + wrong. - When a connection is no longer used, it is kept in the cache. If the - cache is full, the oldest idle connection is closed. If no connection is - idle, the current one is closed instead. + It makes more sense to return CURLE_BAD_CONTENT_ENCODING when the + inbound security challenge can't be decoded correctly or doesn't + contain the KERB_WRAP_NO_ENCRYPT flag and CURLE_OUT_OF_MEMORY when + EncryptMessage() fails. Unfortunately the previous error code of + CURLE_RECV_ERROR was a copy and paste mistakes on my part and should + have been correct in commit 4b491c675f :( -Steve Holme (5 Feb 2013) -- RELEASE-NOTES: Updated following recent changes to the email protocols - - Added recent additions and fixes following the changes to imap, pop3 - and smtp. Additionally added another contributor that helped to test - the imap sasl changes. +- docs: Escaped single backslash -- email: Provided extra comments following recent pop3/imap fixes +- TODO: Updated following GSSAPI (Kerberos V5) additions - Provided additional clarification about the logic of the authenticate() - functions following commit 6b6bdc83bd36 and b4270a9af1d0. - -Daniel Stenberg (5 Feb 2013) -- [Andrei Kurushin brought this change] + Updated "FTP 4.6 GSSAPI via Windows SSPI" and "SASL 14.1 Other + authentication mechanisms" following recent additions. + + Added SASL 14.2 GSSAPI via GSS-API libraries. - winbuild: include version info for .dll .exe +- CURLOPT_USERNAME.3: Added Kerberos V5 and NTLM domain information - Bug: http://curl.haxx.se/bug/view.cgi?id=1186 + This repeats what has already been documented in both the curl manpage + and CURLOPT_USERPWD documentation but is provided here for completeness + as someone may not especially read the latter when using libcurl. -- FAQ: clarify 5.13 How do I stop an ongoing transfer +- CURLOPT_USERPWD.3: Updated following Kerberos V5 SSPI changes - Rich Gray provided good feedback and we now clarify that you can in fact - stop a multi transfer at any point you like by removing the easy handle. + Added information about Kerberos V5 requiring the domain part in the + user name. + + Mentioned that the user name can be specified in UPN format, and not + just in Down-Level Logon Name format, following the information + added in commit 7679cb3fa8 reworking the exisitng information in the + process. -- [Matt Arsenault brought this change] +- docs: Added Kerberos V5 and NTLM domain information to --user - cmake: Fix mingw build +- docs: Added Kerberos V5 to the --user SSPI current credentials usage -- [Sergei Nikulov brought this change] +- sasl_sspi: Tell the server we don't support a GSSAPI receive buffer - cmake: updated OpenSSL build +- smtp: Added support for GSSAPI (Kerberos V5) authentication via Windows SSPI -Steve Holme (4 Feb 2013) -- pop3.c: Updated variable names to use shorter / more readable variant - - Tidied up code from commit 6b6bdc83bdUpdated where a few instances of - the pop3c struct variable used the longer conndata struct rather than - matching what other code in pop3_authenticate() used. +- pop3: Added support for GSSAPI (Kerberos V5) authentication via Windows SSPI -Guenter Knauf (4 Feb 2013) -- updated copyright years. +- imap: Added support for GSSAPI (Kerberos V5) authentication via Windows SSPI -- configure: update the copyright years for the output. +- email: Added mutual authentication flag -Steve Holme (3 Feb 2013) -- imap: Fixed no known authentication mechanism when fallback is required - - Fixed an issue where (lib)curl is compiled without support for a - supported challenge-response based SASL authentication mechanism, such - as CRAM-MD5 or NTLM, the server doesn't support the LOGIN or PLAIN - mechanisms and (lib)curl doesn't fallback to Clear Text authentication. +Daniel Stenberg (15 Aug 2014) +- RELEASE-NOTES: synced with 0187c9e11d079 + +- http: fix the Content-Range: parser - Note: In order to fallback to Clear Text authentication properly this - fix adds support for the LOGINDISABLED server capability. - imap: Fixed no known authentication mechanism when fallback is required + ... to handle "*/[total]". Also, removed the strange hack that made + CURLOPT_FAILONERROR on a 416 response after a *RESUME_FROM return + CURLE_OK. - Fixed an issue where (lib)curl is compiled without support for a - supported challenge-response based SASL authentication mechanism, such - as CRAM-MD5 or NTLM, the server doesn't support the LOGIN or PLAIN - mechanisms and (lib)curl doesn't fallback to Clear Text authentication. + Reported-by: Dimitrios Siganos + Bug: http://curl.haxx.se/mail/lib-2014-06/0221.html + +Steve Holme (14 Aug 2014) +- email: Introduced the GSSAPI states + +- curl_sasl_sspi.c: Fixed more compilation warnings from commit 4b491c675f - Note: In order to fallback to Clear Text authentication properly this - fix adds support for the LOGINDISABLED server capability. + warning: unused variable 'resp' - Related bug: http://curl.haxx.se/mail/lib-2013-02/0004.html - Reported by: Stanislav Ivochkin + warning: no previous prototype for 'Curl_sasl_gssapi_cleanup' -- pop3: Fixed no known authentication mechanism when fallback is required +- SHA-1: 61c93383b7f6cf79d12ff99e9dced1d1cc2a7064 - Fixed an issue where (lib)curl is compiled without support for a - supported challenge-response based SASL authentication mechanism, such - as CRAM-MD5 or NTLM, the server doesn't support the LOGIN or PLAIN - mechanisms and (lib)curl doesn't fallback to APOP or Clear Text - authentication. + * curl_sasl_sspi.c: Fixed compilation warning from commit 4b491c675f - Bug: http://curl.haxx.se/mail/lib-2013-02/0004.html - Reported by: Stanislav Ivochkin + warning: declaration of 'result' shadows a previous local -Daniel Stenberg (1 Feb 2013) -- singleipconnect: simplify and clean up - - Remove timeout argument that's never used. +- curl_sasl.h: Fixed compilation error from commit 4b491c675f - Make the actual connection get detected on a single spot to reduce code - duplication. + warning: 'struct kerberos5data' declared inside parameter list - Store the IPv6 state already when the connection is attempted. + Due to missing forward declaration. -- Curl_perfom: removed +- urldata.h: Fixed compilation warnings from commit 3ec253532e - Curl_perfom is no longer used anywhere since the always-multi commit - c43127414d89ccb9, and some related functions were used only from within - Curl_perfom. + warning: extra tokens at end of #endif directive -Guenter Knauf (30 Jan 2013) -- Updated date. +- sasl_sspi: Added GSSAPI message functions -Yang Tse (30 Jan 2013) -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2 +- urldata: Introduced a GSSAPI (Kerberos V5) data structure - - Fix a pair of single quotes to double quotes. - - URL: http://curl.haxx.se/mail/lib-2013-01/0355.html - Reported by: Tor Arntsen + Added a kerberos5data structure which is similar in nature to the + ntlmdata and negotiatedata structures. -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up - - - Take into account that 'wc' may return leading spaces and/or tabs. +- sspi: Moved KERB_WRAP_NO_ENCRYPT from socks_sspi module - - Set initial IFS to space, tab and newline. + In preparation for the upcoming SSPI implementation of GSSAPI + authentication, moved the definition of KERB_WRAP_NO_ENCRYPT from + socks_sspi.c to curl_sspi.h allowing it to be shared amongst other + SSPI based code. -- zz40-xc-ovr.m4: fix 'wc' detection +Daniel Stenberg (13 Aug 2014) +- mk-ca-bundle.pl: add missing $ + +- mk-ca-bundle.pl: switched to using hg.mozilla.org - - Take into account that 'wc' may return leading spaces. + ... as mxr.mozilla.org is due to be retired. - - Set internationalization behavior variables. + The new host doesn't support If-Modified-Since nor ETags, meaning that + the script will now defer to download and do a post-transfer checksum + check to see if a new output is to be generated. The new output format + will hold the SHA1 checksum of the source file for that purpose. - Tor Arntsen analyzed and reported the issue. + We call this version 1.22 - URL: http://curl.haxx.se/mail/lib-2013-01/0351.html + Reported-by: Ed Morley + Bug: http://curl.haxx.se/bug/view.cgi?id=1409 -- zz40-xc-ovr.m4: check another three basic utilities +- [Jose Alf brought this change] -Guenter Knauf (29 Jan 2013) -- Fixed debug.c to work again unchanged. + openssl: fix version report for the 0.9.8 branch - Added CURLOPT_FOLLOWLOCATION since example.com is now redirected. + Fixed libcurl to correctly output the newer versions of OpenSSL 0.9.8, + starting from openssl-0.9.8za. -Daniel Stenberg (29 Jan 2013) -- [Nick Zitzmann brought this change] +- [Frank Meier brought this change] - darwinssl: Fix bug where packets were sometimes transmitted twice + create_conn: prune dead connections + + Bringing back the old functionality that was mistakenly removed when the + connection cache was remade. When creating a new connection, all the + existing ones are checked and those that are known to be dead get + disconnected for real and removed from the connection cache. It helps + the cache from holding on to very many stale connections and aids in + keeping down the number of system sockets in wait states. - There was a bug where, if SSLWrite() returned errSSLWouldBlock but did - succeed in transmitting at least something, then we'd incorrectly - resend the packet. Now we never take errSSLWouldBlock as a sign that - nothing was transferred to/from the server. + Help-by: Jonatan Vela - Bug: http://curl.haxx.se/mail/lib-2013-01/0295.html - Reported by: Bruno de Carvalho + Bug: http://curl.haxx.se/mail/lib-2014-06/0189.html -- [Nick Zitzmann brought this change] +Kamil Dudka (11 Aug 2014) +- docs/SSLCERTS: update the section about NSS database + + Bug: http://curl.haxx.se/mail/lib-2014-07/0335.html + Reported-by: David Shaw - FAQ: "Darwinssl" is AKA "Secure Transport" and supports NTLM +Daniel Stenberg (11 Aug 2014) +- [Peter Wang brought this change] -- RELEASE-NOTES: only list Nick once + Curl_poll + Curl_wait_ms: fix timeout return value - Even though he's a fine dude, once is enough for this time! - -Yang Tse (28 Jan 2013) -- zz40-xc-ovr.m4: 1.0 interface stabilization + Curl_poll and Curl_wait_ms require the fix applied to Curl_socket_check + in commits b61e8b8 and c771968: - - Stabilization results in 4 public interface m4 macros: - XC_CONFIGURE_PREAMBLE - XC_CONFIGURE_PREAMBLE_VER_MAJOR - XC_CONFIGURE_PREAMBLE_VER_MINOR - XC_CHECK_PATH_SEPARATOR - - Avoid one level of internal indirection - - Update comments - - Drop XC_OVR_ZZ40 macro + When poll or select are interrupted and coincides with the timeout + elapsing, the functions return -1 indicating an error instead of 0 for + the timeout. -Kamil Dudka (28 Jan 2013) -- docs: fix typos in man pages - - Reported by: Jiri Jaburek - Bug: https://bugzilla.redhat.com/896544 +Steve Holme (10 Aug 2014) +- config-tpf.h: Fixed up line lengths > 79 characters + +- config-symbian.h: Fixed up line lengths > 79 characters -- docs: update the comments about loading CA certs with NSS +- tool_hugehelp.c.cvs: Added copyright - Bug: https://bugzilla.redhat.com/696783 + Added copyright due to warning from checksrc.pl. -Guenter Knauf (28 Jan 2013) -- Updated dependency libs. +- RELEASE-NOTES: Synced with cd6ecf6a89 -- Fixed simple.c to work again unchanged. +- sasl_sspi: Fixed hard coded buffer for response generation - Added CURLOPT_FOLLOWLOCATION since example.com is now redirected. + Given the SSPI package info query indicates a token size of 4096 bytes, + updated to use a dynamic buffer for the response message generation + rather than a fixed buffer of 1024 bytes. -Steve Holme (27 Jan 2013) -- smtp.c: Fixed unnecessary state change if starttls fails - - The state machine should only be changed to SMTP_STARTTLS when the - STARTTLS command has been successfully sent to the server. +- sasl_sspi: Fixed missing free of challenge buffer on SPN failure -- pop3.c: Fixed unnecessary state change if starttls fails +- http_negotiate_sspi: Tidy up to remove the get_gss_name() function - The state machine should only be changed to POP3_STARTTLS when the - STLS command has been successfully sent to the server. + Due to the reduction of code in commit 3b924b29 of get_gss_name() the + function isn't necessary anymore. -- imap.c: Fixed unnecessary state change if starttls fails +- http_negotiate_sspi: Use a dynamic buffer for SPN generation - The state machine should only be changed to IMAP_STARTTLS when the - STARTTLS command has been successfully sent to the server. + Updated to use a dynamic buffer for the SPN generation via the recently + introduced Curl_sasl_build_spn() function rather than a fixed buffer of + 1024 characters, which should have been more than enough, but by using + the new function removes the need for another variable sname to do the + wide character conversion in Unicode builds. -- email: Updated comment regarding ssldone usage - - Updated the ssldone comment as multi mode is always used internally now. +- sasl: Tidy up to rename SPN variable from URI -Yang Tse (26 Jan 2013) -- zz40-xc-ovr.m4: emit witness message in configure BODY +- sasl: Use a dynamic buffer for SPN generation - This avoids witness message in output when running configure --help, - while sending the message to config.log for other configure runs. + Updated Curl_sasl_create_digest_md5_message() to use a dynamic buffer + for the SPN generation via the recently introduced Curl_sasl_build_spn() + function rather than a fixed buffer of 128 characters. -Steve Holme (25 Jan 2013) -- smtp.c: Added comments to smtp_endofresp() +- sasl_sspi: Fixed SPN not being converted to wchar under Unicode builds - Minor code tidy up to add comments similar to those used in the pop3 - and imap end of resp functions, in order to assist anyone reading the - code and highlight the similarities between each of these protocols. - -Yang Tse (25 Jan 2013) -- zz40-xc-ovr.m4: truly do version conditional overriding + Curl_sasl_create_digest_md5_message() would simply cast the SPN variable + to a TCHAR when calling InitializeSecurityContext(). This meant that, + under Unicode builds, it would not be valid wide character string. - - version conditional overriding - - catch unexpanded XC macros - - fix double words in comments + Updated to use the recently introduced Curl_sasl_build_spn() function + which performs the correct conversion for us. -- zz40-xc-ovr.m4: fix variable assignment of subshell output bashism +- sasl: Introduced Curl_sasl_build_spn() for building a SPN - Tor Arntsen analyzed and reported the issue. + Various parts of the libcurl source code build a SPN for inclusion in + authentication data. This information is either used by our own native + generation routines or passed to authentication functions in third-party + libraries such as SSPI. However, some of these instances use fixed + buffers rather than dynamically allocated ones and not all of those that + should, convert to wide character strings in Unicode builds. - URL: http://curl.haxx.se/mail/lib-2013-01/0306.html + Implemented a common function that generates a SPN and performs the + wide character conversion where necessary. -- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies +- sasl_sspi: Fixed memory leak with not releasing Package Info struct + + Curl_sasl_create_digest_md5_message() wouldn't free the Package Info + structure after QuerySecurityPackageInfo() had allocated it. -- zz40-xc-ovr.m4: avoid double single-quote usage +- [Michael Osipov brought this change] -- zz40-xc-ovr.m4: parentheses balancing of 'case' statements + docs: Update SPNEGO and GSS-API related doc sections - m4 quadrigraph shell comment technique allows proper autoconf - parentheses balancing in shell 'case' statements. The presence - of unbalanced parentheses may otherwise trigger expansion bugs. + Reflect recent changes in SPNEGO and GSS-API code in the docs. + Update them with appropriate namings and remove visible spots for + GSS-Negotiate. -Steve Holme (24 Jan 2013) -- smtp.c: Corrected RFC references +- sspi: Minor code tidy up to standardise coding style - The most recent version of the SMTP RFC is RFC5321 and not RFC2821 as - previously documented. + Following the recent changes and in attempt to align the SSPI based + authentication code performed the following: - Added RFC1870 and re-ordered list numerically. + * Use NULL and SECBUFFVERSION rather than hard coded constants. + * Avoid comparison of zero in if statements. + * Standardised the buf and desc setup code. -- smtp.c: Fixed failure detection during TLS upgrade +- schannel: Fixed compilation warning in vtls.c - smtp_state_upgrade_tls() would attempt to incorrectly complete the - upgrade to smtps and start the EHLO command if - Curl_ssl_connect_nonblocking() returned a failure code and if ssldone - was set to TRUE. This would only happen when a non-blocking API hadn't - been provided by the SSL implementation and curlssl_connect() was - called underneath. + vtls.c:688:43: warning: unused parameter 'data' -- pop3.c: Fixed failure detection during TLS upgrade +- tool_getparam.c: Fixed compilation warning - pop3_state_upgrade_tls() would attempt to incorrectly complete the - upgrade to pop3s and start the CAPA command if - Curl_ssl_connect_nonblocking() returned a failure code and if ssldone - was set to TRUE. This would only happen when a non-blocking API hadn't - been provided by the SSL implementation and curlssl_connect() was - called underneath. + warning: `orig_opt' might be used uninitialized in this function -- imap.c: Fixed failure detection during TLS upgrade - - imap_state_upgrade_tls() would attempt to incorrectly complete the - upgrade to imaps and start the CAPABILITY command if - Curl_ssl_connect_nonblocking() returned a failure code and if ssldone - was set to TRUE. This would only happen when a non-blocking API hadn't - been provided by the SSL implementation and curlssl_connect() was - called underneath. +- RELEASE-NOTES: Synced with 159c3aafd8 + +Daniel Stenberg (8 Aug 2014) +- curl_ntlm_msgs: make < 80 columns wide -Yang Tse (24 Jan 2013) -- zz40-xc-ovr.m4: internals overhauling +Steve Holme (8 Aug 2014) +- ntlm: Fixed hard coded buffer for SSPI based auth packet generation - - Update comments - - Execute commands in subshells - - Faster path separator check - - Fix missing 'test' command - - Rename private macros - - Minimize AC_REQUIRE usage + Given the SSPI package info query indicates a token size of 2888 bytes, + and as with the Winbind code and commit 9008f3d56, use a dynamic buffer + for the Type-1 and Type-3 message generation rather than a fixed buffer + of 1024 bytes. -Steve Holme (23 Jan 2013) -- email: Removed unnecessary return statements +- ntlm: Added support for SSPI package info query - Small tidy up to remove unnecessary return statements prior to the next - fix. + Just as with the SSPI implementations of Digest and Negotiate added a + package info query so that libcurl can a) return a more appropriate + error code when the NTLM package is not supported and b) it can be of + use later to allocate a dynamic buffer for the Type-1 and Type-3 + output tokens rather than use a fixed buffer of 1024 bytes. -Yang Tse (23 Jan 2013) -- zz40-xc-ovr.m4: redirect errors and warnings to stderr +Daniel Stenberg (7 Aug 2014) +- http2: added some more logging for debugging stream problems -- zz40-xc-ovr.m4: AC_REQUIRE also XC_CONFIGURE_PREAMBLE success message +- [Tatsuhiro Tsujikawa brought this change] -- zz60-xc-ovr.m4: tighten XC_OVR_ZZ60 macro placement requirements + HTTP/2: Reset promised stream, not its associated stream. -- configure: use XC_CONFIGURE_PREAMBLE early checks - - Some basic checks we make were placed early enough in generated - configure script when using autoconf 2.5X versions. Newer autoconf - versions expand these checks much further into the configure script, - rendering them useless. Using XC_CONFIGURE_PREAMBLE fixes placement - of early intended checks across all our autoconf supported versions. +- [Tatsuhiro Tsujikawa brought this change] -- zz40-xc-ovr.m4: provide XC_CONFIGURE_PREAMBLE macro + HTTP/2: Move :authority before non-pseudo header fields -Daniel Stenberg (23 Jan 2013) -- FAQ: update the SSL lib list and wording in question 2.2 +- http2: show the received header for better debugging -Steve Holme (22 Jan 2013) -- curl_sasl.c: Corrected references to RFC +- openssl: replace call to OPENSSL_config - The most recent version of the RFC is RFC4422 and not RFC2222 as - previously documented. - -- email: Corrected references to SASL RFC + OPENSSL_config() is "strongly recommended" to use but unfortunately that + function makes an exit() call on wrongly formatted config files which + makes it hard to use in some situations. OPENSSL_config() itself calls + CONF_modules_load_file() and we use that instead and we ignore its + return code! - The most recent version of the SASL RFC is RFC4422 and not RFC2222 as - previously documented. + Reported-by: Jan Ehrhardt + Bug: http://curl.haxx.se/bug/view.cgi?id=1401 -Daniel Stenberg (22 Jan 2013) -- [Ulion brought this change] +Dan Fandrich (7 Aug 2014) +- [Fabian Keil brought this change] - formpost: support quotes, commas and semicolon in file names - - - document the double-quote and backslash need be escaped if quoting. - - libcurl formdata escape double-quote in filename by backslash. - - curl formparse can parse filename both contains '"' and ',' or ';'. - - curl now can uploading file with ',' or ';' in filename. + runtests.pl: Pad test case numbers with up to three zeroes - Bug: http://curl.haxx.se/bug/view.cgi?id=1171 + Test case numbers with four digits have been available for a + while now. -- memanalyze.pl: handle fopen() of file names with quotes +Steve Holme (7 Aug 2014) +- docs: Added Negotiate to the SSPI current credentials usage description -Yang Tse (21 Jan 2013) -- xc-cc-check.m4: re-evaluate exporting and AC_SUBST'ing vars - - Notes: - - When running a configure script that has nested packages (for example - libcurl's configure with --enable-ares and c-ares sources embedded in - curl tree) and AC_CONFIG_SUBDIRS([nested-subdir]) machinery is used to - automatically run the nested configure script from within the parent - configure script, it happens that the nested _shell_ script will - inherit shell variables exported from the parent _shell_ script. - - If for example parent configure script sets and exports LDFLAGS and LIBS - variables with proper values in order to link either a parent library or - program with a library which will be configured and built by a nested - package; It will happen that when the nested configure script runs, the - nested library does not exist yet and _any_ link-test done in the nested - configure will fail, such as those that autoconf macros perform in order - to detect existing compiler and its characteristics, the result is that - the nested configure script will fail with errors such as: +- TODO: HTTP Digest via Windows SSPI + +- TODO: FTP GSSAPI via Windows SSPI + +- http_negotiate_sspi: Fixed specific username and password not working - configure: error: C compiler cannot create executables + Bug: http://curl.haxx.se/mail/lib-2014-06/0224.html + Reported-by: Leonardo Rosati + +- http_negotiate_sspi: Fixed endless unauthorized loop in commit 6bc76194e8 - For now, we no longer export variables previously exported here. + If the server rejects our authentication attempt and curl hasn't + called CompleteAuthToken() then the status variable will be + SEC_I_CONTINUE_NEEDED and not SEC_E_OK. - On the other hand, AC_SUBST'ing them is appropriate and even with nested - packages each package's config.status gets its own package values. + As such the existing detection mechanism for determining whether or not + the authentication process has finished is not sufficient. - So we reinstate AC_SUBST'ing previously AC_SUBST'ed variables. + However, the WWW-Authenticate: Negotiate header line will not contain + any data when the server has exhausted the negotiation, so we can use + that coupled with the already allocated context pointer. -Daniel Stenberg (21 Jan 2013) -- FAQ: 3.22 curl -X gives me HTTP problems +Daniel Stenberg (5 Aug 2014) +- RELEASE-NOTES: synced with 5b37db44a3eb -Yang Tse (21 Jan 2013) -- xc-cc-check.m4: avoid recursive package automake'ing breakage +Dan Fandrich (5 Aug 2014) +- parsedate.c: fix the return code for an overflow edge condition -- xc-cc-check.m4: mark earlier variables that are to be exported +Daniel Stenberg (5 Aug 2014) +- [Toby Peterson brought this change] -- configure: autotools compatibility fixes - step I + darwinssl: don't use strtok() - Fix proper macro expansion order across autotools versions for - C compiler and preprocessor program checks. + The GetDarwinVersionNumber() function uses strtok, which is not + thread-safe. -Steve Holme (20 Jan 2013) -- pop3.c: Fixed conditional compilation of the apop response function +- Curl_ossl_version: adapted to detect BoringSSL - Extended the fix from commit 8b15c84ea91e to additionally exclude - pop3_state_apop_resp() if the CURL_DISABLE_CRYPTO_AUTH flag is - defined. + This seems to be the way it should work. Right now we can't build with + BoringSSL and try this out properly due to a minor API breakage. -Yang Tse (20 Jan 2013) -- Makefile.inc: fix $(top_srcdir) not allowed in _SOURCES variables - -Daniel Stenberg (19 Jan 2013) -- formadd: reject trying to read a directory where a file is expected +- Curl_ossl_version: detect and show libressl - Bug: http://curl.haxx.se/mail/archive-2013-01/0017.html - Reported by: Ulrich Doehner + LibreSSL is otherwise OpenSSL API compliant (so far) -- curl_easy_send.3: document return codes - - Reported by: Craig Davison - Bug: http://curl.haxx.se/mail/lib-2013-01/0234.html +- [Tatsuhiro Tsujikawa brought this change] -- curl_easy_recv.3: document return codes + HTTP/2: Fix infinite loop in readwrite_data() - Reported by: Craig Davison - Bug: http://curl.haxx.se/mail/lib-2013-01/0234.html + To prevent infinite loop in readwrite_data() function when stream is + reset before any response body comes, reset closed flag to false once + it is evaluated to true. -Steve Holme (19 Jan 2013) -- email: General code tidy up - - Corrected some function argument definitions to maximize the 80 - character line length limit and be in keeping with the curl - coding style. +Dan Fandrich (3 Aug 2014) +- gtls: only define Curl_gtls_seed if Nettle is not being used -- pop3.c: Fixed a problem with pop3s connections not connecting properly - - Fixed an issue where Curl_ssl_connect_nonblocking() wouldn't complete - correctly and the ssldone flag wouldn't be set to true for pop3s based - connections. - - Bug introduced in commit: 4ffb8a6398ed. +- ssl: provide Curl_ssl_backend even if no SSL library is available -Daniel Stenberg (18 Jan 2013) -- RELEASE-NOTES: add references to several bugfixes+changes +Daniel Stenberg (2 Aug 2014) +- [Tatsuhiro Tsujikawa brought this change] -Steve Holme (18 Jan 2013) -- RELEASE-NOTES: Added missing imap fix + HTTP2: Support expect: 100-continue - Added missing imap fix as per commit 709b3506cd9b. + "Expect: 100-continue", which was once deprecated in HTTP/2, is now + resurrected in HTTP/2 draft 14. This change adds its support to + HTTP/2 code. This change also includes stricter header field + checking. -Yang Tse (18 Jan 2013) -- runtests.pl: make VPATH builds find valgrind.supp +- CURLOPT_SSL_VERIFYPEER.3. add a warning about disabling it -Daniel Stenberg (18 Jan 2013) -- RELEASE-NOTES: synced with c43127414d89 +- FEATURES: minor update -- always-multi: always use non-blocking internals - - Remove internal separated behavior of the easy vs multi intercace. - curl_easy_perform() is now using the multi interface itself. +- openssl: make ossl_send return CURLE_OK better - Several minor multi interface quirks and bugs have been fixed in the - process. + Previously it only returned a CURLcode for errors, which is when it + returns a different size than what was passed in to it. - Much help with debugging this has been provided by: Yang Tse + The http2 code only checked the curlcode and thus failed. + +- RELEASE-NOTES: synced with 7bb4c8cadb5d0 + +- [Michael Wallner brought this change] + + CURLOPT_HEADEROPT.3: typo: do -> to -Yang Tse (17 Jan 2013) -- url.c: fix HTTP CONNECT tunnel establishment upon delayed response +- [Marcel Raad brought this change] + + schannel: use CryptGenRandom for random numbers - Fixes initial proxy response being processed by the tunneled protocol - handler instead of the HTTP wrapper handler. This issue would trigger - upon delayed CONNECT response from the proxy. + This function is available for every Windows version since Windows 95/NT. - Additionally fixes a multi interface code-path in which connections - would not time out properly. + reference: + http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942.aspx + +- curl_version_info.3: 'ssl_version_num' is always 0 - This does not fix known bug #39. + ... and has been so since 2005 + +- ssl: generalize how the ssl backend identifier is set - URL: http://curl.haxx.se/mail/lib-2013-01/0191.html + Each backend now defines CURL_SSL_BACKEND accordingly. Added the *AXTLS + one which was missing previously. -Daniel Stenberg (16 Jan 2013) -- [Yves Arrouye brought this change] +Dan Fandrich (31 Jul 2014) +- axtls: define curlssl_random using axTLS's PRNG - --libcurl: fix for non-zero default options - - If the default value for an option taking a long as its value is non - zero, and it is set by zero by a command line option, then that command - line option is not reflected in --libcurl's output. This is because line - 520-521 of tool_setopt.c look like: +- cyassl: fix the test for ASN_NO_SIGNER_E - if(!lval) - skip = TRUE; - - An example of a command-line option doing so is the -k option that sets - CURLOPT_SLL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST to 0L, when the - defaults are non-zero. + It's an enum so a macro test won't work. The CyaSSL changelog doesn't + say exactly when this error code was introduced, but it's likely + to be 2.7.0. -- FTP: reject illegal port numbers in EPSV 229 responses +- cyassl: use RNG_GenerateBlock to generate a good random number -Yang Tse (15 Jan 2013) -- commit bc682cbd follow-up +- opts: fixed some typos -- build: use per-target '_CPPFLAGS' for those currently using default - - Automake documents that doing this will make it choose a different name - for intermediate object files even when sharing source files across - targets of same Makefile.am. +- smtp: fixed a segfault during test 1320 torture test - Up to automake 1.13.1 target's intermediate object files were placed - in the build subdirectory of the target. We depended on this, probably - undocumented behavior, to achieve same behavior as if a per-target flag - had been specified when building targets that actually belong to - different Makefile.am files. - - It seems automake 1.13.2 is going to break behavior mentioned above. + Under these circumstances, the connection hasn't been fully established + and smtp_connect hasn't been called, yet smtp_done still calls the state + machine which dereferences the NULL conn pointer in struct pingpong. + +Daniel Stenberg (30 Jul 2014) +- vtls: repair build without TLS support - So, lets use a documented behavior in order to achieve same purpose, - across automake versions, no matter where automake wishes to place - intermediate object files. + ... by defining Curl_ssl_random() properly + +- polarssl: provide a (weak) random function - Our build targets that already were using a per-target '_CFLAGS' or - '_CPPFLAGS' need no 'fixing', these were already 'fixed'. The only - Makefile.am or Makefile.in files in libcurl's source tree touched by - this 'fix' are tests/libtest/Makefile.inc and tests/unit/Makefile.inc. + This now provides a weak random function since PolarSSL doesn't have a + quick and easy way to provide a good one. It does however provide the + framework to make one so it _can_ and _should_ be done... -- tests/libtest/Makefile.inc: sort build targets +- [Michael Wallner brought this change] -- tests/Makefile.am: remove wildcard usage in EXTRA_DIST + curl_tlsinfo -> curl_tlssessioninfo -Kamil Dudka (15 Jan 2013) -- nss: fix error messages for CURLE_SSL_{CACERT,CRL}_BADFILE +- cyassl: use the default (weeker) random - Do not use the error messages from NSS for errors not occurring in NSS. + I couldn't find any dedicated function in its API to get a "good" random + with. -Steve Holme (14 Jan 2013) -- TODO: Updated following IMAP SASL additions +- cyassl: made it compile with version 2.0.6 again + + ASN_NO_SIGNER_E didn't exist back then! -Yang Tse (14 Jan 2013) -- configure: fix automake 1.13 compatibility +- vtls: make the random function mandatory in the TLS backend - Tested with: + To force each backend implementation to really attempt to provide proper + random. If a proper random function is missing, then we can explicitly + make use of the default one we use when TLS support is missing. - buildconf: autoconf version 2.69 - buildconf: autom4te version 2.69 - buildconf: autoheader version 2.69 - buildconf: automake version 1.13.1 - buildconf: aclocal version 1.13.1 - buildconf: libtool version 2.4 - buildconf: GNU m4 version 1.4.16 + This commit makes sure it works for darwinssl, gnutls, nss and openssl. -Daniel Stenberg (13 Jan 2013) -- BUGS: update bug tracker URL +- libcurl.m4: include the standard source header - ... and refresh number of lines of code + ... with permission from David Shaw -- Curl_resolver_getsock: fix the function description comment +Kamil Dudka (28 Jul 2014) +- nss: do not check the version of NSS at run time - It referred to it by the wrong name and said it returned the wrong value. - - Reported by: Gisle Vanem + The minimal required version of NSS is 3.14.x so it does not make sense + to check for NSS 3.12.0+ at run time. + +Daniel Stenberg (28 Jul 2014) +- [Anthon Pang brought this change] -Kamil Dudka (11 Jan 2013) -- nss: clear session cache if a client cert from file is used + curl.h: bring back CURLE_OBSOLETE16 - This commit fixes a regression introduced in 052a08ff. + Removing defines, even obsolete ones that haven't been used for a very + long time, still break a lot of applications. - NSS caches certs/keys returned by the SSL_GetClientAuthDataHook callback - and if we connect second time to the same server, the cached cert/key - pair is used. If we use multiple client certificates for different - paths on the same server, we need to clear the session cache to force - NSS to call the hook again. The commit 052a08ff prevented the session - cache from being cleared if a client certificate from file was used. + Bug: https://github.com/bagder/curl/pull/106 + +Dan Fandrich (26 Jul 2014) +- [Fabian Keil brought this change] + + tests: Fix a couple of incomplete response lines + +- [Fabian Keil brought this change] + + runtests.pl: Remove filteroff() which hasn't been used since 2001 + +- [Fabian Keil brought this change] + + runtests.pl: Don't expect $TESTDIR/DISABLED to exist - The condition is now fixed to cover both cases: consssl->client_nickname - is not NULL if a client certificate from the NSS database is used and - connssl->obj_clicert is not NULL if a client certificate from file is - used. + If a non-standard $TESTDIR is used the file may not be necessary. - Review by: Kai Engert + Previously a "missing" file resulted in the warning: + readline() on closed filehandle D at ./runtests.pl line 4940. -Yang Tse (11 Jan 2013) -- sockfilt.c: log file descriptor number on read/write error +- [Fabian Keil brought this change] -- [Gisle Vanem brought this change] + getpart.pm: Fix a comment typo - packages/DOS/common.dj: remove COFF debug info generation - - gcc on DOS hasn't really supported COFF-debug (-gcoff) on djgpp for a - long time. +Daniel Stenberg (25 Jul 2014) +- c-ares: fix build without IPv6 support - "Sounds like the COFF debug info generation has bit-rotted in GCC. - Nothing new here, no other platform uses COFF AFAIK." + Bug: http://curl.haxx.se/mail/lib-2014-07/0337.html + Reported-by: Spork Schivago + +- Curl_base64url_encode: unit-tested in 1302 + +- base64: added Curl_base64url_encode() - So lets drop it too. + This is now used by the http2 code. It has two different symbols at the + end of the base64 table to make the output "url safe". - URL: http://curl.haxx.se/mail/lib-2013-01/0130.html + Bug: https://github.com/tatsuhiro-t/nghttp2/issues/62 -- curl: ignore SIGPIPE - compilation fix - follow-up +- [Marcel Raad brought this change] -- test servers: handle W32/W64 SIGBREAK with exit_signal_handler + SSPI Negotiate: Fix 3 memory leaks + + Curl_base64_decode allocates the output string by itself and two other + strings were not freed either. -- test servers: fix errno, ERRNO and SOCKERRNO usage for W32/W64 +- symbols: CURL_VERSION_GSSNEGOTIATE is deprecated -- sockfilt.c: fix some W64 compiler warnings +- test1013.pl: GSS-Negotiate doesn't exist as a feature anymore -Daniel Stenberg (9 Jan 2013) -- [Nick Zitzmann brought this change] +- [Sergey Nikulov brought this change] - docs: the --with-darwinssl option is available on Apple OSes + libtest: fixed duplicated line in Makefile + + Bug: https://github.com/bagder/curl/pull/105 -Yang Tse (9 Jan 2013) -- curl: ignore SIGPIPE - compilation fix +Patrick Monnerat (23 Jul 2014) +- GSSAPI: remove useless *_MECHANISM defines. -- build: fix circular header inclusion with other packages - - This commit renames lib/setup.h to lib/curl_setup.h and - renames lib/setup_once.h to lib/curl_setup_once.h. - - Removes the need and usage of a header inclusion guard foreign - to libcurl. [1] - - Removes the need and presence of an alarming notice we carried - in old setup_once.h [2] - - ---------------------------------------- +Daniel Stenberg (23 Jul 2014) +- findprotocol: show unsupported protocol within quotes - 1 - lib/setup_once.h used __SETUP_ONCE_H macro as header inclusion guard - up to commit ec691ca3 which changed this to HEADER_CURL_SETUP_ONCE_H, - this single inclusion guard is enough to ensure that inclusion of - lib/setup_once.h done from lib/setup.h is only done once. - - Additionally lib/setup.h has always used __SETUP_ONCE_H macro to - protect inclusion of setup_once.h even after commit ec691ca3, this - was to avoid a circular header inclusion triggered when building a - c-ares enabled version with c-ares sources available which also has - a setup_once.h header. Commit ec691ca3 exposes the real nature of - __SETUP_ONCE_H usage in lib/setup.h, it is a header inclusion guard - foreign to libcurl belonging to c-ares's setup_once.h - - The renaming this commit does, fixes the circular header inclusion, - and as such removes the need and usage of a header inclusion guard - foreign to libcurl. Macro __SETUP_ONCE_H no longer used in libcurl. - - 2 - Due to the circular interdependency of old lib/setup_once.h and the - c-ares setup_once.h header, old file lib/setup_once.h has carried - back from 2006 up to now days an alarming and prominent notice about - the need of keeping libcurl's and c-ares's setup_once.h in sync. + ... to aid when for example prefixed with a space or other weird + character. + +Patrick Monnerat (23 Jul 2014) +- GSSAPI: private export mechanisms OIDs. OS400: Make RPG binding up to date. + +Daniel Stenberg (23 Jul 2014) +- [Marcel Raad brought this change] + + conncache: fix compiler warning - Given that this commit fixes the circular interdependency, the need - and presence of mentioned notice is removed. + warning C4267: '=' : conversion from 'size_t' to 'long', possible loss + of data - All mentioned interdependencies come back from now old days when - the c-ares project lived inside a curl subdirectory. This commit - removes last traces of such fact. - -Daniel Stenberg (8 Jan 2013) -- curl: ignore SIGPIPE + The member connection_id of struct connectdata is a long (always a + 32-bit signed integer on Visual C++) and the member next_connection_id + of struct conncache is a size_t, so one of them should be changed to + match the other. - This is a work-around for bug #1180 which is really libcurl's inability - to ignore SIGPIPE in a few cases. With this work-around at least curl - won't suffer from it! + This patch the size_t in struct conncache to long (the less invasive + change as that variable is only ever used in a single code line). - Bug: http://curl.haxx.se/bug/view.cgi?id=1180 - Reported by: Lluís Batlle i Rossell + Bug: http://curl.haxx.se/bug/view.cgi?id=1399 -Yang Tse (8 Jan 2013) -- sockfilt.c: fix some compiler warnings +- RELEASE-NOTES: synced with 81cd24adb8b -Daniel Stenberg (8 Jan 2013) -- Revert "configure: update req to 2.59" +- http2: more and better error checking - This reverts commit 7a6d8b1b1a8fcc184c36d6b6e741e32250b4bacb. + 1 - fixes the warnings when built without http2 support - URL: http://curl.haxx.se/mail/lib-2013-01/0103.html + 2 - adds CURLE_HTTP2, a new error code for errors detected by nghttp2 + basically when they are about http2 specific things. -Steve Holme (8 Jan 2013) -- pop3: Added support for non-blocking SSL upgrade +Dan Fandrich (23 Jul 2014) +- cyassl.c: return the correct error code on no CA cert - Added support for asynchronous SSL upgrade when using the - multi-interface. + CyaSSL 3.0.0 returns a unique error code if no CA cert is available, + so translate that into CURLE_SSL_CACERT_BADFILE when peer verification + is requested. -Daniel Stenberg (8 Jan 2013) -- configure: update req to 2.59 - - I ran the 2.59 version of autoupdate that updates obsoleted configure.ac - constructs to the 2.59 standard. With a little hands-on fiddling I - prevented it from ruining the quoting in AS_HELP_STRING() uses. - - I subsequently also bumped the required autoconf version to 2.59 - (released in December 2003) as I don't have an older autoconf version - around to test with and I can't be bothered to install one either... - - Inspired by: Björn Stenberg - Related blog post: http://cazfi.livejournal.com/195108.html +Daniel Stenberg (23 Jul 2014) +- symbols-in-versions: new SPNEGO/GSS-API symbols in 7.38.0 -Steve Holme (7 Jan 2013) -- imap.c: Small tidy up to add missing comment +- test1013.pl: remove SPNEGO/GSS-API tweaks + + No longer necessary after Michael Osipov's rework -- imap: Added support for sasl digest-md5 authentication +- http_negotiate: remove unused variable -- imap: Added support for sasl cram-md5 authentication +- [Michael Osipov brought this change] -Marc Hoersken (7 Jan 2013) -- tests/server/sockfilt.c: Fixed integer comparison warning + docs: Improve inline GSS-API naming in code documentation -- tests/server/sockfilt.c: Include required Win32 headers +- [Michael Osipov brought this change] -Steve Holme (7 Jan 2013) -- imap: Added support for sasl ntlm authentication + curl.h/features: Deprecate GSS-Negotiate macros due to bad naming + + - Replace CURLAUTH_GSSNEGOTIATE with CURLAUTH_NEGOTIATE + - CURL_VERSION_GSSNEGOTIATE is deprecated which + is served by CURL_VERSION_SSPI, CURL_VERSION_GSSAPI and + CURUL_VERSION_SPNEGO now. + - Remove display of feature 'GSS-Negotiate' -- imap: Added support for sasl login authentication +- [Michael Osipov brought this change] -- pop3.c: Fixed default authentication detection - - Fixed an issue where a server may positively respond to the CAPA command - but not list clear text as a valid authentication type. + configure/features: Add feature and version info for GSS-API and SPNEGO -- curl_sasl.c: Small code tidy up following imap changes +- [Michael Osipov brought this change] -- smtp.c: Small code tidy up following imap changes + HTTP: Remove checkprefix("GSS-Negotiate") + + That auth mech has never existed neither on MS nor on Unix side. + There is only Negotiate over SPNEGO. -- pop3.c: Small code tidy up following imap changes +- [Michael Osipov brought this change] -- imap: Added support for sasl plain text authentication + curl_gssapi: Add macros for common mechs and pass them appropriately + + Macros defined: KRB5_MECHANISM and SPNEGO_MECHANISM called from + HTTP, FTP and SOCKS on Unix -Marc Hoersken (6 Jan 2013) -- tests/server/sockfilt.c: Fixed support for listening sockets +- CONNECT: Revert Curl_proxyCONNECT back to 7.29.0 design - This commit fixes support for sockets that are ready to accept - a new connection and have previously been put into listening mode. + This reverts commit cb3e6dfa3511 and instead fixes the problem + differently. - It also includes changes which are the result of investigation - regarding Windows STDIN. These changes are the preparation for further - improvements regarding support for reading data from STDIN on Windows. + The reverted commit addressed a test failure in test 1021 by simplifying + and generalizing the code flow in a way that damaged the + performance. Now we modify the flow so that Curl_proxyCONNECT() again + does as much as possible in one go, yet still do test 1021 with and + without valgrind. It failed due to mistakes in the multi state machine. - Open issue: WaitForMultipleObjectsEx does not support PIPE handles - which are returned by GetStdHandle while running without a GUI. + Bug: http://curl.haxx.se/bug/view.cgi?id=1397 + Reported-by: Paul Saab -- tests/server/sockfilt.c: Set Windows Console to binary mode +- [Marcel Raad brought this change] -- tests/server/sockfilt.c: Improved log error messages + url.c: use the preferred symbol name: *READDATA + + with CURL_NO_OLDIES defined, it doesn't compile because this deprecated + symbol (*INFILE) is used - Include error code and parameters in error messages. + Bug: http://curl.haxx.se/bug/view.cgi?id=1398 -Steve Holme (6 Jan 2013) -- imap: Introduced the continue response in imap_endofresp() +Dan Fandrich (19 Jul 2014) +- [Alessandro Ghedini brought this change] -- imap: Added support for SASL based authentication mechanism detection - - Added support for detecting the supported SASL authentication mechanisms - via the CAPABILITY command. + CURLOPT_CHUNK_BGN_FUNCTION: fix typo -Yang Tse (6 Jan 2013) -- Revert changes relative to lib/*.[ch] recent renaming - - This reverts renaming and usage of lib/*.h header files done - 28-12-2012, reverting 2 commits: +Kamil Dudka (18 Jul 2014) +- [Alessandro Ghedini brought this change] + + build: link curl to NSS libraries when NSS support is enabled - f871de0... build: make use of 76 lib/*.h renamed files - ffd8e12... build: rename 76 lib/*.h files + This fixes a build failure on Debian caused by commit + 24c3cdce88f39731506c287cb276e8bf4a1ce393. - This also reverts removal of redundant include guard (redundant thanks - to changes in above commits) done 2-12-2013, reverting 1 commit: + Bug: http://curl.haxx.se/mail/lib-2014-07/0209.html + +Steve Holme (17 Jul 2014) +- build: Removed unnecessary XML Documentation file directive from VC8 to VC12 - c087374... curl_setup.h: remove redundant include guard + The curl tool project files for VC8 to VC12 would set this setting to + $(IntDir) which is the Visual Studio default value. To avoid confusion + when viewing settings from within Visual Studio and for consistency + with the libcurl project files removed this setting. - This also reverts renaming and usage of lib/*.c source files done - 3-12-2013, reverting 3 commits: + Conflicts: + projects/Windows/VC10/src/curlsrc.tmpl + projects/Windows/VC11/src/curlsrc.tmpl + projects/Windows/VC12/src/curlsrc.tmpl + projects/Windows/VC8/src/curlsrc.tmpl + projects/Windows/VC9/src/curlsrc.tmpl + +- build: Removed unnecessary Precompiled Header file directive in VC7 to VC12 - 13606bb... build: make use of 93 lib/*.c renamed files - 5b6e792... build: rename 93 lib/*.c files - 7d83dff... build: commit 13606bbfde follow-up 1 + The curl tool project files for VC7 to VC12 would set this settings to + $(IntDir)$(TargetName).pch which is the Visual Studio default value. To + avoid confusion when viewing settings from within Visual Studio and for + consistency with the libcurl project files removed this setting. - Start of related discussion thread: + Conflicts: + projects/Windows/VC10/src/curlsrc.tmpl + projects/Windows/VC11/src/curlsrc.tmpl + projects/Windows/VC12/src/curlsrc.tmpl + projects/Windows/VC8/src/curlsrc.tmpl + projects/Windows/VC9/src/curlsrc.tmpl + +- build: Removed unnecessary ASM and Object file directives in VC7 to VC12 - http://curl.haxx.se/mail/lib-2013-01/0012.html + The curl tool project files for VC7 to VC12 would set these settings to + $(IntDir) which is the Visual Studio default value. To avoid confusion + when viewing settings from within Visual Studio and for consistency + with the libcurl project files removed these two settings. + +Daniel Stenberg (17 Jul 2014) +- [Dave Reisner brought this change] + + src/Makefile.am: add .DELETE_ON_ERROR - Asking for confirmation on pushing this revertion commit: + This prevents targets like tool_hugehelp.c from leaving around + half-constructed files if the rule fails with GNU make. - http://curl.haxx.se/mail/lib-2013-01/0048.html + Reported-by: Rafaël Carré + +- THANKS: added new contributors from 7.37.1 announcement + +Dan Fandrich (17 Jul 2014) +- testcurl.pl: log the value of --runtestopts in the test header + +Daniel Stenberg (16 Jul 2014) +- RELEASE-NOTES: cleared, working towards next release + +- curl_gssapi.c: make line shorter than 80 columns + +- [David Woodhouse brought this change] + + Fix negotiate auth to proxies to track correct state + +- [David Woodhouse brought this change] + + Don't abort Negotiate auth when the server has a response for us - Confirmation summary: + It's wrong to assume that we can send a single SPNEGO packet which will + complete the authentication. It's a *negotiation* — the clue is in the + name. So make sure we handle responses from the server. - http://curl.haxx.se/mail/lib-2013-01/0079.html + Curl_input_negotiate() will already handle bailing out if it thinks the + state is GSS_S_COMPLETE (or SEC_E_OK on Windows) and the server keeps + talking to us, so we should avoid endless loops that way. + +- [David Woodhouse brought this change] + + Don't clear GSSAPI state between each exchange in the negotiation - NOTICE: The list of 2 files that have been modified by other - intermixed commits, while renamed, and also by at least one - of the 6 commits this one reverts follows below. These 2 files - will exhibit a hole in history unless git's '--follow' option - is used when viewing logs. + GSSAPI doesn't work very well if we forget everything ever time. - lib/curl_imap.h - lib/curl_smtp.h + XX: Is Curl_http_done() the right place to do the final cleanup? -Daniel Stenberg (6 Jan 2013) -- mk-ca-bundle.1: convert syntax to what's used elsewhere - - ... mostly to make sure roffit works better on it, but also to make our - man pages use a more unified style. +- [David Woodhouse brought this change] -- mk-ca-bundle.1: mention new -f, fix outputfile output + Use SPNEGO for HTTP Negotiate - also edited a few sentences to become more verbose - -- mk-ca-bundle: add -f, support passing to stdout and more + This is the correct way to do SPNEGO. Just ask for it - 1. When the downloaded data file from Mozilla is current, but the output - bundle does not exist: continue processing to create the bundle. The - goal is to have the output file - not just download the latest input. + Now I correctly see it trying NTLMSSP authentication when a Kerberos ticket + isn't available. Of course, we bail out when the server responds with the + challenge packet, since we don't expect that. But I'll fix that bug next... + +- [David Woodhouse brought this change] + + Remove all traces of FBOpenSSL SPNEGO support - 2. added -f option to force re-processing the file. Useful for - debugging/testing the process. + This is just fundamentally broken. SPNEGO (RFC4178) is a protocol which + allows client and server to negotiate the underlying mechanism which will + actually be used to authenticate. This is *often* Kerberos, and can also + be NTLM and other things. And to complicate matters, there are various + different OIDs which can be used to specify the Kerberos mechanism too. - 3. added support for output to '-' (stdout), allowing the output to be - piped. + A SPNEGO exchange will identify *which* GSSAPI mechanism is being used, + and will exchange GSSAPI tokens which are appropriate for that mechanism. - 4. All progress and error messages go to STDERR rather than STDOUT (3) + But this SPNEGO implementation just strips the incoming SPNEGO packet + and extracts the token, if any. And completely discards the information + about *which* mechanism is being used. Then we *assume* it was Kerberos, + and feed the token into gss_init_sec_context() with the default + mechanism (GSS_S_NO_OID for the mech_type argument). - 5. The script opened and closed the output file many times - unnecessarily. It now opens it once, does the output and closes it. + Furthermore... broken as this code is, it was never even *used* for input + tokens anyway, because higher layers of curl would just bail out if the + server actually said anything *back* to us in the negotiation. We assume + that we send a single token to the server, and it accepts it. If the server + wants to continue the exchange (as is required for NTLM and for SPNEGO + to do anything useful), then curl was broken anyway. - 6. Backup of the input files happens after successful processing, not - before. + So the only bit which actually did anything was the bit in + Curl_output_negotiate(), which always generates an *initial* SPNEGO + token saying "Hey, I support only the Kerberos mechanism and this is its + token". - 7. The output is written to a temporary file, and renamed to the - requested name after backup - this greatly reduces the window where the - file can be seen partially written. + You could have done that by manually just prefixing the Kerberos token + with the appropriate bytes, if you weren't going to do any proper SPNEGO + handling. There's no need for the FBOpenSSL library at all. - 8. all die calls have a \n at the end to suppress perl's traceback - the - traceback isn't useful to end users. + The sane way to do SPNEGO is just to *ask* the GSSAPI library to do + SPNEGO. That's what the 'mech_type' argument to gss_init_sec_context() + is for. And then it should all Just Work™. - Patch: http://curl.haxx.se/mail/lib-2013-01/0045.html + That 'sane way' will be added in a subsequent patch, as will bug fixes + for our failure to handle any exchange other than a single outbound + token to the server which results in immediate success. -Yang Tse (5 Jan 2013) -- imap test server: fix typo in name of SELECT_imap() sub definition - - IMAP test server breaking typo introduced with commit b708a522a1 +- [David Woodhouse brought this change] -Steve Holme (4 Jan 2013) -- imap test server: Added support for the CAPABILITY command - - Added support for the CAPABILITY command in preparation of upcoming - changes. - -Daniel Stenberg (3 Jan 2013) -- writeout: -w now supports remote_ip/port and local_ip/port - - Added mention to the curl.1 man page. - - Test case 1223 verifies remote_ip/port. - -Yang Tse (3 Jan 2013) -- test 1222: 8 chars object name generation && test 1221: adjustments - -Daniel Stenberg (3 Jan 2013) -- INTERNALS: remove "footnote" never used - -Yang Tse (3 Jan 2013) -- build: commit 13606bbfde follow-up 1 - -Daniel Stenberg (3 Jan 2013) -- FAQ: Can I write a server with libcurl? - -Yang Tse (3 Jan 2013) -- build: rename 93 lib/*.c files - - 93 lib/*.c source files renamed to use our standard naming scheme. - - This commit only does the file renaming. - - ---------------------------------------- - - renamed: lib/amigaos.c -> lib/curl_amigaos.c - renamed: lib/asyn-ares.c -> lib/curl_asyn_ares.c - renamed: lib/asyn-thread.c -> lib/curl_asyn_thread.c - renamed: lib/axtls.c -> lib/curl_axtls.c - renamed: lib/base64.c -> lib/curl_base64.c - renamed: lib/bundles.c -> lib/curl_bundles.c - renamed: lib/conncache.c -> lib/curl_conncache.c - renamed: lib/connect.c -> lib/curl_connect.c - renamed: lib/content_encoding.c -> lib/curl_content_encoding.c - renamed: lib/cookie.c -> lib/curl_cookie.c - renamed: lib/cyassl.c -> lib/curl_cyassl.c - renamed: lib/dict.c -> lib/curl_dict.c - renamed: lib/easy.c -> lib/curl_easy.c - renamed: lib/escape.c -> lib/curl_escape.c - renamed: lib/file.c -> lib/curl_file.c - renamed: lib/fileinfo.c -> lib/curl_fileinfo.c - renamed: lib/formdata.c -> lib/curl_formdata.c - renamed: lib/ftp.c -> lib/curl_ftp.c - renamed: lib/ftplistparser.c -> lib/curl_ftplistparser.c - renamed: lib/getenv.c -> lib/curl_getenv.c - renamed: lib/getinfo.c -> lib/curl_getinfo.c - renamed: lib/gopher.c -> lib/curl_gopher.c - renamed: lib/gtls.c -> lib/curl_gtls.c - renamed: lib/hash.c -> lib/curl_hash.c - renamed: lib/hmac.c -> lib/curl_hmac.c - renamed: lib/hostasyn.c -> lib/curl_hostasyn.c - renamed: lib/hostcheck.c -> lib/curl_hostcheck.c - renamed: lib/hostip.c -> lib/curl_hostip.c - renamed: lib/hostip4.c -> lib/curl_hostip4.c - renamed: lib/hostip6.c -> lib/curl_hostip6.c - renamed: lib/hostsyn.c -> lib/curl_hostsyn.c - renamed: lib/http.c -> lib/curl_http.c - renamed: lib/http_chunks.c -> lib/curl_http_chunks.c - renamed: lib/http_digest.c -> lib/curl_http_digest.c - renamed: lib/http_negotiate.c -> lib/curl_http_negotiate.c - renamed: lib/http_negotiate_sspi.c -> lib/curl_http_negotiate_sspi.c - renamed: lib/http_proxy.c -> lib/curl_http_proxy.c - renamed: lib/idn_win32.c -> lib/curl_idn_win32.c - renamed: lib/if2ip.c -> lib/curl_if2ip.c - renamed: lib/imap.c -> lib/curl_imap.c - renamed: lib/inet_ntop.c -> lib/curl_inet_ntop.c - renamed: lib/inet_pton.c -> lib/curl_inet_pton.c - renamed: lib/krb4.c -> lib/curl_krb4.c - renamed: lib/krb5.c -> lib/curl_krb5.c - renamed: lib/ldap.c -> lib/curl_ldap.c - renamed: lib/llist.c -> lib/curl_llist.c - renamed: lib/md4.c -> lib/curl_md4.c - renamed: lib/md5.c -> lib/curl_md5.c - renamed: lib/memdebug.c -> lib/curl_memdebug.c - renamed: lib/mprintf.c -> lib/curl_mprintf.c - renamed: lib/multi.c -> lib/curl_multi.c - renamed: lib/netrc.c -> lib/curl_netrc.c - renamed: lib/non-ascii.c -> lib/curl_non_ascii.c - renamed: lib/curl_non-ascii.h -> lib/curl_non_ascii.h - renamed: lib/nonblock.c -> lib/curl_nonblock.c - renamed: lib/nss.c -> lib/curl_nss.c - renamed: lib/nwlib.c -> lib/curl_nwlib.c - renamed: lib/nwos.c -> lib/curl_nwos.c - renamed: lib/openldap.c -> lib/curl_openldap.c - renamed: lib/parsedate.c -> lib/curl_parsedate.c - renamed: lib/pingpong.c -> lib/curl_pingpong.c - renamed: lib/polarssl.c -> lib/curl_polarssl.c - renamed: lib/pop3.c -> lib/curl_pop3.c - renamed: lib/progress.c -> lib/curl_progress.c - renamed: lib/qssl.c -> lib/curl_qssl.c - renamed: lib/rawstr.c -> lib/curl_rawstr.c - renamed: lib/rtsp.c -> lib/curl_rtsp.c - renamed: lib/security.c -> lib/curl_security.c - renamed: lib/select.c -> lib/curl_select.c - renamed: lib/sendf.c -> lib/curl_sendf.c - renamed: lib/share.c -> lib/curl_share.c - renamed: lib/slist.c -> lib/curl_slist.c - renamed: lib/smtp.c -> lib/curl_smtp.c - renamed: lib/socks.c -> lib/curl_socks.c - renamed: lib/socks_gssapi.c -> lib/curl_socks_gssapi.c - renamed: lib/socks_sspi.c -> lib/curl_socks_sspi.c - renamed: lib/speedcheck.c -> lib/curl_speedcheck.c - renamed: lib/splay.c -> lib/curl_splay.c - renamed: lib/ssh.c -> lib/curl_ssh.c - renamed: lib/sslgen.c -> lib/curl_sslgen.c - renamed: lib/ssluse.c -> lib/curl_ssluse.c - renamed: lib/strdup.c -> lib/curl_strdup.c - renamed: lib/strequal.c -> lib/curl_strequal.c - renamed: lib/strerror.c -> lib/curl_strerror.c - renamed: lib/strtok.c -> lib/curl_strtok.c - renamed: lib/strtoofft.c -> lib/curl_strtoofft.c - renamed: lib/telnet.c -> lib/curl_telnet.c - renamed: lib/tftp.c -> lib/curl_tftp.c - renamed: lib/timeval.c -> lib/curl_timeval.c - renamed: lib/transfer.c -> lib/curl_transfer.c - renamed: lib/url.c -> lib/curl_url.c - renamed: lib/version.c -> lib/curl_version.c - renamed: lib/warnless.c -> lib/curl_warnless.c - renamed: lib/wildcard.c -> lib/curl_wildcard.c - - ---------------------------------------- - -- build: make use of 93 lib/*.c renamed files - - 93 *.c source files renamed to use our standard naming scheme. - - This change affects 77 files in libcurl's source tree. - -Daniel Stenberg (3 Jan 2013) -- INSTALL: unify the SSL library texts - - Make them smaller and more similar for each separate SSL library - supported by the configure build - -Yang Tse (2 Jan 2013) -- curl_setup.h: remove redundant include guard - -- build and tests: curl_10char_object_name() shell function - - lib/objnames.inc provides definition of curl_10char_object_name() shell - function. The intended purpose of this function is to transliterate a - (*.c) source file name that may be longer than 10 characters, or not, - into a string with at most 10 characters which may be used as an OS/400 - object name. - - Test case 1221 does unit testng of this function and also verifies - that it is possible to generate distinct short object names for all - curl and libcurl *.c source file names. - - lib/objnames-test.sh is the shell script used for test case 1221. - - tests/runtests.pl modified to accept shell script test cases. - - More details inside lib/objnames.inc and lib/objnames-test.sh + ntlm_wb: Avoid invoking ntlm_auth helper with empty username -- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS - - automake 1.13 errors if AM_CONFIG_HEADER is used in configure script. - automake 1.13 no longer autoupdates AM_CONFIG_HEADER to - AC_CONFIG_HEADERS, thing which automake has been doing since automake - version 1.7 - - Given that our first automake supported version is automake 1.7, - simply replacing AM_CONFIG_HEADER usage with AC_CONFIG_HEADERS seems - enough to yet support same automake versions. - - Dave Reisner reported issue with 1.13 and provided patch. +- [David Woodhouse brought this change] + + ntlm_wb: Fix hard-coded limit on NTLM auth packet size - http://curl.haxx.se/mail/lib-2012-12/0246.html + Bumping it to 1KiB in commit aaaf9e50ec is all very well, but having hit + a hard limit once let's just make it cope by reallocating as necessary. + +Version 7.37.1 (16 Jul 2014) -- curl-override.m4: provide AC_CONFIG_MACRO_DIR definition conditionally +Daniel Stenberg (16 Jul 2014) +- RELEASE-NOTES: synced with 4cb2521595 + +- test506: verify aa6884845168 - Provide a 'traceable' AC_CONFIG_MACRO_DIR definition only when using - an autoconf version that does not provide it, instead of what we were - doing up to now of providing and overriding AC_CONFIG_MACRO_DIR for - all autoconf versions. + After the fixed cookie lock deadlock, this test now passes and it + detects double-locking and double-unlocking of mutexes. -Steve Holme (30 Dec 2012) -- imap.c: Minor follow up tidy up +- [Yousuke Kimoto brought this change] -- imap: Code tidy up prior to adding support for the CAPABILITY command + cookie: avoid mutex deadlock - * Changing the order of the state machine to represent the order in - which commands are sent to the server. + ... by removing the extra mutex locks around th call to + Curl_flush_cookies() which takes care of the locking itself already. - * Reworking the imap_endofresp() function as the FETCH response doesn't - include the command id and shouldn't be part of the length comparison - that takes into account the id string. + Bug: http://curl.haxx.se/mail/lib-2014-02/0184.html -- pop3_doing: Applied debug info message when function fails +- gnutls: fix compiler warning - Applied the same debug message as used in smtp_doing() and imap_doing() - when pop3_multi_statemach() fails. + conversion to 'int' from 'long int' may alter its value -- imap_doing: don't call imap_dophase_done() if already failed +Dan Fandrich (15 Jul 2014) +- test320: strip off the actual negotiated cipher width - Applied the POP3 fix from commit 2897ce7dc2e1 so imap_dophase_done() - isn't called if imap_multi_statemach() fails. + It's irrelevant to the test, and will change depending on which SSL + library is being used by libcurl. -- smtp_doing: don't call smtp_dophase_done() if already failed +- gnutls: detect lack of SRP support in GnuTLS at run-time and try without - Applied the POP3 fix from commit 2897ce7dc2e1 so smtp_dophase_done() - isn't called if smtp_multi_statemach() fails. + Reported-by: David Woodhouse -Yang Tse (29 Dec 2012) -- examples/certinfo.c: fix compiler warning +Daniel Stenberg (14 Jul 2014) +- [Michał Górny brought this change] -Steve Holme (29 Dec 2012) -- pop3.c: Removed unnecessary POP3_STOP state changes + configure: respect host tool prefix for krb5-config - Removed unnecessary state changes in pop3_state_starttls_resp() - following previous fix in IMAP module. + Use ${host_alias}-krb5-config if available. This improves cross- + compilation support and fixes multilib on Gentoo (at least). -- smtp.c: Added extra comments around SMTP_STOP state change - - Provided extra comments in the SMTP module following previous IMAP fix. +- [David Woodhouse brought this change] -- imap.c: Fixed bad state error when logging in with invalid credentials + gnutls: handle IP address in cert name check - Fixed a problem with the state machine when attempting to log in with - invalid credentials. The server would report login failure but libcurl - would not read the response due to inappropriate IMAP_STOP states being - set after the login was sent. + Before GnuTLS 3.3.6, the gnutls_x509_crt_check_hostname() function + didn't actually check IP addresses in SubjectAltName, even though it was + explicitly documented as doing so. So do it ourselves... + +Dan Fandrich (14 Jul 2014) +- build: set _POSIX_PTHREAD_SEMANTICS on Solaris to get proper getpwuid_r -Yang Tse (29 Dec 2012) -- imap.c: remove trailing whitespace +Daniel Stenberg (14 Jul 2014) +- RELEASE-NOTES: next one is called 7.37.1 -Steve Holme (28 Dec 2012) -- imap.c: Code tidy up - Part 2 - -- imap.c: Code tidy up - Part 1 - - Applied some of the comment and layout changes that had already been - applied to the pop3 and smtp code over the last 6 to 9 months. - - This is in preparation of adding SASL based authentication. - -- pop3.c: Minor code tidy up - - Minor tidy up of comments and layout prior to next part of imap work. - -- smtp: Minor code tidy up - - Minor tidy up of comments and layout prior to next part of imap work. - -- curl_imap.h: Tidy up of comments to be more readable - -- imap.c: Code tidy up renaming imapsendf() to imap_sendf() +Dan Fandrich (13 Jul 2014) +- gnutls: improved error message if setting cipher list fails - Renamed imapsendf() to imap_sendf() to be more in keeping with the - other imap functions as well as Curl_pp_sendf() that it replaces. - -Yang Tse (28 Dec 2012) -- build: rename 76 lib/*.h files - - 76 private header files renamed to use our standard naming scheme. - - This commit only does the file renaming. - - ---------------------------------------- + Reported-by: David Woodhouse + +- netrc: fixed thread safety problem by using getpwuid_r if available - renamed: amigaos.h -> curl_amigaos.h - renamed: arpa_telnet.h -> curl_arpa_telnet.h - renamed: asyn.h -> curl_asyn.h - renamed: axtls.h -> curl_axtls.h - renamed: bundles.h -> curl_bundles.h - renamed: conncache.h -> curl_conncache.h - renamed: connect.h -> curl_connect.h - renamed: content_encoding.h -> curl_content_encoding.h - renamed: cookie.h -> curl_cookie.h - renamed: cyassl.h -> curl_cyassl.h - renamed: dict.h -> curl_dict.h - renamed: easyif.h -> curl_easyif.h - renamed: escape.h -> curl_escape.h - renamed: file.h -> curl_file.h - renamed: fileinfo.h -> curl_fileinfo.h - renamed: formdata.h -> curl_formdata.h - renamed: ftp.h -> curl_ftp.h - renamed: ftplistparser.h -> curl_ftplistparser.h - renamed: getinfo.h -> curl_getinfo.h - renamed: gopher.h -> curl_gopher.h - renamed: gtls.h -> curl_gtls.h - renamed: hash.h -> curl_hash.h - renamed: hostcheck.h -> curl_hostcheck.h - renamed: hostip.h -> curl_hostip.h - renamed: http.h -> curl_http.h - renamed: http_chunks.h -> curl_http_chunks.h - renamed: http_digest.h -> curl_http_digest.h - renamed: http_negotiate.h -> curl_http_negotiate.h - renamed: http_proxy.h -> curl_http_proxy.h - renamed: if2ip.h -> curl_if2ip.h - renamed: imap.h -> curl_imap.h - renamed: inet_ntop.h -> curl_inet_ntop.h - renamed: inet_pton.h -> curl_inet_pton.h - renamed: krb4.h -> curl_krb4.h - renamed: llist.h -> curl_llist.h - renamed: memdebug.h -> curl_memdebug.h - renamed: multiif.h -> curl_multiif.h - renamed: netrc.h -> curl_netrc.h - renamed: non-ascii.h -> curl_non-ascii.h - renamed: nonblock.h -> curl_nonblock.h - renamed: nssg.h -> curl_nssg.h - renamed: parsedate.h -> curl_parsedate.h - renamed: pingpong.h -> curl_pingpong.h - renamed: polarssl.h -> curl_polarssl.h - renamed: pop3.h -> curl_pop3.h - renamed: progress.h -> curl_progress.h - renamed: qssl.h -> curl_qssl.h - renamed: rawstr.h -> curl_rawstr.h - renamed: rtsp.h -> curl_rtsp.h - renamed: select.h -> curl_select.h - renamed: sendf.h -> curl_sendf.h - renamed: setup.h -> curl_setup.h - renamed: setup_once.h -> curl_setup_once.h - renamed: share.h -> curl_share.h - renamed: slist.h -> curl_slist.h - renamed: smtp.h -> curl_smtp.h - renamed: sockaddr.h -> curl_sockaddr.h - renamed: socks.h -> curl_socks.h - renamed: speedcheck.h -> curl_speedcheck.h - renamed: splay.h -> curl_splay.h - renamed: ssh.h -> curl_ssh.h - renamed: sslgen.h -> curl_sslgen.h - renamed: ssluse.h -> curl_ssluse.h - renamed: strdup.h -> curl_strdup.h - renamed: strequal.h -> curl_strequal.h - renamed: strerror.h -> curl_strerror.h - renamed: strtok.h -> curl_strtok.h - renamed: strtoofft.h -> curl_strtoofft.h - renamed: telnet.h -> curl_telnet.h - renamed: tftp.h -> curl_tftp.h - renamed: timeval.h -> curl_timeval.h - renamed: transfer.h -> curl_transfer.h - renamed: url.h -> curl_url.h - renamed: urldata.h -> curl_urldata.h - renamed: warnless.h -> curl_warnless.h - renamed: wildcard.h -> curl_wildcard.h + The old way using getpwuid could cause problems in programs that enable + reading from netrc files simultaneously in multiple threads. - ---------------------------------------- + Reported-by: David Woodhouse + +- RELEASE-NOTES: add the reporter of the previous bug fix -- build: make use of 76 lib/*.h renamed files +- netrc: treat failure to find home dir same as missing netrc file - 76 private header files renamed to use our standard naming scheme. + This previously caused a fatal error (with a confusing error code, at + that). - This change affects 322 files in libcurl's source tree. + Reported by: Glen A Johnson Jr. -- lib/*.h: use our standard naming scheme for header inclusion guards +Steve Holme (12 Jul 2014) +- RELEASE-NOTES: Synced with aaaf9e50ec + +- ntlm_wb: Fixed buffer size not being large enough for NTLMv2 sessions + + Bug: http://curl.haxx.se/mail/lib-2014-07/0103.html + Reported-by: David Woodhouse -Steve Holme (28 Dec 2012) -- imsp.c: Fixed usernames and passwords that contain escape characters +- build: Fixed overridden compiler PDB settings in VC7 to VC12 - Fixed a problem with sending usernames and passwords that contain - backslash, quotation mark and space characters. + The curl tool project files for VC7 to VC12 would override the default + setting with the output filename being the same as the linker PDB file. + As such the compiler file would be overwritten with the linker file + for all debug builds. + + To avoid this overwrite and for consistency with the libcurl project + files, removed the setting to force the default filename to be used. -Daniel Stenberg (27 Dec 2012) -- curl.1: extend the -X, --request description +Dan Fandrich (12 Jul 2014) +- tests: added globbing keyword to URL globbing tests -- RELEASE-NOTES: synced with e3ed2b82e6 +- Fixed some "statement not reached" warnings -- [Nick Zitzmann brought this change] +- gnutls: fixed a couple of uninitialized variable references - darwinssl: Fixed inability to disable peer verification +- gnutls: fixed compilation against versions < 2.12.0 - ... on Snow Leopard and Lion + The AES-GCM ciphers were added to GnuTLS as late as ver. 3.0.1 but + the code path in which they're referenced here is only ever used for + somewhat older GnuTLS versions. This caused undeclared identifier errors + when compiling against those. + +- gnutls: explicitly added SRP to the priority string - Snow Leopard introduced the SSLSetSessionOption() function, but it - doesn't disable peer verification as expected on Snow Leopard or - Lion (it works as expected in Mountain Lion). So we now use sysctl() - to detect whether or not the user is using Snow Leopard or Lion, - and if that's the case, then we now use the deprecated - SSLSetEnableCertVerify() function instead to disable peer verification. + This seems to have become necessary for SRP support to work starting + with GnuTLS ver. 2.99.0. Since support for SRP was added to GnuTLS + before the function that takes this priority string, there should be no + issue with backward compatibility. -Yang Tse (26 Dec 2012) -- curl tool: rename hugehelp files to tool_hugehelp +- tests: adjust for capitalization differences in newer gnutls-serv + +- test320/1/2/4: fix the port number substitution variables + + These tests have been broken since commit 1958fe57 in Oct. 2011 -- curl tool: renaming hugehelp files to tool_hugehelp +- tests: document more test identifiers and variables -- sockfilt.c: commit b44da5a82a follow-up 2 +- gnutls: ignore invalid certificate dates with VERIFYPEER disabled + + This makes the behaviour consistent with what happens if a date can + be extracted from the certificate but is expired. -- sockfilt.c: commit b44da5a82a follow-up +Steve Holme (10 Jul 2014) +- CURLOPT_UPLOAD: Corrected argument type -- sockfilt.c: fix some compiler warnings +Daniel Stenberg (9 Jul 2014) +- FAQ: expand the thread-safe section + + ... with a mention of *NOSIGNAL, based on talk in bug #1386 -- curl_multi_remove_handle: commit 0aabfd9963 follow-up +Dan Fandrich (9 Jul 2014) +- url.c: Fixed memory leak on OOM + + This showed itself on some systems with torture failures + in tests 1060 and 1061 -Daniel Stenberg (25 Dec 2012) -- lib556: enable VERBOSE to ease debugging on failures +- Update instances of some obsolete CURLOPTs to their new names -Marc Hoersken (25 Dec 2012) -- socklift.c: Quick fix to re-add missing code +Daniel Stenberg (5 Jul 2014) +- [Marcel Raad brought this change] -- socklift.c: Added select_ws function to support Windows + compiler warnings: potentially uninitialized variables + + ... pointed out by MSVC2013 - WinSock select() does not support standard file descriptors, - it can only check SOCKETs. The following function is an attempt - to create a select() function with support for other handles. + Bug: http://curl.haxx.se/bug/view.cgi?id=1391 -Yang Tse (25 Dec 2012) -- Enable tests 1503, 1504 and 1505 +Kamil Dudka (4 Jul 2014) +- nss: make the list of CRL items global + + Otherwise NSS could use an already freed item for another connection. -- curl_multi_remove_handle: fix memory leak triggered with CURLOPT_RESOLVE +- nss: fix a memory leak when CURLOPT_CRLFILE is used -- Curl_hash_clean: OOM handling fix +- nss: make crl_der allocated on heap + + ... and spell it as crl_der instead of crlDER -- test 1504 and 1505: same as 1502 but with different cleanup sequences +- nss: let nss_{cache,load}_crl return CURLcode -Daniel Stenberg (24 Dec 2012) -- Curl_conncache_foreach: allow callback to break loop +- tool: oops, forgot to include - ... and have it take a proper 'struct connectdata *' as first argument + ... that contains the declaration of PL_ArenaFinish() -- pop3_doing: don't call pop3_dophase_done() if already failed +- tool: call PL_ArenaFinish() on exit if NSPR is used - ... it also clobbered the 'result' return value so that it wouldn't - return the error back to the parent function properly, which broke test - 809 when run with 'multi-always'. + This prevents valgrind from reporting still reachable memory allocated + by NSPR arenas (mainly the freelist). + + Reported-by: Hubert Kario + +Daniel Stenberg (3 Jul 2014) +- [Dimitrios Siganos brought this change] -Yang Tse (23 Dec 2012) -- test 1503: same as 1502 but with a different cleanup sequence + example: use correct type (long) for CURLOPT_FOLLOWLOCATION -- test 1502: OOM handling fixes +- [Dimitrios Siganos brought this change] -- curl_multi_wait: OOM handling fix + Document type of argument for CURLOPT_FOLLOWLOCATION. -- [Daniel Stenberg brought this change] +- [Dimitrios Siganos brought this change] - curl_multi_wait: avoid an unnecessary memory allocation + Document type of argument for CURLOPT_ERRORBUFFER. -- runtests.pl: prepend $srcdir to HTTPTLS server config files path +- [Dimitrios Siganos brought this change] -- multi.c: OOM handling fix + Document type of argument for CURLOPT_COPYPOSTFIELDS. -- lib543.c: OOM handling fixes +- [Dimitrios Siganos brought this change] -- configure: add internal sanity check (warn only) on vars for makefiles + Document type of argument for CURLOPT_ADDRESS_SCOPE. -Daniel Stenberg (21 Dec 2012) -- SCP: relative path didn't work +- curl.1: minor language fix + + Bug: http://curl.haxx.se/mail/archive-2014-07/0006.html + +- [Ray Satiro brought this change] + + progress callback: skip last callback update on errors + + When an error has been detected, skip the final forced call to the + progress callback by making sure to pass the current return code + variable in the Curl_done() call in the CURLM_STATE_DONE state. - When prefixing a path with /~/ it is supposed to be used relative to the - user's home directory but it didn't work. Now we cut off the entire - three byte sequenct "/~/" which seems to be how OpenSSH does it. + This avoids the "extra" callback that could occur even if you returned + error from the progress callback. - Bug: http://curl.haxx.se/bug/view.cgi?id=1173 - Reported by: Balaji Parasuram + Bug: http://curl.haxx.se/mail/lib-2014-06/0062.html + Reported by: Jonathan Cardoso Machado -Yang Tse (21 Dec 2012) -- configure: LIBMETALINK_CFLAGS actually is LIBMETALINK_CPPFLAGS +Dan Fandrich (2 Jul 2014) +- opts: fixed some CURLOPT references so they get turned into links -- configure: add minimal sanity check on user provided CFLAGS and CPPFLAGS +Kamil Dudka (2 Jul 2014) +- tool: call PR_Cleanup() on exit if NSPR is used + + This prevents valgrind from reporting possibly lost memory that NSPR + uses for file descriptor cache and other globally allocated internal + data structures. + +- nss: make the fallback to SSLv3 work again + + This feature was unintentionally disabled by commit ff92fcfb. -- bundles connection caching: some out of memory handling fixes +- nss: do not abort on connection failure + + ... due to calling SSL_VersionRangeGet() with NULL file descriptor + + reported-by: upstream tests 305 and 404 -- libntlmconnect.c: fix compiler warnings and OOM handling +Dan Fandrich (1 Jul 2014) +- opts: Document the socket callback function parameters -- configure.ac: clear local test intended variables before use +Steve Holme (28 Jun 2014) +- opts: Fixed some typos -- VC6 IDE: link with advapi32.lib when using WIN32 crypto API (md5.c) +Dan Fandrich (25 Jun 2014) +- curl_easy_setopt.3: fixed the error code for an unsupported option -- curl-functions.m4: improve gethostname arg 2 data type check +- opts: added some DEFAULT and RETURN VALUE sections -- setup_once.h: HP-UX specific 'bool', 'false' and 'true' definitions. +Daniel Stenberg (21 Jun 2014) +- libcurl docs: man page edits - Also reverts commit f254c59dc7 + mainly to improve how the web versions render -- configure: check if compiler halts on function prototype mismatch +Dan Fandrich (21 Jun 2014) +- curl_easy_setopt.3: fixed some typos -- warnless.c: fix compiler warnings +Daniel Stenberg (21 Jun 2014) +- lib man pages: update easy setopt option references + + ... by using the "\fIopt(3)\fP" syntax they will be linked properly when + the web version of the page is generated. -- curl-functions.m4: add gethostname arg 2 data type check and definition +- opts: the CURLOPT_SSL_ENABLE_*PN options are enabled by default -Daniel Stenberg (14 Dec 2012) -- [Nick Zitzmann brought this change] +- [Colin Hogben brought this change] - darwinssl: Fix implicit conversion compiler warnings + lib: documentation updates in README.hostip - The Clang compiler found a few implicit conversion problems that have - now been fixed. + c-ares now does support IPv6; + avoid implying threaded resolver is Windows-only; + two referenced source files were renamed in 7de2f92 -Yang Tse (14 Dec 2012) -- setup_once.h: HP-UX issue workaround +- curl_easy_setopt.3: CURLOPT_POSTFIELDS is the exception - Issue: When building a 32bit target with large file support HP-UX - header file may simultaneously provide two different - sets of declarations for sendfile and sendpath functions, one with - static and another with external linkage. Given that we do not use - mentioned functions we really don't care which linkage is the - appropriate one, but on the other hand, the double declaration emmits - warnings when using the HP-UX compiler and errors when using modern - gcc versions resulting in fatal compilation errors. + ... to the always-copy-char *-argument. - Mentioned issue is now fixed as long as we don't use sendfile nor - sendpath functions. + And fix some minor mistakes. -- setup_once.h: refactor inclusion of and +- curl_easy_setopt.3: refer to the individual man pages - Inclusion of top two most included header files now done in setup_once.h + With all the new individual option man pages created, this now refers to + each separate one instead of duplicaing the info. Also makes this page + easier to overview. -- setup_once.h: HP-UX specific TRUE and FALSE definitions +Dan Fandrich (21 Jun 2014) +- opts: fixed mancheck for out-of-tree builds + +Daniel Stenberg (21 Jun 2014) +- curl_easy_setopt.3: shorten - Some HP-UX system headers require TRUE defined to 1 and FALSE to 0. + shorten descriptions, mostly refer to the separate descriptions + +- CURLOPT_DNS_LOCAL_IP4.3: better short desc -Daniel Stenberg (12 Dec 2012) -- gopher: #include cleanup +Dan Fandrich (20 Jun 2014) +- opts: document CURLE_OUT_OF_MEMORY among other return values + +- opts: fixed some typos + +Daniel Stenberg (20 Jun 2014) +- opts: various corrections + +- opts: add the rest of the options - Remove all system file includes from this file as they're not needed + ... and fixed mancheck to ignore obsolete options + +- opts: the final bunch of options as man pages - Reported by: Dan Fandrich + Now all current options have their own man pages. -Yang Tse (11 Dec 2012) -- examples/simplessl.c: fix compiler warning +- opts: 37 additional man pages -- examples/externalsocket.c: fix SunPro compilation issue +- CURLOPT_URL: move up the text from "Notes" -- examples/simplessl.c: fix compiler warning +- ROADMAP: removed, now ROADMAP.md -- build: add bundles and conncache files to other build systems +- ROADMAP.md: make it markdown formatted -- conncache: fix enumerated type mixed with another type +- ROADMAP: initial commit of "curl the next few years" + + To be further discussed, debated and edited -- examples/anyauthput.c: fix Tru64 compilation issue +- opts: more man pages -Daniel Stenberg (8 Dec 2012) -- [Colin Watson brought this change] +- CURLOPT_UNRESTRICTED_AUTH.3: added missing 'T' - configure: fix cross pkg-config detection - - When cross-compiling, CURL_CHECK_PKGCONFIG was checking for the cross - pkg-config using ${host}-pkg-config. - - The gold standard for doing this correctly is pkg-config's own macro, - PKG_PROG_PKG_CONFIG. However, on the assumption that you have a good - reason not to use that directly (reduced dependencies for maintainer - builds?), the behaviour of cURL's version should at least match. - PKG_PROG_PKG_CONFIG uses AC_PATH_TOOL, which ultimately ends up trying - ${host_alias}-pkg-config; this is not quite the same as what cURL does, - and may differ because ${host} has been run through config.sub. For - instance, when cross-building to the armhf architecture on Ubuntu, - ${host_alias} is arm-linux-gnueabihf while ${host} is - arm-unknown-linux-gnueabihf. This may also have been the cause of the - problem reported at http://curl.haxx.se/mail/lib-2012-04/0224.html. - - AC_PATH_TOOL is significantly simpler than cURL's current code, and - dates back to well before the current minimum of Autoconf 2.57, so let's - use it instead. +- opts: makefile now includes all current man pages -- [Linus Nielsen Feltzing brought this change] +- opts: 11 more man pages - Introducing a new persistent connection caching system using "bundles". - - A bundle is a list of all persistent connections to the same host. - The connection cache consists of a hash of bundles, with the - hostname as the key. - The benefits may not be obvious, but they are two: - - 1) Faster search for connections to reuse, since the hash - lookup only finds connections to the host in question. - 2) It lays out the groundworks for an upcoming patch, - which will introduce multiple HTTP pipelines. - - This patch also removes the awkward list of "closure handles", - which were needed to send QUIT commands to the FTP server - when closing a connection. - Now we allocate a separate closure handle and use that - one to close all connections. - - This has been tested in a live system for a few weeks, and of - course passes the test suite. +Dan Fandrich (18 Jun 2014) +- opts: document CURLE_OUT_OF_MEMORY as RETURN VALUE -- [Fabian Keil brought this change] +- opts: fixed a couple of typos - runtests and friends: Do not add undefined values to @INC - - On FreeBSD this fixes the warning: - Use of uninitialized value $p in string eq at /usr/local/lib/perl5/5.14.2/BSDPAN/BSDPAN.pm line 36. +Patrick Monnerat (18 Jun 2014) +- OS400: make it compilable again. Make RPG binding up to date. -Steve Holme (5 Dec 2012) -- Merge pull request #52 from isn-/master +- buildconf: do not search tools in current directory. + +Dan Fandrich (18 Jun 2014) +- curl.h: renamed CURLOPT_DEPRECATEDx to CURLOPT_OBSOLETEx - small compilation fix + This is consistent with the existing obsolete error code naming + convention. + +Daniel Stenberg (18 Jun 2014) +- opts: 16 more man pages diff --git a/CMake/CurlCheckCSourceCompiles.cmake b/CMake/CurlCheckCSourceCompiles.cmake deleted file mode 100644 index b632768..0000000 --- a/CMake/CurlCheckCSourceCompiles.cmake +++ /dev/null @@ -1,75 +0,0 @@ -# - Check if the source code provided in the SOURCE argument compiles. -# CURL_CHECK_C_SOURCE_COMPILES(SOURCE VAR) -# - macro which checks if the source code compiles -# SOURCE - source code to try to compile -# VAR - variable to store whether the source code compiled -# -# The following variables may be set before calling this macro to -# modify the way the check is run: -# -# CMAKE_REQUIRED_FLAGS = string of compile command line flags -# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) -# CMAKE_REQUIRED_INCLUDES = list of include directories -# CMAKE_REQUIRED_LIBRARIES = list of libraries to link - -macro(CURL_CHECK_C_SOURCE_COMPILES SOURCE VAR) - if("${VAR}" MATCHES "^${VAR}$" OR "${VAR}" MATCHES "UNKNOWN") - set(message "${VAR}") - # If the number of arguments is greater than 2 (SOURCE VAR) - if(${ARGC} GREATER 2) - # then add the third argument as a message - set(message "${ARGV2} (${VAR})") - endif(${ARGC} GREATER 2) - set(MACRO_CHECK_FUNCTION_DEFINITIONS - "-D${VAR} ${CMAKE_REQUIRED_FLAGS}") - if(CMAKE_REQUIRED_LIBRARIES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES - "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") - else(CMAKE_REQUIRED_LIBRARIES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES) - endif(CMAKE_REQUIRED_LIBRARIES) - if(CMAKE_REQUIRED_INCLUDES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES - "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") - else(CMAKE_REQUIRED_INCLUDES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES) - endif(CMAKE_REQUIRED_INCLUDES) - set(src "") - foreach(def ${EXTRA_DEFINES}) - set(src "${src}#define ${def} 1\n") - endforeach(def) - foreach(inc ${HEADER_INCLUDES}) - set(src "${src}#include <${inc}>\n") - endforeach(inc) - - set(src "${src}\nint main() { ${SOURCE} ; return 0; }") - set(CMAKE_CONFIGURABLE_FILE_CONTENT "${src}") - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMake/CMakeConfigurableFile.in - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c" - IMMEDIATE) - message(STATUS "Performing Test ${message}") - try_compile(${VAR} - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c - COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} - CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} - "${CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}" - "${CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}" - OUTPUT_VARIABLE OUTPUT) - if(${VAR}) - set(${VAR} 1 CACHE INTERNAL "Test ${message}") - message(STATUS "Performing Test ${message} - Success") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "Performing C SOURCE FILE Test ${message} succeded with the following output:\n" - "${OUTPUT}\n" - "Source file was:\n${src}\n") - else(${VAR}) - message(STATUS "Performing Test ${message} - Failed") - set(${VAR} "" CACHE INTERNAL "Test ${message}") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "Performing C SOURCE FILE Test ${message} failed with the following output:\n" - "${OUTPUT}\n" - "Source file was:\n${src}\n") - endif(${VAR}) - endif("${VAR}" MATCHES "^${VAR}$" OR "${VAR}" MATCHES "UNKNOWN") -endmacro(CURL_CHECK_C_SOURCE_COMPILES) diff --git a/CMake/CurlCheckCSourceRuns.cmake b/CMake/CurlCheckCSourceRuns.cmake deleted file mode 100644 index 6b14af8..0000000 --- a/CMake/CurlCheckCSourceRuns.cmake +++ /dev/null @@ -1,83 +0,0 @@ -# - Check if the source code provided in the SOURCE argument compiles and runs. -# CURL_CHECK_C_SOURCE_RUNS(SOURCE VAR) -# - macro which checks if the source code runs -# SOURCE - source code to try to compile -# VAR - variable to store size if the type exists. -# -# The following variables may be set before calling this macro to -# modify the way the check is run: -# -# CMAKE_REQUIRED_FLAGS = string of compile command line flags -# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) -# CMAKE_REQUIRED_INCLUDES = list of include directories -# CMAKE_REQUIRED_LIBRARIES = list of libraries to link - -macro(CURL_CHECK_C_SOURCE_RUNS SOURCE VAR) - if("${VAR}" MATCHES "^${VAR}$" OR "${VAR}" MATCHES "UNKNOWN") - set(message "${VAR}") - # If the number of arguments is greater than 2 (SOURCE VAR) - if(${ARGC} GREATER 2) - # then add the third argument as a message - set(message "${ARGV2} (${VAR})") - endif(${ARGC} GREATER 2) - set(MACRO_CHECK_FUNCTION_DEFINITIONS - "-D${VAR} ${CMAKE_REQUIRED_FLAGS}") - if(CMAKE_REQUIRED_LIBRARIES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES - "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") - else(CMAKE_REQUIRED_LIBRARIES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES) - endif(CMAKE_REQUIRED_LIBRARIES) - if(CMAKE_REQUIRED_INCLUDES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES - "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") - else(CMAKE_REQUIRED_INCLUDES) - set(CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES) - endif(CMAKE_REQUIRED_INCLUDES) - set(src "") - foreach(def ${EXTRA_DEFINES}) - set(src "${src}#define ${def} 1\n") - endforeach(def) - foreach(inc ${HEADER_INCLUDES}) - set(src "${src}#include <${inc}>\n") - endforeach(inc) - - set(src "${src}\nint main() { ${SOURCE} ; return 0; }") - set(CMAKE_CONFIGURABLE_FILE_CONTENT "${src}") - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CMake/CMakeConfigurableFile.in - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c" - IMMEDIATE) - message(STATUS "Performing Test ${message}") - try_run(${VAR} ${VAR}_COMPILED - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c - COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} - CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} - "${CURL_CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}" - "${CURL_CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}" - OUTPUT_VARIABLE OUTPUT) - # if it did not compile make the return value fail code of 1 - if(NOT ${VAR}_COMPILED) - set(${VAR} 1) - endif(NOT ${VAR}_COMPILED) - # if the return value was 0 then it worked - set(result_var ${${VAR}}) - if("${result_var}" EQUAL 0) - set(${VAR} 1 CACHE INTERNAL "Test ${message}") - message(STATUS "Performing Test ${message} - Success") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "Performing C SOURCE FILE Test ${message} succeded with the following output:\n" - "${OUTPUT}\n" - "Return value: ${${VAR}}\n" - "Source file was:\n${src}\n") - else("${result_var}" EQUAL 0) - message(STATUS "Performing Test ${message} - Failed") - set(${VAR} "" CACHE INTERNAL "Test ${message}") - file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "Performing C SOURCE FILE Test ${message} failed with the following output:\n" - "${OUTPUT}\n" - "Return value: ${result_var}\n" - "Source file was:\n${src}\n") - endif("${result_var}" EQUAL 0) - endif("${VAR}" MATCHES "^${VAR}$" OR "${VAR}" MATCHES "UNKNOWN") -endmacro(CURL_CHECK_C_SOURCE_RUNS) diff --git a/CMake/CurlTests.c b/CMake/CurlTests.c index 199871a..04d5e7e 100644 --- a/CMake/CurlTests.c +++ b/CMake/CurlTests.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -71,264 +71,88 @@ main () } #endif -#ifdef HAVE_GETHOSTBYADDR_R_5 +/* 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 () -{ - -char * address; -int length; -int type; -struct hostent h; -struct hostent_data hdata; -int rc; -#ifndef gethostbyaddr_r - (void)gethostbyaddr_r; -#endif -rc = gethostbyaddr_r(address, length, type, &h, &hdata); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYADDR_R_5_REENTRANT -#define _REENTRANT -#include -#include -int -main () -{ - -char * address; -int length;q -int type; -struct hostent h; -struct hostent_data hdata; -int rc; -#ifndef gethostbyaddr_r - (void)gethostbyaddr_r; -#endif -rc = gethostbyaddr_r(address, length, type, &h, &hdata); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYADDR_R_7 -#include -#include -int -main () -{ - -char * address; -int length; -int type; -struct hostent h; -char buffer[8192]; -int h_errnop; -struct hostent * hp; - -#ifndef gethostbyaddr_r - (void)gethostbyaddr_r; -#endif -hp = gethostbyaddr_r(address, length, type, &h, - buffer, 8192, &h_errnop); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYADDR_R_7_REENTRANT -#define _REENTRANT -#include -#include -int -main () +int main(void) { - -char * address; -int length; -int type; -struct hostent h; -char buffer[8192]; -int h_errnop; -struct hostent * hp; - -#ifndef gethostbyaddr_r - (void)gethostbyaddr_r; -#endif -hp = gethostbyaddr_r(address, length, type, &h, - buffer, 8192, &h_errnop); - ; - return 0; -} + 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 -#ifdef HAVE_GETHOSTBYADDR_R_8 -#include -#include -int -main () -{ - -char * address; -int length; -int type; -struct hostent h; -char buffer[8192]; -int h_errnop; -struct hostent * hp; -int rc; - -#ifndef gethostbyaddr_r - (void)gethostbyaddr_r; -#endif -rc = gethostbyaddr_r(address, length, type, &h, - buffer, 8192, &hp, &h_errnop); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYADDR_R_8_REENTRANT -#define _REENTRANT -#include -#include -int -main () -{ - -char * address; -int length; -int type; -struct hostent h; -char buffer[8192]; -int h_errnop; -struct hostent * hp; -int rc; #ifndef gethostbyaddr_r (void)gethostbyaddr_r; #endif -rc = gethostbyaddr_r(address, length, type, &h, - buffer, 8192, &hp, &h_errnop); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYNAME_R_3 -#include -#include -#include -#undef NULL -#define NULL (void *)0 - -int -main () -{ - -struct hostent_data data; -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYNAME_R_3_REENTRANT -#define _REENTRANT -#include -#include -#include -#undef NULL -#define NULL (void *)0 - -int -main () -{ - -struct hostent_data data; -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYNAME_R_5 -#include -#include -#include -#undef NULL -#define NULL (void *)0 - -int -main () -{ -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL, 0, NULL); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYNAME_R_5_REENTRANT -#define _REENTRANT -#include -#include -#undef NULL -#define NULL (void *)0 -int -main () -{ - -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL, 0, NULL); - ; +#if defined(HAVE_GETHOSTBYADDR_R_5) || \ + defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) + rc = gethostbyaddr_r(address, length, type, &h, &hdata); +#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); +#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, 0, &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_GETHOSTBYNAME_R_6 -#include -#include -#undef NULL -#define NULL (void *)0 - -int -main () -{ -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL); - ; - return 0; -} -#endif -#ifdef HAVE_GETHOSTBYNAME_R_6_REENTRANT -#define _REENTRANT -#include -#include -#undef NULL -#define NULL (void *)0 - -int -main () -{ - -#ifndef gethostbyname_r - (void)gethostbyname_r; -#endif -gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL); - ; - return 0; -} -#endif #ifdef HAVE_SOCKLEN_T #ifdef _WIN32 #include diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake new file mode 100644 index 0000000..4986a8e --- /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 availabe 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 + ) +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 + ) +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 + ) + + # 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 + ) + + # 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 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 "-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 convienced 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/FindOpenSSL.cmake b/CMake/FindOpenSSL.cmake deleted file mode 100644 index 279428b..0000000 --- a/CMake/FindOpenSSL.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# Extension of the standard FindOpenSSL.cmake -# Adds OPENSSL_INCLUDE_DIRS and libeay32 -include("${CMAKE_ROOT}/Modules/FindOpenSSL.cmake") - -# starting 2.8 it is better to use standard modules -if(CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8") - # Bill Hoffman told that libeay32 is necessary for him: - find_library(SSL_LIBEAY NAMES libeay32) - - if(OPENSSL_FOUND) - if(SSL_LIBEAY) - list(APPEND OPENSSL_LIBRARIES ${SSL_LIBEAY}) - else() - set(OPENSSL_FOUND FALSE) - endif() - endif() -endif() # if (CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8") - -if(OPENSSL_FOUND) - set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR}) -endif() diff --git a/CMake/FindZLIB.cmake b/CMake/FindZLIB.cmake deleted file mode 100644 index b2cfe18..0000000 --- a/CMake/FindZLIB.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# Locate zlib -include("${CMAKE_ROOT}/Modules/FindZLIB.cmake") - -# starting 2.8 it is better to use standard modules -if(CMAKE_MAJOR_VERSION EQUAL "2" AND CMAKE_MINOR_VERSION LESS "8") - find_library(ZLIB_LIBRARY_DEBUG NAMES zd zlibd zdlld zlib1d ) - if(ZLIB_FOUND AND ZLIB_LIBRARY_DEBUG) - set( ZLIB_LIBRARIES optimized "${ZLIB_LIBRARY}" debug ${ZLIB_LIBRARY_DEBUG}) - endif() -endif() diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake new file mode 100644 index 0000000..dab005f --- /dev/null +++ b/CMake/Macros.cmake @@ -0,0 +1,95 @@ +#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(${VARIABLE}) +endmacro(CHECK_LIBRARY_EXISTS_CONCAT) + +# 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(${VARIABLE}) +endmacro(CHECK_INCLUDE_FILE_CONCAT) + +# 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(CMAKE_REQUIRED_LIBRARIES) + + 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(${CURL_TEST}) + 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(${CURL_TEST}) + endif() +endmacro(CURL_INTERNAL_TEST) + +macro(CURL_INTERNAL_TEST_RUN CURL_TEST) + if(NOT DEFINED "${CURL_TEST}_COMPILE") + set(MACRO_CHECK_FUNCTION_DEFINITIONS + "-D${CURL_TEST} ${CMAKE_REQUIRED_FLAGS}") + if(CMAKE_REQUIRED_LIBRARIES) + set(CURL_TEST_ADD_LIBRARIES + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") + endif(CMAKE_REQUIRED_LIBRARIES) + + message(STATUS "Performing Curl Test ${CURL_TEST}") + try_run(${CURL_TEST} ${CURL_TEST}_COMPILE + ${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}_COMPILE AND NOT ${CURL_TEST}) + set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}") + message(STATUS "Performing Curl Test ${CURL_TEST} - Success") + else(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST}) + 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}") + if(${CURL_TEST}_COMPILE) + file(APPEND + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" + "There was a problem running this test\n") + endif(${CURL_TEST}_COMPILE) + file(APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" + "\n\n") + endif(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST}) + endif() +endmacro(CURL_INTERNAL_TEST_RUN) diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake index 89d0048..4f07f22 100644 --- a/CMake/OtherTests.cmake +++ b/CMake/OtherTests.cmake @@ -1,15 +1,10 @@ -include(CurlCheckCSourceCompiles) -set(EXTRA_DEFINES "__unused1\n#undef inline\n#define __unused2") -set(HEADER_INCLUDES) -set(headers_hack) +include(CheckCSourceCompiles) +# The begin of the sources (macros and includes) +set(_source_epilogue "#undef inline") macro(add_header_include check header) if(${check}) - set(headers_hack - "${headers_hack}\n#include <${header}>") - #SET(HEADER_INCLUDES - # ${HEADER_INCLUDES} - # "${header}") + set(_source_epilogue "${_source_epilogue}\n#include <${header}>") endif(${check}) endmacro(add_header_include) @@ -18,22 +13,23 @@ if(HAVE_WINDOWS_H) add_header_include(HAVE_WINDOWS_H "windows.h") add_header_include(HAVE_WINSOCK2_H "winsock2.h") add_header_include(HAVE_WINSOCK_H "winsock.h") - set(EXTRA_DEFINES ${EXTRA_DEFINES} - "__unused7\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#define __unused3") + 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(HAVE_WINDOWS_H) add_header_include(HAVE_SYS_TYPES_H "sys/types.h") add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h") endif(HAVE_WINDOWS_H) -set(EXTRA_DEFINES_BACKUP "${EXTRA_DEFINES}") -set(EXTRA_DEFINES "${EXTRA_DEFINES_BACKUP}\n${headers_hack}\n${extern_line}\n#define __unused5") -curl_check_c_source_compiles("recv(0, 0, 0, 0)" curl_cv_recv) +check_c_source_compiles("${_source_epilogue} +int main(void) { + recv(0, 0, 0, 0); + return 0; +}" curl_cv_recv) if(curl_cv_recv) - # AC_CACHE_CHECK([types of arguments and return type for recv], - #[curl_cv_func_recv_args], [ - #SET(curl_cv_func_recv_args "unknown") - #for recv_retv in 'int' 'ssize_t'; do 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 "int" "ssize_t" "SOCKET") @@ -41,17 +37,23 @@ if(curl_cv_recv) foreach(recv_arg3 "size_t" "int" "socklen_t" "unsigned int") foreach(recv_arg4 "int" "unsigned int") if(NOT curl_cv_func_recv_done) - set(curl_cv_func_recv_test "UNKNOWN") - set(extern_line "extern ${recv_retv} ${signature_call_conv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})\;") - set(EXTRA_DEFINES "${EXTRA_DEFINES_BACKUP}\n${headers_hack}\n${extern_line}\n#define __unused5") - curl_check_c_source_compiles(" + 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)" - curl_cv_func_recv_test - "${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})") + ${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}") @@ -69,18 +71,13 @@ if(curl_cv_recv) endforeach(recv_arg2) endforeach(recv_arg1) endforeach(recv_retv) - else(NOT DEFINED curl_cv_func_recv_args OR "${curl_cv_func_recv_args}" STREQUAL "unknown") + 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}") - #MESSAGE("RECV_TYPE_ARG1 ${RECV_TYPE_ARG1}") - #MESSAGE("RECV_TYPE_ARG2 ${RECV_TYPE_ARG2}") - #MESSAGE("RECV_TYPE_ARG3 ${RECV_TYPE_ARG3}") - #MESSAGE("RECV_TYPE_ARG4 ${RECV_TYPE_ARG4}") - #MESSAGE("RECV_TYPE_RETV ${RECV_TYPE_RETV}") - endif(NOT DEFINED curl_cv_func_recv_args OR "${curl_cv_func_recv_args}" STREQUAL "unknown") + endif() if("${curl_cv_func_recv_args}" STREQUAL "unknown") message(FATAL_ERROR "Cannot find proper types to use for recv args") @@ -91,12 +88,12 @@ endif(curl_cv_recv) set(curl_cv_func_recv_args "${curl_cv_func_recv_args}" CACHE INTERNAL "Arguments for recv") set(HAVE_RECV 1) -curl_check_c_source_compiles("send(0, 0, 0, 0)" curl_cv_send) +check_c_source_compiles("${_source_epilogue} +int main(void) { + send(0, 0, 0, 0); + return 0; +}" curl_cv_send) if(curl_cv_send) - # AC_CACHE_CHECK([types of arguments and return type for send], - #[curl_cv_func_send_args], [ - #SET(curl_cv_func_send_args "unknown") - #for send_retv in 'int' 'ssize_t'; do 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 "int" "ssize_t" "SOCKET") @@ -104,19 +101,24 @@ if(curl_cv_send) foreach(send_arg3 "size_t" "int" "socklen_t" "unsigned int") foreach(send_arg4 "int" "unsigned int") if(NOT curl_cv_func_send_done) - set(curl_cv_func_send_test "UNKNOWN") - set(extern_line "extern ${send_retv} ${signature_call_conv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})\;") - set(EXTRA_DEFINES "${EXTRA_DEFINES_BACKUP}\n${headers_hack}\n${extern_line}\n#define __unused5") - curl_check_c_source_compiles(" + 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)" - curl_cv_func_send_test - "${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})") + ${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) - #MESSAGE("Found arguments: ${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 @@ -135,20 +137,14 @@ if(curl_cv_send) endforeach(send_arg2) endforeach(send_arg1) endforeach(send_retv) - else(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown") + 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}") - #MESSAGE("SEND_TYPE_ARG1 ${SEND_TYPE_ARG1}") - #MESSAGE("SEND_TYPE_ARG2 ${SEND_TYPE_ARG2}") - #MESSAGE("SEND_TYPE_ARG3 ${SEND_TYPE_ARG3}") - #MESSAGE("SEND_TYPE_ARG4 ${SEND_TYPE_ARG4}") - #MESSAGE("SEND_TYPE_RETV ${SEND_TYPE_RETV}") - #MESSAGE("SEND_QUAL_ARG2 ${SEND_QUAL_ARG2}") - endif(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown") + endif() if("${curl_cv_func_send_args}" STREQUAL "unknown") message(FATAL_ERROR "Cannot find proper types to use for send args") @@ -160,88 +156,71 @@ endif(curl_cv_send) set(curl_cv_func_send_args "${curl_cv_func_send_args}" CACHE INTERNAL "Arguments for send") set(HAVE_SEND 1) -set(EXTRA_DEFINES "${EXTRA_DEFINES}\n${headers_hack}\n#define __unused5") -curl_check_c_source_compiles("int flag = MSG_NOSIGNAL" HAVE_MSG_NOSIGNAL) +check_c_source_compiles("${_source_epilogue} + int main(void) { + int flag = MSG_NOSIGNAL; + (void)flag; + return 0; + }" HAVE_MSG_NOSIGNAL) -set(EXTRA_DEFINES "__unused1\n#undef inline\n#define __unused2") -set(HEADER_INCLUDES) -set(headers_hack) - -macro(add_header_include check header) - if(${check}) - set(headers_hack - "${headers_hack}\n#include <${header}>") - #SET(HEADER_INCLUDES - # ${HEADER_INCLUDES} - # "${header}") - endif(${check}) -endmacro(add_header_include header) - -if(HAVE_WINDOWS_H) - set(EXTRA_DEFINES ${EXTRA_DEFINES} - "__unused7\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#define __unused3") - add_header_include(HAVE_WINDOWS_H "windows.h") - add_header_include(HAVE_WINSOCK2_H "winsock2.h") - add_header_include(HAVE_WINSOCK_H "winsock.h") -else(HAVE_WINDOWS_H) - add_header_include(HAVE_SYS_TYPES_H "sys/types.h") +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(HAVE_WINDOWS_H) -set(EXTRA_DEFINES "${EXTRA_DEFINES}\n${headers_hack}\n#define __unused5") -curl_check_c_source_compiles("struct timeval ts;\nts.tv_sec = 0;\nts.tv_usec = 0" HAVE_STRUCT_TIMEVAL) - - -include(CurlCheckCSourceRuns) -set(EXTRA_DEFINES) -set(HEADER_INCLUDES) +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) + + +include(CheckCSourceRuns) +set(CMAKE_REQUIRED_FLAGS) if(HAVE_SYS_POLL_H) - set(HEADER_INCLUDES "sys/poll.h") + set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H") endif(HAVE_SYS_POLL_H) -curl_check_c_source_runs("return poll((void *)0, 0, 10 /*ms*/)" HAVE_POLL_FINE) +check_c_source_runs(" + #ifdef HAVE_SYS_POLL_H + # include + #endif + int main(void) { + return poll((void *)0, 0, 10 /*ms*/); + }" HAVE_POLL_FINE) set(HAVE_SIG_ATOMIC_T 1) -set(EXTRA_DEFINES) -set(HEADER_INCLUDES) +set(CMAKE_REQUIRED_FLAGS) if(HAVE_SIGNAL_H) - set(HEADER_INCLUDES "signal.h") + set(CMAKE_REQUIRED_FLAGS "-DHAVE_SIGNAL_H") set(CMAKE_EXTRA_INCLUDE_FILES "signal.h") endif(HAVE_SIGNAL_H) check_type_size("sig_atomic_t" SIZEOF_SIG_ATOMIC_T) if(HAVE_SIZEOF_SIG_ATOMIC_T) - curl_check_c_source_compiles("static volatile sig_atomic_t dummy = 0" HAVE_SIG_ATOMIC_T_NOT_VOLATILE) + 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(NOT HAVE_SIG_ATOMIC_T_NOT_VOLATILE) endif(HAVE_SIZEOF_SIG_ATOMIC_T) -set(CHECK_TYPE_SIZE_PREINCLUDE - "#undef inline") - if(HAVE_WINDOWS_H) - set(CHECK_TYPE_SIZE_PREINCLUDE "${CHECK_TYPE_SIZE_PREINCLUDE} - #ifndef WIN32_LEAN_AND_MEAN - #define WIN32_LEAN_AND_MEAN - #endif - #include ") - if(HAVE_WINSOCK2_H) - set(CHECK_TYPE_SIZE_PREINCLUDE "${CHECK_TYPE_SIZE_PREINCLUDE}\n#include ") - endif(HAVE_WINSOCK2_H) -else(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 ${CMAKE_EXTRA_INCLUDE_FILES} - "sys/socket.h") + set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) endif(HAVE_SYS_SOCKET_H) - if(HAVE_NETINET_IN_H) - set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} - "netinet/in.h") - endif(HAVE_NETINET_IN_H) - if(HAVE_ARPA_INET_H) - set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} - "arpa/inet.h") - endif(HAVE_ARPA_INET_H) -endif(HAVE_WINDOWS_H) +endif() check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE) if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE) diff --git a/CMake/Platforms/WindowsCache.cmake b/CMake/Platforms/WindowsCache.cmake index 49161f8..6fc2991 100644 --- a/CMake/Platforms/WindowsCache.cmake +++ b/CMake/Platforms/WindowsCache.cmake @@ -5,6 +5,7 @@ if(NOT UNIX) set(HAVE_LIBSOCKET 0) set(NOT_NEED_LIBNSL 0) set(HAVE_LIBNSL 0) + set(HAVE_GETHOSTNAME 1) set(HAVE_LIBZ 0) set(HAVE_LIBCRYPTO 0) @@ -14,7 +15,6 @@ if(NOT UNIX) set(HAVE_ARPA_INET_H 0) set(HAVE_DLFCN_H 0) set(HAVE_FCNTL_H 1) - set(HAVE_FEATURES_H 0) set(HAVE_INTTYPES_H 0) set(HAVE_IO_H 1) set(HAVE_MALLOC_H 1) @@ -108,7 +108,11 @@ if(NOT UNIX) set(HAVE_IN_ADDR_T 0) set(HAVE_INET_NTOA_R_DECL 0) set(HAVE_INET_NTOA_R_DECL_REENTRANT 0) - set(HAVE_GETADDRINFO 0) + if(ENABLE_IPV6) + set(HAVE_GETADDRINFO 1) + else() + set(HAVE_GETADDRINFO 0) + endif() set(STDC_HEADERS 1) set(RETSIGTYPE_TEST 1) diff --git a/CMakeLists.txt b/CMakeLists.txt index a7ecace..fc75d59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,24 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### # cURL/libcurl CMake script # by Tetetest and Sukender (Benoit Neil) @@ -17,34 +38,27 @@ # 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 2.6.2 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}") include(Utilities) +include(Macros) project( CURL C ) +message(WARNING "the curl cmake build system is poorly maintained. Be aware") + file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS) -string (REGEX MATCH "LIBCURL_VERSION_MAJOR[ \t]+([0-9]+)" - LIBCURL_VERSION_MJ ${CURL_VERSION_H_CONTENTS}) -string (REGEX MATCH "([0-9]+)" - LIBCURL_VERSION_MJ ${LIBCURL_VERSION_MJ}) -string (REGEX MATCH - "LIBCURL_VERSION_MINOR[ \t]+([0-9]+)" - LIBCURL_VERSION_MI ${CURL_VERSION_H_CONTENTS}) -string (REGEX MATCH "([0-9]+)" LIBCURL_VERSION_MI ${LIBCURL_VERSION_MI}) -string (REGEX MATCH - "LIBCURL_VERSION_PATCH[ \t]+([0-9]+)" - LIBCURL_VERSION_PT ${CURL_VERSION_H_CONTENTS}) -string (REGEX MATCH "([0-9]+)" LIBCURL_VERSION_PT ${LIBCURL_VERSION_PT}) -set (CURL_MAJOR_VERSION ${LIBCURL_VERSION_MJ}) -set (CURL_MINOR_VERSION ${LIBCURL_VERSION_MI}) -set (CURL_PATCH_VERSION ${LIBCURL_VERSION_PT}) +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}) include_regular_expression("^.*$") # Sukender: Is it necessary? # Setup package meta-data # SET(PACKAGE "curl") -set(CURL_VERSION ${CURL_MAJOR_VERSION}.${CURL_MINOR_VERSION}.${CURL_PATCH_VERSION}) message(STATUS "curl version=[${CURL_VERSION}]") # SET(PACKAGE_TARNAME "curl") # SET(PACKAGE_NAME "curl") @@ -60,12 +74,17 @@ include_directories( ${CURL_SOURCE_DIR}/include ) option(BUILD_CURL_EXE "Set to ON to build cURL executable." ON) option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON) option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF) -option(CURL_USE_ARES "Set to ON to enable c-ares support" OFF) +option(ENABLE_ARES "Set to ON to enable c-ares support" OFF) +option(ENABLE_THREADED_RESOLVER "Set to ON to enable POSIX threaded DNS lookup" OFF) # initialize CURL_LIBS set(CURL_LIBS "") -if(CURL_USE_ARES) - set(USE_ARES ${CURL_USE_ARES}) +if(ENABLE_THREADED_RESOLVER AND ENABLE_ARES) + message(FATAL_ERROR "Options ENABLE_THREADED_RESOLVER and ENABLE_ARES are mutually exclusive") +endif() + +if(ENABLE_ARES) + set(USE_ARES 1) find_package(CARES REQUIRED) list(APPEND CURL_LIBS ${CARES_LIBRARY} ) set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY}) @@ -110,6 +129,19 @@ 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) @@ -118,6 +150,11 @@ if(HTTP_ONLY) 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_SMTP ON) + set(CURL_DISABLE_GOPHER ON) endif() option(CURL_DISABLE_COOKIES "to disable cookies support" OFF) @@ -129,9 +166,52 @@ option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF) mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS) option(DISABLED_THREADSAFE "Set to explicitly specify we don't want to use thread-safe functions" OFF) mark_as_advanced(DISABLED_THREADSAFE) -option(ENABLE_IPV6 "Define if you want to enable IPv6 support" OFF) +option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON) mark_as_advanced(ENABLE_IPV6) +if(ENABLE_IPV6) + 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() +option(ENABLE_MANUAL "to provide the built-in manual" ON) +unset(USE_MANUAL CACHE) # TODO: cache NROFF/NROFF_MANOPT/USE_MANUAL vars? +if(ENABLE_MANUAL) + 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(USE_MANUAL 1) + break() + endif() + endforeach() + # No need for the temporary file + file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt") + if(NOT USE_MANUAL) + message(WARNING "Found no *nroff option to get plaintext from man pages") + endif() + else() + message(WARNING "Found no *nroff program") + endif() +endif() # We need ansi c-flags, especially on HP set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}") @@ -154,21 +234,24 @@ include (CheckIncludeFiles) include (CheckLibraryExists) include (CheckSymbolExists) include (CheckTypeSize) +include (CheckCSourceCompiles) # On windows preload settings if(WIN32) include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake) endif(WIN32) -# This macro checks if the symbol exists in the library and if it -# does, it prepends library to the list. -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(${VARIABLE}) -endmacro(CHECK_LIBRARY_EXISTS_CONCAT) +if(ENABLE_THREADED_RESOLVER) + check_include_file_concat("pthread.h" HAVE_PTHREAD_H) + if(HAVE_PTHREAD_H) + set(CMAKE_THREAD_PREFER_PTHREAD 1) + find_package(Threads) + if(CMAKE_USE_PTHREADS_INIT) + set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + set(USE_THREADS_POSIX 1) + endif() + endif() +endif() # Check for all needed libraries check_library_exists_concat("dl" dlopen HAVE_LIBDL) @@ -186,89 +269,271 @@ if(NOT NOT_NEED_LIBNSL) check_library_exists_concat("nsl" gethostbyname HAVE_LIBNSL) endif(NOT NOT_NEED_LIBNSL) -check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32) -check_library_exists_concat("winmm" getch HAVE_LIBWINMM) -check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32) +check_function_exists(gethostname HAVE_GETHOSTNAME) if(WIN32) - set(CURL_DEFAULT_DISABLE_LDAP OFF) - # some windows compilers do not have wldap32 - if(NOT HAVE_WLDAP32) + check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32) + check_library_exists_concat("winmm" getch HAVE_LIBWINMM) +endif() + +option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON) +mark_as_advanced(CMAKE_USE_OPENSSL) + +set(USE_SSLEAY OFF) +set(USE_OPENSSL OFF) +set(HAVE_LIBCRYPTO OFF) +set(HAVE_LIBSSL OFF) + +if(CMAKE_USE_OPENSSL) + find_package(OpenSSL) + if(OPENSSL_FOUND) + list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES}) + set(USE_SSLEAY ON) + set(USE_OPENSSL ON) + set(HAVE_LIBCRYPTO ON) + set(HAVE_LIBSSL ON) + include_directories(${OPENSSL_INCLUDE_DIR}) + set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) + check_include_file_concat("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H) + check_include_file_concat("openssl/engine.h" HAVE_OPENSSL_ENGINE_H) + check_include_file_concat("openssl/err.h" HAVE_OPENSSL_ERR_H) + check_include_file_concat("openssl/pem.h" HAVE_OPENSSL_PEM_H) + check_include_file_concat("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H) + check_include_file_concat("openssl/rsa.h" HAVE_OPENSSL_RSA_H) + check_include_file_concat("openssl/ssl.h" HAVE_OPENSSL_SSL_H) + check_include_file_concat("openssl/x509.h" HAVE_OPENSSL_X509_H) + check_include_file_concat("openssl/rand.h" HAVE_OPENSSL_RAND_H) + endif() +endif() + +if(NOT CURL_DISABLE_LDAP) + + if(WIN32) + option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON) + if(CURL_LDAP_WIN) + check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32) + if(NOT HAVE_WLDAP32) + set(CURL_LDAP_WIN 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 CURL_LDAP_WIN) + message(FATAL_ERROR "Cannot use CURL_LDAP_WIN and CMAKE_USE_OPENLDAP at the same time") + endif() + + # Now that we know, we're not using windows LDAP... + if(NOT CURL_LDAP_WIN) + # 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) + else() + check_include_file_concat("winldap.h" HAVE_WINLDAP_H) + check_include_file_concat("winber.h" HAVE_WINBER_H) + endif() + + set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory") + if(CMAKE_LDAP_INCLUDE_DIR) + set(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) + 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) - message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON") - option(CURL_LDAP_WIN "Use Windows LDAP implementation" OFF) else() - option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON) + 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 "-DLDAP_DEPRECATED=1" "-DWIN32_LEAN_AND_MEAN") + 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) + + if(NOT_NEED_LBER_H) + set(NEED_LBER_H OFF) + else() + set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H") + endif() endif() - mark_as_advanced(CURL_LDAP_WIN) + 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_SPECIAL_LIBZ) -# CHECK_LIBRARY_EXISTS_CONCAT("z" inflateEnd HAVE_LIBZ) -# ENDIF(NOT CURL_SPECIAL_LIBZ) +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("idn" idna_to_ascii_lz HAVE_LIBIDN) -# Check for LDAP -check_library_exists_concat("ldap" ldap_init HAVE_LIBLDAP) -# if(NOT HAVE_LIBLDAP) -# SET(CURL_DISABLE_LDAP ON) -# endif(NOT HAVE_LIBLDAP) - # Check for symbol dlopen (same as HAVE_LIBDL) check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN) -# For other tests to use the same libraries -set(CMAKE_REQUIRED_LIBRARIES ${CURL_LIBS}) - option(CURL_ZLIB "Set to ON to enable building cURL with zlib support." ON) set(HAVE_LIBZ OFF) set(HAVE_ZLIB_H OFF) set(HAVE_ZLIB OFF) -if(CURL_ZLIB) # AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE +if(CURL_ZLIB) find_package(ZLIB QUIET) if(ZLIB_FOUND) set(HAVE_ZLIB_H ON) set(HAVE_ZLIB ON) set(HAVE_LIBZ ON) list(APPEND CURL_LIBS ${ZLIB_LIBRARIES}) + include_directories(${ZLIB_INCLUDE_DIRS}) endif() endif() -option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON) -mark_as_advanced(CMAKE_USE_OPENSSL) -if(CMAKE_USE_OPENSSL) - - set(USE_SSLEAY OFF) - set(USE_OPENSSL OFF) - set(HAVE_LIBCRYPTO OFF) - set(HAVE_LIBSSL OFF) - - find_package(OpenSSL) - if(OPENSSL_FOUND) - list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES}) - list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) - set(USE_SSLEAY ON) - set(USE_OPENSSL ON) - set(HAVE_LIBCRYPTO ON) - set(HAVE_LIBSSL ON) - endif(OPENSSL_FOUND) -endif(CMAKE_USE_OPENSSL) - -# If we have features.h, then do the _BSD_SOURCE magic -check_include_file("features.h" HAVE_FEATURES_H) +#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}) + set(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 "") + + endif(LIBSSH2_FOUND) +endif(CMAKE_USE_LIBSSH2) + +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_GSS_API ${GSS_FOUND}) + if(GSS_FOUND) + + message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"") + + set(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() + + 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}) -# Check if header file exists and add it to the list. -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(${VARIABLE}) -endmacro(CHECK_INCLUDE_FILE_CONCAT) + 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() # Check for header files if(NOT UNIX) @@ -305,32 +570,18 @@ 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("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) check_include_file_concat("idn-free.h" HAVE_IDN_FREE_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("libssh2.h" HAVE_LIBSSH2_H) check_include_file_concat("limits.h" HAVE_LIMITS_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) -if(CMAKE_USE_OPENSSL AND OPENSSL_FOUND) - check_include_file_concat("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H) - check_include_file_concat("openssl/engine.h" HAVE_OPENSSL_ENGINE_H) - check_include_file_concat("openssl/err.h" HAVE_OPENSSL_ERR_H) - check_include_file_concat("openssl/pem.h" HAVE_OPENSSL_PEM_H) - check_include_file_concat("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H) - check_include_file_concat("openssl/rsa.h" HAVE_OPENSSL_RSA_H) - check_include_file_concat("openssl/ssl.h" HAVE_OPENSSL_SSL_H) - check_include_file_concat("openssl/x509.h" HAVE_OPENSSL_X509_H) - check_include_file_concat("openssl/rand.h" HAVE_OPENSSL_RAND_H) -endif(CMAKE_USE_OPENSSL AND OPENSSL_FOUND) + 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) @@ -359,25 +610,13 @@ 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("ldap.h" HAVE_LDAP_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_include_file_concat("idna.h" HAVE_IDNA_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) -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() check_type_size(size_t SIZEOF_SIZE_T) check_type_size(ssize_t SIZEOF_SSIZE_T) @@ -450,6 +689,12 @@ 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(poll "${CURL_INCLUDES}" HAVE_POLL) @@ -513,6 +758,7 @@ 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) @@ -551,75 +797,6 @@ if(NOT HAVE_STRICMP) set(HAVE_LDAP_URL_PARSE 1) endif(NOT HAVE_STRICMP) -# For other curl specific tests, use this macro. -macro(CURL_INTERNAL_TEST CURL_TEST) - if("${CURL_TEST}" MATCHES "^${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(CMAKE_REQUIRED_LIBRARIES) - - 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(${CURL_TEST}) - 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(${CURL_TEST}) - endif("${CURL_TEST}" MATCHES "^${CURL_TEST}$") -endmacro(CURL_INTERNAL_TEST) - -macro(CURL_INTERNAL_TEST_RUN CURL_TEST) - if("${CURL_TEST}_COMPILE" MATCHES "^${CURL_TEST}_COMPILE$") - set(MACRO_CHECK_FUNCTION_DEFINITIONS - "-D${CURL_TEST} ${CMAKE_REQUIRED_FLAGS}") - if(CMAKE_REQUIRED_LIBRARIES) - set(CURL_TEST_ADD_LIBRARIES - "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") - endif(CMAKE_REQUIRED_LIBRARIES) - - message(STATUS "Performing Curl Test ${CURL_TEST}") - try_run(${CURL_TEST} ${CURL_TEST}_COMPILE - ${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}_COMPILE AND NOT ${CURL_TEST}) - set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}") - message(STATUS "Performing Curl Test ${CURL_TEST} - Success") - else(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST}) - 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}") - if(${CURL_TEST}_COMPILE) - file(APPEND - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" - "There was a problem running this test\n") - endif(${CURL_TEST}_COMPILE) - file(APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" - "\n\n") - endif(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST}) - endif("${CURL_TEST}_COMPILE" MATCHES "^${CURL_TEST}_COMPILE$") -endmacro(CURL_INTERNAL_TEST_RUN) - # Do curl specific tests foreach(CURL_TEST HAVE_FCNTL_O_NONBLOCK @@ -783,6 +960,17 @@ else() set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT}) endif() +# TODO test which of these headers are required for the typedefs used in curlbuild.h +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) @@ -796,24 +984,6 @@ if(MSVC) add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) endif(MSVC) -# Sets up the dependencies (zlib, OpenSSL, etc.) of a cURL subproject according to options. -# TODO This is far to be complete! -function(SETUP_CURL_DEPENDENCIES TARGET_NAME) - if(CURL_ZLIB AND ZLIB_FOUND) - include_directories(${ZLIB_INCLUDE_DIR}) - #ADD_DEFINITIONS( -DHAVE_ZLIB_H -DHAVE_ZLIB -DHAVE_LIBZ ) - endif() - - if(CMAKE_USE_OPENSSL AND OPENSSL_FOUND) - include_directories(${OPENSSL_INCLUDE_DIR}) - endif() - if(CMAKE_USE_OPENSSL AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE) - #ADD_DEFINITIONS( -DUSE_SSLEAY ) - endif() - - target_link_libraries(${TARGET_NAME} ${CURL_LIBS}) -endfunction() - # 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) @@ -838,6 +1008,133 @@ if(BUILD_CURL_TESTS) add_subdirectory(tests) endif() +# TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL, WINSSL, DARWINSSL +if(USE_OPENSSL) + set(SSL_ENABLED 1) +endif() + +# Helper to populate a list (_items) with a label when conditions (the remaining +# args) are satisfied +function(_add_if label) + # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection + if(${ARGN}) + set(_items ${_items} "${label}" PARENT_SCOPE) + endif() +endfunction() + +# 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) +_add_if("IDN" HAVE_LIBIDN) +# TODO SSP1 (WinSSL) check is missing +_add_if("SSPI" USE_WINDOWS_SSPI) +_add_if("GSS-API" HAVE_GSS_API) +# TODO SSP1 missing for SPNEGO +_add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND + (HAVE_GSS_API OR USE_WINDOWS_SSPI)) +_add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND + (HAVE_GSS_API OR USE_WINDOWS_SSPI)) +# NTLM support requires crypto function adaptions from various SSL libs +# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS, DARWINSSL +if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR + USE_WINDOWS_SSPI OR GNUTLS_ENABLED OR NSS_ENABLED OR DARWINSSL_ENABLED)) + _add_if("NTLM" 1) + # TODO missing option (autoconf: --enable-ntlm-wb) + _add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED) +endif() +# 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) +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("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) +list(SORT _items) +string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}") +message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}") + +# 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 "") +# TODO need to set this (see CURL_CHECK_CA_BUNDLE in acinclude.m4) +set(CURL_CA_BUNDLE "") +set(CURLVERSION "${CURL_VERSION}") +set(ENABLE_SHARED "yes") +if(CURL_STATICLIB) + # Broken: LIBCURL_LIBS below; .a lib is not built + message(WARNING "Static linking is broken!") + set(ENABLE_STATIC "no") +else() + set(ENABLE_STATIC "no") +endif() +set(exec_prefix "\${prefix}") +set(includedir "\${prefix}/include") +set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}") +set(LIBCURL_LIBS "") +set(libdir "${CMAKE_INSTALL_PREFIX}/lib") +# TODO CURL_LIBS also contains absolute paths which don't work with static -l... +foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS}) + set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}") +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 +configure_file("${CURL_SOURCE_DIR}/curl-config.in" + "${CURL_BINARY_DIR}/curl-config" @ONLY) +install(FILES "${CMAKE_BINARY_DIR}/curl-config" + DESTINATION bin + 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 "${CMAKE_BINARY_DIR}/libcurl.pc" + DESTINATION lib/pkgconfig) + # This needs to be run very last so other parts of the scripts can take advantage of this. if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE) set(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before") diff --git a/COPYING b/COPYING index 85d122e..6b5d59f 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ COPYRIGHT AND PERMISSION NOTICE -Copyright (c) 1996 - 2013, Daniel Stenberg, . +Copyright (c) 1996 - 2015, Daniel Stenberg, . All rights reserved. diff --git a/Makefile b/Makefile index 3efb8eb..f0f50d8 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -130,29 +130,143 @@ vc-x64: $(VC) cd ..\src nmake /f Makefile.$(VC) MACHINE=x64 cfg=release +vc-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 + +vc-x64-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release WINDOWS_SSPI=1 + +vc-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release USE_IDN=1 + +vc-x64-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 + +vc-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 WINDOWS_SSPI=1 + vc-zlib: $(VC) cd lib nmake /f Makefile.$(VC) cfg=release-zlib cd ..\src nmake /f Makefile.$(VC) cfg=release-zlib +vc-x64-zlib: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib + +vc-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-zlib WINDOWS_SSPI=1 + +vc-x64-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib WINDOWS_SSPI=1 + +vc-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 + +vc-x64-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 + +vc-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1 + vc-ssl: $(VC) cd lib nmake /f Makefile.$(VC) cfg=release-ssl cd ..\src nmake /f Makefile.$(VC) cfg=release-ssl -vc-ssl-zlib: $(VC) +vc-x64-ssl: $(VC) cd lib - nmake /f Makefile.$(VC) cfg=release-ssl-zlib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl cd ..\src - nmake /f Makefile.$(VC) cfg=release-ssl-zlib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl -vc-winssl-zlib: $(VC) +vc-ssl-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl WINDOWS_SSPI=1 + +vc-x64-ssl-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl WINDOWS_SSPI=1 + +vc-ssl-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 + +vc-x64-ssl-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 + +vc-ssl-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-ssl-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1 + +vc-ssl-zlib: $(VC) cd lib - nmake /f Makefile.$(VC) cfg=release-winssl-zlib + nmake /f Makefile.$(VC) cfg=release-ssl-zlib cd ..\src - nmake /f Makefile.$(VC) cfg=release-winssl-zlib + nmake /f Makefile.$(VC) cfg=release-ssl-zlib vc-x64-ssl-zlib: $(VC) cd lib @@ -160,11 +274,137 @@ vc-x64-ssl-zlib: $(VC) cd ..\src nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib +vc-ssl-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-zlib WINDOWS_SSPI=1 + +vc-x64-ssl-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib WINDOWS_SSPI=1 + +vc-ssl-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 + +vc-x64-ssl-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 + +vc-ssl-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-ssl-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-ssl-ssh2-zlib: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib + +vc-x64-ssl-ssh2-zlib: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib + +vc-ssl-ssh2-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1 + +vc-x64-ssl-ssh2-zlib-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1 + +vc-ssl-ssh2-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 + +vc-x64-ssl-ssh2-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 + +vc-ssl-ssh2-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-ssl-ssh2-zlib-idn-sspi: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-winssl: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1 + +vc-x64-winssl: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1 + +vc-winssl-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-winssl-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1 + +vc-winssl-zlib: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-winssl-zlib WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-winssl-zlib WINDOWS_SSPI=1 + vc-x64-winssl-zlib: $(VC) cd lib - nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib WINDOWS_SSPI=1 cd ..\src - nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib WINDOWS_SSPI=1 + +vc-winssl-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + +vc-x64-winssl-zlib-idn: $(VC) + cd lib + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1 + cd ..\src + nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1 vc-ssl-dll: $(VC) cd lib @@ -208,12 +448,6 @@ vc-zlib-dll: $(VC) cd ..\src nmake /f Makefile.$(VC) cfg=release-zlib-dll -vc-sspi: $(VC) - cd lib - nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 - cd ..\src - nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 - djgpp: $(MAKE) -C lib -f Makefile.dj $(MAKE) -C src -f Makefile.dj @@ -266,6 +500,18 @@ linux-ssl: ssl # We don't need to do anything for vc6. vc6: +# VC7 makefiles are for use with VS.NET and VS.NET 2003 +vc7: lib/Makefile.vc7 src/Makefile.vc7 + +lib/Makefile.vc7: lib/Makefile.vc6 + @echo "generate $@" + @sed -e "s/VC6/VC7/g" lib/Makefile.vc6 > lib/Makefile.vc7 + +src/Makefile.vc7: src/Makefile.vc6 + @echo "generate $@" + @sed -e "s/VC6/VC7/g" src/Makefile.vc6 > src/Makefile.vc7 + +# VC8 makefiles are for use with VS2005 vc8: lib/Makefile.vc8 src/Makefile.vc8 lib/Makefile.vc8: lib/Makefile.vc6 @@ -298,6 +544,28 @@ src/Makefile.vc10: src/Makefile.vc6 @echo "generate $@" @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" src/Makefile.vc6 > src/Makefile.vc10 +# VC11 makefiles are for use with VS2012 +vc11: lib/Makefile.vc11 src/Makefile.vc11 + +lib/Makefile.vc11: lib/Makefile.vc6 + @echo "generate $@" + @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" lib/Makefile.vc6 > lib/Makefile.vc11 + +src/Makefile.vc11: src/Makefile.vc6 + @echo "generate $@" + @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" src/Makefile.vc6 > src/Makefile.vc11 + +# VC12 makefiles are for use with VS2013 +vc12: lib/Makefile.vc12 src/Makefile.vc12 + +lib/Makefile.vc12: lib/Makefile.vc6 + @echo "generate $@" + @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" lib/Makefile.vc6 > lib/Makefile.vc12 + +src/Makefile.vc12: src/Makefile.vc6 + @echo "generate $@" + @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" src/Makefile.vc6 > src/Makefile.vc12 + ca-bundle: lib/mk-ca-bundle.pl @echo "generate a fresh ca-bundle.crt" @perl $< -b -l -u lib/ca-bundle.crt diff --git a/Makefile.am b/Makefile.am index 608bd11..3b91e83 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -24,34 +24,94 @@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 -CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \ -CMake/CurlCheckCSourceCompiles.cmake CMake/CurlCheckCSourceRuns.cmake \ -CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake \ -CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \ -CMake/Utilities.cmake include/curl/curlbuild.h.cmake - -VC6LIBDSP = vs/vc6/lib/vc6libcurl.dsp -VC6LIBDSPHEAD = vs/t/lib/vc6_libcurl_dsp.head -VC6LIBDSPFOOT = vs/t/lib/vc6_libcurl_dsp.foot - -VC8LIBPRJ = vs/vc8/lib/vc8libcurl.vcproj -VC8LIBPRJHEAD = vs/t/lib/vc8_libcurl_prj.head -VC8LIBPRJFOOT = vs/t/lib/vc8_libcurl_prj.foot - -VC_DIST = \ - vs/t/README \ - $(VC6LIBDSP) $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ - $(VC8LIBPRJ) $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ - vs/vc6/vc6curl.dsw \ - vs/vc6/lib/vc6libcurl.dsw \ - vs/vc6/src/vc6curltool.dsw \ - vs/vc6/src/vc6curltool.dsp - -VC6LIBDSP_DEPS = $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ - Makefile.am lib/Makefile.inc - -VC8LIBPRJ_DEPS = $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ - Makefile.am lib/Makefile.inc +CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \ + CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \ + CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \ + include/curl/curlbuild.h.cmake CMake/Macros.cmake + +VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl +VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp +VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc +VC6_SRCTMPL = projects/Windows/VC6/src/curlsrc.tmpl +VC6_SRCDSP = projects/Windows/VC6/src/curlsrc.dsp +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 +VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc +VC7_SRCTMPL = projects/Windows/VC7/src/curlsrc.tmpl +VC7_SRCVCPROJ = projects/Windows/VC7/src/curlsrc.vcproj +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 +VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc +VC71_SRCTMPL = projects/Windows/VC7.1/src/curlsrc.tmpl +VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curlsrc.vcproj +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 +VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc +VC8_SRCTMPL = projects/Windows/VC8/src/curlsrc.tmpl +VC8_SRCVCPROJ = projects/Windows/VC8/src/curlsrc.vcproj +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 +VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc +VC9_SRCTMPL = projects/Windows/VC9/src/curlsrc.tmpl +VC9_SRCVCPROJ = projects/Windows/VC9/src/curlsrc.vcproj +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 +VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc +VC10_SRCTMPL = projects/Windows/VC10/src/curlsrc.tmpl +VC10_SRCVCXPROJ = projects/Windows/VC10/src/curlsrc.vcxproj +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 +VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc +VC11_SRCTMPL = projects/Windows/VC11/src/curlsrc.tmpl +VC11_SRCVCXPROJ = projects/Windows/VC11/src/curlsrc.vcxproj +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 +VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc +VC12_SRCTMPL = projects/Windows/VC12/src/curlsrc.tmpl +VC12_SRCVCXPROJ = projects/Windows/VC12/src/curlsrc.vcxproj +VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc + +VC_DIST = projects/README \ + projects/build-openssl.bat \ + projects/checksrc.bat \ + projects/Windows/VC6/curl.dsw \ + projects/Windows/VC6/lib/libcurl.dsw $(VC6_LIBDSP) \ + projects/Windows/VC6/src/curlsrc.dsw $(VC6_SRCDSP) \ + projects/Windows/VC7/curl.sln \ + projects/Windows/VC7/lib/libcurl.sln $(VC7_LIBVCPROJ) \ + projects/Windows/VC7/src/curlsrc.sln $(VC7_SRCVCPROJ) \ + projects/Windows/VC7.1/curl.sln \ + projects/Windows/VC7.1/lib/libcurl.sln $(VC71_LIBVCPROJ) \ + projects/Windows/VC7.1/src/curlsrc.sln $(VC71_SRCVCPROJ) \ + projects/Windows/VC8/curl.sln \ + projects/Windows/VC8/lib/libcurl.sln $(VC8_LIBVCPROJ) \ + projects/Windows/VC8/src/curlsrc.sln $(VC8_SRCVCPROJ) \ + projects/Windows/VC9/curl.sln \ + projects/Windows/VC9/lib/libcurl.sln $(VC9_LIBVCPROJ) \ + projects/Windows/VC9/src/curlsrc.sln $(VC9_SRCVCPROJ) \ + projects/Windows/VC10/curl.sln \ + projects/Windows/VC10/lib/libcurl.sln $(VC10_LIBVCXPROJ) \ + projects/Windows/VC10/src/curlsrc.sln $(VC10_SRCVCXPROJ) \ + projects/Windows/VC11/curl.sln \ + projects/Windows/VC11/lib/libcurl.sln $(VC11_LIBVCXPROJ) \ + projects/Windows/VC11/src/curlsrc.sln $(VC11_SRCVCXPROJ) \ + projects/Windows/VC12/curl.sln \ + projects/Windows/VC12/lib/libcurl.sln $(VC12_LIBVCXPROJ) \ + projects/Windows/VC12/src/curlsrc.sln $(VC12_SRCVCXPROJ) WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ winbuild/MakefileBuild.vc winbuild/Makefile.vc \ @@ -61,7 +121,10 @@ EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \ $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in -CLEANFILES = $(VC6LIBDSP) $(VC8LIBPRJ) +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) bin_SCRIPTS = curl-config @@ -71,11 +134,9 @@ DIST_SUBDIRS = $(SUBDIRS) tests packages docs pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libcurl.pc -# List of libcurl source files required to generate VC IDE dsp and prj files +# List of files required to generate VC IDE .dsp, .vcproj and .vcxproj files include lib/Makefile.inc - -WIN32SOURCES = $(CSOURCES) -WIN32HEADERS = $(HHEADERS) config-win32.h +include src/Makefile.inc dist-hook: rm -rf $(top_builddir)/tests/log @@ -187,96 +248,283 @@ uninstall-hook: cd docs && $(MAKE) uninstall ca-bundle: lib/mk-ca-bundle.pl - @echo "generate a fresh ca-bundle.crt" + @echo "generating 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" + @echo "generating a fresh ca-bundle.crt" ./lib/firefox-db2pem.sh lib/ca-bundle.crt checksrc: cd lib && $(MAKE) checksrc cd src && $(MAKE) checksrc -.PHONY: vc6-ide - -vc6-ide: - $(MAKE) $(VC6LIBDSP) - -$(VC6LIBDSP): $(VC6LIBDSP_DEPS) - @(echo "generating '$(VC6LIBDSP)'"; \ +.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) + @(win32_lib_srcs='$(LIB_CFILES)'; \ + win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \ + win32_lib_rc='$(LIB_RCFILES)'; \ + 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'; \ \ - for dir in 'vs' 'vs/vc6' 'vs/vc6/lib'; do \ - test -d "$$dir" || mkdir "$$dir" || exit 1; \ - done; \ + 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_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`; \ \ - dir='..\..\..\lib\'; \ - body='$(VC6LIBDSP)'.body; \ - win32_srcs='$(WIN32SOURCES)'; \ - win32_hdrs='$(WIN32HEADERS)'; \ - sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ - sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ + awk_code='\ +function gen_element(type, dir, file)\ +{\ + sub(/vtls\//, "", file);\ +\ + spaces=" ";\ + if(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_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 "# Begin Group \"Source Files\"" > $$body; \ - echo "" >> $$body; \ - echo "# PROP Default_Filter \"\"" >> $$body; \ - for file in $$sorted_srcs; do \ - echo "# Begin Source File" >> $$body; \ - echo "" >> $$body; \ - echo "SOURCE="$$dir$$file >> $$body; \ - echo "# End Source File" >> $$body; \ - done; \ - echo "# End Group" >> $$body; \ - echo "# Begin Group \"Header Files\"" >> $$body; \ - echo "" >> $$body; \ - echo "# PROP Default_Filter \"\"" >> $$body; \ - for file in $$sorted_hdrs; do \ - echo "# Begin Source File" >> $$body; \ - echo "" >> $$body; \ - echo "SOURCE="$$dir$$file >> $$body; \ - echo "# End Source File" >> $$body; \ - done; \ - echo "# End Group" >> $$body; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \ \ - awk '{ printf("%s\r\n", $$0); }' \ - $(srcdir)/$(VC6LIBDSPHEAD) $$body $(srcdir)/$(VC6LIBDSPFOOT) \ - > $(VC6LIBDSP) || { rm -f $$body; 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; }; \ \ - rm -f $$body) - -.PHONY: vc8-ide - -vc8-ide: - $(MAKE) $(VC8LIBPRJ) - -$(VC8LIBPRJ): $(VC8LIBPRJ_DEPS) - @(echo "generating '$(VC8LIBPRJ)'"; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \ \ - for dir in 'vs' 'vs/vc8' 'vs/vc8/lib'; do \ - test -d "$$dir" || mkdir "$$dir" || exit 1; \ - done; \ + 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; }; \ \ - dir='..\..\..\lib\'; \ - body='$(VC8LIBPRJ)'.body; \ - win32_srcs='$(WIN32SOURCES)'; \ - win32_hdrs='$(WIN32HEADERS)'; \ - sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ - sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \ \ - echo "%tab%%tab%" > $$body; \ - for file in $$sorted_srcs; do \ - echo "%tab%%tab%%tab%" >> $$body; \ - done; \ - echo "%tab%%tab%" >> $$body; \ - echo "%tab%%tab%" >> $$body; \ - for file in $$sorted_hdrs; do \ - echo "%tab%%tab%%tab%" >> $$body; \ - done; \ - echo "%tab%%tab%" >> $$body; \ + 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; }; \ \ - awk '{ gsub(/%tab%/, "\t"); printf("%s\r\n", $$0); }' \ - $(srcdir)/$(VC8LIBPRJHEAD) $$body $(srcdir)/$(VC8LIBPRJFOOT) \ - > $(VC8LIBPRJ) || { rm -f $$body; 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \ \ - rm -f $$body) - + 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_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_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_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_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; };) diff --git a/Makefile.in b/Makefile.in index 0818741..51c490e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -21,7 +21,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -36,7 +36,29 @@ # ########################################################################### -# ./lib/Makefile.inc +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### + +# ./src/Makefile.inc # Using the backslash as line continuation character might be problematic # with some make flavours, as Watcom's wmake showed us already. If we # ever want to change this in a portable manner then we should consider @@ -110,11 +132,12 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/lib/Makefile.inc $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) mkinstalldirs $(srcdir)/curl-config.in \ - $(srcdir)/libcurl.pc.in COPYING README compile config.guess \ - config.sub depcomp install-sh missing ltmain.sh +DIST_COMMON = $(srcdir)/lib/Makefile.inc $(srcdir)/src/Makefile.inc \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) mkinstalldirs \ + $(srcdir)/curl-config.in $(srcdir)/libcurl.pc.in COPYING \ + README compile config.guess config.sub depcomp install-sh \ + missing ltmain.sh subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ @@ -302,6 +325,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -326,7 +350,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -335,7 +358,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -356,6 +378,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -391,11 +414,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -456,32 +481,86 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 -CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \ -CMake/CurlCheckCSourceCompiles.cmake CMake/CurlCheckCSourceRuns.cmake \ -CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake \ -CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \ -CMake/Utilities.cmake include/curl/curlbuild.h.cmake - -VC6LIBDSP = vs/vc6/lib/vc6libcurl.dsp -VC6LIBDSPHEAD = vs/t/lib/vc6_libcurl_dsp.head -VC6LIBDSPFOOT = vs/t/lib/vc6_libcurl_dsp.foot -VC8LIBPRJ = vs/vc8/lib/vc8libcurl.vcproj -VC8LIBPRJHEAD = vs/t/lib/vc8_libcurl_prj.head -VC8LIBPRJFOOT = vs/t/lib/vc8_libcurl_prj.foot -VC_DIST = \ - vs/t/README \ - $(VC6LIBDSP) $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ - $(VC8LIBPRJ) $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ - vs/vc6/vc6curl.dsw \ - vs/vc6/lib/vc6libcurl.dsw \ - vs/vc6/src/vc6curltool.dsw \ - vs/vc6/src/vc6curltool.dsp - -VC6LIBDSP_DEPS = $(VC6LIBDSPHEAD) $(VC6LIBDSPFOOT) \ - Makefile.am lib/Makefile.inc - -VC8LIBPRJ_DEPS = $(VC8LIBPRJHEAD) $(VC8LIBPRJFOOT) \ - Makefile.am lib/Makefile.inc +CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \ + CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \ + CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \ + include/curl/curlbuild.h.cmake CMake/Macros.cmake + +VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl +VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp +VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc +VC6_SRCTMPL = projects/Windows/VC6/src/curlsrc.tmpl +VC6_SRCDSP = projects/Windows/VC6/src/curlsrc.dsp +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 +VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc +VC7_SRCTMPL = projects/Windows/VC7/src/curlsrc.tmpl +VC7_SRCVCPROJ = projects/Windows/VC7/src/curlsrc.vcproj +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 +VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc +VC71_SRCTMPL = projects/Windows/VC7.1/src/curlsrc.tmpl +VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curlsrc.vcproj +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 +VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc +VC8_SRCTMPL = projects/Windows/VC8/src/curlsrc.tmpl +VC8_SRCVCPROJ = projects/Windows/VC8/src/curlsrc.vcproj +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 +VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc +VC9_SRCTMPL = projects/Windows/VC9/src/curlsrc.tmpl +VC9_SRCVCPROJ = projects/Windows/VC9/src/curlsrc.vcproj +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 +VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc +VC10_SRCTMPL = projects/Windows/VC10/src/curlsrc.tmpl +VC10_SRCVCXPROJ = projects/Windows/VC10/src/curlsrc.vcxproj +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 +VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc +VC11_SRCTMPL = projects/Windows/VC11/src/curlsrc.tmpl +VC11_SRCVCXPROJ = projects/Windows/VC11/src/curlsrc.vcxproj +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 +VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc +VC12_SRCTMPL = projects/Windows/VC12/src/curlsrc.tmpl +VC12_SRCVCXPROJ = projects/Windows/VC12/src/curlsrc.vcxproj +VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc +VC_DIST = projects/README \ + projects/build-openssl.bat \ + projects/checksrc.bat \ + projects/Windows/VC6/curl.dsw \ + projects/Windows/VC6/lib/libcurl.dsw $(VC6_LIBDSP) \ + projects/Windows/VC6/src/curlsrc.dsw $(VC6_SRCDSP) \ + projects/Windows/VC7/curl.sln \ + projects/Windows/VC7/lib/libcurl.sln $(VC7_LIBVCPROJ) \ + projects/Windows/VC7/src/curlsrc.sln $(VC7_SRCVCPROJ) \ + projects/Windows/VC7.1/curl.sln \ + projects/Windows/VC7.1/lib/libcurl.sln $(VC71_LIBVCPROJ) \ + projects/Windows/VC7.1/src/curlsrc.sln $(VC71_SRCVCPROJ) \ + projects/Windows/VC8/curl.sln \ + projects/Windows/VC8/lib/libcurl.sln $(VC8_LIBVCPROJ) \ + projects/Windows/VC8/src/curlsrc.sln $(VC8_SRCVCPROJ) \ + projects/Windows/VC9/curl.sln \ + projects/Windows/VC9/lib/libcurl.sln $(VC9_LIBVCPROJ) \ + projects/Windows/VC9/src/curlsrc.sln $(VC9_SRCVCPROJ) \ + projects/Windows/VC10/curl.sln \ + projects/Windows/VC10/lib/libcurl.sln $(VC10_LIBVCXPROJ) \ + projects/Windows/VC10/src/curlsrc.sln $(VC10_SRCVCXPROJ) \ + projects/Windows/VC11/curl.sln \ + projects/Windows/VC11/lib/libcurl.sln $(VC11_LIBVCXPROJ) \ + projects/Windows/VC11/src/curlsrc.sln $(VC11_SRCVCXPROJ) \ + projects/Windows/VC12/curl.sln \ + projects/Windows/VC12/lib/libcurl.sln $(VC12_LIBVCXPROJ) \ + projects/Windows/VC12/src/curlsrc.sln $(VC12_SRCVCXPROJ) WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ winbuild/MakefileBuild.vc winbuild/Makefile.vc \ @@ -491,62 +570,173 @@ EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \ $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in -CLEANFILES = $(VC6LIBDSP) $(VC8LIBPRJ) +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) + bin_SCRIPTS = curl-config SUBDIRS = lib src include DIST_SUBDIRS = $(SUBDIRS) tests packages docs pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libcurl.pc -CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ - cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ - ldap.c ssluse.c version.c getenv.c escape.c mprintf.c telnet.c \ - netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \ - curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \ - memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ - content_encoding.c share.c http_digest.c md4.c md5.c \ - http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \ - hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \ - select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c \ - qssl.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ - curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ - pingpong.c rtsp.c curl_threads.c warnless.c hmac.c polarssl.c \ - polarssl_threadlock.c curl_rtmp.c openldap.c curl_gethostname.c \ - gopher.c axtls.c idn_win32.c http_negotiate_sspi.c cyassl.c \ - http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \ - curl_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c \ - curl_sasl.c curl_schannel.c curl_multibyte.c curl_darwinssl.c \ +LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \ + vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c \ + vtls/cyassl.c vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c + +LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \ + vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h \ + vtls/cyassl.h vtls/curl_schannel.h vtls/curl_darwinssl.h vtls/gskit.h + +LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ + cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ + ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c \ + getinfo.c transfer.c strequal.c easy.c security.c curl_fnmatch.c \ + fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \ + strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c \ + http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \ + strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \ + inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \ + ssh.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ + curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ + pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \ + openldap.c curl_gethostname.c gopher.c idn_win32.c \ + http_negotiate_sspi.c http_proxy.c non-ascii.c asyn-ares.c \ + asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.c \ + curl_ntlm_core.c curl_ntlm_msgs.c curl_sasl.c curl_multibyte.c \ hostcheck.c bundles.c conncache.c pipeline.c dotdot.c x509asn1.c \ - gskit.c - -HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \ - progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \ - if2ip.h speedcheck.h urldata.h curl_ldap.h ssluse.h escape.h telnet.h \ - getinfo.h strequal.h krb4.h memdebug.h http_chunks.h \ - curl_fnmatch.h wildcard.h fileinfo.h ftplistparser.h strtok.h \ - connect.h llist.h hash.h content_encoding.h share.h curl_md4.h \ - curl_md5.h http_digest.h http_negotiate.h inet_pton.h amigaos.h \ - strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h curl_setup.h \ - transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \ - tftp.h sockaddr.h splay.h strdup.h socks.h ssh.h nssg.h curl_base64.h \ - rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \ - curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h \ - warnless.h curl_hmac.h polarssl.h polarssl_threadlock.h curl_rtmp.h \ - curl_gethostname.h gopher.h axtls.h cyassl.h http_proxy.h non-ascii.h \ - asyn.h curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ - curl_ntlm_msgs.h curl_sasl.h curl_schannel.h curl_multibyte.h \ - curl_darwinssl.h hostcheck.h bundles.h conncache.h curl_setup_once.h \ - multihandle.h setup-vms.h pipeline.h dotdot.h x509asn1.h gskit.h - - -# List of libcurl source files required to generate VC IDE dsp and prj files -WIN32SOURCES = $(CSOURCES) -WIN32HEADERS = $(HHEADERS) config-win32.h + http2.c curl_sasl_sspi.c smb.c curl_sasl_gssapi.c curl_endian.c + +LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \ + formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \ + speedcheck.h urldata.h curl_ldap.h escape.h telnet.h getinfo.h \ + strequal.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h \ + wildcard.h fileinfo.h ftplistparser.h strtok.h connect.h llist.h \ + hash.h content_encoding.h share.h curl_md4.h curl_md5.h http_digest.h \ + http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h \ + inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h \ + easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h \ + socks.h ssh.h curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h \ + slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h \ + rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h \ + curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \ + curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ + curl_ntlm_msgs.h curl_sasl.h curl_multibyte.h hostcheck.h bundles.h \ + conncache.h curl_setup_once.h multihandle.h setup-vms.h pipeline.h \ + dotdot.h x509asn1.h http2.h sigpipe.h smb.h curl_endian.h + +LIB_RCFILES = libcurl.rc +CSOURCES = $(LIB_CFILES) $(LIB_VTLS_CFILES) +HHEADERS = $(LIB_HFILES) $(LIB_VTLS_HFILES) + +# libcurl has sources that provide functions named curlx_* that aren't part of +# the official API, but we re-use the code here to avoid duplication. +CURLX_CFILES = \ + ../lib/strtoofft.c \ + ../lib/rawstr.c \ + ../lib/nonblock.c \ + ../lib/warnless.c + +CURLX_HFILES = \ + ../lib/curl_setup.h \ + ../lib/strtoofft.h \ + ../lib/rawstr.h \ + ../lib/nonblock.h \ + ../lib/warnless.h + +CURL_CFILES = \ + tool_binmode.c \ + tool_bname.c \ + tool_cb_dbg.c \ + tool_cb_hdr.c \ + tool_cb_prg.c \ + tool_cb_rea.c \ + tool_cb_see.c \ + tool_cb_wrt.c \ + tool_cfgable.c \ + tool_convert.c \ + tool_dirhie.c \ + tool_doswin.c \ + tool_easysrc.c \ + tool_formparse.c \ + tool_getparam.c \ + tool_getpass.c \ + tool_help.c \ + tool_helpers.c \ + tool_homedir.c \ + tool_hugehelp.c \ + tool_libinfo.c \ + tool_main.c \ + tool_metalink.c \ + tool_mfiles.c \ + tool_msgs.c \ + tool_operate.c \ + tool_operhlp.c \ + tool_panykey.c \ + tool_paramhlp.c \ + tool_parsecfg.c \ + tool_strdup.c \ + tool_setopt.c \ + tool_sleep.c \ + tool_urlglob.c \ + tool_util.c \ + tool_vms.c \ + tool_writeenv.c \ + tool_writeout.c \ + tool_xattr.c + +CURL_HFILES = \ + tool_binmode.h \ + tool_bname.h \ + tool_cb_dbg.h \ + tool_cb_hdr.h \ + tool_cb_prg.h \ + tool_cb_rea.h \ + tool_cb_see.h \ + tool_cb_wrt.h \ + tool_cfgable.h \ + tool_convert.h \ + tool_dirhie.h \ + tool_doswin.h \ + tool_easysrc.h \ + tool_formparse.h \ + tool_getparam.h \ + tool_getpass.h \ + tool_help.h \ + tool_helpers.h \ + tool_homedir.h \ + tool_hugehelp.h \ + tool_libinfo.h \ + tool_main.h \ + tool_metalink.h \ + tool_mfiles.h \ + tool_msgs.h \ + tool_operate.h \ + tool_operhlp.h \ + tool_panykey.h \ + tool_paramhlp.h \ + tool_parsecfg.h \ + tool_sdecls.h \ + tool_setopt.h \ + tool_setup.h \ + tool_sleep.h \ + tool_strdup.h \ + tool_urlglob.h \ + tool_util.h \ + tool_version.h \ + tool_vms.h \ + tool_writeenv.h \ + tool_writeout.h \ + tool_xattr.h + +CURL_RCFILES = curl.rc +curl_SOURCES = $(CURL_CFILES) $(CURLX_CFILES) $(CURL_HFILES) all: all-recursive .SUFFIXES: am--refresh: Makefile @: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/lib/Makefile.inc $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/lib/Makefile.inc $(srcdir)/src/Makefile.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -569,7 +759,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; -$(srcdir)/lib/Makefile.inc: +$(srcdir)/lib/Makefile.inc $(srcdir)/src/Makefile.inc: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -839,10 +1029,16 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -884,9 +1080,10 @@ distcheck: dist && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -1069,6 +1266,8 @@ uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA uninstall-pkgconfigDATA +# List of files required to generate VC IDE .dsp, .vcproj and .vcxproj files + dist-hook: rm -rf $(top_builddir)/tests/log find $(distdir) -name "*.dist" -exec rm {} \; @@ -1174,98 +1373,286 @@ uninstall-hook: cd docs && $(MAKE) uninstall ca-bundle: lib/mk-ca-bundle.pl - @echo "generate a fresh ca-bundle.crt" + @echo "generating 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" + @echo "generating a fresh ca-bundle.crt" ./lib/firefox-db2pem.sh lib/ca-bundle.crt checksrc: cd lib && $(MAKE) checksrc cd src && $(MAKE) checksrc -.PHONY: vc6-ide - -vc6-ide: - $(MAKE) $(VC6LIBDSP) - -$(VC6LIBDSP): $(VC6LIBDSP_DEPS) - @(echo "generating '$(VC6LIBDSP)'"; \ +.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) + @(win32_lib_srcs='$(LIB_CFILES)'; \ + win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \ + win32_lib_rc='$(LIB_RCFILES)'; \ + 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'; \ \ - for dir in 'vs' 'vs/vc6' 'vs/vc6/lib'; do \ - test -d "$$dir" || mkdir "$$dir" || exit 1; \ - done; \ + 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_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`; \ \ - dir='..\..\..\lib\'; \ - body='$(VC6LIBDSP)'.body; \ - win32_srcs='$(WIN32SOURCES)'; \ - win32_hdrs='$(WIN32HEADERS)'; \ - sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ - sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ + awk_code='\ +function gen_element(type, dir, file)\ +{\ + sub(/vtls\//, "", file);\ +\ + spaces=" ";\ + if(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_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 "# Begin Group \"Source Files\"" > $$body; \ - echo "" >> $$body; \ - echo "# PROP Default_Filter \"\"" >> $$body; \ - for file in $$sorted_srcs; do \ - echo "# Begin Source File" >> $$body; \ - echo "" >> $$body; \ - echo "SOURCE="$$dir$$file >> $$body; \ - echo "# End Source File" >> $$body; \ - done; \ - echo "# End Group" >> $$body; \ - echo "# Begin Group \"Header Files\"" >> $$body; \ - echo "" >> $$body; \ - echo "# PROP Default_Filter \"\"" >> $$body; \ - for file in $$sorted_hdrs; do \ - echo "# Begin Source File" >> $$body; \ - echo "" >> $$body; \ - echo "SOURCE="$$dir$$file >> $$body; \ - echo "# End Source File" >> $$body; \ - done; \ - echo "# End Group" >> $$body; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \ \ - awk '{ printf("%s\r\n", $$0); }' \ - $(srcdir)/$(VC6LIBDSPHEAD) $$body $(srcdir)/$(VC6LIBDSPFOOT) \ - > $(VC6LIBDSP) || { rm -f $$body; 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; }; \ \ - rm -f $$body) - -.PHONY: vc8-ide - -vc8-ide: - $(MAKE) $(VC8LIBPRJ) - -$(VC8LIBPRJ): $(VC8LIBPRJ_DEPS) - @(echo "generating '$(VC8LIBPRJ)'"; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \ \ - for dir in 'vs' 'vs/vc8' 'vs/vc8/lib'; do \ - test -d "$$dir" || mkdir "$$dir" || exit 1; \ - done; \ + 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; }; \ \ - dir='..\..\..\lib\'; \ - body='$(VC8LIBPRJ)'.body; \ - win32_srcs='$(WIN32SOURCES)'; \ - win32_hdrs='$(WIN32HEADERS)'; \ - sorted_srcs=`for file in $$win32_srcs; do echo $$file; done | sort`; \ - sorted_hdrs=`for file in $$win32_hdrs; do echo $$file; done | sort`; \ + 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \ \ - echo "%tab%%tab%" > $$body; \ - for file in $$sorted_srcs; do \ - echo "%tab%%tab%%tab%" >> $$body; \ - done; \ - echo "%tab%%tab%" >> $$body; \ - echo "%tab%%tab%" >> $$body; \ - for file in $$sorted_hdrs; do \ - echo "%tab%%tab%%tab%" >> $$body; \ - done; \ - echo "%tab%%tab%" >> $$body; \ + 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_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_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_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_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; }; \ \ - awk '{ gsub(/%tab%/, "\t"); printf("%s\r\n", $$0); }' \ - $(srcdir)/$(VC8LIBPRJHEAD) $$body $(srcdir)/$(VC8LIBPRJFOOT) \ - > $(VC8LIBPRJ) || { rm -f $$body; 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_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \ \ - rm -f $$body) + 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; };) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index c796d8d..123088f 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -1,69 +1,146 @@ -Curl and libcurl 7.32.0 +Curl and libcurl 7.40.0 - Public curl releases: 134 - Command line options: 152 - curl_easy_setopt() options: 199 + Public curl releases: 143 + Command line options: 162 + curl_easy_setopt() options: 208 Public functions in libcurl: 58 - Known libcurl bindings: 42 - Contributors: 1049 - -*** - krb4 support is up for removal. If you care about it at all, speak up - on the curl-library list asap! -*** + Contributors: 1219 This release includes the following changes: - o curl: allow timeouts to accept decimal values - o OS400: add slist and certinfo EBCDIC support - o OS400: new SSL backend GSKit - o CURLOPT_XFERINFOFUNCTION: introducing a new progress callback - o LIBCURL-STRUCTS: new document + o http_digest: Added support for Windows SSPI based authentication + o version info: Added Kerberos V5 to the supported features + o Makefile: Added VC targets for WinIDN + o config-win32: Introduce build targets for VS2012+ + o SSL: Add PEM format support for public key pinning + o smtp: Added support for the conversion of Unix newlines during mail send [8] + o smb: Added initial support for the SMB/CIFS protocol + o Added support for HTTP over unix domain sockets, via + CURLOPT_UNIX_SOCKET_PATH and --unix-socket + o sasl: Added support for GSS-API based Kerberos V5 authentication This release includes the following bugfixes: - o dotdot: introducing dot file path cleanup [1] - o docs: fix typo in curl_easy_getinfo manpage - o test1230: avoid using hard-wired port number - o test1396: invoke the correct test tool - o SIGPIPE: ignored while inside the library [2] - o darwinssl: fix crash that started happening in Lion - o OpenSSL: check for read errors, don't assume [3] - o c-ares: improve error message on failed resolve [4] - o printf: make sure %x are treated unsigned - o formpost: better random boundaries [5] - o url: restore the functionality of 'curl -u :' [6] - o curl.1: fix typo in --xattr description [7] - o digest: improve nonce generation - o configure: automake 1.14 compatibility tweak - o curl.1: document the --post303 option in the man page - o curl.1: document the --sasl-ir option in the man page - o setup-vms.h: sk_pop symbol tweak - o tool_paramhlp: try harder to catch negatives - o cmake: Fix for MSVC2010 project generation [8] - o asyn-ares: Don't blank ares servers if none configured - o curl_multi_wait: set revents for extra fds - o Reinstate "WIN32 MemoryTracking: track wcsdup() _wcsdup() and _tcsdup() - o ftp_do_more: consider DO_MORE complete when server connects back [9] - o curl_easy_perform: gradually increase the delay time [10] - o curl: fix symbolic names for CURLUSESSL_* enum in --libcurl output - o curl: fix upload of a zip file in OpenVMS [11] - o build: fix linking on Solaris 10 [12] - o curl_formadd: CURLFORM_FILECONTENT wrongly rejected some option combos [13] - o curl_formadd: fix file upload on VMS [14] - o curl_easy_pause: on unpause, trigger mulit-socket handling [15] - o md5 & metalink: use better build macros on Apple operating systems [16] - o darwinssl: fix build error in crypto authentication under Snow Leopard [16] - o curl: make --progress-bar update the line less frequently [17] - o configure: don't error out on variable confusions (CFLAGS, LDFLAGS etc) - o mk-ca-bundle: skip more untrusted certificates - o formadd: wrong pointer for file name when CURLFORM_BUFFERPTR used [18] - o FTP: when EPSV gets a 229 but fails to connect, retry with PASV - o mk-ca-bundle.1: don't install on make install [19] - o VMS: lots of updates and fixes of the build procedure - o global dns cache: didn't work (regression) - o global dns cache: fix memory leak - o + o darwinssl: fix session ID keys to only reuse identical sessions [18] + o url-parsing: reject CRLFs within URLs [19] + o OS400: Adjust specific support to last release + o THANKS: Remove duplicate names + o url.c: Fixed compilation warning + o ssh: Fixed build on platforms where R_OK is not defined [1] + o tool_strdup.c: include the tool strdup.h + o build: Fixed Visual Studio project file generation of strdup.[c|h] + o curl_easy_setopt.3: add CURLOPT_PINNEDPUBLICKEY [2] + o curl.1: show zone index use in a URL + o mk-ca-bundle.vbs: switch to new certdata.txt url + o Makefile.dist: Added some missing SSPI configurations + o build: Fixed no NTLM support for email when CURL_DISABLE_HTTP is defined + o SSH: use the port number as well for known_known checks [3] + o libssh2: detect features based on version, not configure checks + o http2: Deal with HTTP/2 data inside Upgrade response header buffer [4] + o multi: removed Curl_multi_set_easy_connection + o symbol-scan.pl: do not require autotools + o cmake: add ENABLE_THREADED_RESOLVER, rename ARES + o cmake: build libhostname for test suite + o cmake: fix HAVE_GETHOSTNAME definition + o tests: fix libhostname visibility + o tests: fix memleak in server/resolve.c + o vtls.h: Fixed compiler warning when compiled without SSL + o CMake: Restore order-dependent header checks + o CMake: Restore order-dependent library checks + o tool: Removed krb4 from the supported features + o http2: Don't send Upgrade headers when we already do HTTP/2 + o examples: Don't call select() to sleep on windows [6] + o win32: Updated some legacy APIs to use the newer extended versions [5] + o easy.c: Fixed compilation warning when no verbose string support + o connect.c: Fixed compilation warning when no verbose string support + o build: in Makefile.m32 pass -F flag to windres + o build: in Makefile.m32 add -m32 flag for 32bit + o multi: when leaving for timeout, close accordingly + o CMake: Simplify if() conditions on check result variables + o build: in Makefile.m32 try to detect 64bit target + o multi: inform about closed sockets before they are closed + o multi-uv.c: close the file handle after download + o examples: Wait recommended 100ms when no file descriptors are ready + o ntlm: Split the SSPI based messaging code from the native messaging code + o cmake: fix NTLM detection when CURL_DISABLE_HTTP defined + o cmake: add Kerberos to the supported feature + o CURLOPT_POSTFIELDS.3: mention the COPYPOSTFIELDS option + o http: Disable pipelining for HTTP/2 and upgraded connections + o ntlm: Fixed static'ness of local decode function + o sasl: Reduced the need for two sets of NTLM messaging functions + o multi.c: Fixed compilation warnings when no verbose string support + o select.c: fix compilation for VxWorks [7] + o multi-single.c: switch to use curl_multi_wait + o curl_multi_wait.3: clarify numfds being used if not NULL + o http.c: Fixed compilation warnings from features being disabled + o NSS: enable the CAPATH option [9] + o docs: Fix FAILONERROR typos + o HTTP: don't abort connections with pending Negotiate authentication + o HTTP: Free (proxy)userpwd for NTLM/Negotiate after sending a request + o http_perhapsrewind: don't abort CONNECT requests + o build: updated dependencies in makefiles + o multi.c: Fixed compilation warning + o ftp.c: Fixed compilation warnings when proxy support disabled + o get_url_file_name: Fixed crash on OOM on debug build + o cookie.c: Refactored cleanup code to simplify + o OS400: enable NTLM authentication + o ntlm: Use Windows Crypt API + o http2: avoid logging neg "failure" if h2 was not requested + o schannel_recv: return the correct code [10] + o VC build: added sspi define for winssl-zlib builds + o Curl_client_write(): chop long data, convert data only once + o openldap: do not ignore Curl_client_write() return code + o ldap: check Curl_client_write() return codes + o parsedate.c: Fixed compilation warning + o url.c: Fixed compilation warning when USE_NTLM is not defined + o ntlm_wb_response: fix "statement not reached" [11] + o telnet: fix "cast increases required alignment of target type" + o smtp: Fixed dot stuffing when EOL characters at end of input buffers [12] + o ntlm: Allow NTLM2Session messages when USE_NTRESPONSES manually defined + o ntlm: Disable NTLM v2 when 64-bit integers are not supported + o ntlm: Use short integer when decoding 16-bit values + o ftp.c: Fixed compilation warning when no verbose string support + o synctime.c: fixed timeserver URLs + o mk-ca-bundle.pl: restored forced run again + o ntlm: Fixed return code for bad type-2 Target Info + o curl_schannel.c: Data may be available before connection shutdown + o curl_schannel: Improvements to memory re-allocation strategy [13] + o darwinssl: aprintf() to allocate the session key + o tool_util.c: Use GetTickCount64 if it is available + o lib: Fixed multiple code analysis warnings if SAL are available + o tool_binmode.c: Explicitly ignore the return code of setmode + o tool_urlglob.c: Silence warning C6293: Ill-defined for-loop + o opts: Warn CURLOPT_TIMEOUT overrides when set after CURLOPT_TIMEOUT_MS + o SFTP: work-around servers that return zero size on STAT [14] + o connect: singleipconnect(): properly try other address families after failure + o IPV6: address scope != scope id [15] + o parseurlandfillconn(): fix improper non-numeric scope_id stripping [16] + o secureserver.pl: make OpenSSL CApath and cert absolute path values + o secureserver.pl: update Windows detection and fix path conversion + o secureserver.pl: clean up formatting of config and fix verbose output + o tests: Added Windows support using Cygwin-based OpenSSH + o sockfilt.c: use non-Ex functions that are available before WinXP + o VMS: Updates for 0740-0D1220 + o openssl: warn for SRP set if SSLv3 is used, not for TLS version + o openssl: make it compile against openssl 1.1.0-DEV master branch + o openssl: fix SSL/TLS versions in verbose output + o curl: show size of inhibited data when using -v + o build: Removed WIN32 definition from the Visual Studio projects + o build: Removed WIN64 definition from the libcurl Visual Studio projects + o vtls: Use bool for Curl_ssl_getsessionid() return type + o sockfilt.c: Replace 100ms sleep with thread throttle + o sockfilt.c: Reduce the number of individual memory allocations + o vtls: Don't set cert info count until memory allocation is successful + o nss: Don't ignore Curl_ssl_init_certinfo() OOM failure + o nss: Don't ignore Curl_extract_certinfo() OOM failure + o vtls: Fixed compilation warning and an ignored return code + o sockfilt.c: Fixed compilation warnings + o darwinssl: Fixed compilation warning + o vtls: Use '(void) arg' for unused parameters + o sepheaders.c: Fixed resource leak on failure + o lib1900.c: Fixed cppcheck error [17] + o ldap: Fixed Unicode connection details in Win32 initialsation / bind calls + o ldap: Fixed Unicode DN, attributes and filter in Win32 search calls This release includes the following known bugs: @@ -72,34 +149,35 @@ This release includes the following known bugs: This release would not have looked like this without help, code, reports and advice from friends like these: - Alex Vinnik, Alessandro Ghedini, Nick Zitzmann, Kamil Dudka, - Lluis Batlle i Rossell, Nach M. S., Kim Vandry, Ben Greear, Dan Fandrich, - Dave Reisner, Evgeny Turnaev, Guenter Knauf, John E. Malmberg, Marc Hoersken, - Patrick Monnerat, Sergei Nikulov, Yang Tse, Andreas Malzahn, Clemens Gruber, - Jean-Noel Rouvignac, Markus Moeller, Fabian Keil, Dagobert Michelsen, - Byrial Jensen, Justin Karneges, Edward Rudd, Marc Doughty, Konstantin Isakov, - + Andrey Labunets, Anthon Pang, Bill Nagel, Brad Harder, Brad King, Carlo Wood, + Christian Hägele, Dan Fandrich, Daniel Stenberg, Dave Reisner, Frank Gevaerts, + Gisle Vanem, Guenter Knauf, Jan Ehrhardt, Johan Lantz, John E. Malmberg, + Jon Spencer, Julien Nabet, Kamil Dudka, Kyle J. McKay, Lucas Pardue, + Marc Hesse, Marc Hoersken, Marc Renault, Michael Osipov, Nick Zitzmann, + Nobuhiro Ban, Patrick Monnerat, Peter Wu, Ray Satiro, Sam Hurst, + Stefan Bühler, Stefan Neis, Steve Holme, Tae Hyoung Ahn, Tatsuhiro Tsujikawa, + Tomasz Kojm, Tor Arntsen, Waldek Kozba, Warren Menzer Thanks! (and sorry if I forgot to mention someone) References to bug reports and discussions on issues: - [1] = http://curl.haxx.se/bug/view.cgi?id=1200 - [2] = http://curl.haxx.se/bug/view.cgi?id=1180 - [3] = http://curl.haxx.se/bug/view.cgi?id=1249 - [4] = http://curl.haxx.se/bug/view.cgi?id=1191 - [5] = http://curl.haxx.se/bug/view.cgi?id=1251 - [6] = http://curl.haxx.se/mail/archive-2013-06/0052.html - [7] = http://curl.haxx.se/bug/view.cgi?id=1252 - [8] = http://curl.haxx.se/mail/lib-2013-07/0046.html - [9] = http://curl.haxx.se/mail/lib-2013-07/0115.html - [10] = http://curl.haxx.se/mail/lib-2013-07/0103.html - [11] = http://curl.haxx.se/bug/view.cgi?id=496 - [12] = http://curl.haxx.se/bug/view.cgi?id=1217 - [13] = http://curl.haxx.se/mail/lib-2013-07/0258.html - [14] = http://curl.haxx.se/bug/view.cgi?id=758 - [15] = http://curl.haxx.se/mail/lib-2013-07/0239.html - [16] = http://curl.haxx.se/bug/view.cgi?id=1255 - [17] = http://curl.haxx.se/mail/archive-2013-07/0031.html - [18] = http://curl.haxx.se/bug/view.cgi?id=1262 - [19] = http://curl.haxx.se/mail/lib-2013-08/0057.html + [1] = http://curl.haxx.se/mail/lib-2014-11/0035.html + [2] = http://curl.haxx.se/mail/lib-2014-11/0078.html + [3] = http://curl.haxx.se/bug/view.cgi?id=1448 + [4] = https://github.com/tatsuhiro-t/nghttp2/issues/103 + [5] = http://sourceforge.net/p/curl/feature-requests/82/ + [6] = http://curl.haxx.se/mail/lib-2014-11/0221.html + [7] = http://curl.haxx.se/bug/view.cgi?id=1455 + [8] = http://curl.haxx.se/bug/view.cgi?id=1456 + [9] = http://curl.haxx.se/bug/view.cgi?id=1457 + [10] = http://curl.haxx.se/bug/view.cgi?id=1462 + [11] = http://curl.haxx.se/mail/lib-2014-12/0089.html + [12] = http://curl.haxx.se/bug/view.cgi?id=1456 + [13] = http://curl.haxx.se/bug/view.cgi?id=1450 + [14] = http://curl.haxx.se/mail/lib-2014-12/0103.html + [15] = http://curl.haxx.se/bug/view.cgi?id=1451 + [16] = http://curl.haxx.se/bug/view.cgi?id=1449 + [17] = https://github.com/bagder/curl/pull/133 + [18] = http://curl.haxx.se/docs/adv_20150108A.html + [19] = http://curl.haxx.se/docs/adv_20150108B.html diff --git a/acinclude.m4 b/acinclude.m4 index 5a3906a..453358d 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2614,53 +2614,54 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]), 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"; then - AC_MSG_ERROR([--with-ca-path only works with openSSL]) + if test "x$OPENSSL_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then + AC_MSG_ERROR([--with-ca-path only works with openSSL or PolarSSL]) fi capath="$want_capath" ca="no" - elif test "x$cross_compiling" != "xyes"; then - dnl NOT cross-compiling and... - dnl neither of the --with-ca-* options are provided - + 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$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 place - dnl 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.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 - for a in /etc/ssl/certs/; 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 - capath="$a" - break + 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 - done + + 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.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 + for a in /etc/ssl/certs/; 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 + capath="$a" + break + fi + done + fi + else + dnl no option given and cross-compiling + AC_MSG_WARN([skipped the ca-cert path detection when cross-compiling]) fi - else - dnl no option given and cross-compiling - AC_MSG_WARN([skipped the ca-cert path detection when cross-compiling]) fi if test "x$ca" != "xno"; then diff --git a/aclocal.m4 b/aclocal.m4 index 7f275db..fd841ca 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.13.3 -*- Autoconf -*- +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.13' +[am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.13.3], [], +m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,7 +51,7 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.13.3])dnl +[AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) @@ -103,10 +103,9 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- @@ -418,6 +417,12 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -526,6 +531,48 @@ dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not @@ -534,7 +581,6 @@ dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -682,38 +728,6 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. @@ -784,6 +798,70 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. diff --git a/buildconf b/buildconf index a7eb51a..f3f0bd5 100755 --- a/buildconf +++ b/buildconf @@ -6,7 +6,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -32,6 +32,7 @@ die(){ #-------------------------------------------------------------------------- # 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" @@ -49,7 +50,7 @@ findtool(){ do IFS=$old_IFS # echo "checks for $file in $path" >&2 - if test -f "$path/$file"; then + if test "$path" -a "$path" != '.' -a -f "$path/$file"; then echo "$path/$file" return fi @@ -189,32 +190,32 @@ else fi #-------------------------------------------------------------------------- -# GNU libtool preliminary check +# 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 'glibtool' first is intended for systems that -# have GNU libtool named as 'glibtool' and libtool not being GNU's. +# This approach that tries 'glibtoolize' first is intended for systems that +# have GNU libtool named as 'glibtoolize' and libtoolize not being GNU's. -libtool=`findtool glibtool 2>/dev/null` -if test ! -x "$libtool"; then - libtool=`findtool ${LIBTOOL:-libtool}` +libtoolize=`findtool glibtoolize 2>/dev/null` +if test ! -x "$libtoolize"; then + libtoolize=`findtool ${LIBTOOLIZE:-libtoolize}` fi -if test -z "$libtool"; then - echo "buildconf: libtool not found." - echo " You need GNU libtool $want_lt_version or newer installed." +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=`$libtool --version 2>/dev/null|head -n 1` +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: libtool not found." - echo " You need GNU libtool $want_lt_version or newer installed." + 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 @@ -244,27 +245,12 @@ else lt_status="good" fi if test "$lt_status" != "good"; then - echo "buildconf: libtool version $lt_version found." - echo " You need GNU libtool $want_lt_version or newer installed." + echo "buildconf: libtoolize version $lt_version found." + echo " You need GNU libtoolize $want_lt_version or newer installed." exit 1 fi -echo "buildconf: libtool version $lt_version (ok)" - -#-------------------------------------------------------------------------- -# GNU libtoolize check -# -if test -z "$LIBTOOLIZE"; then - # use (g)libtoolize from same location as (g)libtool - libtoolize="${libtool}ize" -else - libtoolize=`findtool $LIBTOOLIZE` -fi -if test ! -f "$libtoolize"; then - echo "buildconf: libtoolize not found." - echo " You need GNU libtoolize $want_lt_version or newer installed." - exit 1 -fi +echo "buildconf: libtoolize version $lt_version (ok)" #-------------------------------------------------------------------------- # m4 check diff --git a/config.guess b/config.guess index 120cc0d..1f5c50c 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2013-05-16' +timestamp='2014-03-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -149,7 +149,7 @@ Linux|GNU|GNU/*) LIBC=gnu #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac @@ -826,7 +826,7 @@ EOF *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -969,10 +969,10 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} exit ;; - or32:Linux:*:*) + or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) @@ -995,6 +995,12 @@ EOF ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; @@ -1254,16 +1260,26 @@ EOF if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; @@ -1355,154 +1371,6 @@ EOF exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <." version="\ GNU config.sub ($timestamp) -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -257,7 +257,7 @@ case $basic_machine in | avr | avr32 \ | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ @@ -265,6 +265,7 @@ case $basic_machine in | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ @@ -282,8 +283,10 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ @@ -295,11 +298,11 @@ case $basic_machine in | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ @@ -324,7 +327,7 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -372,7 +375,7 @@ case $basic_machine in | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ @@ -381,6 +384,7 @@ case $basic_machine in | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ @@ -400,8 +404,10 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ @@ -413,6 +419,7 @@ case $basic_machine in | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -794,7 +801,7 @@ case $basic_machine in os=-mingw64 ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -822,6 +829,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -830,7 +841,7 @@ case $basic_machine in basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -1367,14 +1378,14 @@ case $os in | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1546,6 +1557,9 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; hexagon-*) os=-elf ;; @@ -1589,9 +1603,6 @@ case $basic_machine in mips*-*) os=-elf ;; - or1k-*) - os=-elf - ;; or32-*) os=-coff ;; diff --git a/configure b/configure index 618bea8..bbdf846 100755 --- a/configure +++ b/configure @@ -11,7 +11,7 @@ # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # -# Copyright (c) 1998 - 2013 Daniel Stenberg, +# Copyright (c) 1998 - 2014 Daniel Stenberg, # This configure script may be copied, distributed and modified under the # terms of the curl license; see COPYING for more details @@ -890,6 +890,7 @@ SONAME_BUMP_TRUE CFLAG_CURL_SYMBOL_HIDING DOING_CURL_SYMBOL_HIDING_FALSE DOING_CURL_SYMBOL_HIDING_TRUE +USE_UNIX_SOCKETS BUILD_LIBHOSTNAME_FALSE BUILD_LIBHOSTNAME_TRUE USE_EMBEDDED_ARES_FALSE @@ -902,6 +903,7 @@ MANOPT NROFF PERL IPV6_ENABLED +USE_NGHTTP2 IDN_ENABLED CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE @@ -914,7 +916,7 @@ LIBMETALINK_LIBS CURL_CA_BUNDLE SSL_ENABLED USE_AXTLS -HAVE_NSS_INITCONTEXT +NSS_LIBS USE_NSS USE_CYASSL USE_POLARSSL @@ -928,7 +930,6 @@ PKGCONFIG USE_DARWINSSL USE_WINDOWS_SSPI USE_SCHANNEL -KRB4_ENABLED USE_OPENLDAP ZLIB_LIBS HAVE_LIBZ_FALSE @@ -936,6 +937,7 @@ HAVE_LIBZ_TRUE HAVE_LIBZ CURL_DISABLE_GOPHER CURL_DISABLE_SMTP +CURL_DISABLE_SMB CURL_DISABLE_IMAP CURL_DISABLE_POP3 CURL_DISABLE_TFTP @@ -1125,6 +1127,7 @@ enable_telnet enable_tftp enable_pop3 enable_imap +enable_smb enable_smtp enable_gopher enable_manual @@ -1134,10 +1137,6 @@ with_zlib with_ldap_lib with_lber_lib enable_ipv6 -with_krb4_includes -with_krb4_libs -with_krb4 -with_spnego with_gssapi_includes with_gssapi_libs with_gssapi @@ -1159,12 +1158,14 @@ with_librtmp enable_versioned_symbols with_winidn with_libidn +with_nghttp2 enable_threaded_resolver enable_verbose enable_sspi enable_crypto_auth enable_ntlm_wb enable_tls_srp +enable_unix_sockets enable_cookies enable_soname_bump ' @@ -1851,6 +1852,8 @@ Optional Features: --disable-pop3 Disable POP3 support --enable-imap Enable IMAP support --disable-imap Disable IMAP support + --enable-smb Enable SMB/CIFS support + --disable-smb Disable SMB/CIFS support --enable-smtp Enable SMTP support --disable-smtp Disable SMTP support --enable-gopher Enable Gopher support @@ -1861,8 +1864,8 @@ Optional Features: --disable-libcurl-option Disable --libcurl C code generation support --enable-libgcc use libgcc when linking - --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support + --enable-ipv6 Enable IPv6 (with IPv4) support + --disable-ipv6 Disable IPv6 support --enable-versioned-symbols Enable versioned symbols in shared library --disable-versioned-symbols @@ -1884,6 +1887,8 @@ Optional Features: helper --enable-tls-srp Enable TLS-SRP authentication --disable-tls-srp Disable TLS-SRP authentication + --enable-unix-sockets Enable Unix domain sockets + --disable-unix-sockets Disable Unix domain sockets --enable-cookies Enable cookies support --disable-cookies Disable cookies support --enable-soname-bump Enable enforced SONAME bump @@ -1901,15 +1906,10 @@ Optional Packages: --without-zlib disable use of zlib --with-ldap-lib=libname Specify name of ldap lib file --with-lber-lib=libname Specify name of lber lib file - --with-krb4-includes=DIR - Specify location of kerberos4 headers - --with-krb4-libs=DIR Specify location of kerberos4 libs - --with-krb4=DIR where to look for Kerberos4 - --with-spnego=DIR Specify location of SPNEGO library fbopenssl --with-gssapi-includes=DIR - Specify location of GSSAPI header - --with-gssapi-libs=DIR Specify location of GSSAPI libs - --with-gssapi=DIR Where to look for GSSAPI + Specify location of GSS-API headers + --with-gssapi-libs=DIR Specify location of GSS-API libs + --with-gssapi=DIR Where to look for GSS-API --with-winssl enable Windows native SSL/TLS --without-winssl disable Windows native SSL/TLS --with-darwinssl enable iOS/Mac OS X native SSL/TLS @@ -1959,6 +1959,8 @@ Optional Packages: --without-winidn disable Windows native IDN --with-libidn=PATH Enable libidn usage --without-libidn Disable libidn usage + --with-nghttp2=PATH Enable nghttp2 usage + --without-nghttp2 Disable nghttp2 usage Some influential environment variables: CC C compiler command @@ -2043,7 +2045,7 @@ Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (c) 1998 - 2013 Daniel Stenberg, +Copyright (c) 1998 - 2014 Daniel Stenberg, This configure script may be copied, distributed and modified under the terms of the curl license; see COPYING for more details _ACEOF @@ -2618,6 +2620,61 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int main (void) +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int main (void) +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -3810,6 +3867,9 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -4591,16 +4651,14 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4613,103 +4671,30 @@ int main (void) return 0; } _ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h - + done + rm -f core conftest* + unset am_i fi - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. @@ -4717,6 +4702,12 @@ if test "$am_t" != yes; then # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_ext=c @@ -4867,7 +4858,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.13' +am__api_version='1.14' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } @@ -5496,6 +5487,48 @@ fi +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + ## ------------------------------------- ## ## End of automake initialization code ## ## ------------------------------------- ## @@ -5521,12 +5554,11 @@ PKGADD_VENDOR="curl.haxx.se" curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls,winssl,darwinssl} )" curl_ssh_msg="no (--with-libssh2)" curl_zlib_msg="no (--with-zlib)" - curl_krb4_msg="no (--with-krb4*)" curl_gss_msg="no (--with-gssapi)" - curl_spnego_msg="no (--with-spnego)" 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-{libidn,winidn})" curl_manual_msg="no (--enable-manual)" curl_libcurl_msg="enabled (--disable-libcurl-option)" @@ -7606,7 +7638,7 @@ else 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)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -7651,7 +7683,7 @@ else 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)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -7674,7 +7706,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -7718,7 +7750,7 @@ else 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)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -7741,7 +7773,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -9975,7 +10007,7 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext @@ -10000,7 +10032,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -10019,7 +10054,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -16726,8 +16764,8 @@ squeeze() { INTEL_UNIX_C) # tmp_CFLAGS="$tmp_CFLAGS -std=gnu89" - tmp_CPPFLAGS="$tmp_CPPFLAGS -we 140,147,165,266" - tmp_CPPFLAGS="$tmp_CPPFLAGS -wd 279,981,1469" + tmp_CPPFLAGS="$tmp_CPPFLAGS -we140,147,165,266" + tmp_CPPFLAGS="$tmp_CPPFLAGS -wd279,981,1469" ;; # INTEL_WINDOWS_C) @@ -17814,7 +17852,7 @@ $as_echo_n "checking if compiler halts on function prototype mismatch... " >&6; int main (void) { - int i[2]; + int i[2]={0,0}; int j = rand(i[0]); if(j) return j; @@ -18917,6 +18955,31 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support smb" >&5 +$as_echo_n "checking whether to support smb... " >&6; } +# Check whether --enable-smb was given. +if test "${enable_smb+set}" = set; then : + enableval=$enable_smb; case "$enableval" in + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define CURL_DISABLE_SMB 1" >>confdefs.h + + CURL_DISABLE_SMB=1 + + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + esac +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support smtp" >&5 $as_echo_n "checking whether to support smtp... " >&6; } # Check whether --enable-smtp was given. @@ -20877,8 +20940,8 @@ if test x$CURL_DISABLE_LDAPS != x1 ; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ipv6" >&5 -$as_echo_n "checking whether to enable ipv6... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable IPv6" >&5 +$as_echo_n "checking whether to enable IPv6... " >&6; } # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; case "$enableval" in @@ -20904,6 +20967,7 @@ else /* is AF_INET6 available? */ #include #include +#include /* for exit() */ main() { if (socket(AF_INET6, SOCK_STREAM, 0) < 0) @@ -21019,304 +21083,6 @@ esac -# Check whether --with-krb4-includes was given. -if test "${with_krb4_includes+set}" = set; then : - withval=$with_krb4_includes; - CPPFLAGS="$CPPFLAGS -I$withval" - KRB4INC="$withval" - want_krb4=yes - -fi - - - -# Check whether --with-krb4-libs was given. -if test "${with_krb4_libs+set}" = set; then : - withval=$with_krb4_libs; - LDFLAGS="$LDFLAGS -L$withval" - KRB4LIB="$withval" - want_krb4=yes - -fi - - - -OPT_KRB4=off - -# Check whether --with-krb4 was given. -if test "${with_krb4+set}" = set; then : - withval=$with_krb4; - OPT_KRB4="$withval" - if test X"$OPT_KRB4" != Xno; then - want_krb4="yes" - if test X"$OPT_KRB4" != Xyes; then - LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" - KRB4LIB="$OPT_KRB4/lib$libsuff" - CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" - KRB4INC="$OPT_KRB4/include" - fi - fi - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Kerberos4 support is requested" >&5 -$as_echo_n "checking if Kerberos4 support is requested... " >&6; } - -if test "$want_krb4" = yes -then - if test "$ipv6" = "yes"; then - echo krb4 is not compatible with IPv6 - exit 1 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to look for Kerberos4" >&5 -$as_echo_n "checking where to look for Kerberos4... " >&6; } - if test X"$OPT_KRB4" = Xyes - then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: defaults" >&5 -$as_echo "defaults" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libs in $KRB4LIB, headers in $KRB4INC" >&5 -$as_echo "libs in $KRB4LIB, headers in $KRB4INC" >&6; } - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for des_pcbc_encrypt in -ldes" >&5 -$as_echo_n "checking for des_pcbc_encrypt in -ldes... " >&6; } -if ${ac_cv_lib_des_des_pcbc_encrypt+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldes $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - -#ifdef __cplusplus -extern "C" -#endif -char des_pcbc_encrypt (); -int main (void) -{ -return des_pcbc_encrypt (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_des_des_pcbc_encrypt=yes -else - ac_cv_lib_des_des_pcbc_encrypt=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_des_des_pcbc_encrypt" >&5 -$as_echo "$ac_cv_lib_des_des_pcbc_encrypt" >&6; } -if test "x$ac_cv_lib_des_des_pcbc_encrypt" = xyes; then : - - for ac_header in des.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "des.h" "ac_cv_header_des_h" "$ac_includes_default" -if test "x$ac_cv_header_des_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DES_H 1 -_ACEOF - -fi - -done - - - ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search" -if test "x$ac_cv_func_res_search" = xyes; then : - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lresolv" >&5 -$as_echo_n "checking for res_search in -lresolv... " >&6; } -if ${ac_cv_lib_resolv_res_search+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lresolv $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - -#ifdef __cplusplus -extern "C" -#endif -char res_search (); -int main (void) -{ -return res_search (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_resolv_res_search=yes -else - ac_cv_lib_resolv_res_search=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_search" >&5 -$as_echo "$ac_cv_lib_resolv_res_search" >&6; } -if test "x$ac_cv_lib_resolv_res_search" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBRESOLV 1 -_ACEOF - - LIBS="-lresolv $LIBS" - -fi - -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for krb_net_read in -lkrb" >&5 -$as_echo_n "checking for krb_net_read in -lkrb... " >&6; } -if ${ac_cv_lib_krb_krb_net_read+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lkrb $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - -#ifdef __cplusplus -extern "C" -#endif -char krb_net_read (); -int main (void) -{ -return krb_net_read (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_krb_krb_net_read=yes -else - ac_cv_lib_krb_krb_net_read=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_krb_krb_net_read" >&5 -$as_echo "$ac_cv_lib_krb_krb_net_read" >&6; } -if test "x$ac_cv_lib_krb_krb_net_read" = xyes; then : - - for ac_header in krb.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "krb.h" "ac_cv_header_krb_h" "$ac_includes_default" -if test "x$ac_cv_header_krb_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_KRB_H 1 -_ACEOF - -fi - -done - - - LIBS="-lkrb -lcom_err -ldes $LIBS" - - for ac_func in krb_get_our_ip_for_realm -do : - ac_fn_c_check_func "$LINENO" "krb_get_our_ip_for_realm" "ac_cv_func_krb_get_our_ip_for_realm" -if test "x$ac_cv_func_krb_get_our_ip_for_realm" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_KRB_GET_OUR_IP_FOR_REALM 1 -_ACEOF - -fi -done - - - -$as_echo "#define HAVE_KRB4 1" >>confdefs.h - - - KRB4_ENABLED=1 - - - curl_krb4_msg="enabled" - - for ac_func in strlcpy -do : - ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" -if test "x$ac_cv_func_strlcpy" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STRLCPY 1 -_ACEOF - -fi -done - - - -fi - - -fi - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -# Check whether --with-spnego was given. -if test "${with_spnego+set}" = set; then : - withval=$with_spnego; - SPNEGO_ROOT="$withval" - if test x"$SPNEGO_ROOT" != xno; then - want_spnego="yes" - fi - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if SPNEGO support is requested" >&5 -$as_echo_n "checking if SPNEGO support is requested... " >&6; } -if test x"$want_spnego" = xyes; then - - if test X"$SPNEGO_ROOT" = Xyes; then - as_fn_error $? "FBOpenSSL libs and/or directories were not found where specified!" "$LINENO" 5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - if test -z "$SPNEGO_LIB_DIR"; then - LDFLAGS="$LDFLAGS -L$SPNEGO_ROOT -lfbopenssl" - else - LDFLAGS="$LDFLAGS $SPNEGO_LIB_DIR" - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_SPNEGO 1" >>confdefs.h - - curl_spnego_msg="enabled" - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - GSSAPI_ROOT="/usr" # Check whether --with-gssapi-includes was given. @@ -21352,14 +21118,16 @@ fi save_CPPFLAGS="$CPPFLAGS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GSSAPI support is requested" >&5 -$as_echo_n "checking if GSSAPI support is requested... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GSS-API support is requested" >&5 +$as_echo_n "checking if GSS-API support is requested... " >&6; } if test x"$want_gss" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test -z "$GSSAPI_INCS"; then - if test -f "$GSSAPI_ROOT/bin/krb5-config"; 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 "$GSSAPI_ROOT/bin/krb5-config"; then GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` elif test "$GSSAPI_ROOT" != "yes"; then GSSAPI_INCS="-I$GSSAPI_ROOT/include" @@ -21424,8 +21192,8 @@ $as_echo "#define HAVE_GSSHEIMDAL 1" >>confdefs.h else want_gss=no - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling GSSAPI since no header files was found" >&5 -$as_echo "$as_me: WARNING: disabling GSSAPI since no header files was found" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabling GSS-API support since no header files were found" >&5 +$as_echo "$as_me: WARNING: disabling GSS-API support since no header files were found" >&2;} fi @@ -21435,8 +21203,8 @@ fi $as_echo "#define HAVE_GSSMIT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gssapi headers declare GSS_C_NT_HOSTBASED_SERVICE" >&5 -$as_echo_n "checking if gssapi headers declare GSS_C_NT_HOSTBASED_SERVICE... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GSS-API headers declare GSS_C_NT_HOSTBASED_SERVICE" >&5 +$as_echo_n "checking if GSS-API headers declare GSS_C_NT_HOSTBASED_SERVICE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -21488,8 +21256,8 @@ if test x"$want_gss" = xyes; then $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h - - curl_gss_msg="enabled (MIT/Heimdal)" + HAVE_GSSAPI=1 + curl_gss_msg="enabled (MIT Kerberos/Heimdal)" if test -n "$gnu_gss"; then curl_gss_msg="enabled (GNU GSS)" @@ -21501,20 +21269,41 @@ $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h LIBS="-lgssapi_krb5 -lresolv $LIBS" ;; *) - if test -f "$GSSAPI_ROOT/bin/krb5-config"; then + if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then + gss_libs=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --libs gssapi` + LIBS="$gss_libs $LIBS" + elif test -f "$GSSAPI_ROOT/bin/krb5-config"; then gss_libs=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` LIBS="$gss_libs $LIBS" - elif test "$GSSAPI_ROOT" != "yes"; then - LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff" - LIBS="-lgssapi $LIBS" else - LIBS="-lgssapi $LIBS" + 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" - LIBS="-lgssapi $LIBS" + case $host in + *-hp-hpux*) + LIBS="-lgss $LIBS" + ;; + *) + LIBS="-lgssapi $LIBS" + ;; + esac fi else CPPFLAGS="$save_CPPFLAGS" @@ -23685,6 +23474,53 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: detected CyaSSL" >&5 $as_echo "$as_me: detected CyaSSL" >&6;} + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + + + for ac_header in cyassl/error-ssl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "cyassl/error-ssl.h" "ac_cv_header_cyassl_error_ssl_h" "$ac_includes_default" +if test "x$ac_cv_header_cyassl_error_ssl_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CYASSL_ERROR_SSL_H 1 +_ACEOF + +fi + +done + + LIBS="-lcyassl -lm $LIBS" if test -n "$cyassllib"; then @@ -23886,9 +23722,9 @@ $as_echo "found" >&6; } CPPFLAGS="$CPPFLAGS $addcflags" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PK11_CreateGenericObject in -lnss3" >&5 -$as_echo_n "checking for PK11_CreateGenericObject in -lnss3... " >&6; } -if ${ac_cv_lib_nss3_PK11_CreateGenericObject+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_VersionRangeSet in -lnss3" >&5 +$as_echo_n "checking for SSL_VersionRangeSet in -lnss3... " >&6; } +if ${ac_cv_lib_nss3_SSL_VersionRangeSet+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -23900,26 +23736,26 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char PK11_CreateGenericObject (); +char SSL_VersionRangeSet (); int main (void) { -return PK11_CreateGenericObject (); +return SSL_VersionRangeSet (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nss3_PK11_CreateGenericObject=yes + ac_cv_lib_nss3_SSL_VersionRangeSet=yes else - ac_cv_lib_nss3_PK11_CreateGenericObject=no + ac_cv_lib_nss3_SSL_VersionRangeSet=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nss3_PK11_CreateGenericObject" >&5 -$as_echo "$ac_cv_lib_nss3_PK11_CreateGenericObject" >&6; } -if test "x$ac_cv_lib_nss3_PK11_CreateGenericObject" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nss3_SSL_VersionRangeSet" >&5 +$as_echo "$ac_cv_lib_nss3_SSL_VersionRangeSet" >&6; } +if test "x$ac_cv_lib_nss3_SSL_VersionRangeSet" = xyes; then : $as_echo "#define USE_NSS 1" >>confdefs.h @@ -23942,16 +23778,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: detected NSS version $version" >&5 $as_echo "$as_me: detected NSS version $version" >&6;} - ac_fn_c_check_func "$LINENO" "NSS_InitContext" "ac_cv_func_NSS_InitContext" -if test "x$ac_cv_func_NSS_InitContext" = xyes; then : - - -$as_echo "#define HAVE_NSS_INITCONTEXT 1" >>confdefs.h - - HAVE_NSS_INITCONTEXT=1 - - -fi + NSS_LIBS=$addlib if test "x$cross_compiling" != "xyes"; then @@ -24044,11 +23871,12 @@ $as_echo "#define USE_AXTLS 1" >>confdefs.h USE_AXTLS="yes" curl_ssl_msg="enabled (axTLS)" - - LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" - export LD_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: Added $LIB_AXTLS to LD_LIBRARY_PATH" >&5 + if test "x$cross_compiling" != "xyes"; then + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" + export LD_LIBRARY_PATH + { $as_echo "$as_me:${as_lineno-$LINENO}: Added $LIB_AXTLS to LD_LIBRARY_PATH" >&5 $as_echo "$as_me: Added $LIB_AXTLS to LD_LIBRARY_PATH" >&6;} + fi else @@ -24112,46 +23940,47 @@ fi ca="$want_ca" capath="no" elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then - if test "x$OPENSSL_ENABLED" != "x1"; then - as_fn_error $? "--with-ca-path only works with openSSL" "$LINENO" 5 + if test "x$OPENSSL_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then + as_fn_error $? "--with-ca-path only works with openSSL or PolarSSL" "$LINENO" 5 fi capath="$want_capath" ca="no" - elif test "x$cross_compiling" != "xyes"; then - + else ca="no" capath="no" - if test "x$want_ca" = "xunset"; then - 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.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 - for a in /etc/ssl/certs/; 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 - capath="$a" - break + if test "x$cross_compiling" != "xyes"; then + if test "x$want_ca" = "xunset"; then + 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 - done - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: skipped the ca-cert path detection when cross-compiling" >&5 + + 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.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 + for a in /etc/ssl/certs/; 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 + capath="$a" + break + fi + done + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: skipped the ca-cert path detection when cross-compiling" >&5 $as_echo "$as_me: WARNING: skipped the ca-cert path detection when cross-compiling" >&2;} + fi fi if test "x$ca" != "xno"; then @@ -24790,19 +24619,6 @@ done if test "$LIBSSH2_ENABLED" = "1"; then if test -n "$DIR_SSH2"; then - for ac_func in libssh2_version libssh2_init libssh2_exit \ - libssh2_scp_send64 libssh2_session_handshake -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - if test "x$cross_compiling" != "xyes"; then LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2" export LD_LIBRARY_PATH @@ -25080,19 +24896,19 @@ $as_echo "$as_me: WARNING: You need an ld version supporting the --version-scrip $as_echo "yes" >&6; } if test "x$OPENSSL_ENABLED" = "x1"; then versioned_symbols_flavour="OPENSSL_" - elif test "x$GNUTLS_ENABLED" == "x1"; then + elif test "x$GNUTLS_ENABLED" = "x1"; then versioned_symbols_flavour="GNUTLS_" - elif test "x$NSS_ENABLED" == "x1"; then + elif test "x$NSS_ENABLED" = "x1"; then versioned_symbols_flavour="NSS_" - elif test "x$POLARSSL_ENABLED" == "x1"; then + elif test "x$POLARSSL_ENABLED" = "x1"; then versioned_symbols_flavour="POLARSSL_" - elif test "x$CYASSL_ENABLED" == "x1"; then + elif test "x$CYASSL_ENABLED" = "x1"; then versioned_symbols_flavour="CYASSL_" - elif test "x$AXTLS_ENABLED" == "x1"; then + elif test "x$AXTLS_ENABLED" = "x1"; then versioned_symbols_flavour="AXTLS_" - elif test "x$WINSSL_ENABLED" == "x1"; then + elif test "x$WINSSL_ENABLED" = "x1"; then versioned_symbols_flavour="WINSSL_" - elif test "x$DARWINSSL_ENABLED" == "x1"; then + elif test "x$DARWINSSL_ENABLED" = "x1"; then versioned_symbols_flavour="DARWINSSL_" else versioned_symbols_flavour="" @@ -25715,7 +25531,7 @@ done IDN_ENABLED=1 curl_idn_msg="enabled" - if test -n "$IDN_DIR"; then + if test -n "$IDN_DIR" -a "x$cross_compiling" != "xyes"; then LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$IDN_DIR" export LD_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: Added $IDN_DIR to LD_LIBRARY_PATH" >&5 @@ -25741,6 +25557,265 @@ fi +OPT_H2="yes" + +# Check whether --with-nghttp2 was given. +if test "${with_nghttp2+set}" = set; then : + withval=$with_nghttp2; OPT_H2=$withval +fi + +case "$OPT_H2" in + no) + want_h2="no" + ;; + yes) + want_h2="default" + want_h2_path="" + ;; + *) + want_h2="yes" + want_h2_path="$withval/lib/pkgconfig" + ;; +esac + +curl_h2_msg="disabled (--with-nghttp2)" +if test X"$want_h2" != Xno; then + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + + + PKGCONFIG="no" + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKGCONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/bin:/usr/local/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKGCONFIG=$ac_cv_path_PKGCONFIG +if test -n "$PKGCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 +$as_echo "$PKGCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKGCONFIG"; then + ac_pt_PKGCONFIG=$PKGCONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/bin:/usr/local/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG +if test -n "$ac_pt_PKGCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5 +$as_echo "$ac_pt_PKGCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKGCONFIG" = x; then + PKGCONFIG="no" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKGCONFIG=$ac_pt_PKGCONFIG + fi +else + PKGCONFIG="$ac_cv_path_PKGCONFIG" +fi + + + if test x$PKGCONFIG != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnghttp2 options with pkg-config" >&5 +$as_echo_n "checking for libnghttp2 options with pkg-config... " >&6; } + itexists=` + if test -n "$want_h2_path"; then + PKG_CONFIG_LIBDIR="$want_h2_path" + export PKG_CONFIG_LIBDIR + fi + $PKGCONFIG --exists libnghttp2 >/dev/null 2>&1 && echo 1` + + if test -z "$itexists"; then + PKGCONFIG="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + fi + fi + + + if test "$PKGCONFIG" != "no" ; then + LIB_H2=` + if test -n "$want_h2_path"; then + PKG_CONFIG_LIBDIR="$want_h2_path" + export PKG_CONFIG_LIBDIR + fi + + $PKGCONFIG --libs-only-l libnghttp2` + { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_H2" >&5 +$as_echo "$as_me: -l is $LIB_H2" >&6;} + + CPP_H2=` + if test -n "$want_h2_path"; then + PKG_CONFIG_LIBDIR="$want_h2_path" + export PKG_CONFIG_LIBDIR + fi + $PKGCONFIG --cflags-only-I libnghttp2` + { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_H2" >&5 +$as_echo "$as_me: -I is $CPP_H2" >&6;} + + LD_H2=` + if test -n "$want_h2_path"; then + PKG_CONFIG_LIBDIR="$want_h2_path" + export PKG_CONFIG_LIBDIR + fi + + $PKGCONFIG --libs-only-L libnghttp2` + { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_H2" >&5 +$as_echo "$as_me: -L is $LD_H2" >&6;} + + LDFLAGS="$LDFLAGS $LD_H2" + CPPFLAGS="$CPPFLAGS $CPP_H2" + LIBS="$LIB_H2 $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp2_session_callbacks_set_send_callback in -lnghttp2" >&5 +$as_echo_n "checking for nghttp2_session_callbacks_set_send_callback in -lnghttp2... " >&6; } +if ${ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnghttp2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#ifdef __cplusplus +extern "C" +#endif +char nghttp2_session_callbacks_set_send_callback (); +int main (void) +{ +return nghttp2_session_callbacks_set_send_callback (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback=yes +else + ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback" >&5 +$as_echo "$ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback" >&6; } +if test "x$ac_cv_lib_nghttp2_nghttp2_session_callbacks_set_send_callback" = xyes; then : + + for ac_header in nghttp2/nghttp2.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "nghttp2/nghttp2.h" "ac_cv_header_nghttp2_nghttp2_h" "$ac_includes_default" +if test "x$ac_cv_header_nghttp2_nghttp2_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NGHTTP2_NGHTTP2_H 1 +_ACEOF + curl_h2_msg="enabled (nghttp2)" + NGHTTP2_ENABLED=1 + +$as_echo "#define USE_NGHTTP2 1" >>confdefs.h + + USE_NGHTTP2=1 + + +fi + +done + + +else + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + +fi + + + else + if test X"$want_h2" != Xdefault; then + as_fn_error $? "--with-nghttp2 was specified but could not find libnghttp2 pkg-config file." "$LINENO" 5 + fi + fi + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : @@ -34351,7 +34426,7 @@ $as_echo "no" >&6; } tst_allow_poll="unknown" # case $host_os in - darwin*|interix*) + darwin[123456789].*|darwin10.*|darwin11.*|darwin12.*|interix*) curl_disallow_poll="yes" ;; esac @@ -37836,8 +37911,10 @@ for ac_func in fork \ getppid \ getprotobyname \ getpwuid \ + getpwuid_r \ getrlimit \ gettimeofday \ + if_nametoindex \ inet_addr \ perror \ pipe \ @@ -38835,6 +38912,7 @@ $as_echo "no" >&6; } $as_echo "#define CURL_DISABLE_CRYPTO_AUTH 1" >>confdefs.h + CURL_DISABLE_CRYPTO_AUTH=1 ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -38928,6 +39006,53 @@ $as_echo "#define USE_TLS_SRP 1" >>confdefs.h curl_tls_srp_msg="enabled" fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Unix domain sockets" >&5 +$as_echo_n "checking whether to enable Unix domain sockets... " >&6; } +# Check whether --enable-unix-sockets was given. +if test "${enable_unix_sockets+set}" = set; then : + enableval=$enable_unix_sockets; case "$enableval" in + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + want_unix_sockets=no + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + want_unix_sockets=yes + ;; + esac +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: auto" >&5 +$as_echo "auto" >&6; } + want_unix_sockets=auto + + +fi + +if test "x$want_unix_sockets" != "xno"; then + ac_fn_c_check_member "$LINENO" "struct sockaddr_un" "sun_path" "ac_cv_member_struct_sockaddr_un_sun_path" " + #include + +" +if test "x$ac_cv_member_struct_sockaddr_un_sun_path" = xyes; then : + + +$as_echo "#define USE_UNIX_SOCKETS 1" >>confdefs.h + + USE_UNIX_SOCKETS=1 + + curl_unix_sockets_msg="enabled" + +else + + if test "x$want_unix_sockets" = "xyes"; then + as_fn_error $? "--enable-unix-sockets is not available on this platform!" "$LINENO" 5 + fi + +fi + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable support for cookies" >&5 $as_echo_n "checking whether to enable support for cookies... " >&6; } # Check whether --enable-cookies was given. @@ -39044,12 +39169,12 @@ if test "x$USE_SSLEAY" = "x1"; then elif test -n "$SSL_ENABLED"; then SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" fi -if test "@KRB4_ENABLED@" = "x1"; then - SUPPORT_FEATURES="$SUPPORT_FEATURES KRB4" -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 @@ -39062,20 +39187,42 @@ fi if test "x$USE_WINDOWS_SSPI" = "x1"; then SUPPORT_FEATURES="$SUPPORT_FEATURES SSPI" fi -if test "x$CURL_DISABLE_HTTP" != "x1"; then + +if test "x$HAVE_GSSAPI" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API" +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$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ -o "x$DARWINSSL_ENABLED" = "x1"; then SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM" - if test "x$NTLM_WB_ENABLED" = "x1"; then + + 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$CURL_DISABLE_HTTP" != "x1"; then @@ -39126,6 +39273,16 @@ if test "x$CURL_DISABLE_IMAP" != "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$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ + -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ + -o "x$DARWINSSL_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 @@ -39334,7 +39491,7 @@ if test "x$want_curldebug_assumed" = "xyes" && ac_configure_args="$ac_configure_args --enable-curldebug" fi -ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile include/Makefile include/curl/Makefile src/Makefile lib/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/Win32/Makefile packages/Win32/cygwin/Makefile packages/Linux/Makefile packages/Linux/RPM/Makefile packages/Linux/RPM/curl.spec packages/Linux/RPM/curl-ssl.spec packages/Solaris/Makefile packages/EPM/curl.list packages/EPM/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc" +ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile docs/libcurl/opts/Makefile include/Makefile include/curl/Makefile src/Makefile lib/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/Win32/Makefile packages/Win32/cygwin/Makefile packages/Linux/Makefile packages/Linux/RPM/Makefile packages/Linux/RPM/curl.spec packages/Linux/RPM/curl-ssl.spec packages/Solaris/Makefile packages/EPM/curl.list packages/EPM/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -40408,6 +40565,7 @@ do "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "docs/examples/Makefile") CONFIG_FILES="$CONFIG_FILES docs/examples/Makefile" ;; "docs/libcurl/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libcurl/Makefile" ;; + "docs/libcurl/opts/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libcurl/opts/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/curl/Makefile") CONFIG_FILES="$CONFIG_FILES include/curl/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; @@ -41974,6 +42132,109 @@ _EOF +## ---------------------------------- ## +## Start of distclean amending code ## +## ---------------------------------- ## + +for xc_subdir in lib src tests/unit tests/server tests/libtest docs/examples +do + +if test ! -f "$xc_subdir/Makefile"; then + echo "$xc_msg_err $xc_subdir/Makefile file not found. $xc_msg_abrt" >&2 + exit 1 +fi + +# Fetch dependency tracking file list from Makefile include lines. + +xc_inc_lines=`grep '^include .*(DEPDIR)' "$xc_subdir/Makefile" 2>/dev/null` +xc_cnt_words=`echo "$xc_inc_lines" | wc -w | tr -d "$xc_space$xc_tab"` + +# --disable-dependency-tracking might have been used, consequently +# there is nothing to amend without a dependency tracking file list. + +if test $xc_cnt_words -gt 0; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: amending $xc_subdir/Makefile" >&5 +$as_echo "$as_me: amending $xc_subdir/Makefile" >&6;} + +# Build Makefile specific patch hunk. + +xc_p="$xc_subdir/xc_patch.tmp" + +xc_rm_depfiles=`echo "$xc_inc_lines" \ + | $SED 's%include% -rm -f%' 2>/dev/null` + +xc_dep_subdirs=`echo "$xc_inc_lines" \ + | $SED 's%include[ ][ ]*%%' 2>/dev/null \ + | $SED 's%(DEPDIR)/.*%(DEPDIR)%' 2>/dev/null \ + | sort | uniq` + +echo "$xc_rm_depfiles" >$xc_p + +for xc_dep_dir in $xc_dep_subdirs; do + echo "${xc_tab}@xm_dep_cnt=\`ls $xc_dep_dir | wc -l 2>/dev/null\`; \\" >>$xc_p + echo "${xc_tab}if test \$\$xm_dep_cnt -eq 0 && test -d $xc_dep_dir; then \\" >>$xc_p + echo "${xc_tab} rm -rf $xc_dep_dir; \\" >>$xc_p + echo "${xc_tab}fi" >>$xc_p +done + +# Build Makefile patching sed scripts. + +xc_s1="$xc_subdir/xc_script_1.tmp" +xc_s2="$xc_subdir/xc_script_2.tmp" +xc_s3="$xc_subdir/xc_script_3.tmp" + +cat >$xc_s1 <<\_EOT +/^distclean[ ]*:/,/^[^ ][^ ]*:/{ + s/^.*(DEPDIR)/___xc_depdir_line___/ +} +/^maintainer-clean[ ]*:/,/^[^ ][^ ]*:/{ + s/^.*(DEPDIR)/___xc_depdir_line___/ +} +_EOT + +cat >$xc_s2 <<\_EOT +/___xc_depdir_line___$/{ + N + /___xc_depdir_line___$/D +} +_EOT + +cat >$xc_s3 <<_EOT +/^___xc_depdir_line___/{ + r $xc_p + d +} +_EOT + +# Apply patch to Makefile and cleanup. + +$SED -f "$xc_s1" "$xc_subdir/Makefile" >"$xc_subdir/Makefile.tmp1" +$SED -f "$xc_s2" "$xc_subdir/Makefile.tmp1" >"$xc_subdir/Makefile.tmp2" +$SED -f "$xc_s3" "$xc_subdir/Makefile.tmp2" >"$xc_subdir/Makefile.tmp3" + +if test -f "$xc_subdir/Makefile.tmp3"; then + mv -f "$xc_subdir/Makefile.tmp3" "$xc_subdir/Makefile" +fi + +test -f "$xc_subdir/Makefile.tmp1" && rm -f "$xc_subdir/Makefile.tmp1" +test -f "$xc_subdir/Makefile.tmp2" && rm -f "$xc_subdir/Makefile.tmp2" +test -f "$xc_subdir/Makefile.tmp3" && rm -f "$xc_subdir/Makefile.tmp3" + +test -f "$xc_p" && rm -f "$xc_p" +test -f "$xc_s1" && rm -f "$xc_s1" +test -f "$xc_s2" && rm -f "$xc_s2" +test -f "$xc_s3" && rm -f "$xc_s3" + +fi + +done + +## -------------------------------- ## +## End of distclean amending code ## +## -------------------------------- ## + + { $as_echo "$as_me:${as_lineno-$LINENO}: Configured to build curl/libcurl: @@ -41984,12 +42245,11 @@ _EOF SSL support: ${curl_ssl_msg} SSH support: ${curl_ssh_msg} zlib support: ${curl_zlib_msg} - krb4 support: ${curl_krb4_msg} - GSSAPI support: ${curl_gss_msg} - SPNEGO support: ${curl_spnego_msg} + GSS-API support: ${curl_gss_msg} TLS-SRP support: ${curl_tls_srp_msg} resolver: ${curl_res_msg} - ipv6 support: ${curl_ipv6_msg} + IPv6 support: ${curl_ipv6_msg} + Unix sockets support: ${curl_unix_sockets_msg} IDN support: ${curl_idn_msg} Build libcurl: Shared=${enable_shared}, Static=${enable_static} Built-in manual: ${curl_manual_msg} @@ -42003,6 +42263,7 @@ _EOF RTSP support: ${curl_rtsp_msg} RTMP support: ${curl_rtmp_msg} metalink support: ${curl_mtlnk_msg} + HTTP2 support: ${curl_h2_msg} Protocols: ${SUPPORT_PROTOCOLS} " >&5 $as_echo "$as_me: Configured to build curl/libcurl: @@ -42014,12 +42275,11 @@ $as_echo "$as_me: Configured to build curl/libcurl: SSL support: ${curl_ssl_msg} SSH support: ${curl_ssh_msg} zlib support: ${curl_zlib_msg} - krb4 support: ${curl_krb4_msg} - GSSAPI support: ${curl_gss_msg} - SPNEGO support: ${curl_spnego_msg} + GSS-API support: ${curl_gss_msg} TLS-SRP support: ${curl_tls_srp_msg} resolver: ${curl_res_msg} - ipv6 support: ${curl_ipv6_msg} + IPv6 support: ${curl_ipv6_msg} + Unix sockets support: ${curl_unix_sockets_msg} IDN support: ${curl_idn_msg} Build libcurl: Shared=${enable_shared}, Static=${enable_static} Built-in manual: ${curl_manual_msg} @@ -42033,6 +42293,7 @@ $as_echo "$as_me: Configured to build curl/libcurl: RTSP support: ${curl_rtsp_msg} RTMP support: ${curl_rtmp_msg} metalink support: ${curl_mtlnk_msg} + HTTP2 support: ${curl_h2_msg} Protocols: ${SUPPORT_PROTOCOLS} " >&6;} diff --git a/configure.ac b/configure.ac index 00ffe5c..a1b560c 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -31,7 +31,7 @@ XC_OVR_ZZ60 CURL_OVERRIDE_AUTOCONF dnl configure script copyright -AC_COPYRIGHT([Copyright (c) 1998 - 2013 Daniel Stenberg, +AC_COPYRIGHT([Copyright (c) 1998 - 2014 Daniel Stenberg, This configure script may be copied, distributed and modified under the terms of the curl license; see COPYING for more details]) @@ -150,12 +150,11 @@ dnl initialize all the info variables curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls,winssl,darwinssl} )" curl_ssh_msg="no (--with-libssh2)" curl_zlib_msg="no (--with-zlib)" - curl_krb4_msg="no (--with-krb4*)" curl_gss_msg="no (--with-gssapi)" - curl_spnego_msg="no (--with-spnego)" 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-{libidn,winidn})" curl_manual_msg="no (--enable-manual)" curl_libcurl_msg="enabled (--disable-libcurl-option)" @@ -576,6 +575,22 @@ AC_HELP_STRING([--disable-imap],[Disable IMAP support]), ) +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]) @@ -1049,10 +1064,10 @@ dnl ********************************************************************** dnl Checks for IPv6 dnl ********************************************************************** -AC_MSG_CHECKING([whether to enable ipv6]) +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]), +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) @@ -1066,6 +1081,7 @@ AC_HELP_STRING([--disable-ipv6],[Disable ipv6 support]), AC_TRY_RUN([ /* is AF_INET6 available? */ #include #include +#include /* for exit() */ main() { if (socket(AF_INET6, SOCK_STREAM, 0) < 0) @@ -1135,159 +1151,29 @@ no) esac dnl ********************************************************************** -dnl Check for the presence of Kerberos4 libraries and headers -dnl ********************************************************************** - -AC_ARG_WITH(krb4-includes, -AC_HELP_STRING([--with-krb4-includes=DIR], - [Specify location of kerberos4 headers]),[ - CPPFLAGS="$CPPFLAGS -I$withval" - KRB4INC="$withval" - want_krb4=yes - ]) - -AC_ARG_WITH(krb4-libs, -AC_HELP_STRING([--with-krb4-libs=DIR],[Specify location of kerberos4 libs]),[ - LDFLAGS="$LDFLAGS -L$withval" - KRB4LIB="$withval" - want_krb4=yes - ]) - - -OPT_KRB4=off -AC_ARG_WITH(krb4,dnl -AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ - OPT_KRB4="$withval" - if test X"$OPT_KRB4" != Xno; then - want_krb4="yes" - if test X"$OPT_KRB4" != Xyes; then - LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" - KRB4LIB="$OPT_KRB4/lib$libsuff" - CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" - KRB4INC="$OPT_KRB4/include" - fi - fi - ]) - -AC_MSG_CHECKING([if Kerberos4 support is requested]) - -if test "$want_krb4" = yes -then - if test "$ipv6" = "yes"; then - echo krb4 is not compatible with IPv6 - exit 1 - fi - AC_MSG_RESULT(yes) - - dnl Check for & handle argument to --with-krb4 - - AC_MSG_CHECKING(where to look for Kerberos4) - if test X"$OPT_KRB4" = Xyes - then - AC_MSG_RESULT([defaults]) - else - AC_MSG_RESULT([libs in $KRB4LIB, headers in $KRB4INC]) - fi - - dnl Check for DES library - AC_CHECK_LIB(des, des_pcbc_encrypt, - [ - AC_CHECK_HEADERS(des.h) - - dnl resolv lib? - AC_CHECK_FUNC(res_search, , [AC_CHECK_LIB(resolv, res_search)]) - - dnl Check for the Kerberos4 library - AC_CHECK_LIB(krb, krb_net_read, - [ - dnl Check for header files - AC_CHECK_HEADERS(krb.h) - - dnl we found the required libraries, add to LIBS - LIBS="-lkrb -lcom_err -ldes $LIBS" - - dnl Check for function krb_get_our_ip_for_realm - dnl this is needed for NAT networks - AC_CHECK_FUNCS(krb_get_our_ip_for_realm) - - dnl add define KRB4 - AC_DEFINE(HAVE_KRB4, 1, - [if you have the Kerberos4 libraries (including -ldes)]) - - dnl substitute it too! - KRB4_ENABLED=1 - AC_SUBST(KRB4_ENABLED) - - curl_krb4_msg="enabled" - - dnl the krb4 stuff needs a strlcpy() - AC_CHECK_FUNCS(strlcpy) - - ]) - ]) -else - AC_MSG_RESULT(no) -fi - -dnl ********************************************************************** -dnl Check for FBopenssl(SPNEGO) libraries -dnl ********************************************************************** - -AC_ARG_WITH(spnego, - AC_HELP_STRING([--with-spnego=DIR], - [Specify location of SPNEGO library fbopenssl]), [ - SPNEGO_ROOT="$withval" - if test x"$SPNEGO_ROOT" != xno; then - want_spnego="yes" - fi -]) - -AC_MSG_CHECKING([if SPNEGO support is requested]) -if test x"$want_spnego" = xyes; then - - if test X"$SPNEGO_ROOT" = Xyes; then - AC_MSG_ERROR([FBOpenSSL libs and/or directories were not found where specified!]) - AC_MSG_RESULT(no) - else - if test -z "$SPNEGO_LIB_DIR"; then - LDFLAGS="$LDFLAGS -L$SPNEGO_ROOT -lfbopenssl" - else - LDFLAGS="$LDFLAGS $SPNEGO_LIB_DIR" - fi - - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_SPNEGO, 1, - [Define this if you have the SPNEGO library fbopenssl]) - curl_spnego_msg="enabled" - fi -else - AC_MSG_RESULT(no) -fi - -dnl ********************************************************************** dnl Check for GSS-API libraries dnl ********************************************************************** -dnl check for gss stuff in the /usr as default +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 GSSAPI header]), + [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 GSSAPI libs]), + [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 GSSAPI]), [ + [Where to look for GSS-API]), [ GSSAPI_ROOT="$withval" if test x"$GSSAPI_ROOT" != xno; then want_gss="yes" @@ -1299,12 +1185,14 @@ AC_ARG_WITH(gssapi, ]) save_CPPFLAGS="$CPPFLAGS" -AC_MSG_CHECKING([if GSSAPI support is requested]) +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 -f "$GSSAPI_ROOT/bin/krb5-config"; 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 "$GSSAPI_ROOT/bin/krb5-config"; then GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` elif test "$GSSAPI_ROOT" != "yes"; then GSSAPI_INCS="-I$GSSAPI_ROOT/include" @@ -1316,7 +1204,7 @@ if test x"$want_gss" = xyes; then AC_CHECK_HEADER(gss.h, [ dnl found in the given dirs - AC_DEFINE(HAVE_GSSGNU, 1, [if you have the GNU gssapi libraries]) + AC_DEFINE(HAVE_GSSGNU, 1, [if you have GNU GSS]) gnu_gss=yes ], [ @@ -1337,19 +1225,19 @@ AC_INCLUDES_DEFAULT AC_CHECK_HEADER(gssapi.h, [ dnl found - AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) + AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have Heimdal]) ], [ dnl no header found, disabling GSS want_gss=no - AC_MSG_WARN(disabling GSSAPI since no header files was found) + 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 the MIT gssapi libraries]) - dnl check if we have a really old MIT kerberos (<= 1.2) - AC_MSG_CHECKING([if gssapi headers declare GSS_C_NT_HOSTBASED_SERVICE]) + 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 @@ -1367,7 +1255,7 @@ AC_INCLUDES_DEFAULT ],[ AC_MSG_RESULT([no]) AC_DEFINE(HAVE_OLD_GSSMIT, 1, - [if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE]) + [if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE]) ]) fi ] @@ -1376,9 +1264,9 @@ else AC_MSG_RESULT(no) fi if test x"$want_gss" = xyes; then - AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries]) - - curl_gss_msg="enabled (MIT/Heimdal)" + 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)" @@ -1390,22 +1278,45 @@ if test x"$want_gss" = xyes; then LIBS="-lgssapi_krb5 -lresolv $LIBS" ;; *) - if test -f "$GSSAPI_ROOT/bin/krb5-config"; then + 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 "$GSSAPI_ROOT/bin/krb5-config"; then dnl krb5-config doesn't have --libs-only-L or similar, put everything dnl into LIBS gss_libs=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` LIBS="$gss_libs $LIBS" - elif test "$GSSAPI_ROOT" != "yes"; then - LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff" - LIBS="-lgssapi $LIBS" else - LIBS="-lgssapi $LIBS" + 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" - LIBS="-lgssapi $LIBS" + case $host in + *-hp-hpux*) + LIBS="-lgss $LIBS" + ;; + *) + LIBS="-lgssapi $LIBS" + ;; + esac fi else CPPFLAGS="$save_CPPFLAGS" @@ -2079,6 +1990,12 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then if test "x$USE_CYASSL" = "xyes"; then AC_MSG_NOTICE([detected CyaSSL]) + dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined! + AC_CHECK_SIZEOF(long long) + + dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h + AC_CHECK_HEADERS(cyassl/error-ssl.h) + LIBS="-lcyassl -lm $LIBS" if test -n "$cyassllib"; then @@ -2163,8 +2080,8 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then CPPFLAGS="$CPPFLAGS $addcflags" fi - dnl The function PK11_CreateGenericObject is needed to load libnsspem.so - AC_CHECK_LIB(nss3, PK11_CreateGenericObject, + 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]) @@ -2180,13 +2097,9 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then if test "x$USE_NSS" = "xyes"; then AC_MSG_NOTICE([detected NSS version $version]) - dnl NSS_InitContext() was introduced in NSS 3.12.5 and helps to prevent - dnl collisions on NSS initialization/shutdown with other libraries - AC_CHECK_FUNC(NSS_InitContext, - [ - AC_DEFINE(HAVE_NSS_INITCONTEXT, 1, [if you have the NSS_InitContext function]) - AC_SUBST(HAVE_NSS_INITCONTEXT, [1]) - ]) + 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 @@ -2248,10 +2161,11 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then USE_AXTLS="yes" curl_ssl_msg="enabled (axTLS)" - - LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" - export LD_LIBRARY_PATH - AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH]) + if test "x$cross_compiling" != "xyes"; then + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS" + export LD_LIBRARY_PATH + AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH]) + fi ],[ LDFLAGS="$CLEANLDFLAGS" CPPFLAGS="$CLEANCPPFLAGS" @@ -2435,12 +2349,6 @@ if test X"$OPT_LIBSSH2" != Xno; then dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH dnl to prevent further configure tests to fail due to this - dnl libssh2_version is a post 1.0 addition - dnl libssh2_init and libssh2_exit were added in 1.2.5 - dnl libssh2_scp_send64 was added in 1.2.6 - dnl libssh2_session_handshake was added in 1.2.8 - AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit \ - libssh2_scp_send64 libssh2_session_handshake) if test "x$cross_compiling" != "xyes"; then LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2" export LD_LIBRARY_PATH @@ -2553,19 +2461,19 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar AC_MSG_RESULT(yes) if test "x$OPENSSL_ENABLED" = "x1"; then versioned_symbols_flavour="OPENSSL_" - elif test "x$GNUTLS_ENABLED" == "x1"; then + elif test "x$GNUTLS_ENABLED" = "x1"; then versioned_symbols_flavour="GNUTLS_" - elif test "x$NSS_ENABLED" == "x1"; then + elif test "x$NSS_ENABLED" = "x1"; then versioned_symbols_flavour="NSS_" - elif test "x$POLARSSL_ENABLED" == "x1"; then + elif test "x$POLARSSL_ENABLED" = "x1"; then versioned_symbols_flavour="POLARSSL_" - elif test "x$CYASSL_ENABLED" == "x1"; then + elif test "x$CYASSL_ENABLED" = "x1"; then versioned_symbols_flavour="CYASSL_" - elif test "x$AXTLS_ENABLED" == "x1"; then + elif test "x$AXTLS_ENABLED" = "x1"; then versioned_symbols_flavour="AXTLS_" - elif test "x$WINSSL_ENABLED" == "x1"; then + elif test "x$WINSSL_ENABLED" = "x1"; then versioned_symbols_flavour="WINSSL_" - elif test "x$DARWINSSL_ENABLED" == "x1"; then + elif test "x$DARWINSSL_ENABLED" = "x1"; then versioned_symbols_flavour="DARWINSSL_" else versioned_symbols_flavour="" @@ -2783,7 +2691,7 @@ if test "$want_idn" = "yes"; then if test "x$ac_cv_header_tld_h" = "xyes"; then AC_SUBST([IDN_ENABLED], [1]) curl_idn_msg="enabled" - if test -n "$IDN_DIR"; then + if test -n "$IDN_DIR" -a "x$cross_compiling" != "xyes"; then LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$IDN_DIR" export LD_LIBRARY_PATH AC_MSG_NOTICE([Added $IDN_DIR to LD_LIBRARY_PATH]) @@ -2809,6 +2717,84 @@ dnl genprogc/thread_quick_ref.htm dnl ********************************************************************** +dnl Check for nghttp2 +dnl ********************************************************************** + +OPT_H2="yes" +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" + + AC_CHECK_LIB(nghttp2, nghttp2_session_callbacks_set_send_callback, + [ + 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 Back to "normal" configuring dnl ********************************************************************** @@ -3035,8 +3021,10 @@ AC_CHECK_FUNCS([fork \ getppid \ getprotobyname \ getpwuid \ + getpwuid_r \ getrlimit \ gettimeofday \ + if_nametoindex \ inet_addr \ perror \ pipe \ @@ -3247,6 +3235,7 @@ AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]), 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) ;; @@ -3286,6 +3275,39 @@ if test "$want_tls_srp" = "yes" && ( test "x$HAVE_GNUTLS_SRP" = "x1" || test "x$ 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 enable support for cookies]) @@ -3365,12 +3387,12 @@ if test "x$USE_SSLEAY" = "x1"; then elif test -n "$SSL_ENABLED"; then SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" fi -if test "@KRB4_ENABLED@" = "x1"; then - SUPPORT_FEATURES="$SUPPORT_FEATURES KRB4" -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 @@ -3383,20 +3405,42 @@ fi if test "x$USE_WINDOWS_SSPI" = "x1"; then SUPPORT_FEATURES="$SUPPORT_FEATURES SSPI" fi -if test "x$CURL_DISABLE_HTTP" != "x1"; then + +if test "x$HAVE_GSSAPI" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API" +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$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ -o "x$DARWINSSL_ENABLED" = "x1"; then SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM" - if test "x$NTLM_WB_ENABLED" = "x1"; then + + 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 + AC_SUBST(SUPPORT_FEATURES) dnl For supported protocols in pkg-config file @@ -3448,6 +3492,16 @@ if test "x$CURL_DISABLE_IMAP" != "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$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ + -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ + -o "x$DARWINSSL_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 @@ -3498,6 +3552,7 @@ AC_CONFIG_FILES([Makefile \ docs/Makefile \ docs/examples/Makefile \ docs/libcurl/Makefile \ + docs/libcurl/opts/Makefile \ include/Makefile \ include/curl/Makefile \ src/Makefile \ @@ -3542,12 +3597,11 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: SSL support: ${curl_ssl_msg} SSH support: ${curl_ssh_msg} zlib support: ${curl_zlib_msg} - krb4 support: ${curl_krb4_msg} - GSSAPI support: ${curl_gss_msg} - SPNEGO support: ${curl_spnego_msg} + GSS-API support: ${curl_gss_msg} TLS-SRP support: ${curl_tls_srp_msg} resolver: ${curl_res_msg} - ipv6 support: ${curl_ipv6_msg} + IPv6 support: ${curl_ipv6_msg} + Unix sockets support: ${curl_unix_sockets_msg} IDN support: ${curl_idn_msg} Build libcurl: Shared=${enable_shared}, Static=${enable_static} Built-in manual: ${curl_manual_msg} @@ -3561,6 +3615,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: RTSP support: ${curl_rtsp_msg} RTMP support: ${curl_rtmp_msg} metalink support: ${curl_mtlnk_msg} + HTTP2 support: ${curl_h2_msg} Protocols: ${SUPPORT_PROTOCOLS} ]) diff --git a/docs/BINDINGS b/docs/BINDINGS index 466c36b..d4cf488 100644 --- a/docs/BINDINGS +++ b/docs/BINDINGS @@ -128,6 +128,11 @@ Mono libcurl-net by Jeffrey Phillips http://sourceforge.net/projects/libcurl-net/ +node.js + + node-libcurl by Jonathan Cardoso Machado + https://github.com/JCMais/node-libcurl + Object-Pascal Free Pascal, Delphi and Kylix binding written by Christophe Espern. diff --git a/docs/CONTRIBUTE b/docs/CONTRIBUTE index 75e7ebb..83fa420 100644 --- a/docs/CONTRIBUTE +++ b/docs/CONTRIBUTE @@ -278,6 +278,10 @@ [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] + + [Bug: link 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, diff --git a/docs/DISTRO-DILEMMA b/docs/DISTRO-DILEMMA index 108e6ba..71186a2 100644 --- a/docs/DISTRO-DILEMMA +++ b/docs/DISTRO-DILEMMA @@ -59,7 +59,7 @@ GnuTLS OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl without including any Original BSD licensed code. - I believe Debian is the first (only?) distro that provides libcurl/GnutTLS + I believe Debian is the first (only?) distro that provides libcurl/GnuTLS packages. yassl @@ -72,20 +72,20 @@ GnuTLS vs OpenSSL vs yassl While these three libraries offer similar features, they are not equal. libcurl does not (yet) offer a standardized stable ABI if you decide to - switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS + switch from using libcurl-openssl to libcurl-gnutls or vice-versa. The GnuTLS and yassl support is very recent in libcurl and it has not been tested nor used very extensively, while the OpenSSL equivalent code has been used and thus matured since 1999. GnuTLS - - LGPL licensened + - LGPL licensed - supports SRP - lacks SSLv2 support - lacks MD2 support (used by at least some CA certs) - lacks the crypto functions libcurl uses for NTLM OpenSSL - - Original BSD licensened + - Original BSD licensed - lacks SRP - supports SSLv2 - older and more widely used diff --git a/docs/FAQ b/docs/FAQ index 2b15254..043b7bb 100644 --- a/docs/FAQ +++ b/docs/FAQ @@ -80,6 +80,7 @@ FAQ 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! 5. libcurl Issues 5.1 Is libcurl thread-safe? @@ -99,6 +100,7 @@ FAQ 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? @@ -132,14 +134,14 @@ FAQ 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, SMTP, SMTPS, TELNET and TFTP. + POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, - kerberos, HTTP form based upload, proxies, cookies, user+password + 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, HPUX, + 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... @@ -154,7 +156,10 @@ FAQ Since curl uses libcurl, curl supports the same wide range of common Internet protocols that libcurl does. - We pronounce curl and cURL with an initial k sound: [kurl]. + 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: + + http://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 @@ -202,27 +207,25 @@ FAQ 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. + 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 fine at the side. Curl's output is fine to pipe into another - program or redirect to another file for the next program to interpret. + We do not add things to curl that other small and available tools already do + very fine at the side. Curl's output is fine to pipe into another program or + redirect to another file for the next program to interpret. - * We focus on protocol related issues and improvements. If you wanna do more - magic with the supported protocols than curl currently does, chances are - big we will agree. If you wanna add more protocols, we may very well - agree. + We focus on protocol related issues and improvements. If you wanna do more + magic with the supported protocols than curl currently does, chances are big + we will agree. If you wanna add more protocols, we may very well agree. - * If you want someone else to make 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 - efforts in return. + If you want someone else to make 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 + efforts in return. - * If you write the code, chances are bigger that it will get into curl - faster. + If you write the code, chances are bigger that it will get into curl faster. 1.5 Who makes curl? @@ -239,10 +242,10 @@ FAQ 1.6 What do you get for making curl? Project cURL is entirely free and open. No person gets paid for developing - (lib)curl on full or even part time. We do this voluntarily on our spare - time. Occasionally companies pay individual developers to work on curl, but - that's up to each company and developer. It is not controlled by nor - supervised in any way by the project. + curl on full time. We do this voluntarily, mostly on spare time. + Occasionally companies pay individual developers to work on curl, but that's + up to each company and developer. It 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, sourceforge.net hosts project services we take advantage from, @@ -263,7 +266,7 @@ FAQ 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 - first-hand rights to the name. + rights to the name. We recognize that we will be living in parallel with curl.com and wish them every success. @@ -424,7 +427,7 @@ FAQ curl can be built to use one of the following SSL alternatives: OpenSSL, GnuTLS, yassl, NSS, PolarSSL, axTLS, Secure Transport (native iOS/OS X), - schannel (native Windows) or qssl (native IBM i). They all have their pros + WinSSL (native Windows) or GSKit (native IBM i). They all have their pros and cons, and we try to maintain a comparison of them here: http://curl.haxx.se/docs/ssl-compared.html @@ -620,15 +623,15 @@ FAQ 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. + 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. + 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. + 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. + Ask your admins to stop this, for a static proxy setup or similar. 3.15 Can I do recursive fetches with curl? @@ -644,34 +647,38 @@ FAQ 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 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 - (http://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. + CLIENT CERTIFICATE + + The server you communicate 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 + (http://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? @@ -794,12 +801,13 @@ FAQ curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl' - In Windows, the standard DOS shell treats the %-symbol specially and you - need to use TWO %-symbols for each single one you want to use in the URL. + 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. - Also note that if you want the literal %-symbol 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 %-symbol doubled on Windows machines). + 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? @@ -968,13 +976,13 @@ FAQ 4.14 Redirects work in browser but not with curl! curl supports HTTP redirects fine (see item 3.8). Browsers generally support - at least two other ways to perform directs that curl does not: + 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. + 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. + 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 you write a script that @@ -1082,7 +1090,31 @@ FAQ 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 signalling 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 get 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 return in the response. + 5. libcurl Issues @@ -1095,6 +1127,12 @@ FAQ your system has such. Note that you must never share the same handle in multiple threads. + libcurl's implementation of timeouts might use signals (depending on what it + was built to use for name resolving), and signal handling is generally not + thread-safe. Multi-threaded Applicationss that call libcurl from different + threads (on different handles) might want to use CURLOPT_NOSIGNAL, e.g.: + + curl_easy_setopt(handle, CURLOPT_NOSIGNAL, true); If you use a OpenSSL-powered libcurl in a multi-threaded environment, you need to provide one or two locking functions: @@ -1236,7 +1274,7 @@ FAQ 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 out of four host name resolve calls + - The non-IPv6 resolver that can use one out of four host name resolve calls (depending on what your system supports): A - gethostbyname() @@ -1244,15 +1282,15 @@ FAQ C - gethostbyname_r() with 5 arguments D - gethostbyname_r() with 6 arguments - - The ipv6-resolver that uses getaddrinfo() + - 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 + 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. @@ -1270,17 +1308,18 @@ FAQ 5.12 Can I make libcurl fake or hide my real IP address? - No. libcurl operates on a higher level than so. Besides, faking IP address - would imply sending IP packages with a made-up source address, and then you - normally get a problem with intercepting the packages sent back as they - would then not be routed to you! + No. libcurl operates on a higher level. Besides, faking IP address would + imply sending IP packet 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. + remote server will see you coming from. You may also consider using + http://www.torproject.org . 5.13 How do I stop an ongoing transfer? @@ -1361,6 +1400,19 @@ FAQ 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 diff --git a/docs/FEATURES b/docs/FEATURES index 14d7e78..a674002 100644 --- a/docs/FEATURES +++ b/docs/FEATURES @@ -28,7 +28,7 @@ libcurl - selectable network interface for outgoing traffic - IPv6 support on unix and Windows - persistent connections - - socks5 support + - 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 @@ -45,8 +45,8 @@ HTTP - POST - Pipelining - multipart formpost (RFC1867-style) - - authentication: Basic, Digest, NTLM (*9), GSS-Negotiate/Negotiate (*3) and - SPNEGO (*4) to server and proxy + - 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 @@ -55,7 +55,7 @@ HTTP - reads/writes the netscape cookie file format - custom headers (replace/remove internally generated headers) - custom user-agent string - - custom referer string + - custom referrer string - range - proxy authentication - time conditions @@ -64,6 +64,7 @@ HTTP - 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) @@ -76,8 +77,7 @@ HTTPS (*1) FTP - download - authentication - - kerberos4 (*5) - - kerberos5 (*3) + - Kerberos 5 (*14) - active/passive using PORT, EPRT, PASV or EPSV - single file size information (compare to HTTP HEAD) - 'type=' URL support @@ -127,8 +127,15 @@ FILE - upload - resume +SMB + - SMBv1 over TCP and SSL + - download + - upload + - authentication with NTLMv1 + SMTP - - authentication: Plain, Login, CRAM-MD5, Digest-MD5 and NTLM (*9) + - authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9) and Kerberos 5 + (*4) - send e-mails - mail from support - mail size support @@ -143,8 +150,8 @@ SMTPS (*1) POP3 - authentication: Clear Text, APOP and SASL - - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5 and - NTLM (*9) + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9) and + Kerberos 5 (*4) - list e-mails - retrieve e-mails - enhanced command support for: CAPA, DELE, TOP, STAT, UIDL and NOOP via @@ -158,11 +165,11 @@ POP3S (*1) IMAP - authentication: Clear Text and SASL - - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5 and - NTLM (*9) + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9) and + Kerberos 5 (*4) - list the folders of a mailbox - - select a mailbox with support for verifing the UIDVALIDITY - - fetch e-mails with support for specifing the UID and SECTION + - 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 @@ -176,14 +183,16 @@ IMAPS (*1) FOOTNOTES ========= - *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, schannel (native - Windows), Secure Transport (native iOS/OS X) or qssl (native IBM i) + *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, WinSSL (native + Windows), Secure Transport (native iOS/OS X) or GSKit (native IBM i) *2 = requires OpenLDAP - *3 = requires a GSSAPI-compliant library, such as Heimdal or similar - *4 = requires FBopenssl - *5 = requires a krb4 library, such as the MIT one or similar + *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, qssl, schannel or Secure Transport; GnuTLS, for + *7 = requires OpenSSL, NSS, GSKit, WinSSL or Secure Transport; GnuTLS, for example, only supports SSLv3 and TLSv1 *8 = requires libssh2 *9 = requires OpenSSL, GnuTLS, NSS, yassl, Secure Transport or SSPI (native @@ -194,3 +203,4 @@ FOOTNOTES *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/HISTORY b/docs/HISTORY index 3c14099..e76e5b9 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -4,23 +4,31 @@ | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| - How cURL Became Like This +How cURL Became Like This +========================= - -Towards the end of 1996, Daniel Stenberg came up with the idea to make +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 are 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 release version 0.1 of. After -a few minor adjustments, it did just what he needed. HttpGet 1.0 was released -on April 8th 1997 with brand new HTTP proxy support. +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 @@ -33,33 +41,39 @@ was revealed to us much later.) SSL support was added, powered by the SSLeay library. -August 1998, first announcement of curl on freshmeat.net. +August, first announcement of curl on freshmeat.net. -October 1998, 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 +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 1998, configure script and reported successful compiles on several +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. -January 1999, DICT support added. +1999 +---- + +January, DICT support added. OpenSSL took over where SSLeay was abandoned. -May 1999, first Debian package. +May, first Debian package. -August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300 -visits weekly. +August, LDAP:// and FILE:// support added. The curl web site gets 1300 visits +weekly. Released curl 6.0 in September. 15000 lines of code. -December 28 1999, added the project on Sourceforge and started using its -services for managing the project. +December 28, added the project on Sourceforge and started using its services +for managing the project. + +2000 +---- Spring 2000, major internal overhaul to provide a suitable library interface. The first non-beta release was named 7.1 and arrived in August. This offered @@ -67,19 +81,22 @@ the easy interface and turned out to be the beginning of actually getting other software and programs to get based on and powered by libcurl. Almost 20000 lines of code. -August 2000, the curl web site gets 4000 visits weekly. +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 2000, kerberos4 support was added. +September, kerberos4 support was added. + +In 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. -In November 2000 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 2001, Daniel released curl 7.5.2 under a new license again: MIT (or +January, Daniel released curl 7.5.2 under a new license again: MIT (or MPL). The MIT license is extremely liberal and can be used 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 @@ -92,17 +109,20 @@ code. The libcurl major SONAME number was bumped to 2 due to this overhaul. The first experimental ftps:// support was added in March 2001. -August 2001. 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 +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 in touch again. -September 2001, libcurl 7.9 introduces cookie jar and curl_formadd(). During -the forthcoming 7.9.x releases, we introduced the multi interface slowly and +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 much whistles. -June 2002, the curl web site gets 13000 visits weekly. curl and libcurl is +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. @@ -111,134 +131,152 @@ 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 2002, with the release of curl 7.10 it is released under the MIT -license only. +September, with the release of curl 7.10 it is released under the MIT license +only. + +2003 +---- -January 2003. Started working on the distributed curl tests. The autobuilds. +January. Started working on the distributed curl tests. The autobuilds. -February 2003, 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. +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 2003: curl 7.10.8 is released. 45000 lines of code. ~55000 unique -visitors to the curl.haxx.se site. Five official web mirrors. +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 2003, full-fledged SSL for FTP is supported. +December, full-fledged SSL for FTP is supported. -January 2004: curl 7.11.0 introduced large file support. +2004 +---- -June 2004: +January: curl 7.11.0 introduced large file support. - curl 7.12.0 introduced IDN support. 10 official web mirrors. +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 +This release bumped the major SONAME to 3 due to the removal of the +curl_formparse() function -August 2004: - Curl and libcurl 7.12.1 +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 + 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 -April 2005: +2005 +---- - GnuTLS can now optionally be used for the secure layer when curl is built. +April. GnuTLS can now optionally be used for the secure layer when curl is +built. -September 2005: +September: TFTP support was added. - TFTP support was added. +More than 100,000 unique visitors of the curl web site. 25 mirrors. - More than 100,000 unique visitors of the curl web site. 25 mirrors. +December: security vulnerability: libcurl URL Buffer Overflow -December 2005: +2006 +---- - security vulnerability: libcurl URL Buffer Overflow +January. We dropped support for Gopher. We found bugs in the implementation +that turned out having been introduced years ago, so with the conclusion that +nobody had found out in all this time we removed it instead of fixing it. -January 2006: +March: security vulnerability: libcurl TFTP Packet Buffer Overflow - We dropped support for Gopher. We found bugs in the implementation that - turned out having been introduced years ago, so with the conclusion that - nobody had found out in all this time we removed it instead of fixing it. +April: Added the multi_socket() API -March 2006: +September: The major SONAME number for libcurl was bumped to 4 due to the +removal of ftp third party transfer support. - security vulnerability: libcurl TFTP Packet Buffer Overflow +November: Added SCP and SFTP support -April 2006: +2007 +---- - Added the multi_socket() API +February: Added support for the Mozilla NSS library to do the SSL/TLS stuff -September 2006: +July: security vulnerability: libcurl GnuTLS insufficient cert verification - The major SONAME number for libcurl was bumped to 4 due to the removal of - ftp third party transfer support. +2008 +---- -November 2006: +November: - Added SCP and SFTP support + Command line options: 128 + curl_easy_setopt() options: 158 + Public functions in libcurl: 58 + Known libcurl bindings: 37 + Contributors: 683 -February 2007: + 145,000 unique visitors. >100 GB downloaded. - Added support for the Mozilla NSS library to do the SSL/TLS stuff +2009 +---- -July 2007: +March: security vulnerability: libcurl Arbitrary File Access - security vulnerability: libcurl GnuTLS insufficient cert verification +August: security vulnerability: libcurl embedded zero in cert name -November 2008: +December: Added support for IMAP, POP3 and SMTP - Command line options: 128 - curl_easy_setopt() options: 158 - Public functions in libcurl: 58 - Known libcurl bindings: 37 - Contributors: 683 +2010 +---- - 145,000 unique visitors. >100 GB downloaded. +January: Added support for RTSP -March 2009: +February: security vulnerability: libcurl data callback excessive length - security vulnerability: libcurl Arbitrary File Access +March: The project switched over to use git (hosted by github) instead of CVS +for source code control -August 2009: +May: Added support for RTMP - security vulnerability: libcurl embedded zero in cert name +Added support for PolarSSL to do the SSL/TLS stuff -December 2009: +August: - Added support for IMAP, POP3 and SMTP + Public curl releases: 117 + Command line options: 138 + curl_easy_setopt() options: 180 + Public functions in libcurl: 58 + Known libcurl bindings: 39 + Contributors: 808 -January 2010: + Gopher support added (re-added actually) - Added support for RTSP +2012 +---- -February 2010: + July: Added support for Schannel (native Windows TLS backend) and Darwin SSL + (Native Mac OS X and iOS TLS backend). - security vulnerability: libcurl data callback excessive length + Supports metalink -March 2010: + October: SSH-agent support. - The project switched over to use git instead of CVS for source code control +2013 +---- -May 2010: + February: Cleaned up internals to always uses the "multi" non-blocking + approach internally and only expose the blocking API with a wrapper. - Added support for RTMP + September: First small steps on supporting HTTP/2 with nghttp2. - Added support for PolarSSL to do the SSL/TLS stuff + October: Removed krb4 support. -August 2010: + December: Happy eyeballs. - Public curl releases: 117 - Command line options: 138 - curl_easy_setopt() options: 180 - Public functions in libcurl: 58 - Known libcurl bindings: 39 - Contributors: 808 +2014 +---- - Gopher support added (re-added actually) + March: first real release supporting HTTP/2 + + September: Web site had 245,000 unique visitors and served 236GB data diff --git a/docs/INSTALL b/docs/INSTALL index 4140359..30dec53 100644 --- a/docs/INSTALL +++ b/docs/INSTALL @@ -20,9 +20,10 @@ Building from git If you get your code off a git repository, see the GIT-INFO file in the root directory for specific instructions on how to proceed. -UNIX +Unix ==== - A normal unix installation is made in three or four steps (after you've + + A normal Unix installation is made in three or four steps (after you've unpacked the source archive): ./configure @@ -115,18 +116,6 @@ UNIX ./configure --disable-thread - To build curl with kerberos4 support enabled, curl requires the krb4 libs - and headers installed. You can then use a set of options to tell - configure where those are: - - --with-krb4-includes[=DIR] Specify location of kerberos4 headers - --with-krb4-libs[=DIR] Specify location of kerberos4 libs - --with-krb4[=DIR] where to look for Kerberos4 - - In most cases, /usr/athena is the install prefix and then it works with - - ./configure --with-krb4=/usr/athena - If you're a curl developer and use gcc, you might want to enable more debug options with the --enable-debug option. @@ -148,8 +137,8 @@ UNIX To build with axTLS for SSL/TLS, use both --without-ssl and --with-axtls. - To get GSSAPI support, build with --with-gssapi and have the MIT or - Heimdal Kerberos 5 packages installed. + To build with GSS-API support, use --with-gssapi and have the MIT Kerberos + or Heimdal packages installed. To get support for SCP and SFTP, build with --with-libssh2 and have libssh2 0.16 or later installed. @@ -159,6 +148,7 @@ UNIX SPECIAL CASES ------------- + Some versions of uClibc require configuring with CPPFLAGS=-D_GNU_SOURCE=1 to get correct large file support. @@ -167,7 +157,6 @@ UNIX ./configure CC=owcc AR="$WATCOM/binl/wlib" AR_FLAGS=-q \ RANLIB=/bin/true STRIP="$WATCOM/binl/wstrip" CFLAGS=-Wextra - Win32 ===== @@ -199,7 +188,6 @@ Win32 If you get linkage errors read section 5.7 of the FAQ document. - MingW32 ------- @@ -221,7 +209,7 @@ Win32 environment variables, for example: set ZLIB_PATH=c:\zlib-1.2.8 - set OPENSSL_PATH=c:\openssl-0.9.8y + set OPENSSL_PATH=c:\openssl-0.9.8zc set LIBSSH2_PATH=c:\libssh2-1.4.3 ATTENTION: if you want to build with libssh2 support you have to use latest @@ -246,7 +234,6 @@ Win32 - optional recent Novell CLDAP SDK available from: http://developer.novell.com/ndk/cldap.htm - Cygwin ------ @@ -264,8 +251,10 @@ Win32 MSVC 6 caveats -------------- - If you use MSVC 6 it is required that you use the February 2003 edition PSDK: - http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm + If you use MSVC 6 it is required that you use the February 2003 edition of + the 'Platform SDK' which can be downloaded from: + + http://www.microsoft.com/en-us/download/details.aspx?id=12261 Building any software with MSVC 6 without having PSDK installed is just asking for trouble down the road once you have released it, you might notice @@ -273,8 +262,6 @@ Win32 choice of static vs dynamic runtime and third party libraries. Anyone using software built in such way will at some point regret having done so. - When someone uses MSVC 6 without PSDK he is using a compiler back from 1998. - If the compiler has been updated with the installation of a service pack as those mentioned in http://support.microsoft.com/kb/194022 the compiler can be safely used to read source code, translate and make it object code. @@ -284,13 +271,6 @@ Win32 header files and libraries with bugs and security issues which have already been addressed and fixed long time ago. - In order to make use of the updated system headers and fixed libraries - for MSVC 6, it is required that 'Platform SDK', PSDK from now onwards, - is installed. The specific PSDK that must be installed for MSVC 6 is the - February 2003 edition, which is the latest one supporting the MSVC 6 compiler, - this PSDK is also known as 'Windows Server 2003 PSDK' and can be downloaded - from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm - So, building curl and libcurl with MSVC 6 without PSDK is absolutely discouraged for the benefit of anyone using software built in such environment. And it will not be supported in any way, as we could just @@ -337,7 +317,7 @@ Win32 Before running nmake define the OPENSSL_PATH environment variable with the root/base directory of OpenSSL, for example: - set OPENSSL_PATH=c:\openssl-0.9.8y + set OPENSSL_PATH=c:\openssl-0.9.8zc Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root directory. 'nmake vc-ssl' will create a libcurl static and dynamic @@ -352,39 +332,18 @@ Win32 at runtime. Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. - MSVC 6 IDE - ---------- - - A minimal VC++ 6.0 reference workspace (vc6curl.dsw) is available with the - source distribution archive to allow proper building of the two included - projects, the libcurl library and the curl tool. - - 1) Open the vs/vc6/vc6curl.dsw workspace with MSVC6's IDE. - 2) Select 'Build' from top menu. - 3) Select 'Batch Build' from dropdown menu. - 4) Make sure that the eight project configurations are 'checked'. - 5) Click on the 'Build' button. - 6) Once the eight project configurations are built you are done. - - Dynamic and static libcurl libraries are built in debug and release flavours, - and can be located each one in its own subdirectory, dll-debug, dll-release, - lib-debug and lib-release, all of them below the 'vs/vc6/lib' subdirectory. + MSVC IDE + -------- - In the same way four curl executables are created, each using its respective - library. The resulting curl executables are located in its own subdirectory, - dll-debug, dll-release, lib-debug and lib-release, below 'vs/vc6/src' subdir. + A fairly comprehensive set of Visual Studio project files are available for + v6.0 through v12.0 and are located in the projects folder to allow proper + building of both the libcurl library as well as the curl tool. - These reference VC++ 6.0 configurations are generated using the dynamic CRT. - - Intentionally, these reference VC++ 6.0 projects and configurations don't use - third party libraries, such as OpenSSL or Zlib, to allow proper compilation - and configuration for all new users without further requirements. - - If you need something more 'involved' you might adjust them for your own use, - or explore the world of makefiles described above 'MSVC from command line'. + For more information about these projects and building via Visual Studio + please see the README file located in the projects folder. Borland C++ compiler - --------------------- + -------------------- Ensure that your build environment is properly set up to use the compiler and associated tools. PATH environment variable must include the path to @@ -429,7 +388,6 @@ Win32 is required, as well as the OpenSSL libeay32.lib and ssleay32.lib libraries. - OTHER MSVC IDEs --------------- @@ -440,7 +398,6 @@ Win32 Make the sources in the src/ drawer be a "win32 console application" project. Name it curl. - Disabling Specific Protocols in Win32 builds -------------------------------------------- @@ -459,16 +416,21 @@ Win32 CURL_DISABLE_FILE disables FILE CURL_DISABLE_TFTP disables TFTP CURL_DISABLE_HTTP disables HTTP + CURL_DISABLE_IMAP disables IMAP + CURL_DISABLE_POP3 disables POP3 + CURL_DISABLE_SMTP disables SMTP - If you want to set any of these defines you have the following - possibilities: + 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 lib/Makefile.vc6 - - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions - in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project. + - 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 -------------------------------------------------------------------- @@ -480,8 +442,12 @@ Win32 - Modify lib/config-win32.h and src/config-win32.h - Modify lib/Makefile.vc6 - - Add definition to Project/Settings/C/C++/General/Preprocessor Definitions - in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project. + - 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 @@ -505,9 +471,9 @@ Win32 add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for dynamic import symbols. - Apple iOS and Mac OS X ====================== + On recent 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 @@ -537,9 +503,9 @@ Apple iOS and Mac OS X ./configure --with-darwinssl make - IBM OS/2 ======== + Building under OS/2 is not much different from building under unix. You need: @@ -567,9 +533,9 @@ IBM OS/2 If you're getting huge binaries, probably your makefiles have the -g in CFLAGS. - VMS === + (The VMS section is in whole contributed by the friendly Nico Baggus) Curl seems to work with FTP & HTTP other protocols are not tested. (the @@ -614,6 +580,7 @@ VMS the name can be fetched from external or internal message libraries Error code - the err codes assigned by the application Sev. - severity: Even = error, off = non error + 0 = Warning 1 = Success 2 = Error @@ -635,12 +602,13 @@ VMS Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2 So far for porting notes as of: + 13-jul-2001 N. Baggus - QNX === + (This section was graciously brought to us by David Bentham) As QNX is targeted for resource constrained environments, the QNX headers @@ -651,11 +619,12 @@ QNX A good all-round solution to this is to override the default when building libcurl, by overriding CFLAGS during configure, example - # configure CFLAGS='-DFD_SETSIZE=64 -g -O2' + # configure CFLAGS='-DFD_SETSIZE=64 -g -O2' RISC OS ======= + The library can be cross-compiled using gccsdk as follows: CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \ @@ -665,9 +634,9 @@ RISC OS where riscos-gcc and riscos-ar are links to the gccsdk tools. You can then link your program with curl/lib/.libs/libcurl.a - AmigaOS ======= + (This section was graciously brought to us by Diego Casorran) To build cURL/libcurl on AmigaOS just type 'make amiga' ... @@ -687,10 +656,11 @@ AmigaOS To enable SSL support, you need a OpenSSL native version (without ixemul), you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/ - NetWare ======= + To compile curl.nlm / libcurl.nlm you need: + - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. - gnu make and awk running on the platform you compile on; native Win32 versions can be downloaded from: @@ -731,9 +701,9 @@ NetWare the status of these builds can be viewed at the autobuild table: http://curl.haxx.se/dev/builds.html - eCos ==== + curl does not use the eCos build system, so you must first build eCos separately, then link curl to the resulting eCos library. Here's a sample configure line to do so on an x86 Linux box targeting x86: @@ -801,9 +771,9 @@ eCos config.errors = stderr; /* default errors to stderr */ - Minix ===== + curl can be compiled on Minix 3 using gcc or ACK (starting with ver. 3.1.3). Ensure that GNU gawk and bash are both installed and available in the PATH. @@ -833,9 +803,9 @@ Minix make chmem =256000 src/curl - Symbian OS ========== + The Symbian OS port uses the Symbian build system to compile. From the packages/Symbian/group/ directory, run: @@ -846,9 +816,9 @@ Symbian OS SDK doesn't include support for P.I.P.S., you will need to contact your SDK vendor to obtain that first. - VxWorks ======== + Build for VxWorks is performed using cross compilation. That means you build on Windows machine using VxWorks tools and run the built image on the VxWorks device. @@ -872,13 +842,15 @@ VxWorks As a result the libcurl.a library should be created in the 'lib' folder. To clean the build results type 'make -f ./Makefile.vxworks clean'. - Android ======= + Method using the static makefile: + - see the build notes in the packages/Android/Android.mk file. Method using a configure cross-compile (tested with Android NDK r7c, r8): + - prepare the toolchain of the Android NDK for standalone use; this can be done by invoking the script: ./build/tools/make-standalone-toolchain.sh @@ -900,7 +872,8 @@ Android found in your automake folder: find /usr -name config.sub - Wrapper for pkg-config + Wrapper for pkg-config: + - In order to make proper use of pkg-config so that configure is able to find all dependencies you should create a wrapper script for pkg-config; file /opt/arm-linux-androideabi-4.4.3/bin/arm-linux-androideabi-pkg-config: @@ -914,9 +887,9 @@ Android also create a copy or symlink with name arm-unknown-linux-androideabi-pkg-config. - CROSS COMPILE ============= + (This section was graciously brought to us by Jim Duey, with additions by Dan Fandrich) @@ -962,9 +935,9 @@ CROSS COMPILE ./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 @@ -993,6 +966,7 @@ REDUCING SIZE --disable-verbose (eliminates debugging strings and error code strings) --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) @@ -1000,6 +974,7 @@ REDUCING SIZE 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" \ LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" @@ -1011,9 +986,9 @@ REDUCING SIZE .comment section). Using these techniques it is possible to create a basic HTTP-only shared - libcurl library for i386 Linux platforms that is only 106 KiB in size, and - an FTP-only library that is 108 KiB in size (as of libcurl version 7.27.0, - using gcc 4.6.3). + libcurl library for i386 Linux platforms that is only 114 KiB in size, and + an FTP-only library that is 115 KiB in size (as of libcurl version 7.35.0, + using gcc 4.8.2). You may find that statically linking libcurl to your application will result in a lower total size than dynamically linking. @@ -1025,13 +1000,12 @@ REDUCING SIZE command line. Following is a list of appropriate key words: --disable-cookies !cookies - --disable-crypto-auth !HTTP\ Digest\ auth !HTTP\ proxy\ Digest\ auth --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! diff --git a/docs/INTERNALS b/docs/INTERNALS index 66e11a4..f8b1b47 100644 --- a/docs/INTERNALS +++ b/docs/INTERNALS @@ -14,6 +14,7 @@ INTERNALS 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 easier spotted and tracked @@ -33,7 +34,7 @@ Portability 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): - OpenSSL 0.9.6 + OpenSSL 0.9.7 GnuTLS 1.2 zlib 1.1.4 libssh2 0.16 @@ -41,11 +42,13 @@ Portability libidn 0.4.1 cyassl 2.0.0 openldap 2.0 - MIT krb5 lib 1.2.4 - qsossl V5R3M0 - NSS 3.12.x + MIT Kerberos 1.2.4 + GSKit V5R3M0 + NSS 3.14.x axTLS 1.2.7 + PolarSSL 1.3.0 Heimdal ? + nghttp2 0.6.0 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 @@ -249,7 +252,9 @@ Library Kerberos - The kerberos support is mainly in lib/krb4.c and lib/security.c. + 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 & socks_sspi.c for SOCKS5 proxy specifics. TELNET @@ -259,10 +264,18 @@ Library 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, @@ -300,7 +313,7 @@ Persistent Connections o 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 the cache. If the cache is full already when a new - conncetion is added added, it will first close the oldest unused one. + connection is added added, it will first close the oldest unused one. o 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. @@ -337,10 +350,10 @@ SSL libraries 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 sslgen.[ch] system, and they are the only SSL - functions we must use from within libcurl. sslgen is then crafted to use the + function API as provided by the 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. + use. For example vtls/openssl.[ch] for the OpenSSL library. Library Symbols =============== diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS index 7bd6e6e..7788567 100644 --- a/docs/KNOWN_BUGS +++ b/docs/KNOWN_BUGS @@ -3,43 +3,56 @@ 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 since this was written! -83. curl is unable to load non-default openssl engines, because openssl isn't - initialized properly. This seems to require OpenSSL_config() or - CONF_modules_load_file() to be used by libcurl but the first seems to not - work and we've gotten not reports from tests with the latter. Possibly we - need to discuss with OpenSSL developers how this is supposed to be done. We - need users with actual external openssl engines for testing to work on this. - http://curl.haxx.se/bug/view.cgi?id=1208 +88. libcurl doesn't support CURLINFO_FILETIME for SFTP transfers and thus + curl's -R option also doesn't work then. + +87. -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. + http://curl.haxx.se/bug/view.cgi?id=1294 + +86. 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. + +85. 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. + http://curl.haxx.se/bug/view.cgi?id=1213 + +84. CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS + backends, so relying on this information in a generic app is flaky. 82. When building with the Windows Borland compiler, it fails because the "tlib" tool doesn't support hyphens (minus signs) in file names and we have such in the build. http://curl.haxx.se/bug/view.cgi?id=1222 -81. When using -J (with -O), automaticly 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 +81. 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! http://curl.haxx.se/bug/view.cgi?id=1169 80. Curl doesn't recognize certificates in DER format in keychain, but it works with PEM. - http://curl.haxx.se/bug/view.cgi?id=3439999 + http://curl.haxx.se/bug/view.cgi?id=1065 79. SMTP. When sending data to multiple recipients, curl will abort and return failure if one of the recipients indicate failure (on the "RCPT TO" command). Ordinary mail programs would proceed and still send to the ones that can receive data. This is subject for change in the future. - http://curl.haxx.se/bug/view.cgi?id=3438362 + http://curl.haxx.se/bug/view.cgi?id=1116 78. curl and libcurl don't always signal the client properly when "sending" zero bytes files - it makes for example the command line client not creating any file at all. Like when using FTP. - http://curl.haxx.se/bug/view.cgi?id=3438362 - -77. CURLOPT_FORBID_REUSE on a handle prevents NTLM from working since it - "abuses" the underlying connection re-use system and if connections are - forced to close they break the NTLM support. + http://curl.haxx.se/bug/view.cgi?id=1063 76. The SOCKET type in Win64 is 64 bits large (and thus so is curl_socket_t on that platform), and long is only 32 bits. It makes it impossible for @@ -47,12 +60,12 @@ may have been fixed since this was written! option as for all other operating systems. 75. NTLM authentication involving unicode user name or password only works - properly if built with UNICODE defined together with the schannel/winssl + properly if built with UNICODE defined together with the WinSSL/schannel backend. The original problem was mentioned in: http://curl.haxx.se/mail/lib-2009-10/0024.html - http://curl.haxx.se/bug/view.cgi?id=2944325 + http://curl.haxx.se/bug/view.cgi?id=896 - The schannel version verified to work as mentioned in + The WinSSL/schannel version verified to work as mentioned in http://curl.haxx.se/mail/lib-2012-07/0073.html 73. if a connection is made to a FTP server but the server then just never @@ -60,7 +73,7 @@ may have been fixed since this was written! 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: - http://curl.haxx.se/bug/view.cgi?id=2844077 + http://curl.haxx.se/bug/view.cgi?id=856 72. "Pausing pipeline problems." http://curl.haxx.se/mail/lib-2009-07/0214.html @@ -78,7 +91,7 @@ may have been fixed since this was written! http://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 66. When using telnet, the time limitation options don't work. - http://curl.haxx.se/bug/view.cgi?id=2818950 + http://curl.haxx.se/bug/view.cgi?id=846 65. 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 @@ -109,7 +122,7 @@ may have been fixed since this was written! 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 - http://curl.haxx.se/bug/view.cgi?id=2006544 + http://curl.haxx.se/bug/view.cgi?id=748 55. 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 @@ -133,12 +146,12 @@ may have been fixed since this was written! protocol code. This should be very rare. 43. There seems to be a problem when connecting to the Microsoft telnet server. - http://curl.haxx.se/bug/view.cgi?id=1720605 + http://curl.haxx.se/bug/view.cgi?id=649 41. 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: - http://curl.haxx.se/bug/view.cgi?id=1693337 + http://curl.haxx.se/bug/view.cgi?id=635 39. Steffen Rumler's Race Condition in Curl_proxyCONNECT: http://curl.haxx.se/mail/lib-2007-01/0045.html @@ -151,28 +164,15 @@ may have been fixed since this was written! 34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts. Also see #12. According to bug #1556528, even the SOCKS5 connect code does - not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528, + not do it right: http://curl.haxx.se/bug/view.cgi?id=604 31. "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. -30. You need to use -g to the command line tool in order to use RFC2732-style - IPv6 numerical addresses in URLs. - -29. IPv6 URLs with zone ID is not nicely supported. - http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt (expired) - specifies the use of a plus sign instead of a percent when specifying zone - IDs in URLs to get around the problem of percent signs being - special. According to the reporter, Firefox deals with the URL _with_ a - percent letter (which seems like a blatant URL spec violation). - libcurl supports zone IDs where the percent sign is URL-escaped (i.e. %25). - - See http://curl.haxx.se/bug/view.cgi?id=1371118 - 26. 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 http://curl.haxx.se/bug/view.cgi?id=1281867 + to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=535 23. SOCKS-related problems: B) libcurl doesn't support FTPS over a SOCKS proxy. @@ -200,7 +200,7 @@ may have been fixed since this was written! 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). + anyway (e.g., Unix pathnames may not contain NUL). 14. Test case 165 might fail on a system which has libidn present, but with an old iconv version (2.1.3 is a known bad version), since it doesn't recognize @@ -215,10 +215,10 @@ may have been fixed since this was written! acknowledged after the actual TCP connect (during the SOCKS "negotiate" phase). -10. To get HTTP Negotiate authentication to work fine, 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. - http://curl.haxx.se/bug/view.cgi?id=1004841. How? +10. To get HTTP Negotiate (SPNEGO) authentication to work fine, 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. + http://curl.haxx.se/bug/view.cgi?id=440 How? http://curl.haxx.se/mail/lib-2004-08/0182.html 8. Doing resumed upload over HTTP does not work with '-C -', because curl diff --git a/docs/LIBCURL-STRUCTS b/docs/LIBCURL-STRUCTS index 20f2d34..136d17c 100644 --- a/docs/LIBCURL-STRUCTS +++ b/docs/LIBCURL-STRUCTS @@ -47,7 +47,7 @@ for older and later versions as things don't change drastically that often. ->mstate is the multi state of this particular SessionHandle. 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 - speicific SessionHandle when curl_multi_fdset() is called etc. + specific SessionHandle when curl_multi_fdset() is called etc. The libcurl source code generally use the name 'data' for the variable that points to the SessionHandle. @@ -60,7 +60,7 @@ for older and later versions as things don't change drastically that often. re-use an existing one instead of creating a new as it creates a significant performance boost. - Each 'connectdata' identifies a single physical conncetion to a server. If + 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. @@ -158,18 +158,18 @@ for older and later versions as things don't change drastically that often. ->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 entier DO sequence to complete, ->doing is then usually + 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 issudeing the transfer request command(s) + ->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 doring the DO_MORE state. The FTP protocol uses this + ->do_more gets called during the DO_MORE state. The FTP protocol uses this state when setting up the second connection. ->proto_getsock diff --git a/docs/LICENSE-MIXING b/docs/LICENSE-MIXING index f596546..a53835c 100644 --- a/docs/LICENSE-MIXING +++ b/docs/LICENSE-MIXING @@ -21,9 +21,7 @@ announcement clause that collides with GPL. libcurl http://curl.haxx.se/docs/copyright.html Uses an MIT (or Modified BSD)-style license that is as liberal as - possible. Some of the source files that deal with KRB4 have Original - BSD-style announce-clause licenses. You may not distribute binaries - with krb4-enabled libcurl that also link with GPL-licensed code! + possible. OpenSSL http://www.openssl.org/source/license.html @@ -70,14 +68,6 @@ zlib http://www.gzip.org/zlib/zlib_license.html (Used for compressed Transfer-Encoding support) Uses an MIT-style license that shouldn't collide with any other library. -krb4 - - While nothing in particular says that a Kerberos4 library must use any - particular license, the one I've tried and used successfully so far - (kth-krb4) is partly Original BSD-licensed with the announcement - clause. Some of the code in libcurl that is written to deal with - Kerberos4 is Modified BSD-licensed. - MIT Kerberos http://web.mit.edu/kerberos/www/dist/ (May be used for GSS support) MIT licensed, that shouldn't collide @@ -94,12 +84,6 @@ GNU GSS http://www.gnu.org/software/gss/ may not distribute binary curl packages that uses this if you build curl to also link and use any Original BSD licensed libraries! -fbopenssl - - (Used for SPNEGO support) Unclear license. Based on its name, I assume - that it uses the OpenSSL license and thus shares the same issues as - described for OpenSSL above. - libidn http://josefsson.org/libidn/ (Used for IDNA support) Uses the GNU Lesser General Public diff --git a/docs/MAIL-ETIQUETTE b/docs/MAIL-ETIQUETTE index ae1821a..fb50312 100644 --- a/docs/MAIL-ETIQUETTE +++ b/docs/MAIL-ETIQUETTE @@ -14,6 +14,7 @@ MAIL ETIQUETTE 1.5 Moderation of new posters 1.6 Handling trolls and spam 1.7 How to unsubscribe + 1.8 I posted, now what? 2. Sending mail 2.1 Reply or New Mail @@ -105,7 +106,7 @@ MAIL ETIQUETTE No matter what, we NEVER EVER respond to trolls or spammers on the list. If you believe the list admin should do something particular, contact him/her off-list. The subject will be taken care of as good as possible to prevent - repeated offences, but responding on the list to such messages never lead to + repeated offenses, but responding on the list to such messages never lead to anything good and only puts the light even more on the offender: which was the entire purpose of it getting to the list in the first place. @@ -125,6 +126,42 @@ MAIL ETIQUETTE You NEVER EVER email the mailing list requesting someone else to get 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. 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 + thousand 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 have to wait + for a response and you must 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 in details enough to allow others to help point out the problem + or repeat the same steps in their places. + + Failing to include details will only delay responses and make people respond + and ask for the details and you 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 will greatly diminish. + 2. Sending mail diff --git a/docs/MANUAL b/docs/MANUAL index 4ad2e13..113df20 100644 --- a/docs/MANUAL +++ b/docs/MANUAL @@ -41,16 +41,27 @@ SIMPLE USAGE Get a file from an SSH server using SFTP: - curl -u username sftp://shell.example.com/etc/issue + curl -u username sftp://example.com/etc/issue - Get a file from an SSH server using SCP using a private key to authenticate: + Get a file from an SSH server using SCP using a private key + (not password-protected) to authenticate: - curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \ - scp://shell.example.com/~/personal.txt + 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 -g "http://[2001:1890:1112:1::20]/" + 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 @@ -91,10 +102,13 @@ USING PASSWORDS SFTP / SCP - This is similar to FTP, but you can 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. If you - provide a private key file you must also provide a public key file. + 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 @@ -108,10 +122,10 @@ USING PASSWORDS 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. 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. + 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 @@ -218,6 +232,11 @@ UPLOADING 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: @@ -956,9 +975,9 @@ IPv6 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 and the percent - character must be URL escaped. The previous example in an SFTP URL might - look like: + 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]/ diff --git a/docs/Makefile.am b/docs/Makefile.am index 8466a6c..1f92911 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -37,7 +37,8 @@ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \ - MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS + MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE \ + SSL-PROBLEMS MAN2HTML= roffit < $< >$@ diff --git a/docs/Makefile.in b/docs/Makefile.in index 43a3729..49f9338 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -21,7 +21,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -272,6 +272,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -296,7 +297,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -305,7 +305,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -326,6 +325,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -361,11 +361,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -436,7 +438,8 @@ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \ - MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS + MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE \ + SSL-PROBLEMS MAN2HTML = roffit < $< >$@ SUFFIXES = .1 .html .pdf diff --git a/docs/README.netware b/docs/README.netware index 41da2e8..12065f3 100644 --- a/docs/README.netware +++ b/docs/README.netware @@ -10,7 +10,7 @@ README.netware 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 continously growing share of + While not being the main development target, a continuously growing share of curl users are NetWare-based, specially also consuming the lib from PHP. The unix-style man pages are tricky to read on windows, so therefore are all diff --git a/docs/RELEASE-PROCEDURE b/docs/RELEASE-PROCEDURE new file mode 100644 index 0000000..2f85b3f --- /dev/null +++ b/docs/RELEASE-PROCEDURE @@ -0,0 +1,94 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +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. + +- 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 tag 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) + +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 +======================= + +Basics +------ + +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 very 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. + +Coming dates +------------ + +Based on the description above, here are some planned release dates (at the +time of this writing): + +- November 5, 2014 (version 7.39.0) +- December 31, 2014 +- February 25, 2015 +- April 22, 2015 +- June 17, 2015 +- August 12, 2015 +- October 7, 2015 +- December 2, 2015 diff --git a/docs/SECURITY b/docs/SECURITY new file mode 100644 index 0000000..ee844d8 --- /dev/null +++ b/docs/SECURITY @@ -0,0 +1,107 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +curl security for developers +============================ + +This document is intended to provide guidance to curl developers on how +security vulnerabilities should be handled. + +Publishing Information +---------------------- + +All known and public curl or libcurl related vulnerabilities are listed on +[the curl web site security page](http://curl.haxx.se/docs/security.html). + +Security vulnerabilities should not be entered in the project's public bug +tracker unless the necessary configuration is in place to limit access to the +issue to only the reporter and the project's security team. + +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 + privately to `curl-security@haxx.se`. That's an email alias that reaches 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 sends an e-mail to the original reporter to + acknowledge 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 synced with an upcoming release that contains the fix. If the + reporter, or anyone else, thinks the next planned release is too far away + then a separate earlier release for security reasons 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. + +- Request a CVE number from distros@openwall[1] when also informing and + preparing them for the upcoming public security vulnerability announcement - + attach the advisory draft for information. Note that 'distros' won't accept + an embargo longer than 19 days. + +- 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. + +- At the day of the next 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 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. + +[1] = http://oss-security.openwall.org/wiki/mailing-lists/distros + +CURL-SECURITY (at haxx dot se) +------------------------------ + +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 partipants public mostly because it tends to vary +somewhat over time and a list somewhere will only risk getting outdated. diff --git a/docs/SSL-PROBLEMS b/docs/SSL-PROBLEMS new file mode 100644 index 0000000..7ee4d14 --- /dev/null +++ b/docs/SSL-PROBLEMS @@ -0,0 +1,67 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +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. + +SSL 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! + +SSL 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. + + References: + + http://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. diff --git a/docs/SSLCERTS b/docs/SSLCERTS index e6b05c3..89e5bb6 100644 --- a/docs/SSLCERTS +++ b/docs/SSLCERTS @@ -1,23 +1,46 @@ - Peer SSL Certificate Verification - ================================= +SSL Certificate Verification +============================ -(NOTE: If libcurl was built with Schannel or Secure Transport support, 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.) +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 cert bundle 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 CA cert bundle that the SSL library can use to make sure the peer's server certificate is valid. -If you communicate with HTTPS or FTPS servers using certificates that are -signed by CAs present in the bundle, you can be sure that the remote server -really is the one it claims to be. - -Until 7.18.0, curl bundled a severely outdated ca bundle file that was -installed by default. These days, the curl archives include no ca certs at -all. You need to get them elsewhere. See below for example. +If you communicate with HTTPS, FTPS or other TLS-using servers using +certificates that are signed by CAs present in the bundle, 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 bundle, if the server uses a certificate signed by a CA that isn't @@ -26,13 +49,13 @@ 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); + `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); + libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAPATH, capath);` With the curl command line tool: --cacert [file] @@ -46,32 +69,32 @@ server, do one of the following: If you use Internet Explorer, this is one way to get extract the CA cert for a particular server: - o View the certificate by double-clicking the padlock - o Find out where the CA certificate is kept (Certificate> + - View the certificate by double-clicking the padlock + - Find out where the CA certificate is kept (Certificate> Authority Information Access>URL) - o Get a copy of the crt file using curl - o Convert it from crt to PEM using the openssl tool: + - 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 - o Append the 'outcert.pem' to the CA cert bundle or use it stand-alone + - Append the 'outcert.pem' to the CA cert bundle 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: - o openssl s_client -connect xxxxx.com:443 |tee logfile - o type "QUIT", followed by the "ENTER" key - o The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE" + - `openssl s_client -connect xxxxx.com:443 |tee logfile` + - type "QUIT", followed by the "ENTER" key + - The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE" markers. - o If you want to see the data in the certificate, you can do: "openssl + - 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. - o If you want to trust the certificate, you can append it to your - cert_bundle or use it stand-alone as described. Just remember that the + - If you want to trust the certificate, you can append it to your + cert bundle 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 + 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 @@ -86,9 +109,7 @@ server, do one of the following: 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: - - http://curl.haxx.se/docs/caextract.html + way for you: [CA Extract](http://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 @@ -96,35 +117,29 @@ cert bundle, will cause SSL to report an error ("certificate verify failed") during the handshake and SSL will then refuse further communication with that server. - Peer SSL Certificate Verification with NSS - ========================================== +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. This library is missing in OpenSuSE, and -without it, NSS can only work with its own internal formats. NSS also has a new -database format: https://wiki.mozilla.org/NSS_Shared_DB - -Starting with version 7.19.7, libcurl will check for the NSS version it runs, -and automatically add the 'sql:' prefix to the certdb directory (either the -hardcoded default /etc/pki/nssdb or the directory configured with SSL_DIR -environment variable) if version 3.12.0 or later is detected. To check which -ertdb 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, modsec.db. - -Usually these cert databases are empty, but NSS also has built-in CAs which are -provided through a shared library, libnssckbi.so; if you want to use these -built-in CAs, then create a symlink to libnssckbi.so in /etc/pki/nssdb: -ln -s /usr/lib[64]/libnssckbi.so /etc/pki/nssdb/libnssckbi.so - - Peer SSL Certificate Verification with Schannel and Secure Transport - ==================================================================== - -If libcurl was built with Schannel (Microsoft's TLS/SSL engine) or Secure -Transport (Apple's TLS/SSL engine) support, then libcurl will still perform +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. This library is missing in +OpenSuSE, and without it, NSS can only work with its own internal formats. 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) diff --git a/docs/THANKS b/docs/THANKS index 693139b..0887881 100644 --- a/docs/THANKS +++ b/docs/THANKS @@ -4,11 +4,14 @@ If you have contributed but are missing here, please let us know! +Aaro Koskinen Aaron Oneal Aaron Orenstein +Abram Pousada Adam D. Moss Adam Light Adam Piggott +Adam Sampson Adam Tkac Adrian Schuur Adriano Meirelles @@ -19,7 +22,7 @@ Alan Pinstein Albert Chin-A-Young Albert Choy Ale Vesely -Alejandro Alvarez +Alejandro Alvarez Ayllon Aleksandar Milivojevic Aleksey Tulinov Alessandro Ghedini @@ -27,6 +30,7 @@ Alessandro Vesely Alex Bligh Alex Fishman Alex Gruz +Alex McLellan Alex Neblett Alex Suykov Alex Vinnik @@ -44,6 +48,7 @@ Alexey Zakhlestin Alexis Carvalho Alfred Gebert Allen Pulsifer +Alona Rossen Amol Pattekar Amr Shahin Anatoli Tubman @@ -51,6 +56,7 @@ Anders Gustafsson Anders Havn Andi Jahja Andre Guibert de Bruet +Andre Heinecke Andreas Damm Andreas Faerber Andreas Farber @@ -62,7 +68,8 @@ Andreas Schuldei Andreas Wurf Andrei Benea Andrei Cipu -Andres Garcia +Andrei Kurushin +Andrej E Baranov Andrew Benham Andrew Biggs Andrew Bushnell @@ -78,6 +85,7 @@ Andy Cedilnik Andy Serpa Andy Tsouladze Angus Mackay +Anthon Pang Anthony Bryan Anthony G. Basile Antoine Calando @@ -91,12 +99,17 @@ Arnaud Compan Arnaud Ebalard Arthur Murray Arve Knudsen +Arvid Norberg +Ask Bjørn Hansen +Askar Safin Ates Goral Augustus Saunders Avery Fay Axel Tillequin Balaji Parasuram +Balaji Salunke Balint Szilakszi +Barry Abrahamson Bart Whiteley Bas Mevissen Ben Darnell @@ -109,12 +122,16 @@ Benbuck Nason Benjamin Gerard Benjamin Gilbert Benjamin Johnson +Benoit Neil +Benoit Sigoure Bernard Leak Bernhard Reutner-Fischer Bertrand Demiddelaer +Bill Doyle Bill Egert Bill Hoffman Bill Middlecamp +Bill Nagel Bjoern Sikora Bjorn Augustsson Bjorn Reese @@ -127,7 +144,9 @@ Bogdan Nicula Brad Burdick Brad Hards Brad King +Brad Spencer Bradford Bruce +Brandon Casey Brandon Wang Brendan Jurd Brent Beardsley @@ -138,6 +157,7 @@ Brian R Duffy Brian Ulm Brock Noland Bruce Mitchener +Bruno Thomsen Bruno de Carvalho Bryan Henderson Bryan Kemp @@ -145,22 +165,25 @@ Byrial Jensen Cameron Kaiser Camille Moncelier Caolan McNamara +Carlo Wood Carsten Lange Casey O'Donnell -Cedric Deltheil +Catalin Patulea Chad Monroe Chandrakant Bagul Charles Kerr +Chen Prog Chih-Chung Chang Chris "Bob Bob" Chris Combes -Chris Conroy +Chris Conlon Chris Deidun Chris Flerackers Chris Gaukroger Chris Maltby Chris Mumford Chris Smowton +Chris Young Christian Grothoff Christian Hägele Christian Krause @@ -181,6 +204,9 @@ Clarence Gardner Clemens Gruber Clifford Wolf Cody Jones +Cody Mack +Colby Ranger +Colin Blair Colin Hogben Colin Watson Colm Buckley @@ -194,8 +220,10 @@ Cristian Rodríguez Curt Bogmine Cyrill Osterwalder Cédric Deltheil +D. Flinkmann Dag Ekengren Dagobert Michelsen +Damian Dixon Damien Adant Dan Becker Dan C @@ -221,6 +249,7 @@ Dave Halbakken Dave Hamilton Dave May Dave Reisner +Dave Thompson Dave Vasilevsky David Bau David Binderman @@ -237,21 +266,31 @@ David Kimdon David Lang David LeBlanc David McCreedy +David Meyer David Odin David Phillips David Rosenstrauch +David Ryskalczyk David Shaw David Strauss David Tarendash David Thiel +David Walser +David Woodhouse David Wright David Yan Dengminwen +Dennis Clarke +Derek Higgins Detlef Schmier Didier Brisebourg Diego Casorran +Dilyan Palauzov Dima Barsky +Dima Tisnek +Dimitar Boevski Dimitre Dimitrov +Dimitrios Siganos Dimitris Sarris Dinar Dirk Eddelbuettel @@ -259,6 +298,7 @@ Dirk Manske Dmitri Shubin Dmitriy Sergeyev Dmitry Bartsevich +Dmitry Falko Dmitry Kurochkin Dmitry Popov Dmitry Rechkin @@ -274,13 +314,13 @@ Douglas R. Horner Douglas Steinwand Dov Murik Duane Cathey -Duncan Duncan Mac-Vicar Prett Dustin Boswell Dylan Ellicott Dylan Salisbury Early Ehlinger Ebenezer Ikonne +Ed Morley Edin Kadribasic Eduard Bloch Edward Rudd @@ -289,6 +329,7 @@ Eelco Dolstra Eetu Ojanen Eldar Zaitov Ellis Pritchard +Elmira A Semenova Emanuele Bovisio Emil Romanus Emiliano Ida @@ -298,6 +339,7 @@ Eric Cooper Eric Hu Eric Landes Eric Lavigne +Eric Lubin Eric Melville Eric Mertens Eric Rautman @@ -308,20 +350,26 @@ Eric Wong Eric Young Erick Nuwendam Erik Johansson +Ernest Beinrohr Erwan Legrand Erwin Authried +Ethan Glasser Camp Eugene Kotlyarov Evan Jordan Evgeny Turnaev Eygene Ryabinkin +Fabian Frank Fabian Hiernaux Fabian Keil Fabrizio Ammollo Fedor Karpelevitch +Felix Yan Felix von Leitner Feng Tu Florian Schoppmann +Florian Weimer Forrest Cahoon +Frank Gevaerts Frank Hempel Frank Keeney Frank McGeough @@ -329,6 +377,7 @@ Frank Meier Frank Ticheler Frank Van Uffelen František Kučera +François Charlier Fred Machado Fred New Fred Noz @@ -342,11 +391,14 @@ Gautam Kachroo Gautam Mani Gavrie Philipson Gaz Iqbal +Gaël Portay +Geoff Beier Georg Horn Georg Huettenegger Georg Lippitsch Georg Wicherski Gerd v. Egidy +Gergely Nagy Gerhard Herre Gerrit Bruchhäuser Ghennadi Procopciuc @@ -359,21 +411,27 @@ Gilles Blanc Gisle Vanem Giuseppe Attardi Giuseppe D'Ambrosio +Glen A Johnson Jr. Glen Nakamura Glen Scott -Gokhan Sengun +Glenn Sheridan +Gordon Marler +Gorilla Maguila Grant Erickson Greg Hewgill Greg Morse Greg Onufer +Greg Pratt Greg Zavertnik Grigory Entin Guenole Bescon Guenter Knauf Guido Berhoerster Guillaume Arluison +Gunter Knauf Gustaf Hui Gwenole Beauchesne +Gökhan Şengün Götz Babin-Ebell Hamish Mackenzie Hang Kin Lau @@ -382,10 +440,14 @@ Hanno Kranzhoff Hans Steegers Hans-Jurgen May Hardeep Singh +Haris Okanovic Harshal Pradhan Hauke Duden +He Qin Heikki Korpela Heinrich Ko +Heinrich Schaefer +Helwing Lutz Hendrik Visage Henrik Storner Henry Ludemann @@ -395,6 +457,7 @@ Ho-chi Chen Hoi-Ho Chan Hongli Lai Howard Chu +Hubert Kario Hzhijun Ian D Allen Ian Ford @@ -406,6 +469,7 @@ Ignacio Vazquez-Abrams Igor Franchuk Igor Novoseltsev Igor Polyakov +Iida Yosiaki Ilguiz Latypov Ilja van Sprundel Immanuel Gregoire @@ -413,15 +477,18 @@ Ingmar Runge Ingo Ralf Blum Ingo Wilken Ishan SinghLevett +Ivo Bellin Salarin Jack Zhang Jacky Lam Jacob Meuser Jacob Moshenko Jad Chamcham +Jakub Zakrzewski James Bursa James Cheng James Clancy James Cone +James Dury James Gallagher James Griffiths James Housley @@ -436,11 +503,13 @@ Jan Schaumann Jan Van Boghout Jared Jennings Jared Lundell +Jari Aalto Jari Sundell Jason Glasgow Jason Liu Jason McDonald Jason S. Priebe +Javier Barroso Jay Austin Jayesh A Shah Jaz Fresh @@ -449,19 +518,24 @@ Jean-Claude Chauve Jean-Francois Bertrand Jean-Louis Lemaire Jean-Marc Ranger -Jean-Noel Rouvignac +Jean-Noël Rouvignac Jean-Philippe Barrette-LaPierre Jeff Connelly +Jeff Hodges Jeff Johnson +Jeff King Jeff Lawson Jeff Phillips Jeff Pohlmeyer Jeff Weber -Jeffrey Pohlmeyer Jeremy Friesner Jeremy Huddleston +Jeremy Lin +Jeroen Koekkoek Jerome Muffat-Meridol +Jerome Robert Jerome Vouillon +Jerry Krinock Jerry Wu Jes Badwal Jesper Jensen @@ -473,6 +547,7 @@ Jim Hollinger Jim Meyering Jiri Hruska Jiri Jaburek +Jiri Malak Jocelyn Jaubert Joe Halpin Joe Malicki @@ -483,9 +558,12 @@ Johan Anderson Johan Nilsson Johan van Selst Johannes Bauer +Johannes Ernst John Bradshaw +John Coffey John Crow John Dennis +John Dunn John E. Malmberg John Gardiner Myers John Janssen @@ -503,14 +581,18 @@ Johnny Luong Jon Grubbs Jon Nelson Jon Sargeant +Jon Torrey Jon Travis Jon Turner Jonas Forsman Jonas Schnelli Jonatan Lander +Jonatan Vela +Jonathan Cardoso Machado Jonathan Hseu Jonathan Nieder Jongki Suwandi +Jose Alf Jose Kahan Josef Wolf Josh Kapell @@ -530,15 +612,16 @@ Jun-ichiro itojun Hagino Jurij Smakov Justin Fletcher Justin Karneges +Justin Maggard Jörg Mueller-Tolk Jörn Hartroth +K. R. Walker Kai Engert Kai Sommerfeld Kai-Uwe Rommel Kalle Vahlman Kamil Dudka Kang-Jin Lee -Karl M Karl Moerder Karol Pietrzak Kaspar Brand @@ -569,10 +652,13 @@ Krishnendu Majumdar Krister Johansen Kristian Gunstone Kristian Köhntopp +Kyle L. Huff Kyle Sallee Lachlan O'Dea Larry Campbell Larry Fahnoe +Larry Lin +Larry Stone Lars Buitinck Lars Gustafsson Lars J. Aas @@ -583,12 +669,16 @@ Lau Hang Kin Laurent Rabret Legoff Vincent Lehel Bernadt +Leif W Len Krause Lenaic Lefever Lenny Rachitsky +Leon Winter +Leonardo Rosati Liam Healy Lijo Antony Linas Vepstas +Lindley French Ling Thio Linus Nielsen Feltzing Lisa Xu @@ -596,21 +686,28 @@ Liza Alenchery Lluís Batlle i Rossell Loic Dachary Loren Kirkby +Luan Cestari Luca Altea -Luca Alteas Lucas Adamski +Lucas Pardue +Ludek Finstrle Ludovico Cavedon Lukasz Czekierda Luke Amery Luke Call +Luke Dashjr Luong Dinh Dung +Lyndon Hill Maciej Karpiuk +Maciej Puzio Maciej W. Rozycki +Maks Naumov Mamoru Tasaka Mandy Wu Manfred Schwarb Manuel Massing Marc Boucher +Marc Deslauriers Marc Doughty Marc Hoersken Marc Kleine-Budde @@ -618,6 +715,7 @@ Marcel Raad Marcel Roelofs Marcelo Juchem Marcin Adamski +Marcin Gryszkalis Marcin Konicki Marco G. Salvagno Marco Maggi @@ -655,6 +753,7 @@ Mateusz Loskot Mathias Axelsson Mats Lidell Matt Arsenault +Matt Ford Matt Kraai Matt Veenstra Matt Witherspoon @@ -672,6 +771,7 @@ Maxim Prohorov Maxime Larocque Mehmet Bozkurt Mekonikum +Melissa Mears Mettgut Jamalla Michael Benedict Michael Calmer @@ -683,15 +783,17 @@ Michael Jahn Michael Jerris Michael Mealling Michael Mueller +Michael Osipov Michael Smith Michael Stillwell Michael Wallner Michal Bonino -Michal Gorny -Michal Kowalczyk Michal Marek +Michał Górny +Michał Kowalczyk Michele Bini Miguel Angel +Miguel Diaz Mihai Ionescu Mikael Johansson Mikael Sennerholm @@ -699,17 +801,22 @@ Mike Bytnar Mike Crowe Mike Dobbs Mike Giancola +Mike Hasselberg +Mike Henshaw Mike Hommey +Mike Mio Mike Power Mike Protts Mike Revi Miklos Nemeth +Miroslav Spousta Mitz Wark Mohamed Lrhazi +Mohammad AlSaleh Mohun Biswas -Moonesamy Myk Taylor Nach M. S. +Nagai H Nathan Coulter Nathan O'Sullivan Nathanael Nerode @@ -740,10 +847,12 @@ Nodak Sodak Norbert Frese Norbert Novotny Ofer +Ola Mork Olaf Flebbe -Olaf Stueben Olaf Stüben Oliver Gondža +Oliver Kuckertz +Oliver Schindler Olivier Berger Oren Tirosh Ori Avtalion @@ -751,23 +860,30 @@ Oscar Koeroo Oscar Norlander P R Schaffner Paolo Piacentini +Paras Sethia Pascal Terjan Pasha Kuznetsov +Pasi Karkkainen Pat Ray Patrice Guerin Patricia Muscalu Patrick Bihan-Faou +Patrick McManus Patrick Monnerat Patrick Scott Patrick Smith +Patrick Watson Patrik Thunstrom Pau Garcia i Quiles +Paul Donohue Paul Harrington Paul Howarth +Paul Marks Paul Marquis Paul Moore Paul Nolan Paul Querna +Paul Saab Pavel Cenek Pavel Orehov Pavel Raiskup @@ -775,7 +891,6 @@ Pawel A. Gajda Pawel Kierski Pedro Larroy Pedro Neves -Pete Su Peter Bray Peter Forret Peter Gal @@ -790,8 +905,13 @@ Peter Su Peter Sylvester Peter Todd Peter Verhas +Peter Wang +Peter Wu Peter Wullinger Peteris Krumins +Petr Bahula +Petr Novak +Petr Pisar Phil Blundell Phil Karn Phil Lisiecki @@ -809,12 +929,16 @@ Pierre Joye Pierre Ynard Pooyan McSporran Pramod Sharma +Prash Dush +Priyanka Shah Puneet Pawaia Quagmire Quanah Gibson-Mount Quinn Slack +Radu Simionescu Rafa Muyo Rafael Sagula +Rafaël Carré Rainer Canavan Rainer Jung Rainer Koenig @@ -827,7 +951,9 @@ Randy McMurchy Ravi Pratap Ray Dassen Ray Pekowski +Ray Satiro Reinout van Schouwen +Remi Gacogne Renato Botelho Renaud Chaillat Renaud Duhaut @@ -846,11 +972,13 @@ Richard Clayton Richard Cooper Richard Gorton Richard Michael +Richard Moore Richard Prescott Richard Silverman Rick Jones Rick Richardson Rob Crittenden +Rob Davies Rob Jones Rob Stanzel Rob Ward @@ -868,6 +996,7 @@ Robin Johnson Robin Kay Robson Braga Araujo Rodney Simmons +Rodric Glaser Rodrigo Silva Roland Blom Roland Krikava @@ -875,20 +1004,23 @@ Roland Zimmermann Rolland Dudemaine Roman Koifman Roman Mamedov +Romulo A. Ceccon +Ron Parker Ron Zapp Rosimildo da Silva Roy Shan Rune Kleveland Ruslan Gazizov Rutger Hofman +Ryan Braud Ryan Chan Ryan Nelson Ryan Schmidt +Rémy Léone S. Moonesamy Salvador Dávila Salvatore Sorrentino Sam Deane -Sam Listopad Sampo Kellomaki Samuel Díaz García Samuel Listopad @@ -899,6 +1031,7 @@ Santhana Todatry Saqib Ali Sara Golemon Saran Neti +Sascha Swiercy Saul good Scott Bailey Scott Barrett @@ -906,14 +1039,16 @@ Scott Cantor Scott Davis Scott McCreary Sebastian Rasmussen -Sebastien Willemijns Senthil Raja Velu Sergei Nikulov +Sergey Tatarincev Sergio Ballestrero Seshubabu Pasam Sh Diao +Shao Shuchao Sharad Gupta Shard +Shawn Landden Shawn Poulson Shmulik Regev Siddhartha Prakash Jain @@ -926,6 +1061,7 @@ Song Ma Sonia Subramanian Spacen Jasset Spiridonoff A.V +Spork Schivago Stadler Stephan Stan van de Burgt Stanislav Ivochkin @@ -935,6 +1071,7 @@ Stefan Neis Stefan Teleman Stefan Tomanek Stefan Ulrich +Steinar H. Gunderson Stephan Bergmann Stephen Collyer Stephen Kick @@ -954,9 +1091,11 @@ Steven Gu Steven M. Schweda Steven Parkes Stoned Elipot +Sune Ahlgren Sven Anders Sven Neuhaus Sven Wegener +Symeon Paraschoudis Sébastien Willemijns T. Bharath T. Yamada @@ -964,12 +1103,15 @@ Taneli Vahakangas Tanguy Fautre Tatsuhiro Tsujikawa Temprimus +Thomas Braun Thomas J. Moore Thomas Klausner Thomas L. Shinnick Thomas Lopatic Thomas Schwinge Thomas Tonino +Tiit Pikma +Till Maas Tim Ansell Tim Baker Tim Bartley @@ -978,9 +1120,12 @@ Tim Costello Tim Harder Tim Heckman Tim Newsome +Tim Ruehsen Tim Sneddon +Tim Starling Timo Sirainen Tinus van den Berg +Tobias Markus Tobias Rundström Toby Peterson Todd A Ouska @@ -995,8 +1140,10 @@ Tom Mattison Tom Moers Tom Mueller Tom Regner +Tom Sparrow Tom Wright Tom Zerucha +Tomas Hoger Tomas Mlcoch Tomas Pospisek Tomas Szepe @@ -1014,12 +1161,18 @@ Traian Nicolescu Troels Walsted Hansen Troy Engel Tupone Alfredo +Tyler Hall +Török Edwin Ulf Härnhammar +Ulf Samuelsson Ulrich Doehner +Ulrich Telle Ulrich Zadow Venkat Akella Victor Snezhko +Vijay Panghal Vikram Saxena +Viktor Szakáts Vilmos Nebehaj Vincent Bronner Vincent Le Normand @@ -1033,6 +1186,7 @@ Vladimir Lazarenko Vojtech Janota Vojtech Minarik Vsevolod Novikov +Waldek Kozba Walter J. Mack Ward Willats Wayne Haigh @@ -1041,15 +1195,22 @@ Wesley Laxton Wesley Miaw Wez Furlong Wilfredo Sanchez +Will Dietz Willem Sparreboom +William Ahern Wojciech Zwiefka Wouter Van Rooy Wu Yongzheng Xavier Bouchoux -Yamada Yasuharu +Yaakov Selkowitz Yang Tse Yarram Sunil +Yasuharu Yamada +Yehezkel Horowitz Yehoshua Hershberg +Yi Huang +Yingwei Liu +Yousuke Kimoto Yukihiro Kawada Yuriy Sosov Yves Arrouye @@ -1061,3 +1222,4 @@ Zvi Har'El nk swalkaus at yahoo.com tommink[at]post.pl +Никита Дорохин diff --git a/docs/TODO b/docs/TODO index 8b133dc..2b5a4c2 100644 --- a/docs/TODO +++ b/docs/TODO @@ -16,29 +16,34 @@ 1.3 struct lifreq 1.4 signal-based resolver timeouts 1.5 get rid of PATH_MAX - 1.6 Happy Eyeball dual stack connect - 1.7 Modified buffer size approach + 1.6 Modified buffer size approach + 1.7 Detect when called from within callbacks + 1.8 Allow SSL (HTTPS) to proxy + 1.9 Cache negative name resolves 2. libcurl - multi interface 2.1 More non-blocking 2.2 Fix HTTP Pipelining for PUT + 2.3 Better support for same name resolves 3. Documentation - 3.1 More and better + 3.1 Update date and version in man pages 4. FTP 4.1 HOST 4.2 Alter passive/active on failure and retry 4.3 Earlier bad letter detection 4.4 REST for large files - 4.5 FTP proxy support - 4.6 ASCII support + 4.5 ASCII support + 4.6 GSSAPI via Windows SSPI + 4.7 STAT for LIST without data connection 5. HTTP 5.1 Better persistency for HTTP 1.0 5.2 support FF3 sqlite cookie files 5.3 Rearrange request header order - 5.4 HTTP2/SPDY + 5.4 SPDY + 5.5 auth= in URLs 6. TELNET 6.1 ditch stdin @@ -48,17 +53,14 @@ 7. SMTP 7.1 Pipelining - 7.2 Graceful base64 decoding failure - 7.3 Enhanced capability support + 7.2 Enhanced capability support 8. POP3 8.1 Pipelining - 8.2 Graceful base64 decoding failure - 8.3 Enhanced capability support + 8.2 Enhanced capability support 9. IMAP - 9.1 Graceful base64 decoding failure - 9.2 Enhanced capability support + 9.1 Enhanced capability support 10. LDAP 10.1 SASL based authentication mechanisms @@ -73,9 +75,8 @@ 12.4 Cache OpenSSL contexts 12.5 Export session ids 12.6 Provide callback for cert verification - 12.7 Support other SSL libraries - 12.8 improve configure --with-ssl - 12.9 Support DANE + 12.7 improve configure --with-ssl + 12.8 Support DANE 13. GnuTLS 13.1 SSL engine stuff @@ -83,6 +84,7 @@ 14. SASL 14.1 Other authentication mechanisms + 14.2 Add QOP support to GSSAPI authentication 15. Client 15.1 sync @@ -90,9 +92,7 @@ 15.3 prevent file overwriting 15.4 simultaneous parallel transfers 15.5 provide formpost headers - 15.6 url-specific options - 15.7 warning when setting an option - 15.8 IPv6 addresses with globbing + 15.6 warning when setting an option 16. Build 16.1 roffit @@ -102,9 +102,10 @@ 17.2 nicer lacking perl message 17.3 more protocols supported 17.4 more platforms supported + 17.5 Add support for concurrent connections 18. Next SONAME bump - 18.1 http-style HEAD output for ftp + 18.1 http-style HEAD output for FTP 18.2 combine error codes 18.3 extend CURLOPT_SOCKOPTFUNCTION prototype @@ -134,7 +135,7 @@ 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. + To support IPv6 interface addresses for network interfaces properly. 1.4 signal-based resolver timeouts @@ -157,19 +158,7 @@ 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.6 Happy Eyeball dual stack connect - - In order to make alternative technologies not suffer when transitioning, like - when introducing IPv6 as an alternative to IPv4 and there are more than one - option existing simultaneously there are reasons to reconsider internal - choices. - - To make libcurl do blazing fast IPv6 in a dual-stack configuration, this needs - to be addressed: - - http://tools.ietf.org/html/rfc6555 - -1.7 Modified buffer size approach +1.6 Modified buffer size approach Current libcurl allocates a fixed 16K size buffer for download and an additional 16K for upload. They are always unconditionally part of the easy @@ -190,6 +179,26 @@ Dynamically allocate buffer size depending on protocol in use in combination with freeing it after each individual transfer? Other suggestions? +1.7 Detect when called from within callbacks + + We should set a state variable before calling callbacks, so that we + subsequently can add code within libcurl that returns error if called within + callbacks for when that's not supported. + +1.8 Allow SSL (HTTPS) to proxy + + To prevent local users from snooping on your traffic to the proxy. Supported + by Chrome already: + http://www.chromium.org/developers/design-documents/secure-web-proxy + + ...and by Firefox soon: + https://bugzilla.mozilla.org/show_bug.cgi?id=378637 + +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. + 2. libcurl - multi interface @@ -213,20 +222,31 @@ serial requests and currently libcurl only supports that for HEAD and GET requests but it should also be possible for PUT. +2.3 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. + + 3. Documentation -3.1 More and better +3.1 Update date and version in man pages - Exactly + 'maketgz' or another suitable script could update the .TH sections of the man + pages at release time to use the current date and curl/libcurl version + number. 4. FTP 4.1 HOST - HOST is a suggested command in the works for a client to tell which host name - to use, to offer FTP servers named-based virtual hosting: + HOST is a command for a client to tell which host name to use, to offer FTP + servers named-based virtual hosting: - http://tools.ietf.org/html/draft-hethmon-mcmurray-ftp-hosts-11 + http://tools.ietf.org/html/rfc7151 4.2 Alter passive/active on failure and retry @@ -237,7 +257,7 @@ 4.3 Earlier bad letter detection - Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the + 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.4 REST for large files @@ -246,17 +266,25 @@ the server doesn't set the pointer to the requested index. The tricky (impossible?) part is to figure out if the server did the right thing or not. -4.5 FTP proxy support - - Support the most common FTP proxies, Philip Newton provided a list allegedly - from ncftp. This is not a subject without debate, and is probably not really - suitable for libcurl. http://curl.haxx.se/mail/archive-2003-04/0126.html - -4.6 ASCII support +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: http://www.nsftools.com/tips/RawFTP.htm#STAT + +This is not detailed in any FTP specification. + 5. HTTP 5.1 Better persistency for HTTP 1.0 @@ -282,24 +310,25 @@ headers use a default value so only headers that need to be moved have to be specified. -5.4 HTTP2/SPDY +5.4 SPDY + + Chrome and Firefox already support SPDY and lots of web services do. There's + a library for us to use for this (spdylay) that has a similar API and the + same author as nghttp2. - The first drafts for HTTP2 have been published - (http://tools.ietf.org/html/draft-ietf-httpbis-http2-03) and is so far based - on SPDY (http://www.chromium.org/spdy) designs and experiences. Chances are - it will end up in that style. Chrome and Firefox already support SPDY and - lots of web services do. + spdylay: https://github.com/tatsuhiro-t/spdylay - It would make sense to implement SPDY support now and later transition into - or add HTTP2 support as well. +5.5 auth= in URLs - We should base or HTTP2/SPDY work on a 3rd party library for the protocol - fiddling. The Spindy library (http://spindly.haxx.se/) was an attempt to make - such a library with an API suitable for use by libcurl but that effort has - more or less stalled. spdylay (https://github.com/tatsuhiro-t/spdylay) may - be a better option, either used directly or wrapped with a more spindly-like - API. + 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 @@ -331,14 +360,7 @@ to provide the data to send. Add support for pipelining emails. -7.2 Graceful base64 decoding failure - - Rather than shutting down the session and returning an error when the - decoding of a base64 encoded authentication response fails, we should - gracefully shutdown the authentication process by sending a * response to the - server as per RFC4954. - -7.3 Enhanced capability support +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. @@ -349,28 +371,14 @@ to provide the data to send. Add support for pipelining commands. -8.2 Graceful base64 decoding failure - - Rather than shutting down the session and returning an error when the - decoding of a base64 encoded authentication response fails, we should - gracefully shutdown the authentication process by sending a * response to the - server as per RFC5034. - -8.3 Enhanced capability support +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 Graceful base64 decoding failure - - Rather than shutting down the session and returning an error when the - decoding of a base64 encoded authentication response fails, we should - gracefully shutdown the authentication process by sending a * response to the - server as per RFC3501. - -9.2 Enhanced capability support +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. @@ -382,7 +390,7 @@ to provide the data to send. 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 specifing the security context + be possible to use ldap_bind_s() instead specifying the security context information ourselves. 11. New protocols @@ -413,7 +421,7 @@ to provide the data to send. 12.4 Cache 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 + 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 @@ -434,17 +442,12 @@ to provide the data to send. 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! -12.7 Support other SSL libraries - - Make curl's SSL layer capable of using other free SSL libraries. Such as - MatrixSSL (http://www.matrixssl.org/). - -12.8 improve configure --with-ssl +12.7 improve configure --with-ssl make the configure --with-ssl option first check for OpenSSL, then GnuTLS, then NSS... -12.9 Support DANE +12.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. @@ -471,7 +474,15 @@ to provide the data to send. 14.1 Other authentication mechanisms - Add support for GSSAPI to SMTP, POP3 and IMAP. + Add support for other authentication mechanisms such as EXTERNAL, OLP, + GSS-SPNEGO and others. + +14.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). 15. Client @@ -518,33 +529,12 @@ to provide the data to send. which should overwrite the program reasonable defaults (plain/text, 8bit...) -15.6 url-specific options - - Provide a way to make options bound to a specific URL among several on the - command line. Possibly by letting ':' separate options between URLs, - similar to this: - - curl --data foo --url url.com : \ - --url url2.com : \ - --url url3.com --data foo3 - - (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html) - - The example would do a POST-GET-POST combination on a single command line. - -15.7 warning when setting an option +15.6 warning when setting an option Display a warning when libcurl returns an error when setting an option. This can be useful to tell when support for a particular feature hasn't been compiled into the library. -15.8 IPv6 addresses with globbing - - Currently the command line client needs to get url globbing disabled (with - -g) for it to support IPv6 numerical addresses. This is a rather silly flaw - that should be corrected. It probably involves a smarter detection of the - '[' and ']' letters. - 16. Build 16.1 roffit @@ -567,7 +557,7 @@ to provide the data to send. 17.3 more protocols supported - Extend the test suite to include more protocols. The telnet could just do ftp + Extend the test suite to include more protocols. The telnet could just do FTP or http operations (for which we have test servers). 17.4 more platforms supported @@ -575,12 +565,26 @@ to provide the data to send. Make the test suite work on more platforms. OpenBSD and Mac OS. Remove fork()s and it should become even more portable. +17.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. + 18. Next SONAME bump -18.1 http-style HEAD output for ftp +18.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 + from being output in NOBODY requests over FTP 18.2 combine error codes @@ -614,7 +618,7 @@ to provide the data to send. for applications to differentiate on TCP vs UDP and even HTTP vs FTP and similar. -10. Next major release +19. Next major release 19.1 cleanup return codes @@ -678,7 +682,7 @@ to provide the data to send. 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 maintining a solid API and ABI. + allow us much greater freedoms while still maintaining a solid API and ABI. 19.9 have form functions use CURL handle argument @@ -692,7 +696,7 @@ to provide the data to send. 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 - specifing this data as the URL is non-standard and to be honest a bit of a + 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: diff --git a/docs/TheArtOfHttpScripting b/docs/TheArtOfHttpScripting index b0dab5f..7235f12 100644 --- a/docs/TheArtOfHttpScripting +++ b/docs/TheArtOfHttpScripting @@ -1,16 +1,72 @@ -Online: http://curl.haxx.se/docs/httpscripting.html -Date: Jan 19, 2011 - - The Art Of Scripting HTTP Requests Using Curl - ============================================= - - This document will assume that you're familiar with HTML and general - networking. - - The possibility to write scripts is essential to make a good computer - system. Unix' capability to be extended by shell scripts and various tools to - run various automated commands and scripts is one reason why it has succeeded - so well. +Updated: Dec 24, 2013 (http://curl.haxx.se/docs/httpscripting.html) + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +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 + 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 @@ -27,7 +83,7 @@ Date: Jan 19, 2011 to glue everything together using some kind of script language or repeated manual invokes. -1. The HTTP Protocol + 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 @@ -44,7 +100,7 @@ Date: Jan 19, 2011 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.1 See the Protocol + 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 @@ -59,13 +115,88 @@ Date: Jan 19, 2011 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 - http://curl.haxx.se or https://yourbank.com a million times. + http://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the + canonical spec. + + 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 situation, you can point out 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 operate 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 separate on 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 then is 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. GET a page +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 @@ -79,10 +210,23 @@ Date: Jan 19, 2011 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. You can also ask the remote server for ONLY the headers by using - the --head (-I) option (which will make curl issue a HEAD request). + 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. -4. Forms +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' @@ -95,7 +239,7 @@ Date: Jan 19, 2011 Of course there has to be some kind of program in the server end to receive the data you send. You cannot just invent something out of the air. - 4.1 GET + 4.2 GET A GET-form uses the method GET, as specified in HTML like: @@ -121,7 +265,7 @@ Date: Jan 19, 2011 curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" - 4.2 POST + 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 @@ -158,7 +302,7 @@ Date: Jan 19, 2011 curl --data-urlencode "name=I am Daniel" http://www.example.com - 4.3 File Upload POST + 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 @@ -179,7 +323,7 @@ Date: Jan 19, 2011 curl --form upload=@localfilename --form press=OK [URL] - 4.4 Hidden Fields + 4.5 Hidden Fields A very common way for HTML based application to pass state information between pages is to add hidden fields to the forms. Hidden fields are @@ -200,7 +344,7 @@ Date: Jan 19, 2011 curl --data "birthyear=1905&press=OK&person=daniel" [URL] - 4.5 Figure Out What A POST Looks Like + 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 @@ -213,7 +357,9 @@ Date: Jan 19, 2011 You will then clearly see the data get appended to the URL, separated with a '?'-letter as GET forms are supposed to. -5. PUT +5. HTTP upload + + 5.1 PUT The perhaps 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 @@ -225,6 +371,8 @@ Date: Jan 19, 2011 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 @@ -236,10 +384,14 @@ Date: Jan 19, 2011 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 @@ -253,6 +405,8 @@ Date: Jan 19, 2011 If you use any one 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 @@ -262,7 +416,9 @@ Date: Jan 19, 2011 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. Referer +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 @@ -276,7 +432,7 @@ Date: Jan 19, 2011 curl --referer http://www.example.come http://www.example.com -8. User Agent + 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 @@ -298,7 +454,9 @@ Date: Jan 19, 2011 curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] -9. Redirects +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 @@ -318,7 +476,16 @@ Date: Jan 19, 2011 only use POST in the first request, and then revert to GET in the following operations. -10. Cookies + 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 @@ -335,6 +502,8 @@ Date: Jan 19, 2011 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: @@ -351,7 +520,7 @@ Date: Jan 19, 2011 Curl has a full blown cookie parsing engine built-in that comes to use if you want to reconnect to a server and use cookies that were stored from a - previous connection (or handicrafted manually to fool the server into + 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: @@ -366,16 +535,18 @@ Date: Jan 19, 2011 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 do. It is a convenient way to share cookies - between browsers and automatic scripts. 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: + 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 -11. HTTPS +10. HTTPS + + 10.1 HTTPS is HTTP secure There are a few ways to do secure HTTP transfers. The by far most common protocol for doing this is what is generally known as HTTPS, HTTP over @@ -391,7 +562,7 @@ Date: Jan 19, 2011 curl https://secure.example.com - 11.1 Certificates + 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- @@ -413,7 +584,9 @@ Date: Jan 19, 2011 http://curl.haxx.se/docs/sslcerts.html -12. Custom Request Elements +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. @@ -434,7 +607,26 @@ Date: Jan 19, 2011 curl --header "Destination: http://nowhere" http://example.com -13. Web Login + 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 cause a lot of people problems so here's the executive run-down of how the vast majority of all login forms @@ -453,7 +645,7 @@ Date: Jan 19, 2011 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 browers and analyzing the + 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. @@ -463,7 +655,9 @@ Date: Jan 19, 2011 to do a proper login POST. Remember that the contents need to be URL encoded when sent in a normal POST. -14. Debug +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 @@ -473,35 +667,40 @@ Date: Jan 19, 2011 browser's requests: * Use the --trace-ascii option to store fully detailed logs of the requests - for easier analyzing and better understanding + 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) + --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. (See chapter 4.5 above) + 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). + (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.) -15. References +14. References + + 14.1 Standards RFC 2616 is a must to read if you want in-depth understanding of the HTTP - protocol. + protocol + + RFC 3986 explains the URL syntax - RFC 3986 explains the URL syntax. + RFC 1867 defines the HTTP post upload format - RFC 2109 defines how cookies are supposed to work. + RFC 6525 defines how HTTP cookies work - RFC 1867 defines the HTTP post upload format. + 14.2 Sites http://curl.haxx.se is the home of the cURL project diff --git a/docs/curl-config.pdf b/docs/curl-config.pdf index 429812f14ba25978c88f1454931b870372d5be9e..301530442805c4a9990020d2ae19fd946bf57357 100644 GIT binary patch delta 369 zcmZqBZ_wW`S3t-#HPy%@*(6anIn5|Z*U&IEZSs17xXB-d)UZoQO^z2d6E@W~Fw`}$ z2r;mF}as=E5SaRC4`xng<% delta 371 zcmZqBZ_wW`S3tl#=9 zQHX)1m5Hg9k)gJM(c~3^8d$|23tBQ7O_mjM!)0KBxf+}LU?CiLTOA?DpDvDCm QxJ*sVjJZ@*UH#p-09IgKo&W#< diff --git a/docs/curl.1 b/docs/curl.1 index 9e1a688..0b9971c 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -20,7 +20,7 @@ .\" * .\" ************************************************************************** .\" -.TH curl 1 "27 July 2012" "Curl 7.27.0" "Curl Manual" +.TH curl 1 "30 Nov 2014" "Curl 7.40.0" "Curl Manual" .SH NAME curl \- transfer a URL .SH SYNOPSIS @@ -30,8 +30,8 @@ curl \- transfer a URL .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, SMTP, SMTPS, TELNET and TFTP). The -command is designed to work without user interaction. +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 @@ -48,18 +48,20 @@ 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 + http://site.{one,two,three}.com or you can get sequences of alphanumeric series by using [] as in: - ftp://ftp.numericals.com/file[1-100].txt - ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) - ftp://ftp.letters.com/file[a-z].txt + ftp://ftp.numericals.com/file[1-100].txt + + ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) + + ftp://ftp.letters.com/file[a-z].txt Nested sequences are not supported, but you can use several ones next to each other: - http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html + http://any.org/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. @@ -67,8 +69,19 @@ in a sequential manner in the specified order. You can specify a step counter for the ranges to get every Nth number or letter: - http://www.numericals.com/file[1-100:10].txt - http://www.letters.com/file[a-z:2].txt + http://www.numericals.com/file[1-100:10].txt + + http://www.letters.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 @@ -103,6 +116,18 @@ any response data to the terminal. If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your friend. .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 @@ -112,30 +137,56 @@ same command line option.) .IP "-#, --progress-bar" Make curl display progress as a simple progress bar instead of the standard, more informational, meter. +.IP "-:, --next" +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. (Added in 7.36.0) .IP "-0, --http1.0" -(HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its -internally preferred: HTTP 1.1. +(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally +preferred: HTTP 1.1. +.IP "--http1.1" +(HTTP) Tells curl to use HTTP version 1.1. This is the internal default +version. (Added in 7.33.0) +.IP "--http2" +(HTTP) Tells curl to issue its requests using HTTP 2. This requires that the +underlying libcurl was built to support it. (Added in 7.33.0) +.IP "--no-npn" +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. + +(Added in 7.36.0) +.IP "--no-alpn" +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. + +(Added in 7.36.0) .IP "-1, --tlsv1" (SSL) -Forces curl to use TLS version 1 when negotiating with a remote TLS server. +Forces curl to use TLS version 1.x when negotiating with a remote TLS server. +You can use options \fI--tlsv1.0\fP, \fI--tlsv1.1\fP, and \fI--tlsv1.2\fP to +control the TLS version more precisely (if the SSL backend in use supports such +a level of control). .IP "-2, --sslv2" -(SSL) -Forces curl to use SSL version 2 when negotiating with a remote SSL server. +(SSL) 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. .IP "-3, --sslv3" -(SSL) -Forces curl to use SSL version 3 when negotiating with a remote SSL server. +(SSL) Forces curl to use SSL version 3 when negotiating with a remote SSL +server. Sometimes curl is built without SSLv3 support. .IP "-4, --ipv4" -If curl is capable of resolving an address to multiple IP versions (which it -is if it is IPv6-capable), this option tells curl to resolve names to IPv4 -addresses only. +This option tells curl to resolve names to IPv4 addresses only, and not for +example try IPv6. .IP "-6, --ipv6" -If curl is capable of resolving an address to multiple IP versions (which it -is if it is IPv6-capable), this option tells curl to resolve names to IPv6 -addresses only. +This option tells curl to resolve names to IPv6 addresses only, and not for +example try IPv4. .IP "-a, --append" -(FTP/SFTP) When used in an upload, this will tell curl to append to the target -file instead of overwriting it. If the file doesn't exist, it will be created. -Note that this flag is ignored by some SSH servers (including OpenSSH). +(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). .IP "-A, --user-agent " (HTTP) Specify the User-Agent string to send to the HTTP server. Some badly done CGIs fail if this field isn't set to "Mozilla/4.0". To encode blanks in @@ -156,10 +207,9 @@ 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. .IP "-b, --cookie " -(HTTP) -Pass the data to the HTTP server as a cookie. 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". +(HTTP) Pass the data to the HTTP server as a cookie. 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 line, it is treated as a filename to use to read previously stored cookie lines from, which should be used in this session @@ -169,26 +219,29 @@ in combination with the \fI-L, --location\fP option. The file format of the file to read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie file format. -\fBNOTE\fP that the file specified with \fI-b, --cookie\fP is only used as -input. No cookies will be stored in the file. To store cookies, use the -\fI-c, --cookie-jar\fP option or you could even save the HTTP headers to a file -using \fI-D, --dump-header\fP! +The file specified with \fI-b, --cookie\fP is only used as input. No cookies +will be written to the file. To store cookies, use the \fI-c, --cookie-jar\fP +option. If this option is used several times, the last one will be used. .IP "-B, --use-ascii" -(FTP/LDAP) Enable ASCII transfer. For FTP, this can also be -enforced by using an URL that ends with ";type=A". This option causes data -sent to stdout to be in text mode for win32 systems. +(FTP/LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using +an URL that ends with ";type=A". This option causes data sent to stdout to be +in text mode for win32 systems. .IP "--basic" -(HTTP) Tells curl to use HTTP Basic authentication. 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 \fI--ntlm\fP, -\fI--digest\fP, or \fI--negotiate\fP). +(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 \fI--ntlm\fP, \fI--digest\fP, or \fI--negotiate\fP). + +Used together with \fI-u, --user\fP and \fI-x, --proxy\fP. + +See also \fI--proxy-basic\fP. .IP "-c, --cookie-jar " (HTTP) Specify to which file you want curl to write all cookies after a completed operation. Curl writes all cookies previously read from a specified file as well as all cookies received from remote server(s). If no cookies are -known, no file will be written. The file will be written using the Netscape +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. @@ -228,11 +281,12 @@ If this option is used several times, the last one will be used. supports, and save the uncompressed document. If this option is used and the server sends an unsupported encoding, curl will report an error. .IP "--connect-timeout " -Maximum time in seconds that you allow the connection to the server to take. -This only limits the connection phase, once curl has connected this option is -of no more use. 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. See also the \fI-m, --max-time\fP option. +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. + +See also the \fI-m, --max-time\fP option. If this option is used several times, the last one will be used. .IP "--create-dirs" @@ -244,7 +298,9 @@ uses no dir or if the dirs it mentions already exist, no dir will be created. To create remote directories when using FTP or SFTP, try \fI--ftp-create-dirs\fP. .IP "--crlf" -(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). +Convert LF to CRLF in upload. Useful for MVS (OS/390). + +(SMTP added in 7.40.0) .IP "--crlfile " (HTTPS/FTPS) Provide a file using PEM format with a Certificate Revocation List that may specify peer certificates that are to be considered revoked. @@ -269,23 +325,23 @@ data pieces specified will be merged together with a separating 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. The -contents of the file must already be URL-encoded. Multiple files can also be -specified. Posting data from a file named 'foobar' would thus be done with -\fI--data @foobar\fP. +read the data from, or - if you want curl to read the data from +stdin. Multiple files can also be specified. Posting data from a file +named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is +told to read from a file like that, carriage returns and newlines will be +stripped out. .IP "-D, --dump-header " Write the 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 \fI-b, --cookie\fP option! The -\fI-c, --cookie-jar\fP option is however a better way to store cookies. +\fI-c, --cookie-jar\fP option is a better way to store cookies. 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. - .IP "--data-ascii " See \fI-d, --data\fP. .IP "--data-binary " @@ -294,7 +350,7 @@ whatsoever. If you start the data with the letter @, the rest should be a filename. Data is posted in a similar manner as \fI--data-ascii\fP does, except that newlines -are preserved and conversions are never done. +and carriage returns are preserved and conversions are never done. If this option is used several times, the ones following the first will append data as described in \fI-d, --data\fP. @@ -369,8 +425,41 @@ is an alias for \fB--disable-epsv\fP. Disabling EPSV only changes the passive behavior. If you want to switch to active mode you need to use \fI-P, --ftp-port\fP. +.IP "--dns-interface " +Tell curl to send outgoing DNS requests through . This option +is a counterpart to \fI--interface\fP (which does not affect DNS). The +supplied string must be an interface name (not an address). + +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. (Added in +7.33.0) +.IP "--dns-ipv4-addr " +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. + +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. (Added in +7.33.0) +.IP "--dns-ipv6-addr " +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. + +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. (Added in +7.33.0) +.IP "--dns-servers " +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. + +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. (Added in +7.33.0) .IP "-e, --referer " -(HTTP) Sends the "Referer Page" information to the HTTP server. This can also +(HTTP) Sends the "Referrer Page" information to the HTTP server. This can also be set with the \fI-H, --header\fP flag of course. When used with \fI-L, --location\fP you can append ";auto" to the --referer URL to make curl automatically set the previous URL when it follows a Location: header. The @@ -380,7 +469,8 @@ If this option is used several times, the last one will be used. .IP "-E, --cert " (SSL) 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 PEM format. If the optional password isn't specified, it will be queried +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 private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify them independently. @@ -396,9 +486,10 @@ recognized as password delimiter. If the nickname contains "\\", it needs to be escaped as "\\\\" so that it is not recognized as an escape character. (iOS and Mac OS X only) If curl is built against Secure Transport, then the -certificate string must match the name of a certificate that's in the system or -user keychain. The private key corresponding to the certificate, and -certificate chain (if any), must also be present in the keychain. +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. If this option is used several times, the last one will be used. .IP "--engine " @@ -448,12 +539,25 @@ OpenSSL-powered curl to make SSL-connections much more efficiently than using 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. +.IP "--pinnedpubkey " +(SSL) Tells curl to use the specified public key file to verify the peer. The +file must contain a single public key in PEM or DER format. + +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. + +This is currently only implemented in the OpenSSL, GnuTLS and GSKit backends. + +If this option is used several times, the last one will be used. +(Added in 7.39.0) .IP "-f, --fail" (HTTP) 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. +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 @@ -462,11 +566,11 @@ response codes will slip through, especially when authentication is involved (HTTP) 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. 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. +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. Example, to send your password file to the server, where \&'password' is the name of the form-field to which /etc/passwd will be the @@ -592,10 +696,10 @@ 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. .IP "-G, --get" -When used, this option will make all data specified with \fI-d, --data\fP or -\fI--data-binary\fP 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. +When used, this option will make all data specified with \fI-d, --data\fP, +\fI--data-binary\fP or \fI--data-urlencode\fP 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 -I, the POST data will instead be appended to the URL with a HEAD request. @@ -604,16 +708,16 @@ 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. .IP "-H, --header
" -(HTTP) Extra header to use when getting a web page. 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:". +(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 @@ -622,6 +726,13 @@ for you. See also the \fI-A, --user-agent\fP and \fI-e, --referer\fP options. +Starting in 7.37.0, you need \fI--proxy-header\fP to send custom headers +intended for a proxy. + +Example: + +\&# curl -H "X-First-Name: Joe" http://192.168.0.1/ + This option can be used multiple times to add/replace/remove multiple headers. .IP "--hostpubmd5 " (SCP/SFTP) Pass a string containing 32 hexadecimal digits. The string should @@ -657,6 +768,9 @@ cookies when they're closed down. (HTTP) This option tells the \fI-O, --remote-name\fP option to use the server-specified Content-Disposition filename instead of extracting a filename from the URL. + +There's no attempt to decode %-sequences (yet) in the provided file name, so +this option may provide you with rather unexpected file names. .IP "-k, --insecure" (SSL) This option explicitly allows curl to perform "insecure" SSL connections and transfers. All SSL connections are attempted to be made secure by using @@ -668,16 +782,21 @@ See this online resource for further details: .IP "-K, --config " Specify which config file to read curl arguments from. The config file is a text file in which command line arguments can be written which then will be -used as if they were written on the actual command line. Options and their -parameters must be specified on the same config file line, separated by -whitespace, colon, the equals sign or any combination thereof (however, -the preferred separator is the equals sign). If the parameter is to contain -whitespace, 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. +used as if they were written on the actual command line. + +Options and their parameters must be specified on the same config file line, +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 is to contain whitespace, 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 -K, --config as '-' to make curl read the file from stdin. @@ -688,21 +807,18 @@ line. So, it could look similar to this: url = "http://curl.haxx.se/docs/" -Long option names can optionally be given in the config file without the -initial double dashes. - When curl is invoked, it always (unless \fI-q\fP 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 +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 +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 @@ -731,7 +847,8 @@ If this option is used several times, the last one will be used. If unspecified, the option defaults to 60 seconds. .IP "--key " (SSL/SSH) Private key file name. Allows you to provide your private key in this -separate file. +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 this option is used several times, the last one will be used. .IP "--key-type " @@ -745,22 +862,29 @@ If this option is used several times, the last one will be used. 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. -This option requires a library built with kerberos4 or GSSAPI -(GSS-Negotiate) support. This is not very common. Use \fI-V, --version\fP to -see if your curl supports it. +This option requires a library built with kerberos4 support. This is not +very common. Use \fI-V, --version\fP to see if your curl supports it. If this option is used several times, the last one will be used. .IP "-l, --list-only" (FTP) -When listing an FTP directory, this switch forces a name-only view. -Especially useful if you want to machine-parse the contents of an FTP -directory since the normal directory view doesn't use a standard look -or format. - -This option causes an FTP NLST command to be sent. Some FTP servers -list only files in their response to NLST; they do not include -subdirectories and symbolic links. - +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 \fI-X, --request \fP, 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. (Added in 7.21.5) .IP "-L, --location" (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), @@ -776,6 +900,10 @@ When curl follows a redirect and the request is not a plain GET (for example POST or PUT), 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 the non-GET request method to GET after a 30x +response by using the dedicated options for that: \fI--post301\fP, +\fI--post302\fP and \fI-post303\fP. .IP "--libcurl " 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 @@ -784,9 +912,10 @@ of what your command-line operation does! If this option is used several times, the last given file name will be used. (Added in 7.16.1) .IP "--limit-rate " -Specify the maximum transfer rate you want curl to use. This feature is useful -if you have a limited pipe and you'd like your transfer not to use your entire -bandwidth. +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 @@ -821,6 +950,16 @@ timeout increases in decimal precision. See also the \fI--connect-timeout\fP option. If this option is used several times, the last one will be used. +.IP "--login-options " +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 (Added in +7.34.0). + +If this option is used several times, the last one will be used. .IP "--mail-auth
" (SMTP) Specify a single address. This will be used to specify the authentication address (identity) of a submitted message that is being relayed @@ -840,10 +979,18 @@ return with exit code 63. files this option has no effect even if the file transfer ends up being larger than this given limit. This concerns both FTP and HTTP transfers. .IP "--mail-rcpt
" -(SMTP) Specify a single address that the given mail should get sent to. This -option can be used multiple times to specify many recipients. +(SMTP) Specify a single address, user name or mailing list name. -(Added in 7.20.0) +When performing a mail transfer, the recipient should specify a valid email +address to send the mail to. (Added in 7.20.0) + +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) .IP "--max-redirs " Set maximum number of redirection-followings allowed. If \fI-L, --location\fP is used, this option can be used to prevent curl from following redirections @@ -879,7 +1026,7 @@ in Metalink file, hash check will fail. .IP "-n, --netrc" 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 +Unix. If used with HTTP, curl will enable user authentication. See .BR netrc(4) or .BR ftp(1) @@ -916,18 +1063,13 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage \fBoptional\fP and not mandatory as the \fI--netrc\fP option does. .IP "--negotiate" -(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was -designed by Microsoft and is used in their web applications. It is primarily -meant as a support for Kerberos5 authentication but may be also used along -with another authentication method. For more information see IETF draft -draft-brezak-spnego-http-04.txt. +(HTTP) Enables Negotiate (SPNEGO) authentication. -If you want to enable Negotiate for your proxy authentication, then use +If you want to enable Negotiate (SPNEGO) for proxy authentication, then use \fI--proxy-negotiate\fP. -This option requires a library built with GSSAPI support. This is -not very common. Use \fI-V, --version\fP to see if your version supports -GSS-Negotiate. +This option requires a library built with GSS-API or SSPI support. Use \fI-V, +--version\fP to see if your curl supports GSS-API/SSPI and SPNEGO. When using this option, you must also provide a fake \fI-u, --user\fP option to activate the authentication code properly. Sending a '-u :' is enough as the @@ -999,7 +1141,37 @@ Consequentially, the file will be saved in the current working directory. If you want the file saved in a different directory, make sure you change current working directory before you invoke curl with the \fB-O, --remote-name\fP flag! +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. +.IP "--oauth2-bearer" +(IMAP, POP3, SMTP) +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 +\fI--url\fP or \fI-u, --user\fP 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. +.IP "--proxy-header
" +(HTTP) 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 \fI-H, --header\fP 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. + +This option can be used multiple times to add/replace/remove multiple headers. + +(Added in 7.37.0) .IP "-p, --proxytunnel" When an HTTP proxy is used (\fI-x, --proxy\fP), this option will cause non-HTTP protocols to attempt to tunnel through the proxy instead of merely using it to @@ -1116,8 +1288,8 @@ the default authentication method curl uses with proxies. Tells curl to use HTTP Digest authentication when communicating with the given proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host. .IP "--proxy-negotiate" -Tells curl to use HTTP Negotiate authentication when communicating -with the given proxy. Use \fI--negotiate\fP for enabling HTTP Negotiate +Tells curl to use HTTP Negotiate (SPNEGO) authentication when communicating +with the given proxy. Use \fI--negotiate\fP for enabling HTTP Negotiate (SPNEGO) with a remote host. (Added in 7.17.1) .IP "--proxy-ntlm" Tells curl to use HTTP NTLM authentication when communicating with the given @@ -1134,6 +1306,11 @@ protocol instead of the default HTTP 1.1. 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.) .IP "-q" If used as the first parameter on the command line, the \fIcurlrc\fP config file will not be read and used. See the \fI-K, --config\fP for details on the @@ -1317,7 +1494,7 @@ option name can still be used but will be removed in a future version. .IP "--ssl-allow-beast" (SSL) 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 work-arounds known to cause interoperability problems with some older +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. (Added in 7.25.0) .IP "--socks4 " @@ -1380,7 +1557,7 @@ sockd/proxy-name --socks5 proxy-name \fI--socks5-gssapi-service\fP sockd/real-name would use sockd/real-name for cases where the proxy-name does not match the principal name. (Added in 7.19.4). .IP "--socks5-gssapi-nec" -As part of the gssapi negotiation a protection mode is negotiated. RFC 1961 +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 \fI--socks5-gssapi-nec\fP allows the unprotected exchange of the protection mode negotiation. (Added in 7.19.4). @@ -1436,14 +1613,26 @@ Set TLS authentication type. Currently, the only supported option is "SRP", for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are specified but \fI--tlsauthtype\fP is not, then this option defaults to "SRP". (Added in 7.21.4) -.IP "--tlsuser " -Set username for use with the TLS authentication method specified with -\fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also be set. (Added in -7.21.4) .IP "--tlspassword " Set password for use with the TLS authentication method specified with \fI--tlsauthtype\fP. Requires that \fI--tlsuser\fP also be set. (Added in 7.21.4) +.IP "--tlsuser " +Set username for use with the TLS authentication method specified with +\fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also be set. (Added in +7.21.4) +.IP "--tlsv1.0" +(SSL) +Forces curl to use TLS version 1.0 when negotiating with a remote TLS server. +(Added in 7.34.0) +.IP "--tlsv1.1" +(SSL) +Forces curl to use TLS version 1.1 when negotiating with a remote TLS server. +(Added in 7.34.0) +.IP "--tlsv1.2" +(SSL) +Forces curl to use TLS version 1.2 when negotiating with a remote TLS server. +(Added in 7.34.0) .IP "--tr-encoding" (HTTP) Request a compressed Transfer-Encoding response using one of the algorithms curl supports, and uncompress the data while receiving it. @@ -1473,24 +1662,44 @@ If this option is used several times, the last one will be used. .IP "--trace-time" Prepends a time stamp to each trace or verbose line that curl displays. (Added in 7.14.0) +.IP "--unix-socket " +(HTTP) Connect through this Unix domain socket, instead of using the +network. (Added in 7.40.0) .IP "-u, --user " Specify the user name and password to use for server authentication. Overrides \fI-n, --netrc\fP and \fI--netrc-optional\fP. -If you just give the user name (without entering a colon) curl will prompt for -a password. +If you simply specify the user name, curl will prompt for a password. + +The user name and passwords are split up on the first colon, which makes it +impossible to use a colon in the user name with this option. The password can, +still. -If you use an SSPI-enabled curl binary and do NTLM authentication, you can -force curl to pick up the user name and password from your environment by -simply specifying a single colon with this option: "-u :". +When using Kerberos V5 with a Windows based server you should include the +Windows domain name in the user name, in order for the server to succesfully +obtain a Kerberos Ticket. If you don't then the initial authentication +handshake may fail. + +When using NTLM, the user name can be specified simply as the user name, +without the domain, if there is a single domain and forest in your setup +for example. + +To specify the domain name use either Down-Level Logon Name or UPN (User +Principal Name) formats. For example, EXAMPLE\\user and user@example.com +respectively. + +If you use a Windows SSPI-enabled curl binary and perform Kerberos V5, +Negotiate, NTLM or Digest 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 :". If this option is used several times, the last one will be used. .IP "-U, --proxy-user " Specify the user name and password to use for proxy authentication. -If you use an SSPI-enabled curl binary and do NTLM authentication, you can -force curl to pick up the user name and password from your environment by -simply specifying a single colon with this option: "-U :". +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 :". If this option is used several times, the last one will be used. .IP "--url " @@ -1500,10 +1709,11 @@ URL(s) in a config file. This option may be used any number of times. To control where this URL is written, use the \fI-o, --output\fP or the \fI-O, --remote-name\fP options. .IP "-v, --verbose" -Makes the fetching more verbose/talkative. Mostly useful for debugging. A line -starting with '>' means "header data" sent by curl, '<' means "header data" -received by curl that is hidden in normal cases, and a line starting with '*' -means additional info provided by curl. +Be more verbose/talkative during the operation. Useful for debugging and +seeing what's going on "under the hood". A line starting with '>' means +"header data" sent by curl, '<' means "header data" received by curl that is +hidden in normal cases, and a line starting with '*' means additional info +provided by curl. Note that if you only want HTTP headers in the output, \fI-i, --include\fP might be the option you're looking for. @@ -1515,10 +1725,10 @@ This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP. Use \fI-s, --silent\fP to make curl quiet. .IP "-w, --write-out " -Defines what to display on stdout after a completed and successful -operation. The format is a string that may contain plain text mixed with any -number of variables. The string can be specified as "string", to get read from -a particular file you specify it "@filename" and to tell curl to read the +Make curl display information on stdout after a completed transfer. The format +is a string that may contain plain text mixed with any number of +variables. The format can be specified as a literal "string", or you can have +curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write "@-". The variables present in the output format will be substituted by the value or @@ -1643,8 +1853,16 @@ to follow location: headers. If this option is used several times, the last one will be used. .IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>" -Use the specified HTTP proxy. If the port number is not specified, it is -assumed at port 1080. +Use the specified proxy. + +The proxy string can 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, http:// and all others will be treated as HTTP proxies. (The +protocol support was added in curl 7.21.7) + +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 @@ -1663,11 +1881,6 @@ 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. -From 7.21.7, the proxy string may 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, http:// and all others will be treated as HTTP proxies. - If this option is used several times, the last one will be used. .IP "-X, --request " (HTTP) Specifies a custom request method to use when communicating with the @@ -1689,8 +1902,17 @@ option. Specifies a custom FTP command to use instead of LIST when doing file lists with FTP. -If this option is used several times, the last one will be used. +(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. .IP "--xattr" When saving output to a file, this option tells curl to store certain file metadata in extended file attributes. Currently, the URL is stored in the @@ -1727,7 +1949,8 @@ than the specified date/time. If this option is used several times, the last one will be used. .IP "-h, --help" -Usage help. +Usage help. This lists all current command line options with a short +description. .IP "-M, --manual" Manual. Display the huge help text. .IP "-V, --version" @@ -1747,29 +1970,32 @@ You can use IPv6 with this. .IP "krb4" Krb4 for FTP is supported. .IP "SSL" -HTTPS and FTPS are supported. +SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S +and so on. .IP "libz" Automatic decompression of compressed files over HTTP is supported. .IP "NTLM" NTLM authentication is supported. -.IP "GSS-Negotiate" -Negotiate authentication and krb5 for FTP is supported. .IP "Debug" This curl uses a libcurl built with Debug. This enables more error-tracking and memory debugging etc. For curl-developers only! .IP "AsynchDNS" -This curl uses asynchronous name resolves. +This curl uses asynchronous name resolves. Asynchronous name resolves can be +done using either the c-ares or the threaded resolver backends. .IP "SPNEGO" -SPNEGO Negotiate authentication is supported. +SPNEGO authentication is supported. .IP "Largefile" This curl supports transfers of large files, files larger than 2GB. .IP "IDN" This curl supports IDN - international domain names. +.IP "GSS-API" +GSS-API is supported. .IP "SSPI" -SSPI is supported. If you use NTLM and set a blank user name, curl will -authenticate with your current user and password. +SSPI is supported. .IP "TLS-SRP" SRP (Secure Remote Password) authentication is supported for TLS. +.IP "HTTP2" +HTTP/2 support has been built-in. .IP "Metalink" This curl supports Metalink (both version 3 and 4 (RFC 5854)), which describes mirrors and hashes. curl will use mirrors for failover if @@ -1983,6 +2209,10 @@ RTSP: mismatch of Session Identifiers 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 XX More error codes will appear here in future releases. The existing ones are meant to never change. diff --git a/docs/curl.html b/docs/curl.html index 88c7e7e..2a961b7 100644 --- a/docs/curl.html +++ b/docs/curl.html @@ -48,19 +48,25 @@ p.roffit {

NAME

curl - transfer a URL

SYNOPSIS

curl [options] [URL...]

DESCRIPTION

-

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, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction. +

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 libcurl (3) for details.

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 +

  http://site.{one,two,three}.com

or you can get sequences of alphanumeric series by using [] as in: -

 ftp://ftp.numericals.com/file[1-100].txt  ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)  ftp://ftp.letters.com/file[a-z].txt +

  ftp://ftp.numericals.com/file[1-100].txt +

  ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) +

  ftp://ftp.letters.com/file[a-z].txt

Nested sequences are not supported, but you can use several ones next to each other: -

 http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html +

  http://any.org/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 a step counter for the ranges to get every Nth number or letter: -

 http://www.numericals.com/file[1-100:10].txt  http://www.letters.com/file[a-z:2].txt +

  http://www.numericals.com/file[1-100:10].txt +

  http://www.letters.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 very 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.

PROGRESS METER

@@ -69,23 +75,38 @@ p.roffit {

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 (>), -o [file] 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, -# is your friend.

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 --option and yet again disabled with --no-option. 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.)

-#, --progress-bar

Make curl display progress as a simple progress bar instead of the standard, more informational, meter. +

-:, --next +

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. (Added in 7.36.0)

-0, --http1.0 -

(HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its internally preferred: HTTP 1.1. +

(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally preferred: HTTP 1.1. +

--http1.1 +

(HTTP) Tells curl to use HTTP version 1.1. This is the internal default version. (Added in 7.33.0) +

--http2 +

(HTTP) Tells curl to issue its requests using HTTP 2. This requires that the underlying libcurl was built to support it. (Added in 7.33.0) +

--no-npn +

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

(Added in 7.36.0) +

--no-alpn +

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

(Added in 7.36.0)

-1, --tlsv1 -

(SSL) Forces curl to use TLS version 1 when negotiating with a remote TLS server. +

(SSL) Forces curl to use TLS version 1.x when negotiating with a remote TLS server. You can use options --tlsv1.0, --tlsv1.1, and --tlsv1.2 to control the TLS version more precisely (if the SSL backend in use supports such a level of control).

-2, --sslv2 -

(SSL) Forces curl to use SSL version 2 when negotiating with a remote SSL server. +

(SSL) 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.

-3, --sslv3 -

(SSL) Forces curl to use SSL version 3 when negotiating with a remote SSL server. +

(SSL) Forces curl to use SSL version 3 when negotiating with a remote SSL server. Sometimes curl is built without SSLv3 support.

-4, --ipv4 -

If curl is capable of resolving an address to multiple IP versions (which it is if it is IPv6-capable), this option tells curl to resolve names to IPv4 addresses only. +

This option tells curl to resolve names to IPv4 addresses only, and not for example try IPv6.

-6, --ipv6 -

If curl is capable of resolving an address to multiple IP versions (which it is if it is IPv6-capable), this option tells curl to resolve names to IPv6 addresses only. +

This option tells curl to resolve names to IPv6 addresses only, and not for example try IPv4.

-a, --append -

(FTP/SFTP) When used in an upload, this will tell curl to append to the target file instead of overwriting it. If the file doesn't exist, it will be created. Note that this flag is ignored by some SSH servers (including OpenSSH). +

(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).

-A, --user-agent <agent string>

(HTTP) Specify the User-Agent string to send to the HTTP server. Some badly done CGIs fail if this field isn't set to "Mozilla/4.0". To encode blanks in the string, surround the string with single quote marks. This can also be set with the -H, --header option of course.

If this option is used several times, the last one will be used. @@ -93,16 +114,18 @@ p.roffit {

(HTTP) 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.

Note that 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.

-b, --cookie <name=data> -

(HTTP) Pass the data to the HTTP server as a cookie. 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". +

(HTTP) Pass the data to the HTTP server as a cookie. 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 line, it is treated as a filename to use to read previously stored cookie lines from, which should be used in this session if they match. Using this method also activates the "cookie parser" which will make curl record incoming cookies too, which may be handy if you're using this in combination with the -L, --location option. The file format of the file to read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie file format. -

NOTE that the file specified with -b, --cookie is only used as input. No cookies will be stored in the file. To store cookies, use the -c, --cookie-jar option or you could even save the HTTP headers to a file using -D, --dump-header! +

The file specified with -b, --cookie is only used as input. No cookies will be written to the file. To store cookies, use the -c, --cookie-jar option.

If this option is used several times, the last one will be used.

-B, --use-ascii

(FTP/LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using an URL that ends with ";type=A". This option causes data sent to stdout to be in text mode for win32 systems.

--basic -

(HTTP) Tells curl to use HTTP Basic authentication. 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). +

(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 -u, --user and -x, --proxy. +

See also --proxy-basic.

-c, --cookie-jar <file name> -

(HTTP) Specify to which file you want curl to write all cookies after a completed operation. Curl writes all cookies previously read from a specified file as well as all cookies received from remote server(s). If no cookies are known, no file 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. +

(HTTP) Specify to which file you want curl to write all cookies after a completed operation. Curl writes all cookies previously read from a specified file as well as all cookies received from remote server(s). 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 -b, --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 -v 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. @@ -112,18 +135,20 @@ p.roffit {

If this option is used several times, the last one will be used.

--ciphers <list of ciphers>

(SSL) 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: http://www.openssl.org/docs/apps/ciphers.html -

NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS ciphers is in the NSSCipherSuite entry at this URL: http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives +

NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS ciphers is in the NSSCipherSuite entry at this URL: http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives

If this option is used several times, the last one will be used.

--compressed

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

--connect-timeout <seconds> -

Maximum time in seconds that you allow the connection to the server to take. This only limits the connection phase, once curl has connected this option is of no more use. 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. See also the -m, --max-time option. +

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

See also the -m, --max-time option.

If this option is used several times, the last one will be used.

--create-dirs

When used in conjunction with the -o option, curl will create the necessary local directory hierarchy as needed. This option creates the dirs mentioned with the -o option, nothing else. If the -o file name uses no dir or if the dirs it mentions already exist, no dir will be created.

To create remote directories when using FTP or SFTP, try --ftp-create-dirs.

--crlf -

(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). +

Convert LF to CRLF in upload. Useful for MVS (OS/390). +

(SMTP added in 7.40.0)

--crlfile <file>

(HTTPS/FTPS) 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. @@ -132,18 +157,17 @@ p.roffit {

(HTTP) 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 -F, --form.

-d, --data is the same as --data-ascii. 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. The contents of the file must already be URL-encoded. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar. +

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. Multiple files can also be specified. 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.

-D, --dump-header <file>

Write the 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 -b, --cookie option! The -c, --cookie-jar option is however a better way to store cookies. +

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 -b, --cookie option! The -c, --cookie-jar option is a better way to store cookies.

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

--data-ascii <data>

See -d, --data.

--data-binary <data>

(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-ascii does, except that newlines are preserved and conversions are never done. +

If you start the data with the letter @, the rest should be a filename. Data is posted in a similar manner as --data-ascii does, except that newlines and carriage returns are preserved and conversions are never done.

If this option is used several times, the ones following the first will append data as described in -d, --data.

--data-urlencode <data>

(HTTP) This posts data, similar to the other --data options with the exception that this performs URL-encoding. (Added in 7.18.0) @@ -181,13 +205,25 @@ p.roffit {

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

Disabling EPSV only changes the passive behavior. If you want to switch to active mode you need to use -P, --ftp-port. +

--dns-interface <interface> +

Tell curl to send outgoing DNS requests through <interface>. This option is a counterpart to --interface (which does not affect DNS). The supplied string must be an interface name (not an address). +

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. (Added in 7.33.0) +

--dns-ipv4-addr <ip-address> +

Tell curl to bind to <ip-address> when making IPv4 DNS requests, so that the DNS requests originate from this address. The argument should be a single IPv4 address. +

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. (Added in 7.33.0) +

--dns-ipv6-addr <ip-address> +

Tell curl to bind to <ip-address> when making IPv6 DNS requests, so that the DNS requests originate from this address. The argument should be a single IPv6 address. +

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. (Added in 7.33.0) +

--dns-servers <ip-address,ip-address> +

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 :<port-number> after each IP address. +

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. (Added in 7.33.0)

-e, --referer <URL> -

(HTTP) Sends the "Referer Page" information to the HTTP server. This can also be set with the -H, --header flag of course. When used with -L, --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. +

(HTTP) Sends the "Referrer Page" information to the HTTP server. This can also be set with the -H, --header flag of course. When used with -L, --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.

-E, --cert <certificate[:password]> -

(SSL) 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 PEM format. 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 private certificate concatenated! See --cert and --key to specify them independently. +

(SSL) 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 private 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. -

(iOS and Mac OS X only) If curl is built against Secure Transport, then the certificate string must match the name of a certificate that's in the system or user keychain. The private key corresponding to the certificate, and certificate chain (if any), must also be present in the keychain. +

(iOS and Mac OS X 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.

If this option is used several times, the last one will be used.

--engine <name>

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. @@ -207,6 +243,11 @@ p.roffit {

--capath <CA certificate directory>

(SSL) 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. +

--pinnedpubkey <pinned public key> +

(SSL) Tells curl to use the specified public key file to verify the peer. The file must contain a single public key in PEM or DER format. +

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

This is currently only implemented in the OpenSSL, GnuTLS and GSKit backends. +

If this option is used several times, the last one will be used. (Added in 7.39.0)

-f, --fail

(HTTP) 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). @@ -265,13 +306,16 @@ p.roffit {

-g, --globoff

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.

-G, --get -

When used, this option will make all data specified with -d, --data or --data-binary 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. +

When used, this option will make all data specified with -d, --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 -I, 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.

-H, --header <header> -

(HTTP) Extra header to use when getting a web page. 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:". +

(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 not add that as a part of the header content: do not add newlines or carriage returns, they will only mess things up for you.

See also the -A, --user-agent and -e, --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://192.168.0.1/

This option can be used multiple times to add/replace/remove multiple headers.

--hostpubmd5 <md5>

(SCP/SFTP) 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. (Added in 7.17.1) @@ -289,18 +333,20 @@ p.roffit {

(HTTP) 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.

-J, --remote-header-name

(HTTP) This option tells the -O, --remote-name option to use the server-specified Content-Disposition filename instead of extracting a filename from the URL. +

There's no attempt to decode %-sequences (yet) in the provided file name, so this option may provide you with rather unexpected file names.

-k, --insecure

(SSL) This option explicitly allows curl to perform "insecure" SSL connections and transfers. All SSL connections are attempted to be made secure by using the CA certificate bundle installed by default. This makes all connections considered "insecure" fail unless -k, --insecure is used.

See this online resource for further details: http://curl.haxx.se/docs/sslcerts.html

-K, --config <config file> -

Specify which config file to read curl arguments from. The config file is a text file in which command line arguments can be written which then will be used as if they were written on the actual command line. Options and their parameters must be specified on the same config file line, separated by whitespace, colon, the equals sign or any combination thereof (however, the preferred separator is the equals sign). If the parameter is to contain whitespace, 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 which config file to read curl arguments from. The config file is a text file in which command line arguments can be written which then will be used as if they were written on the actual command line. +

Options and their parameters must be specified on the same config file line, 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 is to contain whitespace, 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 -K, --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 = "http://curl.haxx.se/docs/" -

Long option names can optionally be given in the config file without the initial double dashes.

When curl is invoked, it always (unless -q 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. +

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.

 

# --- Example file --- # this is a comment @@ -320,27 +366,29 @@ p.roffit {

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. (Added in 7.18.0)

If this option is used several times, the last one will be used. If unspecified, the option defaults to 60 seconds.

--key <key> -

(SSL/SSH) Private key file name. Allows you to provide your private key in this separate file. +

(SSL/SSH) 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 this option is used several times, the last one will be used.

--key-type <type>

(SSL) 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.

--krb <level>

(FTP) 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. -

This option requires a library built with kerberos4 or GSSAPI (GSS-Negotiate) support. This is not very common. Use -V, --version to see if your curl supports it. +

This option requires a library built with kerberos4 support. This is not very common. Use -V, --version to see if your curl supports it.

If this option is used several times, the last one will be used.

-l, --list-only -

(FTP) When listing an FTP directory, this switch forces a name-only view. Especially useful if you want to machine-parse the contents of an FTP directory since the normal directory view doesn't use a standard look or format. -

This option causes an FTP NLST command to be sent. Some FTP servers list only files in their response to NLST; they do not include subdirectories and symbolic links. -

+

(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 -X, --request <command>, 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. (Added in 7.21.5)

-L, --location

(HTTP/HTTPS) 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 -i, --include or -I, --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 the request is not a plain GET (for example POST or PUT), 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 the non-GET request method to GET after a 30x response by using the dedicated options for that: --post301, --post302 and -post303.

--libcurl <file>

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. (Added in 7.16.1)

--limit-rate <speed> -

Specify the maximum transfer rate you want curl to use. This feature is useful if you have a limited pipe and you'd like your transfer not to use your entire bandwidth. +

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.

The given rate is the average speed counted during the entire transfer. It means that curl might use higher transfer speeds in short bursts, but over time it uses no more than the given rate.

If you also use the -Y, --speed-limit option, that option will take precedence and might cripple the rate-limiting slightly, to help keeping the speed-limit logic working. @@ -352,6 +400,10 @@ p.roffit {

-m, --max-time <seconds>

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. See also the --connect-timeout option.

If this option is used several times, the last one will be used. +

--login-options <options> +

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 (Added in 7.34.0). +

If this option is used several times, the last one will be used.

--mail-auth <address>

(SMTP) 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.

(Added in 7.25.0) @@ -362,8 +414,10 @@ p.roffit {

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.

NOTE: 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.

--mail-rcpt <address> -

(SMTP) Specify a single address that the given mail should get sent to. This option can be used multiple times to specify many recipients. -

(Added in 7.20.0) +

(SMTP) Specify a single address, user name or mailing list name. +

When performing a mail transfer, the recipient should specify a valid email address to send the mail to. (Added in 7.20.0) +

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 RFC 5321). (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)

--max-redirs <num>

Set maximum number of redirection-followings allowed. If -L, --location is used, this option can be used to prevent curl from following redirections "in absurdum". By default, the limit is set to 50 redirections. Set this option to -1 to make it limitless.

If this option is used several times, the last one will be used. @@ -376,7 +430,7 @@ p.roffit {

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.

(Added in 7.27.0, if built against the libmetalink library.)

-n, --netrc -

Makes curl scan the .netrc (_netrc 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 netrc(4) or ftp(1) 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. +

Makes curl scan the .netrc (_netrc 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 netrc(4) or ftp(1) 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 .netrc to allow curl to FTP to the machine host.domain.com with user name 'myself' and password 'secret' should look similar to:

machine host.domain.com login myself password secret

-N, --no-buffer @@ -390,9 +444,9 @@ p.roffit {

Very similar to --netrc, but this option makes the .netrc usage optional and not mandatory as the --netrc option does.

--negotiate -

(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was designed by Microsoft and is used in their web applications. It is primarily meant as a support for Kerberos5 authentication but may be also used along with another authentication method. For more information see IETF draft draft-brezak-spnego-http-04.txt. -

If you want to enable Negotiate for your proxy authentication, then use --proxy-negotiate. -

This option requires a library built with GSSAPI support. This is not very common. Use -V, --version to see if your version supports GSS-Negotiate. +

(HTTP) Enables Negotiate (SPNEGO) authentication. +

If you want to enable Negotiate (SPNEGO) for proxy authentication, then use --proxy-negotiate. +

This option requires a library built with GSS-API or SSPI support. Use -V, --version to see if your curl supports GSS-API/SSPI and SPNEGO.

When using this option, you must also provide a fake -u, --user option to activate the authentication code properly. Sending a '-u :' is enough as the user name and password from the -u option aren't actually used.

If this option is used several times, only the first one is used.

--no-keepalive @@ -419,7 +473,18 @@ p.roffit {

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 remote file name to use for saving is extracted from the given URL, nothing else.

Consequentially, the file will be saved in the current working directory. If you want the file saved in a different directory, make sure you change current working directory before you invoke curl with the -O, --remote-name flag! +

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

--oauth2-bearer +

(IMAP, POP3, SMTP) 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 -u, --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. +

--proxy-header <header> +

(HTTP) 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 -H, --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 not 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. +

This option can be used multiple times to add/replace/remove multiple headers. +

(Added in 7.37.0)

-p, --proxytunnel

When an HTTP proxy is used (-x, --proxy), this option will cause non-HTTP protocols to attempt to tunnel through the proxy instead of merely using it to do HTTP-like operations. 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.

-P, --ftp-port <address> @@ -473,7 +538,7 @@ p.roffit {

--proxy-digest

Tells curl to use HTTP Digest authentication when communicating with the given proxy. Use --digest for enabling HTTP Digest with a remote host.

--proxy-negotiate -

Tells curl to use HTTP Negotiate authentication when communicating with the given proxy. Use --negotiate for enabling HTTP Negotiate with a remote host. (Added in 7.17.1) +

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. (Added in 7.17.1)

--proxy-ntlm

Tells curl to use HTTP NTLM authentication when communicating with the given proxy. Use --ntlm for enabling NTLM with a remote host.

--proxy1.0 <proxyhost[:port]> @@ -482,6 +547,7 @@ p.roffit {

--pubkey <key>

(SSH) 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.)

-q

If used as the first parameter on the command line, the curlrc config file will not be read and used. See the -K, --config for details on the default config file search path.

-Q, --quote <command> @@ -560,7 +626,7 @@ p.roffit {

(FTP, POP3, IMAP, SMTP) Require SSL/TLS for the connection. Terminates the connection if the server doesn't support SSL/TLS. (Added in 7.20.0)

This option was formerly known as --ftp-ssl-reqd (added in 7.15.5). That option name can still be used but will be removed in a future version.

--ssl-allow-beast -

(SSL) 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 work-arounds 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. (Added in 7.25.0) +

(SSL) 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. (Added in 7.25.0)

--socks4 <host[:port]>

Use the specified SOCKS4 proxy. If the port number is not specified, it is assumed at port 1080. (Added in 7.15.2)

This option overrides any previous use of -x, --proxy, as they are mutually exclusive. @@ -586,7 +652,7 @@ p.roffit {

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. (Added in 7.19.4).

--socks5-gssapi-nec -

As part of the gssapi 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. (Added in 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. (Added in 7.19.4).

--stderr <file>

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. @@ -610,10 +676,16 @@ p.roffit {

(Added in 7.20.0)

--tlsauthtype <authtype>

Set TLS authentication type. Currently, the only supported option is "SRP", for TLS-SRP (RFC 5054). If --tlsuser and --tlspassword are specified but --tlsauthtype is not, then this option defaults to "SRP". (Added in 7.21.4) -

--tlsuser <user> -

Set username for use with the TLS authentication method specified with --tlsauthtype. Requires that --tlspassword also be set. (Added in 7.21.4)

--tlspassword <password>

Set password for use with the TLS authentication method specified with --tlsauthtype. Requires that --tlsuser also be set. (Added in 7.21.4) +

--tlsuser <user> +

Set username for use with the TLS authentication method specified with --tlsauthtype. Requires that --tlspassword also be set. (Added in 7.21.4) +

--tlsv1.0 +

(SSL) Forces curl to use TLS version 1.0 when negotiating with a remote TLS server. (Added in 7.34.0) +

--tlsv1.1 +

(SSL) Forces curl to use TLS version 1.1 when negotiating with a remote TLS server. (Added in 7.34.0) +

--tlsv1.2 +

(SSL) Forces curl to use TLS version 1.2 when negotiating with a remote TLS server. (Added in 7.34.0)

--tr-encoding

(HTTP) Request a compressed Transfer-Encoding response using one of the algorithms curl supports, and uncompress the data while receiving it.

(Added in 7.21.6) @@ -628,26 +700,32 @@ p.roffit {

If this option is used several times, the last one will be used.

--trace-time

Prepends a time stamp to each trace or verbose line that curl displays. (Added in 7.14.0) +

--unix-socket <path> +

(HTTP) Connect through this Unix domain socket, instead of using the network. (Added in 7.40.0)

-u, --user <user:password>

Specify the user name and password to use for server authentication. Overrides -n, --netrc and --netrc-optional. -

If you just give the user name (without entering a colon) curl will prompt for a password. -

If you use an SSPI-enabled curl binary and do NTLM authentication, you can force curl to pick up the user name and password from your environment by simply specifying a single colon with this option: "-u :". +

If you simply specify the user name, curl will prompt for a password. +

The user name and passwords are split up on the first colon, which makes it impossible to use a colon in the user name with this option. The password can, still. +

When using Kerberos V5 with a Windows based server you should include the Windows domain name in the user name, in order for the server to succesfully obtain a Kerberos Ticket. If you don't then the initial authentication handshake may fail. +

When using NTLM, the user name can be specified simply as the user name, without the domain, if there is a single domain and forest in your setup for example. +

To specify the domain name use either Down-Level Logon Name or UPN (User Principal Name) formats. For example, EXAMPLE\user and user@example.com respectively. +

If you use a Windows SSPI-enabled curl binary and perform Kerberos V5, Negotiate, NTLM or Digest 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 :".

If this option is used several times, the last one will be used.

-U, --proxy-user <user:password>

Specify the user name and password to use for proxy authentication. -

If you use an SSPI-enabled curl binary and do NTLM authentication, you can force curl to pick up the user name and password from your environment by simply specifying a single colon with this option: "-U :". +

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 :".

If this option is used several times, the last one will be used.

--url <URL>

Specify a URL to fetch. This option is mostly handy when you want to specify URL(s) in a config file.

This option may be used any number of times. To control where this URL is written, use the -o, --output or the -O, --remote-name options.

-v, --verbose -

Makes the fetching more verbose/talkative. Mostly useful for debugging. A line starting with '>' means "header data" sent by curl, '<' means "header data" received by curl that is hidden in normal cases, and a line starting with '*' means additional info provided by curl. +

Be more verbose/talkative during the operation. Useful for debugging and seeing what's going on "under the hood". A line starting with '>' means "header data" sent by curl, '<' means "header data" received by curl that is hidden in normal cases, and a line starting with '*' means additional info provided by curl.

Note that if you only want HTTP headers in the output, -i, --include might be the option you're looking for.

If you think this option still doesn't give you enough details, consider using --trace or --trace-ascii instead.

This option overrides previous uses of --trace-ascii or --trace.

Use -s, --silent to make curl quiet.

-w, --write-out <format> -

Defines what to display on stdout after a completed and successful operation. The format is a string that may contain plain text mixed with any number of variables. The string can be specified as "string", to get read from a particular file you specify it "@filename" and to tell curl to read the format from stdin you write "@-". +

Make curl display information on stdout after a completed transfer. The format is a string that may contain plain text mixed with any number of variables. The format can be specified as a literal "string", or you can have curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write "@-".

The variables present in the output format will be substituted by the value or text that curl thinks fit, as described below. All variables are specified as %{variable_name} and to output a normal % you just write them as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t.

NOTE: The %-symbol is a special symbol in the win32-environment, where all occurrences of % must be doubled when using this option.

The variables available are: @@ -682,20 +760,23 @@ p.roffit {

If this option is used several times, the last one will be used.

-x, --proxy <[protocol://][user:password@]proxyhost[:port]> -

Use the specified HTTP proxy. If the port number is not specified, it is assumed at port 1080. +

Use the specified proxy. +

The proxy string can 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, http:// and all others will be treated as HTTP proxies. (The protocol support was added in curl 7.21.7) +

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 -p, --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. -

From 7.21.7, the proxy string may 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, http:// and all others will be treated as HTTP proxies.

If this option is used several times, the last one will be used.

-X, --request <command>

(HTTP) Specifies a custom request method to use when communicating with the HTTP server. The specified request 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 -I, --head option.

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

--xattr

When saving output to a file, this option tells curl to store certain file metadata in extended file attributes. Currently, the URL is stored in the xdg.origin.url attribute and, for HTTP, the content type is stored in the mime_type attribute. If the file system does not support extended attributes, a warning is issued.

@@ -711,7 +792,7 @@ p.roffit {

Start the date expression with a dash (-) to make it request for a document that is older than the given date/time, default is a document that is newer than the specified date/time.

If this option is used several times, the last one will be used.

-h, --help -

Usage help. +

Usage help. This lists all current command line options with a short description.

-M, --manual

Manual. Display the huge help text.

-V, --version @@ -725,27 +806,29 @@ p.roffit {

krb4

Krb4 for FTP is supported.

SSL -

HTTPS and FTPS are supported. +

SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S and so on.

libz

Automatic decompression of compressed files over HTTP is supported.

NTLM

NTLM authentication is supported. -

GSS-Negotiate -

Negotiate authentication and krb5 for FTP is supported.

Debug

This curl uses a libcurl built with Debug. This enables more error-tracking and memory debugging etc. For curl-developers only!

AsynchDNS -

This curl uses asynchronous name resolves. +

This curl uses asynchronous name resolves. Asynchronous name resolves can be done using either the c-ares or the threaded resolver backends.

SPNEGO -

SPNEGO Negotiate authentication is supported. +

SPNEGO authentication is supported.

Largefile

This curl supports transfers of large files, files larger than 2GB.

IDN

This curl supports IDN - international domain names. +

GSS-API +

GSS-API is supported.

SSPI -

SSPI is supported. If you use NTLM and set a blank user name, curl will authenticate with your current user and password. +

SSPI is supported.

TLS-SRP

SRP (Secure Remote Password) authentication is supported for TLS. +

HTTP2 +

HTTP/2 support has been built-in.

Metalink

This curl supports Metalink (both version 3 and 4 (RFC 5854)), which describes mirrors and hashes. curl will use mirrors for failover if there are errors (such as the file or server not being available).

FILES

@@ -926,6 +1009,10 @@ p.roffit {

unable to parse FTP file list

88

FTP chunk callback reported error +

89 +

No connection available, the session will be queued +

90 +

SSL public key does not matched pinned public key

XX

More error codes will appear here in future releases. The existing ones are meant to never change.

AUTHORS / CONTRIBUTORS

Daniel Stenberg is the main author, but the whole list of contributors is found in the separate THANKS file.

WWW

diff --git a/docs/curl.pdf b/docs/curl.pdf index c81dd370dc4728180634c220d52e2e78f009e00d..630cfdb30b0a4f0fdee2067d88ac9922a02996ce 100644 GIT binary patch literal 104875 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 aL`N8x70N|uG9bMS8XYrt?qX{b%>MzqL+rHx literal 93881 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%0AAr4riql0f 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 cM(>Hcdzia, et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ @@ -115,11 +137,19 @@ check_PROGRAMS = 10-at-a-time$(EXEEXT) anyauthput$(EXEEXT) \ simple$(EXEEXT) simplepost$(EXEEXT) simplessl$(EXEEXT) \ sendrecv$(EXEEXT) httpcustomheader$(EXEEXT) certinfo$(EXEEXT) \ chkspeed$(EXEEXT) ftpgetinfo$(EXEEXT) ftp-wildcard$(EXEEXT) \ - smtp-multi$(EXEEXT) simplesmtp$(EXEEXT) smtp-tls$(EXEEXT) \ + smtp-mail$(EXEEXT) smtp-multi$(EXEEXT) smtp-ssl$(EXEEXT) \ + smtp-tls$(EXEEXT) smtp-vrfy$(EXEEXT) smtp-expn$(EXEEXT) \ rtsp$(EXEEXT) externalsocket$(EXEEXT) resolve$(EXEEXT) \ - progressfunc$(EXEEXT) pop3s$(EXEEXT) pop3slist$(EXEEXT) \ - imap$(EXEEXT) url2file$(EXEEXT) sftpget$(EXEEXT) \ - ftpsget$(EXEEXT) + progressfunc$(EXEEXT) pop3-retr$(EXEEXT) pop3-list$(EXEEXT) \ + pop3-uidl$(EXEEXT) pop3-dele$(EXEEXT) pop3-top$(EXEEXT) \ + pop3-stat$(EXEEXT) pop3-noop$(EXEEXT) pop3-ssl$(EXEEXT) \ + pop3-tls$(EXEEXT) pop3-multi$(EXEEXT) imap-list$(EXEEXT) \ + imap-lsub$(EXEEXT) imap-fetch$(EXEEXT) imap-store$(EXEEXT) \ + imap-append$(EXEEXT) imap-examine$(EXEEXT) \ + imap-search$(EXEEXT) imap-create$(EXEEXT) imap-delete$(EXEEXT) \ + imap-copy$(EXEEXT) imap-noop$(EXEEXT) imap-ssl$(EXEEXT) \ + imap-tls$(EXEEXT) imap-multi$(EXEEXT) url2file$(EXEEXT) \ + sftpget$(EXEEXT) ftpsget$(EXEEXT) postinmemory$(EXEEXT) subdir = docs/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ @@ -294,11 +324,104 @@ https_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@https_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@https_DEPENDENCIES = $(LIBDIR)/libcurl.la -imap_SOURCES = imap.c -imap_OBJECTS = imap.$(OBJEXT) -imap_LDADD = $(LDADD) -@USE_EXPLICIT_LIB_DEPS_FALSE@imap_DEPENDENCIES = $(LIBDIR)/libcurl.la -@USE_EXPLICIT_LIB_DEPS_TRUE@imap_DEPENDENCIES = $(LIBDIR)/libcurl.la +imap_append_SOURCES = imap-append.c +imap_append_OBJECTS = imap-append.$(OBJEXT) +imap_append_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_append_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_append_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_copy_SOURCES = imap-copy.c +imap_copy_OBJECTS = imap-copy.$(OBJEXT) +imap_copy_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_copy_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_copy_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_create_SOURCES = imap-create.c +imap_create_OBJECTS = imap-create.$(OBJEXT) +imap_create_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_create_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_create_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_delete_SOURCES = imap-delete.c +imap_delete_OBJECTS = imap-delete.$(OBJEXT) +imap_delete_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_delete_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_delete_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_examine_SOURCES = imap-examine.c +imap_examine_OBJECTS = imap-examine.$(OBJEXT) +imap_examine_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_examine_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_examine_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_fetch_SOURCES = imap-fetch.c +imap_fetch_OBJECTS = imap-fetch.$(OBJEXT) +imap_fetch_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_fetch_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_fetch_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_list_SOURCES = imap-list.c +imap_list_OBJECTS = imap-list.$(OBJEXT) +imap_list_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_list_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_list_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_lsub_SOURCES = imap-lsub.c +imap_lsub_OBJECTS = imap-lsub.$(OBJEXT) +imap_lsub_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_lsub_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_lsub_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_multi_SOURCES = imap-multi.c +imap_multi_OBJECTS = imap-multi.$(OBJEXT) +imap_multi_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_multi_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_multi_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_noop_SOURCES = imap-noop.c +imap_noop_OBJECTS = imap-noop.$(OBJEXT) +imap_noop_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_noop_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_noop_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_search_SOURCES = imap-search.c +imap_search_OBJECTS = imap-search.$(OBJEXT) +imap_search_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_search_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_search_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_ssl_SOURCES = imap-ssl.c +imap_ssl_OBJECTS = imap-ssl.$(OBJEXT) +imap_ssl_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_store_SOURCES = imap-store.c +imap_store_OBJECTS = imap-store.$(OBJEXT) +imap_store_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_store_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_store_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +imap_tls_SOURCES = imap-tls.c +imap_tls_OBJECTS = imap-tls.$(OBJEXT) +imap_tls_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@imap_tls_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@imap_tls_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la multi_app_SOURCES = multi-app.c multi_app_OBJECTS = multi-app.$(OBJEXT) multi_app_LDADD = $(LDADD) @@ -341,18 +464,75 @@ persistant_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@persistant_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la -pop3s_SOURCES = pop3s.c -pop3s_OBJECTS = pop3s.$(OBJEXT) -pop3s_LDADD = $(LDADD) -@USE_EXPLICIT_LIB_DEPS_FALSE@pop3s_DEPENDENCIES = \ +pop3_dele_SOURCES = pop3-dele.c +pop3_dele_OBJECTS = pop3-dele.$(OBJEXT) +pop3_dele_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_dele_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_dele_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_list_SOURCES = pop3-list.c +pop3_list_OBJECTS = pop3-list.$(OBJEXT) +pop3_list_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_list_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la -@USE_EXPLICIT_LIB_DEPS_TRUE@pop3s_DEPENDENCIES = $(LIBDIR)/libcurl.la -pop3slist_SOURCES = pop3slist.c -pop3slist_OBJECTS = pop3slist.$(OBJEXT) -pop3slist_LDADD = $(LDADD) -@USE_EXPLICIT_LIB_DEPS_FALSE@pop3slist_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_list_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_multi_SOURCES = pop3-multi.c +pop3_multi_OBJECTS = pop3-multi.$(OBJEXT) +pop3_multi_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_multi_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la -@USE_EXPLICIT_LIB_DEPS_TRUE@pop3slist_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_multi_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_noop_SOURCES = pop3-noop.c +pop3_noop_OBJECTS = pop3-noop.$(OBJEXT) +pop3_noop_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_noop_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_noop_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_retr_SOURCES = pop3-retr.c +pop3_retr_OBJECTS = pop3-retr.$(OBJEXT) +pop3_retr_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_retr_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_retr_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_ssl_SOURCES = pop3-ssl.c +pop3_ssl_OBJECTS = pop3-ssl.$(OBJEXT) +pop3_ssl_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_stat_SOURCES = pop3-stat.c +pop3_stat_OBJECTS = pop3-stat.$(OBJEXT) +pop3_stat_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_stat_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_stat_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_tls_SOURCES = pop3-tls.c +pop3_tls_OBJECTS = pop3-tls.$(OBJEXT) +pop3_tls_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_tls_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_tls_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_top_SOURCES = pop3-top.c +pop3_top_OBJECTS = pop3-top.$(OBJEXT) +pop3_top_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_top_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_top_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +pop3_uidl_SOURCES = pop3-uidl.c +pop3_uidl_OBJECTS = pop3-uidl.$(OBJEXT) +pop3_uidl_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_uidl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_uidl_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la post_callback_SOURCES = post-callback.c post_callback_OBJECTS = post-callback.$(OBJEXT) @@ -361,6 +541,13 @@ post_callback_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@post_callback_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +postinmemory_SOURCES = postinmemory.c +postinmemory_OBJECTS = postinmemory.$(OBJEXT) +postinmemory_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@postinmemory_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@postinmemory_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la postit2_SOURCES = postit2.c postit2_OBJECTS = postit2.$(OBJEXT) postit2_LDADD = $(LDADD) @@ -422,13 +609,6 @@ simplepost_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@simplepost_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la -simplesmtp_SOURCES = simplesmtp.c -simplesmtp_OBJECTS = simplesmtp.$(OBJEXT) -simplesmtp_LDADD = $(LDADD) -@USE_EXPLICIT_LIB_DEPS_FALSE@simplesmtp_DEPENDENCIES = \ -@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la -@USE_EXPLICIT_LIB_DEPS_TRUE@simplesmtp_DEPENDENCIES = \ -@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la simplessl_SOURCES = simplessl.c simplessl_OBJECTS = simplessl.$(OBJEXT) simplessl_LDADD = $(LDADD) @@ -436,6 +616,20 @@ simplessl_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@simplessl_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +smtp_expn_SOURCES = smtp-expn.c +smtp_expn_OBJECTS = smtp-expn.$(OBJEXT) +smtp_expn_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_expn_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_expn_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +smtp_mail_SOURCES = smtp-mail.c +smtp_mail_OBJECTS = smtp-mail.$(OBJEXT) +smtp_mail_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_mail_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_mail_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la smtp_multi_SOURCES = smtp-multi.c smtp_multi_OBJECTS = smtp-multi.$(OBJEXT) smtp_multi_LDADD = $(LDADD) @@ -443,6 +637,13 @@ smtp_multi_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@smtp_multi_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +smtp_ssl_SOURCES = smtp-ssl.c +smtp_ssl_OBJECTS = smtp-ssl.$(OBJEXT) +smtp_ssl_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_ssl_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la smtp_tls_SOURCES = smtp-tls.c smtp_tls_OBJECTS = smtp-tls.$(OBJEXT) smtp_tls_LDADD = $(LDADD) @@ -450,6 +651,13 @@ smtp_tls_LDADD = $(LDADD) @USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la @USE_EXPLICIT_LIB_DEPS_TRUE@smtp_tls_DEPENDENCIES = \ @USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la +smtp_vrfy_SOURCES = smtp-vrfy.c +smtp_vrfy_OBJECTS = smtp-vrfy.$(OBJEXT) +smtp_vrfy_LDADD = $(LDADD) +@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_vrfy_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la +@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_vrfy_DEPENDENCIES = \ +@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la url2file_SOURCES = url2file.c url2file_OBJECTS = url2file.$(OBJEXT) url2file_LDADD = $(LDADD) @@ -495,22 +703,34 @@ SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \ cookie_interface.c debug.c externalsocket.c fileupload.c \ fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \ ftpsget.c ftpupload.c getinfo.c getinmemory.c http-post.c \ - httpcustomheader.c httpput.c https.c imap.c multi-app.c \ + httpcustomheader.c httpput.c https.c imap-append.c imap-copy.c \ + imap-create.c imap-delete.c imap-examine.c imap-fetch.c \ + imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c \ + imap-ssl.c imap-store.c imap-tls.c multi-app.c \ multi-debugcallback.c multi-double.c multi-post.c \ - multi-single.c persistant.c pop3s.c pop3slist.c \ - post-callback.c postit2.c progressfunc.c resolve.c rtsp.c \ + multi-single.c persistant.c pop3-dele.c pop3-list.c \ + pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c \ + pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c \ + postinmemory.c postit2.c progressfunc.c resolve.c rtsp.c \ sendrecv.c sepheaders.c sftpget.c simple.c simplepost.c \ - simplesmtp.c simplessl.c smtp-multi.c smtp-tls.c url2file.c + simplessl.c smtp-expn.c smtp-mail.c smtp-multi.c smtp-ssl.c \ + smtp-tls.c smtp-vrfy.c url2file.c DIST_SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \ cookie_interface.c debug.c externalsocket.c fileupload.c \ fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \ ftpsget.c ftpupload.c getinfo.c getinmemory.c http-post.c \ - httpcustomheader.c httpput.c https.c imap.c multi-app.c \ + httpcustomheader.c httpput.c https.c imap-append.c imap-copy.c \ + imap-create.c imap-delete.c imap-examine.c imap-fetch.c \ + imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c \ + imap-ssl.c imap-store.c imap-tls.c multi-app.c \ multi-debugcallback.c multi-double.c multi-post.c \ - multi-single.c persistant.c pop3s.c pop3slist.c \ - post-callback.c postit2.c progressfunc.c resolve.c rtsp.c \ + multi-single.c persistant.c pop3-dele.c pop3-list.c \ + pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c \ + pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c \ + postinmemory.c postit2.c progressfunc.c resolve.c rtsp.c \ sendrecv.c sepheaders.c sftpget.c simple.c simplepost.c \ - simplesmtp.c simplessl.c smtp-multi.c smtp-tls.c url2file.c + simplessl.c smtp-expn.c smtp-mail.c smtp-multi.c smtp-ssl.c \ + smtp-tls.c smtp-vrfy.c url2file.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -568,6 +788,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -592,7 +813,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -601,7 +821,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -624,6 +843,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -659,11 +879,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -747,11 +969,11 @@ LIBDIR = $(top_builddir)/lib # These examples require external dependencies that may not be commonly # available on POSIX systems, so don't bother attempting to compile them here. -COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \ - ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \ +COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \ + ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \ opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \ - smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \ - multi-uv.c xmlstream.c usercertinmem.c + smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \ + multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c all: all-am @@ -882,9 +1104,61 @@ https$(EXEEXT): $(https_OBJECTS) $(https_DEPENDENCIES) $(EXTRA_https_DEPENDENCIE @rm -f https$(EXEEXT) $(AM_V_CCLD)$(LINK) $(https_OBJECTS) $(https_LDADD) $(LIBS) -imap$(EXEEXT): $(imap_OBJECTS) $(imap_DEPENDENCIES) $(EXTRA_imap_DEPENDENCIES) - @rm -f imap$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(imap_OBJECTS) $(imap_LDADD) $(LIBS) +imap-append$(EXEEXT): $(imap_append_OBJECTS) $(imap_append_DEPENDENCIES) $(EXTRA_imap_append_DEPENDENCIES) + @rm -f imap-append$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_append_OBJECTS) $(imap_append_LDADD) $(LIBS) + +imap-copy$(EXEEXT): $(imap_copy_OBJECTS) $(imap_copy_DEPENDENCIES) $(EXTRA_imap_copy_DEPENDENCIES) + @rm -f imap-copy$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_copy_OBJECTS) $(imap_copy_LDADD) $(LIBS) + +imap-create$(EXEEXT): $(imap_create_OBJECTS) $(imap_create_DEPENDENCIES) $(EXTRA_imap_create_DEPENDENCIES) + @rm -f imap-create$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_create_OBJECTS) $(imap_create_LDADD) $(LIBS) + +imap-delete$(EXEEXT): $(imap_delete_OBJECTS) $(imap_delete_DEPENDENCIES) $(EXTRA_imap_delete_DEPENDENCIES) + @rm -f imap-delete$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_delete_OBJECTS) $(imap_delete_LDADD) $(LIBS) + +imap-examine$(EXEEXT): $(imap_examine_OBJECTS) $(imap_examine_DEPENDENCIES) $(EXTRA_imap_examine_DEPENDENCIES) + @rm -f imap-examine$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_examine_OBJECTS) $(imap_examine_LDADD) $(LIBS) + +imap-fetch$(EXEEXT): $(imap_fetch_OBJECTS) $(imap_fetch_DEPENDENCIES) $(EXTRA_imap_fetch_DEPENDENCIES) + @rm -f imap-fetch$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_fetch_OBJECTS) $(imap_fetch_LDADD) $(LIBS) + +imap-list$(EXEEXT): $(imap_list_OBJECTS) $(imap_list_DEPENDENCIES) $(EXTRA_imap_list_DEPENDENCIES) + @rm -f imap-list$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_list_OBJECTS) $(imap_list_LDADD) $(LIBS) + +imap-lsub$(EXEEXT): $(imap_lsub_OBJECTS) $(imap_lsub_DEPENDENCIES) $(EXTRA_imap_lsub_DEPENDENCIES) + @rm -f imap-lsub$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_lsub_OBJECTS) $(imap_lsub_LDADD) $(LIBS) + +imap-multi$(EXEEXT): $(imap_multi_OBJECTS) $(imap_multi_DEPENDENCIES) $(EXTRA_imap_multi_DEPENDENCIES) + @rm -f imap-multi$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_multi_OBJECTS) $(imap_multi_LDADD) $(LIBS) + +imap-noop$(EXEEXT): $(imap_noop_OBJECTS) $(imap_noop_DEPENDENCIES) $(EXTRA_imap_noop_DEPENDENCIES) + @rm -f imap-noop$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_noop_OBJECTS) $(imap_noop_LDADD) $(LIBS) + +imap-search$(EXEEXT): $(imap_search_OBJECTS) $(imap_search_DEPENDENCIES) $(EXTRA_imap_search_DEPENDENCIES) + @rm -f imap-search$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_search_OBJECTS) $(imap_search_LDADD) $(LIBS) + +imap-ssl$(EXEEXT): $(imap_ssl_OBJECTS) $(imap_ssl_DEPENDENCIES) $(EXTRA_imap_ssl_DEPENDENCIES) + @rm -f imap-ssl$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_ssl_OBJECTS) $(imap_ssl_LDADD) $(LIBS) + +imap-store$(EXEEXT): $(imap_store_OBJECTS) $(imap_store_DEPENDENCIES) $(EXTRA_imap_store_DEPENDENCIES) + @rm -f imap-store$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_store_OBJECTS) $(imap_store_LDADD) $(LIBS) + +imap-tls$(EXEEXT): $(imap_tls_OBJECTS) $(imap_tls_DEPENDENCIES) $(EXTRA_imap_tls_DEPENDENCIES) + @rm -f imap-tls$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imap_tls_OBJECTS) $(imap_tls_LDADD) $(LIBS) multi-app$(EXEEXT): $(multi_app_OBJECTS) $(multi_app_DEPENDENCIES) $(EXTRA_multi_app_DEPENDENCIES) @rm -f multi-app$(EXEEXT) @@ -910,18 +1184,54 @@ persistant$(EXEEXT): $(persistant_OBJECTS) $(persistant_DEPENDENCIES) $(EXTRA_pe @rm -f persistant$(EXEEXT) $(AM_V_CCLD)$(LINK) $(persistant_OBJECTS) $(persistant_LDADD) $(LIBS) -pop3s$(EXEEXT): $(pop3s_OBJECTS) $(pop3s_DEPENDENCIES) $(EXTRA_pop3s_DEPENDENCIES) - @rm -f pop3s$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(pop3s_OBJECTS) $(pop3s_LDADD) $(LIBS) +pop3-dele$(EXEEXT): $(pop3_dele_OBJECTS) $(pop3_dele_DEPENDENCIES) $(EXTRA_pop3_dele_DEPENDENCIES) + @rm -f pop3-dele$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_dele_OBJECTS) $(pop3_dele_LDADD) $(LIBS) + +pop3-list$(EXEEXT): $(pop3_list_OBJECTS) $(pop3_list_DEPENDENCIES) $(EXTRA_pop3_list_DEPENDENCIES) + @rm -f pop3-list$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_list_OBJECTS) $(pop3_list_LDADD) $(LIBS) -pop3slist$(EXEEXT): $(pop3slist_OBJECTS) $(pop3slist_DEPENDENCIES) $(EXTRA_pop3slist_DEPENDENCIES) - @rm -f pop3slist$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(pop3slist_OBJECTS) $(pop3slist_LDADD) $(LIBS) +pop3-multi$(EXEEXT): $(pop3_multi_OBJECTS) $(pop3_multi_DEPENDENCIES) $(EXTRA_pop3_multi_DEPENDENCIES) + @rm -f pop3-multi$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_multi_OBJECTS) $(pop3_multi_LDADD) $(LIBS) + +pop3-noop$(EXEEXT): $(pop3_noop_OBJECTS) $(pop3_noop_DEPENDENCIES) $(EXTRA_pop3_noop_DEPENDENCIES) + @rm -f pop3-noop$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_noop_OBJECTS) $(pop3_noop_LDADD) $(LIBS) + +pop3-retr$(EXEEXT): $(pop3_retr_OBJECTS) $(pop3_retr_DEPENDENCIES) $(EXTRA_pop3_retr_DEPENDENCIES) + @rm -f pop3-retr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_retr_OBJECTS) $(pop3_retr_LDADD) $(LIBS) + +pop3-ssl$(EXEEXT): $(pop3_ssl_OBJECTS) $(pop3_ssl_DEPENDENCIES) $(EXTRA_pop3_ssl_DEPENDENCIES) + @rm -f pop3-ssl$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_ssl_OBJECTS) $(pop3_ssl_LDADD) $(LIBS) + +pop3-stat$(EXEEXT): $(pop3_stat_OBJECTS) $(pop3_stat_DEPENDENCIES) $(EXTRA_pop3_stat_DEPENDENCIES) + @rm -f pop3-stat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_stat_OBJECTS) $(pop3_stat_LDADD) $(LIBS) + +pop3-tls$(EXEEXT): $(pop3_tls_OBJECTS) $(pop3_tls_DEPENDENCIES) $(EXTRA_pop3_tls_DEPENDENCIES) + @rm -f pop3-tls$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_tls_OBJECTS) $(pop3_tls_LDADD) $(LIBS) + +pop3-top$(EXEEXT): $(pop3_top_OBJECTS) $(pop3_top_DEPENDENCIES) $(EXTRA_pop3_top_DEPENDENCIES) + @rm -f pop3-top$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_top_OBJECTS) $(pop3_top_LDADD) $(LIBS) + +pop3-uidl$(EXEEXT): $(pop3_uidl_OBJECTS) $(pop3_uidl_DEPENDENCIES) $(EXTRA_pop3_uidl_DEPENDENCIES) + @rm -f pop3-uidl$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pop3_uidl_OBJECTS) $(pop3_uidl_LDADD) $(LIBS) post-callback$(EXEEXT): $(post_callback_OBJECTS) $(post_callback_DEPENDENCIES) $(EXTRA_post_callback_DEPENDENCIES) @rm -f post-callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(post_callback_OBJECTS) $(post_callback_LDADD) $(LIBS) +postinmemory$(EXEEXT): $(postinmemory_OBJECTS) $(postinmemory_DEPENDENCIES) $(EXTRA_postinmemory_DEPENDENCIES) + @rm -f postinmemory$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(postinmemory_OBJECTS) $(postinmemory_LDADD) $(LIBS) + postit2$(EXEEXT): $(postit2_OBJECTS) $(postit2_DEPENDENCIES) $(EXTRA_postit2_DEPENDENCIES) @rm -f postit2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(postit2_OBJECTS) $(postit2_LDADD) $(LIBS) @@ -958,22 +1268,34 @@ simplepost$(EXEEXT): $(simplepost_OBJECTS) $(simplepost_DEPENDENCIES) $(EXTRA_si @rm -f simplepost$(EXEEXT) $(AM_V_CCLD)$(LINK) $(simplepost_OBJECTS) $(simplepost_LDADD) $(LIBS) -simplesmtp$(EXEEXT): $(simplesmtp_OBJECTS) $(simplesmtp_DEPENDENCIES) $(EXTRA_simplesmtp_DEPENDENCIES) - @rm -f simplesmtp$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(simplesmtp_OBJECTS) $(simplesmtp_LDADD) $(LIBS) - simplessl$(EXEEXT): $(simplessl_OBJECTS) $(simplessl_DEPENDENCIES) $(EXTRA_simplessl_DEPENDENCIES) @rm -f simplessl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(simplessl_OBJECTS) $(simplessl_LDADD) $(LIBS) +smtp-expn$(EXEEXT): $(smtp_expn_OBJECTS) $(smtp_expn_DEPENDENCIES) $(EXTRA_smtp_expn_DEPENDENCIES) + @rm -f smtp-expn$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(smtp_expn_OBJECTS) $(smtp_expn_LDADD) $(LIBS) + +smtp-mail$(EXEEXT): $(smtp_mail_OBJECTS) $(smtp_mail_DEPENDENCIES) $(EXTRA_smtp_mail_DEPENDENCIES) + @rm -f smtp-mail$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(smtp_mail_OBJECTS) $(smtp_mail_LDADD) $(LIBS) + smtp-multi$(EXEEXT): $(smtp_multi_OBJECTS) $(smtp_multi_DEPENDENCIES) $(EXTRA_smtp_multi_DEPENDENCIES) @rm -f smtp-multi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(smtp_multi_OBJECTS) $(smtp_multi_LDADD) $(LIBS) +smtp-ssl$(EXEEXT): $(smtp_ssl_OBJECTS) $(smtp_ssl_DEPENDENCIES) $(EXTRA_smtp_ssl_DEPENDENCIES) + @rm -f smtp-ssl$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(smtp_ssl_OBJECTS) $(smtp_ssl_LDADD) $(LIBS) + smtp-tls$(EXEEXT): $(smtp_tls_OBJECTS) $(smtp_tls_DEPENDENCIES) $(EXTRA_smtp_tls_DEPENDENCIES) @rm -f smtp-tls$(EXEEXT) $(AM_V_CCLD)$(LINK) $(smtp_tls_OBJECTS) $(smtp_tls_LDADD) $(LIBS) +smtp-vrfy$(EXEEXT): $(smtp_vrfy_OBJECTS) $(smtp_vrfy_DEPENDENCIES) $(EXTRA_smtp_vrfy_DEPENDENCIES) + @rm -f smtp-vrfy$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(smtp_vrfy_OBJECTS) $(smtp_vrfy_LDADD) $(LIBS) + url2file$(EXEEXT): $(url2file_OBJECTS) $(url2file_DEPENDENCIES) $(EXTRA_url2file_DEPENDENCIES) @rm -f url2file$(EXEEXT) $(AM_V_CCLD)$(LINK) $(url2file_OBJECTS) $(url2file_LDADD) $(LIBS) @@ -1005,16 +1327,38 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpcustomheader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/https.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-append.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-copy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-create.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-delete.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-examine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-fetch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-lsub.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-multi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-noop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-search.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-ssl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-store.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-tls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-app.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-debugcallback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-post.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-single.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persistant.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3s.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3slist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-dele.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-multi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-noop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-retr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-ssl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-stat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-tls.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-top.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-uidl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/post-callback.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postinmemory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postit2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progressfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve.Po@am__quote@ @@ -1024,29 +1368,35 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplepost.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplesmtp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplessl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-expn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mail.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-multi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-ssl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-tls.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-vrfy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url2file.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc index 6752db4..6c8df8e 100644 --- a/docs/examples/Makefile.inc +++ b/docs/examples/Makefile.inc @@ -1,16 +1,42 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### + # These are all libcurl example programs to be test compiled check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \ fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput \ https multi-app multi-debugcallback multi-double multi-post multi-single \ persistant post-callback postit2 sepheaders simple simplepost simplessl \ - sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \ - smtp-multi simplesmtp smtp-tls rtsp externalsocket resolve \ - progressfunc pop3s pop3slist imap url2file sftpget ftpsget + sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \ + smtp-mail smtp-multi smtp-ssl smtp-tls smtp-vrfy smtp-expn rtsp \ + externalsocket resolve progressfunc pop3-retr pop3-list pop3-uidl \ + pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \ + imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \ + imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \ + imap-tls imap-multi url2file sftpget ftpsget postinmemory # These examples require external dependencies that may not be commonly # available on POSIX systems, so don't bother attempting to compile them here. -COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \ - ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \ +COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \ + ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \ opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \ - smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \ - multi-uv.c xmlstream.c usercertinmem.c + smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \ + multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c diff --git a/docs/examples/Makefile.m32 b/docs/examples/Makefile.m32 index 6bfb9fa..f607013 100644 --- a/docs/examples/Makefile.m32 +++ b/docs/examples/Makefile.m32 @@ -38,7 +38,7 @@ ZLIB_PATH = ../../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../../openssl-0.9.8y +OPENSSL_PATH = ../../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. ifndef LIBSSH2_PATH @@ -148,9 +148,6 @@ endif ifeq ($(findstring -sspi,$(CFG)),-sspi) SSPI = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -SPNEGO = 1 -endif ifeq ($(findstring -ldaps,$(CFG)),-ldaps) LDAPS = 1 endif @@ -230,9 +227,6 @@ ifdef SSPI CFLAGS += -DUSE_SCHANNEL endif endif -ifdef SPNEGO - CFLAGS += -DHAVE_SPNEGO -endif ifdef IPV6 CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501 endif diff --git a/docs/examples/Makefile.netware b/docs/examples/Makefile.netware index 2816cbd..3fd6b3e 100644 --- a/docs/examples/Makefile.netware +++ b/docs/examples/Makefile.netware @@ -19,7 +19,7 @@ endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../../openssl-0.9.8y +OPENSSL_PATH = ../../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. @@ -211,9 +211,6 @@ endif ifeq ($(findstring -idn,$(CFG)),-idn) WITH_IDN = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -WITH_SPNEGO = 1 -endif ifeq ($(findstring -ipv6,$(CFG)),-ipv6) ENABLE_IPV6 = 1 endif @@ -247,10 +244,6 @@ ifdef WITH_SSL LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT) IMPORTS += GetProcessSwitchCount RunningProcess -ifdef WITH_SPNEGO - # INCLUDES += -I$(FBOPENSSL_PATH)/include - LDLIBS += $(FBOPENSSL_PATH)/nw/fbopenssl.$(LIBEXT) -endif else ifdef WITH_AXTLS INCLUDES += -I$(AXTLS_PATH)/inc diff --git a/docs/examples/asiohiper.cpp b/docs/examples/asiohiper.cpp index 44836fd..eb5cd03 100644 --- a/docs/examples/asiohiper.cpp +++ b/docs/examples/asiohiper.cpp @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -84,7 +84,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g) /* cancel running timer */ timer.cancel(); - if ( timeout_ms > 0 ) + if(timeout_ms > 0) { /* update timer */ timer.expires_from_now(boost::posix_time::millisec(timeout_ms)); @@ -103,26 +103,44 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g) /* Die if we get a bad CURLMcode somewhere */ static void mcode_or_die(const char *where, CURLMcode code) { - if ( CURLM_OK != code ) + if(CURLM_OK != code) { const char *s; - switch ( code ) + switch(code) { - case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; - case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; - case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; - case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; - case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break; - case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break; - case CURLM_LAST: s="CURLM_LAST"; break; - default: s="CURLM_unknown"; + case CURLM_CALL_MULTI_PERFORM: + s = "CURLM_CALL_MULTI_PERFORM"; break; - case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; + case CURLM_BAD_HANDLE: + s = "CURLM_BAD_HANDLE"; + break; + case CURLM_BAD_EASY_HANDLE: + s = "CURLM_BAD_EASY_HANDLE"; + break; + case CURLM_OUT_OF_MEMORY: + s = "CURLM_OUT_OF_MEMORY"; + break; + case CURLM_INTERNAL_ERROR: + s = "CURLM_INTERNAL_ERROR"; + break; + case CURLM_UNKNOWN_OPTION: + s = "CURLM_UNKNOWN_OPTION"; + break; + case CURLM_LAST: + s = "CURLM_LAST"; + break; + default: + s = "CURLM_unknown"; + break; + case CURLM_BAD_SOCKET: + s = "CURLM_BAD_SOCKET"; fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s); /* ignore this error */ return; } + fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s); + exit(code); } } @@ -139,9 +157,9 @@ static void check_multi_info(GlobalInfo *g) fprintf(MSG_OUT, "\nREMAINING: %d", g->still_running); - while ((msg = curl_multi_info_read(g->multi, &msgs_left))) + while((msg = curl_multi_info_read(g->multi, &msgs_left))) { - if (msg->msg == CURLMSG_DONE) + if(msg->msg == CURLMSG_DONE) { easy = msg->easy_handle; res = msg->data.result; @@ -157,17 +175,19 @@ static void check_multi_info(GlobalInfo *g) } /* Called by asio when there is an action on a socket */ -static void event_cb(GlobalInfo * g, boost::asio::ip::tcp::socket * tcp_socket, int action) +static void event_cb(GlobalInfo *g, boost::asio::ip::tcp::socket *tcp_socket, + int action) { fprintf(MSG_OUT, "\nevent_cb: action=%d", action); CURLMcode rc; - rc = curl_multi_socket_action(g->multi, tcp_socket->native_handle(), action, &g->still_running); + rc = curl_multi_socket_action(g->multi, tcp_socket->native_handle(), action, + &g->still_running); mcode_or_die("event_cb: curl_multi_socket_action", rc); check_multi_info(g); - if ( g->still_running <= 0 ) + if(g->still_running <= 0) { fprintf(MSG_OUT, "\nlast transfer done, kill timeout"); timer.cancel(); @@ -177,7 +197,7 @@ static void event_cb(GlobalInfo * g, boost::asio::ip::tcp::socket * tcp_socket, /* Called by asio when our timeout expires */ static void timer_cb(const boost::system::error_code & error, GlobalInfo *g) { - if ( !error) + if(!error) { fprintf(MSG_OUT, "\ntimer_cb: "); @@ -194,7 +214,7 @@ static void remsock(int *f, GlobalInfo *g) { fprintf(MSG_OUT, "\nremsock: "); - if ( f ) + if(f) { free(f); } @@ -206,9 +226,10 @@ static void setsock(int *fdp, curl_socket_t s, CURL*e, int act, GlobalInfo*g) std::map::iterator it = socket_map.find(s); - if ( it == socket_map.end() ) + if(it == socket_map.end()) { fprintf(MSG_OUT, "\nsocket %d is a c-ares socket, ignoring", s); + return; } @@ -216,44 +237,36 @@ static void setsock(int *fdp, curl_socket_t s, CURL*e, int act, GlobalInfo*g) *fdp = act; - if ( act == CURL_POLL_IN ) + if(act == CURL_POLL_IN) { fprintf(MSG_OUT, "\nwatching for socket to become readable"); tcp_socket->async_read_some(boost::asio::null_buffers(), - boost::bind(&event_cb, g, - tcp_socket, - act)); + boost::bind(&event_cb, g, tcp_socket, act)); } - else if ( act == CURL_POLL_OUT ) + else if (act == CURL_POLL_OUT) { fprintf(MSG_OUT, "\nwatching for socket to become writable"); tcp_socket->async_write_some(boost::asio::null_buffers(), - boost::bind(&event_cb, g, - tcp_socket, - act)); + boost::bind(&event_cb, g, tcp_socket, act)); } - else if ( act == CURL_POLL_INOUT ) + else if(act == CURL_POLL_INOUT) { fprintf(MSG_OUT, "\nwatching for socket to become readable & writable"); tcp_socket->async_read_some(boost::asio::null_buffers(), - boost::bind(&event_cb, g, - tcp_socket, - act)); + boost::bind(&event_cb, g, tcp_socket, act)); tcp_socket->async_write_some(boost::asio::null_buffers(), - boost::bind(&event_cb, g, - tcp_socket, - act)); + boost::bind(&event_cb, g, tcp_socket, act)); } } - static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) { - int *fdp = (int *)calloc(sizeof(int), 1); /* fdp is used to store current action */ + /* fdp is used to store current action */ + int *fdp = (int *) calloc(sizeof(int), 1); setsock(fdp, s, easy, action, g); curl_multi_assign(g->multi, s, fdp); @@ -265,20 +278,20 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) fprintf(MSG_OUT, "\nsock_cb: socket=%d, what=%d, sockp=%p", s, what, sockp); GlobalInfo *g = (GlobalInfo*) cbp; - int *actionp = (int*) sockp; - const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE"}; + int *actionp = (int *) sockp; + const char *whatstr[] = { "none", "IN", "OUT", "INOUT", "REMOVE"}; fprintf(MSG_OUT, "\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); - if ( what == CURL_POLL_REMOVE ) + if(what == CURL_POLL_REMOVE) { fprintf(MSG_OUT, "\n"); remsock(actionp, g); } else { - if ( !actionp ) + if(!actionp) { fprintf(MSG_OUT, "\nAdding data: %s", whatstr[what]); addsock(s, e, what, g); @@ -291,19 +304,19 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) setsock(actionp, s, e, what, g); } } + return 0; } - /* CURLOPT_WRITEFUNCTION */ static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) { size_t written = size * nmemb; - char* pBuffer = (char*)malloc(written + 1); + char* pBuffer = (char *) malloc(written + 1); strncpy(pBuffer, (const char *)ptr, written); - pBuffer [written] = '\0'; + pBuffer[written] = '\0'; fprintf(MSG_OUT, "%s", pBuffer); @@ -312,12 +325,12 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) return written; } - /* CURLOPT_PROGRESSFUNCTION */ -static int prog_cb (void *p, double dltotal, double dlnow, double ult, - double uln) +static int prog_cb(void *p, double dltotal, double dlnow, double ult, + double uln) { ConnInfo *conn = (ConnInfo *)p; + (void)ult; (void)uln; @@ -328,16 +341,15 @@ static int prog_cb (void *p, double dltotal, double dlnow, double ult, } /* CURLOPT_OPENSOCKETFUNCTION */ -static curl_socket_t opensocket(void *clientp, - curlsocktype purpose, +static curl_socket_t opensocket(void *clientp, curlsocktype purpose, struct curl_sockaddr *address) { fprintf(MSG_OUT, "\nopensocket :"); curl_socket_t sockfd = CURL_SOCKET_BAD; - /* restrict to ipv4 */ - if (purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET) + /* restrict to IPv4 */ + if(purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET) { /* create a tcp socket object */ boost::asio::ip::tcp::socket *tcp_socket = new boost::asio::ip::tcp::socket(io_service); @@ -346,9 +358,9 @@ static curl_socket_t opensocket(void *clientp, boost::system::error_code ec; tcp_socket->open(boost::asio::ip::tcp::v4(), ec); - if (ec) + if(ec) { - //An error occurred + /* An error occurred */ std::cout << std::endl << "Couldn't open socket [" << ec << "][" << ec.message() << "]"; fprintf(MSG_OUT, "\nERROR: Returning CURL_SOCKET_BAD to signal error"); } @@ -372,7 +384,7 @@ static int closesocket(void *clientp, curl_socket_t item) std::map::iterator it = socket_map.find(item); - if ( it != socket_map.end() ) + if(it != socket_map.end()) { delete it->second; socket_map.erase(it); @@ -382,22 +394,21 @@ static int closesocket(void *clientp, curl_socket_t item) } /* Create a new easy handle, and add it to the global curl_multi */ -static void new_conn(char *url, GlobalInfo *g ) +static void new_conn(char *url, GlobalInfo *g) { ConnInfo *conn; CURLMcode rc; - conn = (ConnInfo *)calloc(1, sizeof(ConnInfo)); - memset(conn, 0, sizeof(ConnInfo)); - conn->error[0]='\0'; + conn = (ConnInfo *) calloc(1, sizeof(ConnInfo)); conn->easy = curl_easy_init(); - - if ( !conn->easy ) + if(!conn->easy) { fprintf(MSG_OUT, "\ncurl_easy_init() failed, exiting!"); + exit(2); } + conn->global = g; conn->url = strdup(url); curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url); @@ -431,6 +442,7 @@ int main(int argc, char **argv) { GlobalInfo g; CURLMcode rc; + (void)argc; (void)argv; @@ -450,5 +462,6 @@ int main(int argc, char **argv) curl_multi_cleanup(g.multi); fprintf(MSG_OUT, "\ndone.\n"); + return 0; } diff --git a/docs/examples/cacertinmem.c b/docs/examples/cacertinmem.c index 051afbc..30a5153 100644 --- a/docs/examples/cacertinmem.c +++ b/docs/examples/cacertinmem.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -103,6 +103,10 @@ static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm) if (X509_STORE_add_cert(store, cert)==0) printf("error adding certificate\n"); + /* decrease reference counts */ + X509_free(cert); + BIO_free(bio); + /* all set to go */ return CURLE_OK ; } @@ -121,7 +125,7 @@ int main(void) rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction); rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout); rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction); - rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr); + rv=curl_easy_setopt(ch,CURLOPT_HEADERDATA, stderr); rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM"); rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L); rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/"); diff --git a/docs/examples/evhiperfifo.c b/docs/examples/evhiperfifo.c index c2e87fc..e03801d 100644 --- a/docs/examples/evhiperfifo.c +++ b/docs/examples/evhiperfifo.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -133,7 +133,6 @@ static void mcode_or_die(const char *where, CURLMcode code) const char *s; switch ( code ) { - case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; diff --git a/docs/examples/externalsocket.c b/docs/examples/externalsocket.c index 1b326c8..5486d12 100644 --- a/docs/examples/externalsocket.c +++ b/docs/examples/externalsocket.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -38,7 +38,7 @@ #include /* socket definitions */ #include #include /* inet (3) funtions */ -#include /* misc. UNIX functions */ +#include /* misc. Unix functions */ #endif #include diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c index 6fe5c0f..3d2a817 100644 --- a/docs/examples/fopen.c +++ b/docs/examples/fopen.c @@ -128,6 +128,7 @@ static int fill_buffer(URL_FILE *file, size_t want) fd_set fdexcep; struct timeval timeout; int rc; + CURLMcode mc; /* curl_multi_fdset() return code */ /* only attempt to fill buffer if transactions still running and buffer * doesnt exceed required size already @@ -158,15 +159,35 @@ static int fill_buffer(URL_FILE *file, size_t want) } /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially - in case of (maxfd == -1), we call select(0, ...), which is basically - equal to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } switch(rc) { case -1: diff --git a/docs/examples/ftp-wildcard.c b/docs/examples/ftp-wildcard.c index 5a2a103..d175ddf 100644 --- a/docs/examples/ftp-wildcard.c +++ b/docs/examples/ftp-wildcard.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,9 +26,9 @@ struct callback_data { FILE *output; }; -static long file_is_comming(struct curl_fileinfo *finfo, - struct callback_data *data, - int remains); +static long file_is_coming(struct curl_fileinfo *finfo, + struct callback_data *data, + int remains); static long file_is_downloaded(struct callback_data *data); @@ -61,7 +61,7 @@ int main(int argc, char **argv) curl_easy_setopt(handle, CURLOPT_WILDCARDMATCH, 1L); /* callback is called before download of concrete file started */ - curl_easy_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, file_is_comming); + curl_easy_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming); /* callback is called after data from the file have been transferred */ curl_easy_setopt(handle, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded); @@ -89,9 +89,9 @@ int main(int argc, char **argv) return rc; } -static long file_is_comming(struct curl_fileinfo *finfo, - struct callback_data *data, - int remains) +static long file_is_coming(struct curl_fileinfo *finfo, + struct callback_data *data, + int remains) { printf("%3d %40s %10luB ", remains, finfo->filename, (unsigned long)finfo->size); diff --git a/docs/examples/ftpgetresp.c b/docs/examples/ftpgetresp.c index db96a3a..dcb296a 100644 --- a/docs/examples/ftpgetresp.c +++ b/docs/examples/ftpgetresp.c @@ -58,7 +58,7 @@ int main(void) /* If you intend to use this on windows with a libcurl DLL, you must use CURLOPT_WRITEFUNCTION as well */ curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response); - curl_easy_setopt(curl, CURLOPT_WRITEHEADER, respfile); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, respfile); res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) diff --git a/docs/examples/getinmemory.c b/docs/examples/getinmemory.c index 8e31e8f..1608ec5 100644 --- a/docs/examples/getinmemory.c +++ b/docs/examples/getinmemory.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -98,10 +98,6 @@ int main(void) * bytes big and contains the remote file. * * Do something nice with it! - * - * You should be aware of the fact that at this point we might have an - * allocated data block, and nothing has yet deallocated that data. So when - * you're done with it, you should free() it as a nice application. */ printf("%lu bytes retrieved\n", (long)chunk.size); diff --git a/docs/examples/ghiper.c b/docs/examples/ghiper.c index 9a3f46d..7571ffa 100644 --- a/docs/examples/ghiper.c +++ b/docs/examples/ghiper.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -104,7 +104,6 @@ static void mcode_or_die(const char *where, CURLMcode code) { if ( CURLM_OK != code ) { const char *s; switch (code) { - case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; diff --git a/docs/examples/hiperfifo.c b/docs/examples/hiperfifo.c index 4c4e223..84035aa 100644 --- a/docs/examples/hiperfifo.c +++ b/docs/examples/hiperfifo.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -125,7 +125,6 @@ static void mcode_or_die(const char *where, CURLMcode code) if ( CURLM_OK != code ) { const char *s; switch (code) { - case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; diff --git a/docs/examples/href_extractor.c b/docs/examples/href_extractor.c index 4b307a2..c11325d 100644 --- a/docs/examples/href_extractor.c +++ b/docs/examples/href_extractor.c @@ -74,7 +74,7 @@ int main(int argc, char *argv[]) curl_easy_setopt(curl, CURLOPT_URL, argv[1]); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, hsp); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_perform(curl); diff --git a/docs/examples/httpcustomheader.c b/docs/examples/httpcustomheader.c index 07ff959..8542ead 100644 --- a/docs/examples/httpcustomheader.c +++ b/docs/examples/httpcustomheader.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,20 +31,25 @@ int main(void) if(curl) { struct curl_slist *chunk = NULL; - chunk = curl_slist_append(chunk, "Accept: moo"); + /* Remove a header curl would otherwise add by itself */ + chunk = curl_slist_append(chunk, "Accept:"); + + /* Add a custom header */ chunk = curl_slist_append(chunk, "Another: yes"); - /* request with the built-in Accept: */ + /* Modify a header curl otherwise adds differently */ + chunk = curl_slist_append(chunk, "Host: example.com"); + + /* Add a header with "blank" contents to the right of the colon. Note that + we're then using a semicolon in the string we pass to curl! */ + chunk = curl_slist_append(chunk, "X-silly-header;"); + + /* set our custom set of headers */ + res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + curl_easy_setopt(curl, CURLOPT_URL, "localhost"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - res = curl_easy_perform(curl); - /* Check for errors */ - if(res != CURLE_OK) - fprintf(stderr, "curl_easy_perform() failed: %s\n", - curl_easy_strerror(res)); - /* redo request with our own custom Accept: */ - res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) diff --git a/docs/examples/httpput.c b/docs/examples/httpput.c index fbbca94..2e9dc21 100644 --- a/docs/examples/httpput.c +++ b/docs/examples/httpput.c @@ -22,8 +22,6 @@ #include #include #include -#include - #include /* @@ -59,7 +57,6 @@ int main(int argc, char **argv) CURL *curl; CURLcode res; FILE * hd_src ; - int hd ; struct stat file_info; char *file; @@ -72,9 +69,7 @@ int main(int argc, char **argv) url = argv[2]; /* get the file size of the local file */ - hd = open(file, O_RDONLY) ; - fstat(hd, &file_info); - close(hd) ; + stat(file, &file_info); /* get a FILE * of the same file, could also be made with fdopen() from the previous descriptor, but hey this is just diff --git a/docs/examples/imap-append.c b/docs/examples/imap-append.c new file mode 100644 index 0000000..fa531a8 --- /dev/null +++ b/docs/examples/imap-append.c @@ -0,0 +1,116 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include + +/* This is a simple example showing how to send mail using libcurl's IMAP + * capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +#define FROM "" +#define TO "" +#define CC "" + +static const char *payload_text[] = { + "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", + "To: " TO "\r\n", + "From: " FROM "(Example User)\r\n", + "Cc: " CC "(Another example User)\r\n", + "Message-ID: \r\n", + "Subject: IMAP example message\r\n", + "\r\n", /* empty line to divide headers from body, see RFC5322 */ + "The body of the message starts here.\r\n", + "\r\n", + "It could be a lot of lines, could be MIME encoded, whatever.\r\n", + "Check RFC5322.\r\n", + NULL +}; + +struct upload_status { + int lines_read; +}; + +static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) +{ + struct upload_status *upload_ctx = (struct upload_status *)userp; + const char *data; + + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { + return 0; + } + + data = payload_text[upload_ctx->lines_read]; + + if(data) { + size_t len = strlen(data); + memcpy(ptr, data, len); + upload_ctx->lines_read++; + + return len; + } + + return 0; +} + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + struct upload_status upload_ctx; + + upload_ctx.lines_read = 0; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will create a new message 100. Note that you should perform an + * EXAMINE command to obtain the UID of the next message to create and a + * SELECT to ensure you are creating the message in the OUTBOX. */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/100"); + + /* In this case, we're using a callback function to specify the data. You + * could just use the CURLOPT_READDATA option to specify a FILE pointer to + * read from. */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* Perform the append */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-copy.c b/docs/examples/imap-copy.c new file mode 100644 index 0000000..fe2d91c --- /dev/null +++ b/docs/examples/imap-copy.c @@ -0,0 +1,65 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to copy a mail from one mailbox folder + * to another using libcurl's IMAP capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is source mailbox folder to select */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); + + /* Set the COPY command specifing the message ID and destination folder */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "COPY 1 FOLDER"); + + /* Note that to perform a move operation you will need to perform the copy, + * then mark the original mail as Deleted and EXPUNGE or CLOSE. Please see + * imap-store.c for more information on deleting messages. */ + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-create.c b/docs/examples/imap-create.c new file mode 100644 index 0000000..65ddede --- /dev/null +++ b/docs/examples/imap-create.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to create a new mailbox folder using + * libcurl's IMAP capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Set the CREATE command specifing the new folder name */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CREATE FOLDER"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-delete.c b/docs/examples/imap-delete.c new file mode 100644 index 0000000..5113be9 --- /dev/null +++ b/docs/examples/imap-delete.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to delete an existing mailbox folder + * using libcurl's IMAP capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Set the DELETE command specifing the existing folder */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE FOLDER"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-examine.c b/docs/examples/imap-examine.c new file mode 100644 index 0000000..a7b41c5 --- /dev/null +++ b/docs/examples/imap-examine.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to obtain information about a mailbox + * folder using libcurl's IMAP capabilities via the EXAMINE command. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Set the EXAMINE command specifing the mailbox folder */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXAMINE OUTBOX"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap.c b/docs/examples/imap-fetch.c similarity index 67% rename from docs/examples/imap.c rename to docs/examples/imap-fetch.c index ba07f02..831d0dc 100644 --- a/docs/examples/imap.c +++ b/docs/examples/imap-fetch.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,6 +22,12 @@ #include #include +/* This is a simple example showing how to fetch mail using libcurl's IMAP + * capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + int main(void) { CURL *curl; @@ -30,15 +36,23 @@ int main(void) curl = curl_easy_init(); if(curl) { /* Set username and password */ - curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); - /* This will fetch the mailbox named "foobar" */ - curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/foobar"); + /* This will fetch message 1 from the user's inbox */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); + /* Perform the fetch */ res = curl_easy_perform(curl); - /* always cleanup */ + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ curl_easy_cleanup(curl); } + return (int)res; } diff --git a/docs/examples/imap-list.c b/docs/examples/imap-list.c new file mode 100644 index 0000000..4223052 --- /dev/null +++ b/docs/examples/imap-list.c @@ -0,0 +1,60 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to list the folders within an IMAP + * mailbox. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will list the folders within the user's mailbox. If you want to + * list the folders within a specific folder, for example the inbox, then + * specify the folder as a path in the URL such as /INBOX */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Perform the list */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-lsub.c b/docs/examples/imap-lsub.c new file mode 100644 index 0000000..8960b62 --- /dev/null +++ b/docs/examples/imap-lsub.c @@ -0,0 +1,62 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to list the subscribed folders within + * an IMAP mailbox. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Set the LSUB command. Note the syntax is very similar to that of a LIST + command. */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "LSUB \"\" *"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-multi.c b/docs/examples/imap-multi.c new file mode 100644 index 0000000..c7dc130 --- /dev/null +++ b/docs/examples/imap-multi.c @@ -0,0 +1,167 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to fetch mail using libcurl's IMAP + * capabilities. It builds on the imap-fetch.c example to demonstrate how to + * use libcurl's multi interface. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 + +static struct timeval tvnow(void) +{ + struct timeval now; + + /* time() returns the value of time in seconds since the epoch */ + now.tv_sec = (long)time(NULL); + now.tv_usec = 0; + + return now; +} + +static long tvdiff(struct timeval newer, struct timeval older) +{ + return (newer.tv_sec - older.tv_sec) * 1000 + + (newer.tv_usec - older.tv_usec) / 1000; +} + +int main(void) +{ + CURL *curl; + CURLM *mcurl; + int still_running = 1; + struct timeval mp_start; + + curl_global_init(CURL_GLOBAL_DEFAULT); + + curl = curl_easy_init(); + if(!curl) + return 1; + + mcurl = curl_multi_init(); + if(!mcurl) + return 2; + + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will fetch message 1 from the user's inbox */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); + + /* Tell the multi stack about our easy handle */ + curl_multi_add_handle(mcurl, curl); + + /* Record the start time which we can use later */ + mp_start = tvnow(); + + /* We start some action by calling perform right away */ + curl_multi_perform(mcurl, &still_running); + + while(still_running) { + struct timeval timeout; + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd = -1; + int rc; + CURLMcode mc; /* curl_multi_fdset() return code */ + + long curl_timeo = -1; + + /* Initialise the file descriptors */ + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* Set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + curl_multi_timeout(mcurl, &curl_timeo); + if(curl_timeo >= 0) { + timeout.tv_sec = curl_timeo / 1000; + if(timeout.tv_sec > 1) + timeout.tv_sec = 1; + else + timeout.tv_usec = (curl_timeo % 1000) * 1000; + } + + /* get file descriptors from the transfers */ + mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); + + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } + + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } + + if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { + fprintf(stderr, + "ABORTING: Since it seems that we would have run forever.\n"); + break; + } + + switch(rc) { + case -1: /* select error */ + break; + case 0: /* timeout */ + default: /* action */ + curl_multi_perform(mcurl, &still_running); + break; + } + } + + /* Always cleanup */ + curl_multi_remove_handle(mcurl, curl); + curl_multi_cleanup(mcurl); + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return 0; +} diff --git a/docs/examples/imap-noop.c b/docs/examples/imap-noop.c new file mode 100644 index 0000000..71a5572 --- /dev/null +++ b/docs/examples/imap-noop.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to perform a noop using libcurl's IMAP + * capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com"); + + /* Set the NOOP command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-search.c b/docs/examples/imap-search.c new file mode 100644 index 0000000..0c1d267 --- /dev/null +++ b/docs/examples/imap-search.c @@ -0,0 +1,65 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to search for new messages using + * libcurl's IMAP capabilities. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is mailbox folder to select */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); + + /* Set the SEARCH command specifing what we want to search for. Note that + * this can contain a message sequence set and a number of search criteria + * keywords including flags such as ANSWERED, DELETED, DRAFT, FLAGGED, NEW, + * RECENT and SEEN. For more information about the search criteria please + * see RFC-3501 section 6.4.4. */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH NEW"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3slist.c b/docs/examples/imap-ssl.c similarity index 64% rename from docs/examples/pop3slist.c rename to docs/examples/imap-ssl.c index 9d9668f..e42ff39 100644 --- a/docs/examples/pop3slist.c +++ b/docs/examples/imap-ssl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,52 +22,64 @@ #include #include +/* This is a simple example showing how to fetch mail using libcurl's IMAP + * capabilities. It builds on the imap-fetch.c example adding transport + * security to protect the authentication details from being snooped. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + int main(void) { CURL *curl; - CURLcode res; + CURLcode res = CURLE_OK; curl = curl_easy_init(); if(curl) { /* Set username and password */ - curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); - /* This will list every message of the given mailbox */ - curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/"); + /* This will fetch message 1 from the user's inbox. Note the use of + * imaps:// rather than imap:// to request a SSL based connection. */ + curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.example.com/INBOX/;UID=1"); -#ifdef SKIP_PEER_VERIFICATION - /* - * If you want to connect to a site who isn't using a certificate that is + /* If you want to connect to a site who isn't using a certificate that is * signed by one of the certs in the CA bundle you have, you can skip the * verification of the server's certificate. This makes the connection * A LOT LESS SECURE. * * If you have a CA cert for the server stored someplace else than in the * default bundle, then the CURLOPT_CAPATH option might come handy for - * you. - */ + * you. */ +#ifdef SKIP_PEER_VERIFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); #endif -#ifdef SKIP_HOSTNAME_VERFICATION - /* - * If the site you're connecting to uses a different host name that what + /* If the site you're connecting to uses a different host name that what * they have mentioned in their server certificate's commonName (or * subjectAltName) fields, libcurl will refuse to connect. You can skip - * this check, but this will make the connection less secure. - */ + * this check, but this will make the connection less secure. */ +#ifdef SKIP_HOSTNAME_VERFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); #endif - /* Perform the request, res will get the return code */ + /* Since the traffic will be encrypted, it is very useful to turn on debug + * information within libcurl to see what is happening during the + * transfer */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Perform the fetch */ res = curl_easy_perform(curl); + /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); - /* always cleanup */ + /* Always cleanup */ curl_easy_cleanup(curl); } - return 0; + + return (int)res; } diff --git a/docs/examples/imap-store.c b/docs/examples/imap-store.c new file mode 100644 index 0000000..8f5e7d5 --- /dev/null +++ b/docs/examples/imap-store.c @@ -0,0 +1,76 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to modify an existing mail using + * libcurl's IMAP capabilities with the STORE command. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is the mailbox folder to select */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX"); + + /* Set the STORE command with the Deleted flag for message 1. Note that + * you can use the STORE command to set other flags such as Seen, Answered, + * Flagged, Draft and Recent. */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STORE 1 +Flags \\Deleted"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + else { + /* Set the EXPUNGE command, although you can use the CLOSE command if you + * don't want to know the result of the STORE */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPUNGE"); + + /* Perform the second custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + } + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/imap-tls.c b/docs/examples/imap-tls.c new file mode 100644 index 0000000..c439864 --- /dev/null +++ b/docs/examples/imap-tls.c @@ -0,0 +1,84 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to fetch mail using libcurl's IMAP + * capabilities. It builds on the imap-fetch.c example adding transport + * security to protect the authentication details from being snooped. + * + * Note that this example requires libcurl 7.30.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will fetch message 1 from the user's inbox */ + curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1"); + + /* In this example, we'll start with a plain text connection, and upgrade + * to Transport Layer Security (TLS) using the STARTTLS command. Be careful + * of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer + * will continue anyway - see the security discussion in the libcurl + * tutorial for more details. */ + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); + + /* If your server doesn't have a valid certificate, then you can disable + * part of the Transport Layer Security protection by setting the + * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false). + * curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + * curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + * That is, in general, a bad idea. It is still better than sending your + * authentication details in plain text though. + * Instead, you should get the issuer certificate (or the host certificate + * if the certificate is self-signed) and add it to the set of certificates + * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See + * docs/SSLCERTS for more information. */ + curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); + + /* Since the traffic will be encrypted, it is very useful to turn on debug + * information within libcurl to see what is happening during the + * transfer */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Perform the fetch */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/multi-app.c b/docs/examples/multi-app.c index a5f71c5..b825897 100644 --- a/docs/examples/multi-app.c +++ b/docs/examples/multi-app.c @@ -73,6 +73,7 @@ int main(void) do { struct timeval timeout; int rc; /* select() return code */ + CURLMcode mc; /* curl_multi_fdset() return code */ fd_set fdread; fd_set fdwrite; @@ -99,15 +100,35 @@ int main(void) } /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } switch(rc) { case -1: diff --git a/docs/examples/multi-debugcallback.c b/docs/examples/multi-debugcallback.c index 8eedcee..5fb86be 100644 --- a/docs/examples/multi-debugcallback.c +++ b/docs/examples/multi-debugcallback.c @@ -147,6 +147,7 @@ int main(void) do { struct timeval timeout; int rc; /* select() return code */ + CURLMcode mc; /* curl_multi_fdset() return code */ fd_set fdread; fd_set fdwrite; @@ -173,15 +174,35 @@ int main(void) } /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } switch(rc) { case -1: diff --git a/docs/examples/multi-double.c b/docs/examples/multi-double.c index 91422e6..0d8d0de 100644 --- a/docs/examples/multi-double.c +++ b/docs/examples/multi-double.c @@ -62,6 +62,7 @@ int main(void) do { struct timeval timeout; int rc; /* select() return code */ + CURLMcode mc; /* curl_multi_fdset() return code */ fd_set fdread; fd_set fdwrite; @@ -88,15 +89,35 @@ int main(void) } /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } switch(rc) { case -1: diff --git a/docs/examples/multi-post.c b/docs/examples/multi-post.c index 965a2c3..f511d66 100644 --- a/docs/examples/multi-post.c +++ b/docs/examples/multi-post.c @@ -83,6 +83,7 @@ int main(void) do { struct timeval timeout; int rc; /* select() return code */ + CURLMcode mc; /* curl_multi_fdset() return code */ fd_set fdread; fd_set fdwrite; @@ -109,15 +110,35 @@ int main(void) } /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } switch(rc) { case -1: diff --git a/docs/examples/multi-single.c b/docs/examples/multi-single.c index 37a01cd..47e23f5 100644 --- a/docs/examples/multi-single.c +++ b/docs/examples/multi-single.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,6 +31,15 @@ /* curl stuff */ #include +#ifdef _WIN32 +#define WAITMS(x) Sleep(x) +#else +/* Portable sleep for platforms other than Windows. */ +#define WAITMS(x) \ + struct timeval wait = { 0, (x) * 1000 }; \ + (void)select(0, NULL, NULL, NULL, &wait); +#endif + /* * Simply download a HTTP file. */ @@ -40,6 +49,7 @@ int main(void) CURLM *multi_handle; int still_running; /* keep number of running handles */ + int repeats = 0; curl_global_init(CURL_GLOBAL_DEFAULT); @@ -58,56 +68,33 @@ int main(void) curl_multi_perform(multi_handle, &still_running); do { - struct timeval timeout; - int rc; /* select() return code */ - - fd_set fdread; - fd_set fdwrite; - fd_set fdexcep; - int maxfd = -1; - - long curl_timeo = -1; - - FD_ZERO(&fdread); - FD_ZERO(&fdwrite); - FD_ZERO(&fdexcep); - - /* set a suitable timeout to play around with */ - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - curl_multi_timeout(multi_handle, &curl_timeo); - if(curl_timeo >= 0) { - timeout.tv_sec = curl_timeo / 1000; - if(timeout.tv_sec > 1) - timeout.tv_sec = 1; - else - timeout.tv_usec = (curl_timeo % 1000) * 1000; - } + CURLMcode mc; /* curl_multi_wait() return code */ + int numfds; - /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + /* wait for activity, timeout or "nothing" */ + mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* 'numfds' being zero means either a timeout or no file descriptors to + wait for. Try timeout on first occurance, then assume no file + descriptors and no file descriptors to wait for means wait for 100 + milliseconds. */ - switch(rc) { - case -1: - /* select error */ - still_running = 0; - printf("select() returns error, this is badness\n"); - break; - case 0: - default: - /* timeout or readable/writable sockets */ - curl_multi_perform(multi_handle, &still_running); - break; + if(!numfds) { + repeats++; /* count number of repeated zero numfds */ + if(repeats > 1) { + WAITMS(100); /* sleep 100 milliseconds */ + } } + else + repeats = 0; + + curl_multi_perform(multi_handle, &still_running); } while(still_running); curl_multi_remove_handle(multi_handle, http_handle); diff --git a/docs/examples/multi-uv.c b/docs/examples/multi-uv.c index 57d712f..0c0f8a2 100644 --- a/docs/examples/multi-uv.c +++ b/docs/examples/multi-uv.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -64,13 +64,13 @@ curl_context_t* create_curl_context(curl_socket_t sockfd) void curl_close_cb(uv_handle_t *handle) { - curl_context_t* context = (curl_context_t*) handle->data; + curl_context_t *context = (curl_context_t *) handle->data; free(context); } void destroy_curl_context(curl_context_t *context) { - uv_close((uv_handle_t*) &context->poll_handle, curl_close_cb); + uv_close((uv_handle_t *) &context->poll_handle, curl_close_cb); } @@ -83,67 +83,84 @@ void add_download(const char *url, int num) sprintf(filename, "%d.download", num); file = fopen(filename, "w"); - if (file == NULL) { + if(!file) { fprintf(stderr, "Error opening %s\n", filename); return; } handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_WRITEDATA, file); + curl_easy_setopt(handle, CURLOPT_PRIVATE, file); curl_easy_setopt(handle, CURLOPT_URL, url); curl_multi_add_handle(curl_handle, handle); fprintf(stderr, "Added download %s -> %s\n", url, filename); } -void curl_perform(uv_poll_t *req, int status, int events) +static void check_multi_info(void) { int running_handles; - int flags = 0; - curl_context_t *context; char *done_url; CURLMsg *message; int pending; + FILE *file; - uv_timer_stop(&timeout); - - if (events & UV_READABLE) - flags |= CURL_CSELECT_IN; - if (events & UV_WRITABLE) - flags |= CURL_CSELECT_OUT; - - context = (curl_context_t*)req; - - curl_multi_socket_action(curl_handle, context->sockfd, flags, - &running_handles); - - while ((message = curl_multi_info_read(curl_handle, &pending))) { - switch (message->msg) { + while((message = curl_multi_info_read(curl_handle, &pending))) { + switch(message->msg) { case CURLMSG_DONE: curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL, &done_url); + curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, &file); printf("%s DONE\n", done_url); curl_multi_remove_handle(curl_handle, message->easy_handle); curl_easy_cleanup(message->easy_handle); - + if(file) { + fclose(file); + } break; + default: fprintf(stderr, "CURLMSG default\n"); - abort(); + break; } } } +void curl_perform(uv_poll_t *req, int status, int events) +{ + int running_handles; + int flags = 0; + curl_context_t *context; + char *done_url; + CURLMsg *message; + int pending; + + uv_timer_stop(&timeout); + + if(events & UV_READABLE) + flags |= CURL_CSELECT_IN; + if(events & UV_WRITABLE) + flags |= CURL_CSELECT_OUT; + + context = (curl_context_t *) req; + + curl_multi_socket_action(curl_handle, context->sockfd, flags, + &running_handles); + + check_multi_info(); +} + void on_timeout(uv_timer_t *req, int status) { int running_handles; curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0, &running_handles); + check_multi_info(); } void start_timeout(CURLM *multi, long timeout_ms, void *userp) { - if (timeout_ms <= 0) + if(timeout_ms <= 0) timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in a bit */ uv_timer_start(&timeout, on_timeout, timeout_ms, 0); @@ -153,9 +170,9 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp) { curl_context_t *curl_context; - if (action == CURL_POLL_IN || action == CURL_POLL_OUT) { - if (socketp) { - curl_context = (curl_context_t*) socketp; + if(action == CURL_POLL_IN || action == CURL_POLL_OUT) { + if(socketp) { + curl_context = (curl_context_t *) socketp; } else { curl_context = create_curl_context(s); @@ -163,7 +180,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, curl_multi_assign(curl_handle, s, (void *) curl_context); } - switch (action) { + switch(action) { case CURL_POLL_IN: uv_poll_start(&curl_context->poll_handle, UV_READABLE, curl_perform); break; @@ -171,7 +188,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, uv_poll_start(&curl_context->poll_handle, UV_WRITABLE, curl_perform); break; case CURL_POLL_REMOVE: - if (socketp) { + if(socketp) { uv_poll_stop(&((curl_context_t*)socketp)->poll_handle); destroy_curl_context((curl_context_t*) socketp); curl_multi_assign(curl_handle, s, NULL); @@ -188,10 +205,10 @@ int main(int argc, char **argv) { loop = uv_default_loop(); - if (argc <= 1) + if(argc <= 1) return 0; - if (curl_global_init(CURL_GLOBAL_ALL)) { + if(curl_global_init(CURL_GLOBAL_ALL)) { fprintf(stderr, "Could not init cURL\n"); return 1; } @@ -202,11 +219,12 @@ int main(int argc, char **argv) curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket); curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout); - while (argc-- > 1) { + while(argc-- > 1) { add_download(argv[argc], argc); } uv_run(loop, UV_RUN_DEFAULT); curl_multi_cleanup(curl_handle); + return 0; } diff --git a/docs/examples/pop3-dele.c b/docs/examples/pop3-dele.c new file mode 100644 index 0000000..fab598f --- /dev/null +++ b/docs/examples/pop3-dele.c @@ -0,0 +1,64 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to delete an existing mail using + * libcurl's POP3 capabilities. + * + * Note that this example requires libcurl 7.26.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* You can specify the message either in the URL or DELE command */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); + + /* Set the DELE command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELE"); + + /* Do not perform a transfer as DELE returns no data */ + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-list.c b/docs/examples/pop3-list.c new file mode 100644 index 0000000..aebcea6 --- /dev/null +++ b/docs/examples/pop3-list.c @@ -0,0 +1,58 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example using libcurl's POP3 capabilities to list the + * contents of a mailbox. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will list every message of the given mailbox */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); + + /* Perform the list */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-multi.c b/docs/examples/pop3-multi.c new file mode 100644 index 0000000..4353086 --- /dev/null +++ b/docs/examples/pop3-multi.c @@ -0,0 +1,167 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to retrieve mail using libcurl's POP3 + * capabilities. It builds on the pop3-retr.c example to demonstrate how to use + * libcurl's multi interface. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 + +static struct timeval tvnow(void) +{ + struct timeval now; + + /* time() returns the value of time in seconds since the epoch */ + now.tv_sec = (long)time(NULL); + now.tv_usec = 0; + + return now; +} + +static long tvdiff(struct timeval newer, struct timeval older) +{ + return (newer.tv_sec - older.tv_sec) * 1000 + + (newer.tv_usec - older.tv_usec) / 1000; +} + +int main(void) +{ + CURL *curl; + CURLM *mcurl; + int still_running = 1; + struct timeval mp_start; + + curl_global_init(CURL_GLOBAL_DEFAULT); + + curl = curl_easy_init(); + if(!curl) + return 1; + + mcurl = curl_multi_init(); + if(!mcurl) + return 2; + + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will retreive message 1 from the user's mailbox */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); + + /* Tell the multi stack about our easy handle */ + curl_multi_add_handle(mcurl, curl); + + /* Record the start time which we can use later */ + mp_start = tvnow(); + + /* We start some action by calling perform right away */ + curl_multi_perform(mcurl, &still_running); + + while(still_running) { + struct timeval timeout; + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + int maxfd = -1; + int rc; + CURLMcode mc; /* curl_multi_fdset() return code */ + + long curl_timeo = -1; + + /* Initialise the file descriptors */ + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* Set a suitable timeout to play around with */ + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + curl_multi_timeout(mcurl, &curl_timeo); + if(curl_timeo >= 0) { + timeout.tv_sec = curl_timeo / 1000; + if(timeout.tv_sec > 1) + timeout.tv_sec = 1; + else + timeout.tv_usec = (curl_timeo % 1000) * 1000; + } + + /* get file descriptors from the transfers */ + mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); + + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } + + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } + + if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { + fprintf(stderr, + "ABORTING: Since it seems that we would have run forever.\n"); + break; + } + + switch(rc) { + case -1: /* select error */ + break; + case 0: /* timeout */ + default: /* action */ + curl_multi_perform(mcurl, &still_running); + break; + } + } + + /* Always cleanup */ + curl_multi_remove_handle(mcurl, curl); + curl_multi_cleanup(mcurl); + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return 0; +} diff --git a/docs/examples/pop3-noop.c b/docs/examples/pop3-noop.c new file mode 100644 index 0000000..4efe671 --- /dev/null +++ b/docs/examples/pop3-noop.c @@ -0,0 +1,64 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to perform a noop using libcurl's POP3 + * capabilities. + * + * Note that this example requires libcurl 7.26.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); + + /* Set the NOOP command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP"); + + /* Do not perform a transfer as NOOP returns no data */ + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-retr.c b/docs/examples/pop3-retr.c new file mode 100644 index 0000000..e5a50f2 --- /dev/null +++ b/docs/examples/pop3-retr.c @@ -0,0 +1,58 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to retrieve mail using libcurl's POP3 + * capabilities. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will retreive message 1 from the user's mailbox */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); + + /* Perform the retr */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3s.c b/docs/examples/pop3-ssl.c similarity index 64% rename from docs/examples/pop3s.c rename to docs/examples/pop3-ssl.c index 44d7c80..45e0054 100644 --- a/docs/examples/pop3s.c +++ b/docs/examples/pop3-ssl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,52 +22,64 @@ #include #include +/* This is a simple example showing how to retrieve mail using libcurl's POP3 + * capabilities. It builds on the pop3-retr.c example adding transport + * security to protect the authentication details from being snooped. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + int main(void) { CURL *curl; - CURLcode res; + CURLcode res = CURLE_OK; curl = curl_easy_init(); if(curl) { /* Set username and password */ - curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); - /* This will only fetch the message with ID "1" of the given mailbox */ - curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/1"); + /* This will retreive message 1 from the user's mailbox. Note the use of + * pop3s:// rather than pop3:// to request a SSL based connection. */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3s://pop.example.com/1"); -#ifdef SKIP_PEER_VERIFICATION - /* - * If you want to connect to a site who isn't using a certificate that is + /* If you want to connect to a site who isn't using a certificate that is * signed by one of the certs in the CA bundle you have, you can skip the * verification of the server's certificate. This makes the connection * A LOT LESS SECURE. * * If you have a CA cert for the server stored someplace else than in the * default bundle, then the CURLOPT_CAPATH option might come handy for - * you. - */ + * you. */ +#ifdef SKIP_PEER_VERIFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); #endif -#ifdef SKIP_HOSTNAME_VERFICATION - /* - * If the site you're connecting to uses a different host name that what + /* If the site you're connecting to uses a different host name that what * they have mentioned in their server certificate's commonName (or * subjectAltName) fields, libcurl will refuse to connect. You can skip - * this check, but this will make the connection less secure. - */ + * this check, but this will make the connection less secure. */ +#ifdef SKIP_HOSTNAME_VERFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); #endif - /* Perform the request, res will get the return code */ + /* Since the traffic will be encrypted, it is very useful to turn on debug + * information within libcurl to see what is happening during the + * transfer */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Perform the retr */ res = curl_easy_perform(curl); + /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); - /* always cleanup */ + /* Always cleanup */ curl_easy_cleanup(curl); } - return 0; + + return (int)res; } diff --git a/docs/examples/pop3-stat.c b/docs/examples/pop3-stat.c new file mode 100644 index 0000000..7b318fc --- /dev/null +++ b/docs/examples/pop3-stat.c @@ -0,0 +1,64 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to obtain message statistics using + * libcurl's POP3 capabilities. + * + * Note that this example requires libcurl 7.26.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); + + /* Set the STAT command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STAT"); + + /* Do not perform a transfer as the data is in the response */ + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-tls.c b/docs/examples/pop3-tls.c new file mode 100644 index 0000000..812d89b --- /dev/null +++ b/docs/examples/pop3-tls.c @@ -0,0 +1,84 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to retrieve mail using libcurl's POP3 + * capabilities. It builds on the pop3-retr.c example adding transport + * security to protect the authentication details from being snooped. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This will retreive message 1 from the user's mailbox */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1"); + + /* In this example, we'll start with a plain text connection, and upgrade + * to Transport Layer Security (TLS) using the STLS command. Be careful of + * using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer + * will continue anyway - see the security discussion in the libcurl + * tutorial for more details. */ + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); + + /* If your server doesn't have a valid certificate, then you can disable + * part of the Transport Layer Security protection by setting the + * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false). + * curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + * curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + * That is, in general, a bad idea. It is still better than sending your + * authentication details in plain text though. + * Instead, you should get the issuer certificate (or the host certificate + * if the certificate is self-signed) and add it to the set of certificates + * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See + * docs/SSLCERTS for more information. */ + curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); + + /* Since the traffic will be encrypted, it is very useful to turn on debug + * information within libcurl to see what is happening during the + * transfer */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Perform the retr */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-top.c b/docs/examples/pop3-top.c new file mode 100644 index 0000000..21cee88 --- /dev/null +++ b/docs/examples/pop3-top.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example showing how to retrieve only the headers of a mail + * using libcurl's POP3 capabilities. + * + * Note that this example requires libcurl 7.26.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); + + /* Set the TOP command for message 1 to only include the headers */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "TOP 1 0"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/pop3-uidl.c b/docs/examples/pop3-uidl.c new file mode 100644 index 0000000..debb179 --- /dev/null +++ b/docs/examples/pop3-uidl.c @@ -0,0 +1,61 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include + +/* This is a simple example using libcurl's POP3 capabilities to list the + * contents of a mailbox by unique ID. + * + * Note that this example requires libcurl 7.26.0 or above. + */ + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is just the server URL */ + curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com"); + + /* Set the UIDL command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UIDL"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/postinmemory.c b/docs/examples/postinmemory.c new file mode 100644 index 0000000..cd2bd13 --- /dev/null +++ b/docs/examples/postinmemory.c @@ -0,0 +1,111 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2013, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include +#include + +struct MemoryStruct { + char *memory; + size_t size; +}; + +static size_t +WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)userp; + + mem->memory = realloc(mem->memory, mem->size + realsize + 1); + if(mem->memory == NULL) { + /* out of memory! */ + printf("not enough memory (realloc returned NULL)\n"); + return 0; + } + + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + + return realsize; +} + +int main(void) +{ + CURL *curl; + CURLcode res; + struct MemoryStruct chunk; + static const char *postthis="Field=1&Field=2&Field=3"; + + chunk.memory = malloc(1); /* will be grown as needed by realloc above */ + chunk.size = 0; /* no data at this point */ + + curl_global_init(CURL_GLOBAL_ALL); + curl = curl_easy_init(); + if(curl) { + + curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.org/"); + + /* send all data to this function */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + + /* some servers don't like requests that are made without a user-agent + field, so we provide one */ + curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis); + + /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by + itself */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis)); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) { + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + } + else { + /* + * Now, our chunk.memory points to a memory block that is chunk.size + * bytes big and contains the remote file. + * + * Do something nice with it! + */ + printf("%s\n",chunk.memory); + } + + /* always cleanup */ + curl_easy_cleanup(curl); + + if(chunk.memory) + free(chunk.memory); + + /* we're done with libcurl, so clean it up */ + curl_global_cleanup(); + } + return 0; +} diff --git a/docs/examples/rtsp.c b/docs/examples/rtsp.c index 669780a..fed343d 100644 --- a/docs/examples/rtsp.c +++ b/docs/examples/rtsp.c @@ -224,7 +224,7 @@ int main(int argc, char * const argv[]) if (curl != NULL) { my_curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); my_curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); - my_curl_easy_setopt(curl, CURLOPT_WRITEHEADER, stdout); + my_curl_easy_setopt(curl, CURLOPT_HEADERDATA, stdout); my_curl_easy_setopt(curl, CURLOPT_URL, url); /* request server options */ diff --git a/docs/examples/sepheaders.c b/docs/examples/sepheaders.c index d944ab9..7402e35 100644 --- a/docs/examples/sepheaders.c +++ b/docs/examples/sepheaders.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -53,23 +53,26 @@ int main(void) /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); - /* open the files */ - headerfile = fopen(headerfilename,"wb"); - if (headerfile == NULL) { + /* open the header file */ + headerfile = fopen(headerfilename, "wb"); + if(!headerfile) { curl_easy_cleanup(curl_handle); return -1; } - bodyfile = fopen(bodyfilename,"wb"); - if (bodyfile == NULL) { + + /* open the body file */ + bodyfile = fopen(bodyfilename, "wb"); + if(!bodyfile) { curl_easy_cleanup(curl_handle); + fclose(headerfile); return -1; } /* we want the headers be written to this file handle */ - curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, headerfile); + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, headerfile); /* we want the body be written to this file handle instead of stdout */ - curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile); /* get it! */ curl_easy_perform(curl_handle); diff --git a/docs/examples/sessioninfo.c b/docs/examples/sessioninfo.c new file mode 100644 index 0000000..2641c71 --- /dev/null +++ b/docs/examples/sessioninfo.c @@ -0,0 +1,105 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2013, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* Note that this example currently requires cURL to be linked against + GnuTLS (and this program must also be linked against -lgnutls). */ + +#include + +#include +#include + +static CURL *curl; + +static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream) +{ + const struct curl_tlssessioninfo *info; + unsigned int cert_list_size; + const gnutls_datum_t *chainp; + CURLcode res; + + (void)stream; + (void)ptr; + + res = curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &info); + + if(!res) { + switch(info->backend) { + case CURLSSLBACKEND_GNUTLS: + /* info->internals is now the gnutls_session_t */ + chainp = gnutls_certificate_get_peers(info->internals, &cert_list_size); + if((chainp) && (cert_list_size)) { + unsigned int i; + + for(i = 0; i < cert_list_size; i++) { + gnutls_x509_crt_t cert; + gnutls_datum_t dn; + + if(GNUTLS_E_SUCCESS == gnutls_x509_crt_init(&cert)) { + if(GNUTLS_E_SUCCESS == + gnutls_x509_crt_import(cert, &chainp[i], GNUTLS_X509_FMT_DER)) { + if(GNUTLS_E_SUCCESS == + gnutls_x509_crt_print(cert, GNUTLS_CRT_PRINT_FULL, &dn)) { + fprintf(stderr, "Certificate #%d: %.*s", i, dn.size, dn.data); + + gnutls_free(dn.data); + } + } + + gnutls_x509_crt_deinit(cert); + } + } + } + break; + case CURLSSLBACKEND_NONE: + default: + break; + } + } + + return size * nmemb; +} + +int main(void) +{ + curl_global_init(CURL_GLOBAL_DEFAULT); + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/"); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu); + + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); + + (void) curl_easy_perform(curl); + + curl_easy_cleanup(curl); + } + + curl_global_cleanup(); + + return 0; +} diff --git a/docs/examples/simplesmtp.c b/docs/examples/simplesmtp.c deleted file mode 100644 index df85162..0000000 --- a/docs/examples/simplesmtp.c +++ /dev/null @@ -1,87 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2011, 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 http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ -#include -#include -#include - -int main(void) -{ - CURL *curl; - CURLcode res; - struct curl_slist *recipients = NULL; - - /* value for envelope reverse-path */ - static const char *from = ""; - - /* this becomes the envelope forward-path */ - static const char *to = ""; - - curl = curl_easy_init(); - if(curl) { - /* this is the URL for your mailserver - you can also use an smtps:// URL - * here */ - curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.net."); - - /* Note that this option isn't strictly required, omitting it will result in - * libcurl will sent the MAIL FROM command with no sender data. All - * autoresponses should have an empty reverse-path, and should be directed - * to the address in the reverse-path which triggered them. Otherwise, they - * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. - */ - curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from); - - /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array. */ - recipients = curl_slist_append(recipients, to); - curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); - - /* You provide the payload (headers and the body of the message) as the - * "data" element. There are two choices, either: - * - provide a callback function and specify the function name using the - * CURLOPT_READFUNCTION option; or - * - just provide a FILE pointer that can be used to read the data from. - * The easiest case is just to read from standard input, (which is available - * as a FILE pointer) as shown here. - */ - curl_easy_setopt(curl, CURLOPT_READDATA, stdin); - - /* send the message (including headers) */ - res = curl_easy_perform(curl); - /* Check for errors */ - if(res != CURLE_OK) - fprintf(stderr, "curl_easy_perform() failed: %s\n", - curl_easy_strerror(res)); - - /* free the list of recipients */ - curl_slist_free_all(recipients); - - /* curl won't send the QUIT command until you call cleanup, so you should be - * able to re-use this connection for additional messages (setting - * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling - * curl_easy_perform() again. It may not be a good idea to keep the - * connection open for a very long time though (more than a few minutes may - * result in the server timing out the connection), and you do want to clean - * up in the end. - */ - curl_easy_cleanup(curl); - } - return 0; -} diff --git a/docs/examples/simplessl.c b/docs/examples/simplessl.c index 74c5846..aefb79f 100644 --- a/docs/examples/simplessl.c +++ b/docs/examples/simplessl.c @@ -75,7 +75,7 @@ int main(void) if(curl) { /* what call to write: */ curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site"); - curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, headerfile); for(i = 0; i < 1; i++) /* single-iteration loop, just to break out from */ { diff --git a/docs/examples/smtp-expn.c b/docs/examples/smtp-expn.c new file mode 100644 index 0000000..0322d2f --- /dev/null +++ b/docs/examples/smtp-expn.c @@ -0,0 +1,73 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include + +/* This is a simple example showing how to expand an email mailing list. + * + * Notes: + * + * 1) This example requires libcurl 7.34.0 or above. + * 2) Not all email servers support this command. + */ + +int main(void) +{ + CURL *curl; + CURLcode res; + struct curl_slist *recipients = NULL; + + curl = curl_easy_init(); + if(curl) { + /* This is the URL for your mailserver */ + curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); + + /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array */ + recipients = curl_slist_append(recipients, "Friends"); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); + + /* Set the EXPN command */ + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPN"); + + /* Perform the custom request */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Free the list of recipients */ + curl_slist_free_all(recipients); + + /* Curl won't send the QUIT command until you call cleanup, so you should + * be able to re-use this connection for additional requests. It may not be + * a good idea to keep the connection open for a very long time though + * (more than a few minutes may result in the server timing out the + * connection) and you do want to clean up in the end. + */ + curl_easy_cleanup(curl); + } + + return 0; +} diff --git a/docs/examples/smtp-mail.c b/docs/examples/smtp-mail.c new file mode 100644 index 0000000..af4d1b6 --- /dev/null +++ b/docs/examples/smtp-mail.c @@ -0,0 +1,137 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include + +/* This is a simple example showing how to send mail using libcurl's SMTP + * capabilities. For an exmaple of using the multi interface please see + * smtp-multi.c. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +#define FROM "" +#define TO "" +#define CC "" + +static const char *payload_text[] = { + "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", + "To: " TO "\r\n", + "From: " FROM "(Example User)\r\n", + "Cc: " CC "(Another example User)\r\n", + "Message-ID: \r\n", + "Subject: SMTP example message\r\n", + "\r\n", /* empty line to divide headers from body, see RFC5322 */ + "The body of the message starts here.\r\n", + "\r\n", + "It could be a lot of lines, could be MIME encoded, whatever.\r\n", + "Check RFC5322.\r\n", + NULL +}; + +struct upload_status { + int lines_read; +}; + +static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) +{ + struct upload_status *upload_ctx = (struct upload_status *)userp; + const char *data; + + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { + return 0; + } + + data = payload_text[upload_ctx->lines_read]; + + if(data) { + size_t len = strlen(data); + memcpy(ptr, data, len); + upload_ctx->lines_read++; + + return len; + } + + return 0; +} + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + struct curl_slist *recipients = NULL; + struct upload_status upload_ctx; + + upload_ctx.lines_read = 0; + + curl = curl_easy_init(); + if(curl) { + /* This is the URL for your mailserver */ + curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); + + /* Note that this option isn't strictly required, omitting it will result in + * libcurl sending the MAIL FROM command with empty sender data. All + * autoresponses should have an empty reverse-path, and should be directed + * to the address in the reverse-path which triggered them. Otherwise, they + * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. + */ + curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); + + /* Add two recipients, in this particular case they correspond to the + * To: and Cc: addressees in the header, but they could be any kind of + * recipient. */ + recipients = curl_slist_append(recipients, TO); + recipients = curl_slist_append(recipients, CC); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); + + /* We're using a callback function to specify the payload (the headers and + * body of the message). You could just use the CURLOPT_READDATA option to + * specify a FILE pointer to read from. */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* Send the message */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Free the list of recipients */ + curl_slist_free_all(recipients); + + /* curl won't send the QUIT command until you call cleanup, so you should be + * able to re-use this connection for additional messages (setting + * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling + * curl_easy_perform() again. It may not be a good idea to keep the + * connection open for a very long time though (more than a few minutes may + * result in the server timing out the connection), and you do want to clean + * up in the end. + */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/smtp-multi.c b/docs/examples/smtp-multi.c index 6462aff..4098c7d 100644 --- a/docs/examples/smtp-multi.c +++ b/docs/examples/smtp-multi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -19,139 +19,152 @@ * KIND, either express or implied. * ***************************************************************************/ -/* This is an example application source code sending SMTP mail using the - * multi interface. - */ - #include #include -/* - * This is the list of basic details you need to tweak to get things right. +/* This is an example showing how to send mail using libcurl's SMTP + * capabilities. It builds on the smtp-mail.c example to demonstrate how to use + * libcurl's multi interface. + * + * Note that this example requires libcurl 7.20.0 or above. */ -#define USERNAME "user@example.com" -#define PASSWORD "123qwerty" -#define SMTPSERVER "smtp.example.com" -#define SMTPPORT ":587" /* it is a colon+port string, but you can set it - to "" to use the default port */ -#define RECIPIENT "" -#define MAILFROM "" + +#define FROM "" +#define TO "" +#define CC "" #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 -/* Note that you should include the actual meta data headers here as well if - you want the mail to have a Subject, another From:, show a To: or whatever - you think your mail should feature! */ -static const char *text[]={ - "one\n", - "two\n", - "three\n", - " Hello, this is CURL email SMTP\n", +static const char *payload_text[] = { + "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", + "To: " TO "\r\n", + "From: " FROM "(Example User)\r\n", + "Cc: " CC "(Another example User)\r\n", + "Message-ID: \r\n", + "Subject: SMTP multi example message\r\n", + "\r\n", /* empty line to divide headers from body, see RFC5322 */ + "The body of the message starts here.\r\n", + "\r\n", + "It could be a lot of lines, could be MIME encoded, whatever.\r\n", + "Check RFC5322.\r\n", NULL }; -struct WriteThis { - int counter; +struct upload_status { + int lines_read; }; -static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) +static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { - struct WriteThis *pooh = (struct WriteThis *)userp; + struct upload_status *upload_ctx = (struct upload_status *)userp; const char *data; - if(size*nmemb < 1) + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { return 0; + } - data = text[pooh->counter]; + data = payload_text[upload_ctx->lines_read]; if(data) { size_t len = strlen(data); memcpy(ptr, data, len); - pooh->counter++; /* advance pointer */ + upload_ctx->lines_read++; + return len; } - return 0; /* no more data left to deliver */ + + return 0; } static struct timeval tvnow(void) { - /* - ** time() returns the value of time in seconds since the Epoch. - */ struct timeval now; + + /* time() returns the value of time in seconds since the epoch */ now.tv_sec = (long)time(NULL); now.tv_usec = 0; + return now; } static long tvdiff(struct timeval newer, struct timeval older) { - return (newer.tv_sec-older.tv_sec)*1000+ - (newer.tv_usec-older.tv_usec)/1000; + return (newer.tv_sec - older.tv_sec) * 1000 + + (newer.tv_usec - older.tv_usec) / 1000; } int main(void) { - CURL *curl; - CURLM *mcurl; - int still_running = 1; - struct timeval mp_start; - struct WriteThis pooh; - struct curl_slist* rcpt_list = NULL; + CURL *curl; + CURLM *mcurl; + int still_running = 1; + struct timeval mp_start; + struct curl_slist *recipients = NULL; + struct upload_status upload_ctx; + + upload_ctx.lines_read = 0; - pooh.counter = 0; + curl_global_init(CURL_GLOBAL_DEFAULT); - curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + if(!curl) + return 1; - curl = curl_easy_init(); - if(!curl) - return 1; + mcurl = curl_multi_init(); + if(!mcurl) + return 2; - mcurl = curl_multi_init(); - if(!mcurl) - return 2; + /* This is the URL for your mailserver */ + curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); - rcpt_list = curl_slist_append(rcpt_list, RECIPIENT); - /* more addresses can be added here - rcpt_list = curl_slist_append(rcpt_list, ""); + /* Note that this option isn't strictly required, omitting it will result in + * libcurl sending the MAIL FROM command with empty sender data. All + * autoresponses should have an empty reverse-path, and should be directed + * to the address in the reverse-path which triggered them. Otherwise, they + * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. */ + curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); + + /* Add two recipients, in this particular case they correspond to the + * To: and Cc: addressees in the header, but they could be any kind of + * recipient. */ + recipients = curl_slist_append(recipients, TO); + recipients = curl_slist_append(recipients, CC); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); - curl_easy_setopt(curl, CURLOPT_URL, "smtp://" SMTPSERVER SMTPPORT); - curl_easy_setopt(curl, CURLOPT_USERNAME, USERNAME); - curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD); - curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); - curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM); - curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list); - curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); - curl_easy_setopt(curl, CURLOPT_READDATA, &pooh); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(curl, CURLOPT_SSLVERSION, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L); - curl_multi_add_handle(mcurl, curl); - - mp_start = tvnow(); - - /* we start some action by calling perform right away */ + /* We're using a callback function to specify the payload (the headers and + * body of the message). You could just use the CURLOPT_READDATA option to + * specify a FILE pointer to read from. */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* Tell the multi stack about our easy handle */ + curl_multi_add_handle(mcurl, curl); + + /* Record the start time which we can use later */ + mp_start = tvnow(); + + /* We start some action by calling perform right away */ curl_multi_perform(mcurl, &still_running); while(still_running) { struct timeval timeout; - int rc; /* select() return code */ - fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = -1; + int rc; + CURLMcode mc; /* curl_multi_fdset() return code */ long curl_timeo = -1; + /* Initialise the file descriptors */ FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); - /* set a suitable timeout to play around with */ + /* Set a suitable timeout to play around with */ timeout.tv_sec = 1; timeout.tv_usec = 0; @@ -165,39 +178,60 @@ int main(void) } /* get file descriptors from the transfers */ - curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); + mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); - /* In a real-world program you OF COURSE check the return code of the - function calls. On success, the value of maxfd is guaranteed to be - greater or equal than -1. We call select(maxfd + 1, ...), specially in - case of (maxfd == -1), we call select(0, ...), which is basically equal - to sleep. */ + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + /* On success the value of maxfd is guaranteed to be >= -1. We call + select(maxfd + 1, ...); specially in case of (maxfd == -1) there are + no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- + to sleep 100ms, which is the minimum suggested value in the + curl_multi_fdset() doc. */ + + if(maxfd == -1) { +#ifdef _WIN32 + Sleep(100); + rc = 0; +#else + /* Portable sleep for platforms other than Windows. */ + struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ + rc = select(0, NULL, NULL, NULL, &wait); +#endif + } + else { + /* Note that on some platforms 'timeout' may be modified by select(). + If you need access to the original value save a copy beforehand. */ + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + } - if (tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { - fprintf(stderr, "ABORTING TEST, since it seems " - "that it would have run forever.\n"); + if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { + fprintf(stderr, + "ABORTING: Since it seems that we would have run forever.\n"); break; } switch(rc) { - case -1: - /* select error */ + case -1: /* select error */ break; - case 0: /* timeout */ - default: /* action */ + case 0: /* timeout */ + default: /* action */ curl_multi_perform(mcurl, &still_running); break; } } - curl_slist_free_all(rcpt_list); + /* Free the list of recipients */ + curl_slist_free_all(recipients); + + /* Always cleanup */ curl_multi_remove_handle(mcurl, curl); curl_multi_cleanup(mcurl); curl_easy_cleanup(curl); curl_global_cleanup(); + return 0; } - - diff --git a/docs/examples/smtp-ssl.c b/docs/examples/smtp-ssl.c new file mode 100644 index 0000000..9a68a7f --- /dev/null +++ b/docs/examples/smtp-ssl.c @@ -0,0 +1,161 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include + +/* This is a simple example showing how to send mail using libcurl's SMTP + * capabilities. It builds on the smtp-mail.c example to add authentication + * and, more importantly, transport security to protect the authentication + * details from being snooped. + * + * Note that this example requires libcurl 7.20.0 or above. + */ + +#define FROM "" +#define TO "" +#define CC "" + +static const char *payload_text[] = { + "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", + "To: " TO "\r\n", + "From: " FROM "(Example User)\r\n", + "Cc: " CC "(Another example User)\r\n", + "Message-ID: \r\n", + "Subject: SMTP SSL example message\r\n", + "\r\n", /* empty line to divide headers from body, see RFC5322 */ + "The body of the message starts here.\r\n", + "\r\n", + "It could be a lot of lines, could be MIME encoded, whatever.\r\n", + "Check RFC5322.\r\n", + NULL +}; + +struct upload_status { + int lines_read; +}; + +static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) +{ + struct upload_status *upload_ctx = (struct upload_status *)userp; + const char *data; + + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { + return 0; + } + + data = payload_text[upload_ctx->lines_read]; + + if(data) { + size_t len = strlen(data); + memcpy(ptr, data, len); + upload_ctx->lines_read++; + + return len; + } + + return 0; +} + +int main(void) +{ + CURL *curl; + CURLcode res = CURLE_OK; + struct curl_slist *recipients = NULL; + struct upload_status upload_ctx; + + upload_ctx.lines_read = 0; + + curl = curl_easy_init(); + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + + /* This is the URL for your mailserver. Note the use of smtps:// rather + * than smtp:// to request a SSL based connection. */ + curl_easy_setopt(curl, CURLOPT_URL, "smtps://mainserver.example.net"); + + /* If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. */ +#ifdef SKIP_PEER_VERIFICATION + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); +#endif + + /* If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. */ +#ifdef SKIP_HOSTNAME_VERFICATION + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + /* Note that this option isn't strictly required, omitting it will result in + * libcurl sending the MAIL FROM command with empty sender data. All + * autoresponses should have an empty reverse-path, and should be directed + * to the address in the reverse-path which triggered them. Otherwise, they + * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. + */ + curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); + + /* Add two recipients, in this particular case they correspond to the + * To: and Cc: addressees in the header, but they could be any kind of + * recipient. */ + recipients = curl_slist_append(recipients, TO); + recipients = curl_slist_append(recipients, CC); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); + + /* We're using a callback function to specify the payload (the headers and + * body of the message). You could just use the CURLOPT_READDATA option to + * specify a FILE pointer to read from. */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* Since the traffic will be encrypted, it is very useful to turn on debug + * information within libcurl to see what is happening during the + * transfer */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Send the message */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Free the list of recipients */ + curl_slist_free_all(recipients); + + /* Always cleanup */ + curl_easy_cleanup(curl); + } + + return (int)res; +} diff --git a/docs/examples/smtp-tls.c b/docs/examples/smtp-tls.c index 3635c10..4872dbd 100644 --- a/docs/examples/smtp-tls.c +++ b/docs/examples/smtp-tls.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,26 +24,29 @@ #include /* This is a simple example showing how to send mail using libcurl's SMTP - * capabilities. It builds on the simplesmtp.c example, adding some - * authentication and transport security. + * capabilities. It builds on the smtp-mail.c example to add authentication + * and, more importantly, transport security to protect the authentication + * details from being snooped. + * + * Note that this example requires libcurl 7.20.0 or above. */ #define FROM "" #define TO "" #define CC "" -static const char *payload_text[]={ - "Date: Mon, 29 Nov 2010 21:54:29 +1100\n", - "To: " TO "\n", - "From: " FROM "(Example User)\n", - "Cc: " CC "(Another example User)\n", - "Message-ID: \n", - "Subject: SMTP TLS example message\n", - "\n", /* empty line to divide headers from body, see RFC5322 */ - "The body of the message starts here.\n", - "\n", - "It could be a lot of lines, could be MIME encoded, whatever.\n", - "Check RFC5322.\n", +static const char *payload_text[] = { + "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", + "To: " TO "\r\n", + "From: " FROM "(Example User)\r\n", + "Cc: " CC "(Another example User)\r\n", + "Message-ID: \r\n", + "Subject: SMTP TLS example message\r\n", + "\r\n", /* empty line to divide headers from body, see RFC5322 */ + "The body of the message starts here.\r\n", + "\r\n", + "It could be a lot of lines, could be MIME encoded, whatever.\r\n", + "Check RFC5322.\r\n", NULL }; @@ -56,33 +59,38 @@ static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) struct upload_status *upload_ctx = (struct upload_status *)userp; const char *data; - if ((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { + if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { return 0; } data = payload_text[upload_ctx->lines_read]; - if (data) { + if(data) { size_t len = strlen(data); memcpy(ptr, data, len); - upload_ctx->lines_read ++; + upload_ctx->lines_read++; + return len; } + return 0; } - int main(void) { CURL *curl; - CURLcode res; + CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; struct upload_status upload_ctx; upload_ctx.lines_read = 0; curl = curl_easy_init(); - if (curl) { + if(curl) { + /* Set username and password */ + curl_easy_setopt(curl, CURLOPT_USERNAME, "user"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret"); + /* This is the URL for your mailserver. Note the use of port 587 here, * instead of the normal SMTP port (25). Port 587 is commonly used for * secure mail submission (see RFC4403), but you should use whatever @@ -106,18 +114,17 @@ int main(void) * Instead, you should get the issuer certificate (or the host certificate * if the certificate is self-signed) and add it to the set of certificates * that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See - * docs/SSLCERTS for more information. - */ + * docs/SSLCERTS for more information. */ curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem"); - /* A common reason for requiring transport security is to protect - * authentication details (user names and passwords) from being "snooped" - * on the network. Here is how the user name and password are provided: */ - curl_easy_setopt(curl, CURLOPT_USERNAME, "user@example.net"); - curl_easy_setopt(curl, CURLOPT_PASSWORD, "P@ssw0rd"); - - /* value for envelope reverse-path */ + /* Note that this option isn't strictly required, omitting it will result in + * libcurl sending the MAIL FROM command with empty sender data. All + * autoresponses should have an empty reverse-path, and should be directed + * to the address in the reverse-path which triggered them. Otherwise, they + * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details. + */ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); + /* Add two recipients, in this particular case they correspond to the * To: and Cc: addressees in the header, but they could be any kind of * recipient. */ @@ -125,28 +132,32 @@ int main(void) recipients = curl_slist_append(recipients, CC); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); - /* In this case, we're using a callback function to specify the data. You - * could just use the CURLOPT_READDATA option to specify a FILE pointer to - * read from. - */ + /* We're using a callback function to specify the payload (the headers and + * body of the message). You could just use the CURLOPT_READDATA option to + * specify a FILE pointer to read from. */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* Since the traffic will be encrypted, it is very useful to turn on debug * information within libcurl to see what is happening during the transfer. */ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - /* send the message (including headers) */ + /* Send the message */ res = curl_easy_perform(curl); + /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); - /* free the list of recipients and clean up */ + /* Free the list of recipients */ curl_slist_free_all(recipients); + + /* Always cleanup */ curl_easy_cleanup(curl); } - return 0; + + return (int)res; } diff --git a/docs/examples/smtp-vrfy.c b/docs/examples/smtp-vrfy.c new file mode 100644 index 0000000..4e44cea --- /dev/null +++ b/docs/examples/smtp-vrfy.c @@ -0,0 +1,73 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include +#include +#include + +/* This is a simple example showing how to verify an email address from an + * SMTP server. + * + * Notes: + * + * 1) This example requires libcurl 7.34.0 or above. + * 2) Not all email servers support this command and even if your email server + * does support it, it may respond with a 252 response code even though the + * address doesn't exist. + */ + +int main(void) +{ + CURL *curl; + CURLcode res; + struct curl_slist *recipients = NULL; + + curl = curl_easy_init(); + if(curl) { + /* This is the URL for your mailserver */ + curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); + + /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array */ + recipients = curl_slist_append(recipients, ""); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); + + /* Perform the VRFY */ + res = curl_easy_perform(curl); + + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* Free the list of recipients */ + curl_slist_free_all(recipients); + + /* Curl won't send the QUIT command until you call cleanup, so you should + * be able to re-use this connection for additional requests. It may not be + * a good idea to keep the connection open for a very long time though + * (more than a few minutes may result in the server timing out the + * connection) and you do want to clean up in the end. + */ + curl_easy_cleanup(curl); + } + + return 0; +} diff --git a/docs/examples/synctime.c b/docs/examples/synctime.c index 14d77de..cd7d073 100644 --- a/docs/examples/synctime.c +++ b/docs/examples/synctime.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -92,6 +92,8 @@ #define MAX_STRING 256 #define MAX_STRING1 MAX_STRING+1 +#define SYNCTIME_UA "synctime/1.0" + typedef struct { char http_proxy[MAX_STRING1]; @@ -99,12 +101,11 @@ typedef struct char timeserver[MAX_STRING1]; } conf_t; -const char DefaultTimeServer[4][MAX_STRING1] = +const char DefaultTimeServer[3][MAX_STRING1] = { - "http://nist.time.gov/timezone.cgi?UTC/s/0", - "http://www.google.com/", - "http://www.worldtimeserver.com/current_time_in_UTC.aspx", - "http://www.worldtime.com/cgi-bin/wt.cgi" + "http://pool.ntp.org/", + "http://nist.time.gov/", + "http://www.google.com/" }; const char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; @@ -186,9 +187,9 @@ void SyncTime_CURL_Init(CURL *curl, char *proxy_port, if (strlen(proxy_user_password) > 0) curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password); - /* Trick Webserver by claiming that you are using Microsoft WinXP SP2, IE6 */ - curl_easy_setopt(curl, CURLOPT_USERAGENT, - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); +#ifdef SYNCTIME_UA + curl_easy_setopt(curl, CURLOPT_USERAGENT, SYNCTIME_UA); +#endif curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, *SyncTime_CURL_WriteOutput); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, *SyncTime_CURL_WriteHeader); } diff --git a/docs/examples/url2file.c b/docs/examples/url2file.c index 64d27c8..adf696c 100644 --- a/docs/examples/url2file.c +++ b/docs/examples/url2file.c @@ -63,9 +63,8 @@ int main(int argc, char *argv[]) pagefile = fopen(pagefilename, "wb"); if (pagefile) { - /* write the page body to this file handle. CURLOPT_FILE is also known as - CURLOPT_WRITEDATA*/ - curl_easy_setopt(curl_handle, CURLOPT_FILE, pagefile); + /* write the page body to this file handle */ + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile); /* get it! */ curl_easy_perform(curl_handle); diff --git a/docs/examples/usercertinmem.c b/docs/examples/usercertinmem.c index 99740fd..dd56c61 100644 --- a/docs/examples/usercertinmem.c +++ b/docs/examples/usercertinmem.c @@ -22,8 +22,9 @@ /* Example using an in memory PEM user certificate and RSA key to retrieve an * https page. * Written by Ishan SinghLevett, based on Theo Borm's cacertinmem.c. - * Note this example does not use a CA certificate, however one should be used - * if you want a properly secure connection + * Note that to maintain simplicity this example does not use a CA certificate + * for peer verification. However, some form of peer verification + * must be used in real circumstances when a secure connection is required. */ #include @@ -152,6 +153,18 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm) printf("Use Key failed\n"); } + /* free resources that have been allocated by openssl functions */ + if (bio) + BIO_free(bio); + + if (kbio) + BIO_free(kbio); + + if (rsa) + RSA_free(rsa); + + if (cert) + X509_free(cert); /* all set to go */ return CURLE_OK ; @@ -171,7 +184,7 @@ int main(void) rv = curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction); rv = curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout); rv = curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction); - rv = curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr); + rv = curl_easy_setopt(ch,CURLOPT_HEADERDATA, stderr); rv = curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM"); /* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is diff --git a/docs/libcurl/ABI b/docs/libcurl/ABI index 3ec0e04..ef0caa6 100644 --- a/docs/libcurl/ABI +++ b/docs/libcurl/ABI @@ -7,16 +7,16 @@ libcurl's binary interface ABI - Application Binary Interface +---------------------------------- - First, allow me to define the word for this context: ABI describes the - low-level interface between an application program and a library. Calling - conventions, function arguments, return values, struct sizes/defines and - more. + "ABI" describes the low-level interface between an application program and a + library. Calling conventions, function arguments, return values, struct + sizes/defines and more. - For a longer description, see - http://en.wikipedia.org/wiki/Application_binary_interface + [Wikipedia has a longer description](http://en.wikipedia.org/wiki/Application_binary_interface) Upgrades +-------- In the vast majority of all cases, a typical libcurl upgrade does not break the ABI at all. Your application can remain using libcurl just as before, @@ -26,11 +26,13 @@ Upgrades it now is defined to work. Version Numbers +--------------- In libcurl land, you really can't tell by the libcurl version number if that libcurl is binary compatible or not with another libcurl version. Soname Bumps +------------ Whenever there are changes done to the library that will cause an ABI breakage, that may require your application to get attention or possibly be @@ -43,7 +45,11 @@ Soname Bumps During the first seven years of libcurl releases, there have only been four ABI breakages. + We are determined to bump the SONAME as rarely as possible. Ideally, we + never do it again. + Downgrades +---------- Going to an older libcurl version from one you're currently using can be a tricky thing. Mostly we add features and options to newer libcurls as that @@ -54,6 +60,7 @@ Downgrades soname, and then your application may need to adapt to the modified ABI. History +------- The previous major library soname number bumps (breaking backwards compatibility) have happened the following times: diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am index 3114e2b..c47678b 100644 --- a/docs/libcurl/Makefile.am +++ b/docs/libcurl/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -22,6 +22,8 @@ AUTOMAKE_OPTIONS = foreign no-dependencies +SUBDIRS = opts + man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \ curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \ curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \ @@ -79,20 +81,25 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \ curl_multi_assign.pdf curl_easy_pause.pdf curl_easy_recv.pdf \ curl_easy_send.pdf curl_multi_socket_action.pdf curl_multi_wait.pdf +m4macrodir = $(datadir)/aclocal +dist_m4macro_DATA = libcurl.m4 + CLEANFILES = $(HTMLPAGES) $(PDFPAGES) -EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 ABI \ +EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) ABI \ symbols-in-versions symbols.pl MAN2HTML= roffit --mandir=. < $< >$@ SUFFIXES = .3 .html html: $(HTMLPAGES) + cd opts; make html .3.html: $(MAN2HTML) pdf: $(PDFPAGES) + cd opts; make pdf .3.pdf: @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ diff --git a/docs/libcurl/Makefile.in b/docs/libcurl/Makefile.in index fa1939d..7430e81 100644 --- a/docs/libcurl/Makefile.in +++ b/docs/libcurl/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -21,7 +21,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -35,6 +35,7 @@ # KIND, either express or implied. # ########################################################################### + VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ @@ -101,7 +102,7 @@ build_triplet = @build@ host_triplet = @host@ subdir = docs/libcurl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs + $(top_srcdir)/mkinstalldirs $(dist_m4macro_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ $(top_srcdir)/m4/curl-confopts.m4 \ @@ -143,6 +144,14 @@ depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -176,10 +185,63 @@ am__uninstall_files_from_dir = { \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 -am__installdirs = "$(DESTDIR)$(man3dir)" +am__installdirs = "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(m4macrodir)" MANS = $(man_MANS) +DATA = $(dist_m4macro_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ @@ -212,6 +274,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -236,7 +299,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -245,7 +307,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -266,6 +327,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -301,11 +363,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -365,6 +429,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign no-dependencies +SUBDIRS = opts man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \ curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \ curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \ @@ -422,13 +487,15 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \ curl_multi_assign.pdf curl_easy_pause.pdf curl_easy_recv.pdf \ curl_easy_send.pdf curl_multi_socket_action.pdf curl_multi_wait.pdf +m4macrodir = $(datadir)/aclocal +dist_m4macro_DATA = libcurl.m4 CLEANFILES = $(HTMLPAGES) $(PDFPAGES) -EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 ABI \ +EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) ABI \ symbols-in-versions symbols.pl MAN2HTML = roffit --mandir=. < $< >$@ SUFFIXES = .3 .html -all: all-am +all: all-recursive .SUFFIXES: .SUFFIXES: .3 .html .pdf @@ -511,12 +578,126 @@ uninstall-man3: } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: +install-dist_m4macroDATA: $(dist_m4macro_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_m4macro_DATA)'; test -n "$(m4macrodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(m4macrodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(m4macrodir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4macrodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(m4macrodir)" || exit $$?; \ + done -cscope cscopelist: +uninstall-dist_m4macroDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_m4macro_DATA)'; test -n "$(m4macrodir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(m4macrodir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -548,22 +729,48 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man3dir)"; do \ +check: check-recursive +all-am: Makefile $(MANS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(m4macrodir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-am +installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ @@ -586,92 +793,96 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am +clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am -distclean: distclean-am +distclean: distclean-recursive -rm -f Makefile -distclean-am: clean-am distclean-generic +distclean-am: clean-am distclean-generic distclean-tags -dvi: dvi-am +dvi: dvi-recursive dvi-am: html-am: -info: info-am +info: info-recursive info-am: -install-data-am: install-man +install-data-am: install-dist_m4macroDATA install-man -install-dvi: install-dvi-am +install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: -install-html: install-html-am +install-html: install-html-recursive install-html-am: -install-info: install-info-am +install-info: install-info-recursive install-info-am: install-man: install-man3 -install-pdf: install-pdf-am +install-pdf: install-pdf-recursive install-pdf-am: -install-ps: install-ps-am +install-ps: install-ps-recursive install-ps-am: installcheck-am: -maintainer-clean: maintainer-clean-am +maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-am +mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf-am: -ps: ps-am +ps: ps-recursive ps-am: -uninstall-am: uninstall-man +uninstall-am: uninstall-dist_m4macroDATA uninstall-man uninstall-man: uninstall-man3 -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - cscopelist-am ctags-am distclean distclean-generic \ - distclean-libtool distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man3 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_m4macroDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man3 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags-am uninstall uninstall-am uninstall-man \ - uninstall-man3 + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-dist_m4macroDATA uninstall-man uninstall-man3 html: $(HTMLPAGES) + cd opts; make html .3.html: $(MAN2HTML) pdf: $(PDFPAGES) + cd opts; make pdf .3.pdf: @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3 index d8a3f9f..403bfd3 100644 --- a/docs/libcurl/curl_easy_cleanup.3 +++ b/docs/libcurl/curl_easy_cleanup.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -22,20 +22,20 @@ .\" .TH curl_easy_cleanup 3 "22 aug 2007" "libcurl 7.17.0" "libcurl Manual" .SH NAME -curl_easy_cleanup - End a libcurl easy session +curl_easy_cleanup - End a libcurl easy handle .SH SYNOPSIS .B #include .BI "void curl_easy_cleanup(CURL *" handle ");" - .SH DESCRIPTION This function must be the last function to call for an easy session. It is the opposite of the \fIcurl_easy_init(3)\fP function and must be called with the -same \fIhandle\fP as input that the curl_easy_init call returned. +same \fIhandle\fP as input that a \fIcurl_easy_init(3)\fP call returned. -This will effectively close all connections this handle has used and possibly -has kept open until now. Don't call this function if you intend to transfer -more files. +This might close all connections this handle has used and possibly has kept +open until now - unless it was attached to a multi handle while doing the +transfers. Don't call this function if you intend to transfer more files, +re-using handles is a key to good performance with libcurl. Occasionally you may get your progress callback or header callback called from within \fIcurl_easy_cleanup(3)\fP (if previously set for the handle using @@ -43,15 +43,25 @@ within \fIcurl_easy_cleanup(3)\fP (if previously set for the handle using connection and the protocol is of a kind that requires a command/response sequence before disconnect. Examples of such protocols are FTP, POP3 and IMAP. -Any uses of the \fBhandle\fP after this function has been called and have -returned, are illegal. This kills the handle and all memory associated with -it! +Any use of the \fBhandle\fP after this function has been called and have +returned, is illegal. \fIcurl_easy_cleanup(3)\fP kills the handle and all +memory associated with it! -With libcurl versions prior to 7.17.: when you've called this, you can safely -remove all the strings you've previously told libcurl to use, as it won't use -them anymore now. +For libcurl versions before 7.17,: after you've called this function, you can +safely remove all the strings you've previously told libcurl to use, as it +won't use them anymore now. .SH RETURN VALUE None +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); +} +.fi .SH "SEE ALSO" .BR curl_easy_init "(3), " diff --git a/docs/libcurl/curl_easy_cleanup.html b/docs/libcurl/curl_easy_cleanup.html index 2ea921d..752461e 100644 --- a/docs/libcurl/curl_easy_cleanup.html +++ b/docs/libcurl/curl_easy_cleanup.html @@ -46,17 +46,27 @@ p.roffit {

NAME

-

curl_easy_cleanup - End a libcurl easy session

SYNOPSIS

+

curl_easy_cleanup - End a libcurl easy handle

SYNOPSIS

#include <curl/curl.h> -

void curl_easy_cleanup(CURL * handle ); -

DESCRIPTION

-

This function must be the last function to call for an easy session. It is the opposite of the curl_easy_init(3) function and must be called with the same handle as input that the curl_easy_init call returned. -

This will effectively close all connections this handle has used and possibly has kept open until now. Don't call this function if you intend to transfer more files. -

Occasionally you may get your progress callback or header callback called from within curl_easy_cleanup(3) (if previously set for the handle using curl_easy_setopt(3)). Like if libcurl decides to shut down the connection and the protocol is of a kind that requires a command/response sequence before disconnect. Examples of such protocols are FTP, POP3 and IMAP. -

Any uses of the handle after this function has been called and have returned, are illegal. This kills the handle and all memory associated with it! -

With libcurl versions prior to 7.17.: when you've called this, you can safely remove all the strings you've previously told libcurl to use, as it won't use them anymore now.

RETURN VALUE

-

None

SEE ALSO

-

curl_easy_init (3) +

void curl_easy_cleanup(CURL * handle );

DESCRIPTION

+

This function must be the last function to call for an easy session. It is the opposite of the curl_easy_init function and must be called with the same handle as input that a curl_easy_init call returned. +

This might close all connections this handle has used and possibly has kept open until now - unless it was attached to a multi handle while doing the transfers. Don't call this function if you intend to transfer more files, re-using handles is a key to good performance with libcurl. +

Occasionally you may get your progress callback or header callback called from within curl_easy_cleanup (if previously set for the handle using curl_easy_setopt). Like if libcurl decides to shut down the connection and the protocol is of a kind that requires a command/response sequence before disconnect. Examples of such protocols are FTP, POP3 and IMAP. +

Any use of the handle after this function has been called and have returned, is illegal. curl_easy_cleanup kills the handle and all memory associated with it! +

For libcurl versions before 7.17,: after you've called this function, you can safely remove all the strings you've previously told libcurl to use, as it won't use them anymore now.

RETURN VALUE

+

None

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   CURLcode res; +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +   res = curl_easy_perform(curl); +   curl_easy_cleanup(curl); + } +

+ +

SEE ALSO

+

curl_easy_init,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_cleanup.pdf b/docs/libcurl/curl_easy_cleanup.pdf index cf588e5e2939f81a8cb09b1891ed1cd80414810e..7e22eed662aafc4c90e6f61297248d7ef513d804 100644 GIT binary patch delta 2374 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 diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3 index e53ced4..080723a 100644 --- a/docs/libcurl/curl_easy_duphandle.3 +++ b/docs/libcurl/curl_easy_duphandle.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -19,7 +19,7 @@ .\" * KIND, either express or implied. .\" * .\" ************************************************************************** -.TH curl_easy_duphandle 3 "18 September 2001" "libcurl 7.9" "libcurl Manual" +.TH curl_easy_duphandle 3 "19 Sep 2014" "libcurl" "libcurl Manual" .SH NAME curl_easy_duphandle - Clone a libcurl session handle .SH SYNOPSIS @@ -47,5 +47,4 @@ in a synchronous way, the input handle may not be in use when cloned. If this function returns NULL, something went wrong and no valid handle was returned. .SH "SEE ALSO" -.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_global_init "(3) - +.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_global_init "(3)" diff --git a/docs/libcurl/curl_easy_duphandle.html b/docs/libcurl/curl_easy_duphandle.html index f84f0d3..19b1f6f 100644 --- a/docs/libcurl/curl_easy_duphandle.html +++ b/docs/libcurl/curl_easy_duphandle.html @@ -50,12 +50,11 @@ p.roffit {

#include <curl/curl.h>

CURL *curl_easy_duphandle(CURL *handle );

DESCRIPTION

-

This function will return a new curl handle, a duplicate, using all the options previously set in the input curl handle. Both handles can subsequently be used independently and they must both be freed with curl_easy_cleanup(3). -

All strings that the input handle has been told to point to (as opposed to copy) with previous calls to curl_easy_setopt(3) using char * inputs, will be pointed to by the new handle as well. You must therefore make sure to keep the data around until both handles have been cleaned up. +

This function will return a new curl handle, a duplicate, using all the options previously set in the input curl handle. Both handles can subsequently be used independently and they must both be freed with curl_easy_cleanup. +

All strings that the input handle has been told to point to (as opposed to copy) with previous calls to curl_easy_setopt using char * inputs, will be pointed to by the new handle as well. You must therefore make sure to keep the data around until both handles have been cleaned up.

The new handle will not inherit any state information, no connections, no SSL sessions and no cookies.

Note that even in multi-threaded programs, this function must be called in a synchronous way, the input handle may not be in use when cloned.

RETURN VALUE

If this function returns NULL, something went wrong and no valid handle was returned.

SEE ALSO

-

curl_easy_init (3) curl_easy_cleanup (3) curl_global_init (3) -

+

curl_easy_init, curl_easy_cleanup, curl_global_init,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_duphandle.pdf b/docs/libcurl/curl_easy_duphandle.pdf index 864fedf05a380de2bc9a57ee3c9b490b985dbfd0..b0fadf1c0bba8b2efec6f5674dd2da9f53487cf0 100644 GIT binary patch delta 2003 zcmb7=dr(t%7RQHxAzUO#0YO&?;TdEJ_mbS?CI$oop-{l^vb-f=c!ZaR5DTaw4#*=a zNU$LCC|M0JDQ_qi1%cKsPZ345tsra#A&Lq@wa6^(?99$A-C6hi^E>nTeb1Ti`QF5J z;|hF5gX$7|t<|{9f%29KG`6;vqa;@Yez1+Kwerm)LL2J_g)*~wln#0};3^XRtc=zl z?F_m&pL)N%3U&p##7ui&9v`Z(@UxL^TG@SN^Ovbz^{Q8@b5pZrIaN97$g`N_jL%WS z5p6Ut!?Lz|3C=jy>!2|7k{SQ=9M?PPWipZRbX|Mx5bBItZdqflq7ZdzwQsd@q*A*$ zoP}oryAX$72Aj~mD`B^GbgJD4l^V_^G%{mo^rOOj^x-?f$})yzGG(E~xAYxyetJ^V zoImdA?JoXAq6^Dn-}o4}-Y%n`d5XdopG77)52uSyOiy+$ae_75H5D6$Lv0H}5$b~+ z+v6iTw)XAg(Uaw4BOiET`<~!ktt!vM8VJoHnfSGYdyV+T0TadgQ2xY`>AvW5b5l&B zX_ZW0XdO-<*gf;;AzUckzi7B03V#usaqhKQtBwLQP~(j#OZW8sa2UJ+PBF)b$^1B z1H@;QRrHtEgigpB01d4Qo)Z2->Xkjav%Br`34fnzQ?0$0l_9+DF(1mtG1n+5?X!!j zUl%G8osR#*RsOnBTqbW2SEKoEkF|E35^>#>7gP#-cNZk(*4Y*}yq_NzUu&sz_uu<# z`Iirh_7~4IC!?0xwfY^(A`gP*&L7!7%QC`$iA(brN{$PSfV=11UQQrXHsN&|S`BN` z(|FA%xYP`OAMXgz`kXR;5bH;~hE>~WkXca^Nr6L&B}2yVl3-XX4P zj`djHBY#%V@LWmS;gA_{R$)rNu;@HynCu;lb7l6)JMx-7JGlDjn~U5>Vfzgn(xMBz zh*eKg)o;>JGa{F%Tc`K>U%GH4{&uqi+J9xi2-6VE4#ZdPwx zmY|QE5!PxFH9`~XTmBmSn%65<55UPvGQZanXzy(fsL=1f_%lXj&m%PF`XqAhnBi}e zd0hLqsPOaI7Z@=eZetEVFzEw%o_BN-UUmdp7aH6ReDI6tmKU}lHXSl)J6DzEH_g*j zktTWBjx74rowi?ePc8|HHb11NAK74hU?S?pWu+$PgXY5CfH~-VUt|+QNZU+zrJGt1 zy1!Qm?=2aJCR#G%dJ_lw(^occ2aZtJ>&@P$yW8nI;ZwfWTVHu1d4e5PonL$IZ#Vo+ z{M|RFn@g%hat0VIW2?7J3=^=;BPlfP`a zLc0-mec8UddgranLmU42nFC>jqRXSiu?*r>eDlQY$gwVlC2I7n{9Wap7ZUyzo#m%_ zEc9I2osuErSD)Ivv_Z(`gVjYSg>F9InvPx#=t zRbwK!iAR$Kd@d&e*y@rZcmTx+H2VF8NFc3Mv|~cq6po^DxVDiT>&PhE2x|!9Mp=Vf zWer0x2!j+V0!P|Pg=!wk6bl=vjhe~F4eSK$wP9-zvIY@9kVc27bTVuOLefxx@Ta^4 zped20_W;(%t!JpantzP(|HE?YEA?6>7R3^`JLAPu7a zafAg3T5QQYlaBs3g>+iOc delta 1968 zcmdlZzgK=jaJ?6Iw_>Syl*ox?bsi5(w`~hbm?**>nWj^!>UB}I?f*XKpe;*c8V)t& zc8WYdGsignOAp7gj*jymW>4#0o!ij&wrRoRN0p9Gm89w}3DtHcI&0(|@#p@^%QcMHkoled5{6Qma{ng(TvI z@2Ru?dcpX4{*Uvmt{Z$6-M9pl8XA=S7ZlWptQSA_?A9Na6^T=;Zgk5yh{=l`yFOL& zzxBZ!;Wv{QBCm*@c6m_4ueRxeZ(w1YP_O9LHMyU=l(#z0wQ5Xc)rF(tA5zIplm zvhBMIZ!?r~%CJ{_NkfUc3F#0$W*L#^q{WjQL?# zR(ff@;;AFdZ}?94KU<&w@OD{?Gkav2#gY%lv&uK`{VR6=UhXqhnavD0Ih+=>6i(az zV&(Hpb+3|B-AtxyUQ6?_J`w8dt#y@K%D9a=|3Hz~(M6BWw*FR7+W8@&W7cYy`e_9m zOX8noUOMP{|Jk1oA&!fwJfT}TZZ6uDxa{pCjZZ5+P71G$p3}IA?`cfl>B_t1LGeM} zlTSrnS$N~~9d6U)uQfi0919*sxCuODxO5=i?TbQn{*Lzv`XQw&cjb62a?Lyxc>8_y zw>!r7828vV$J}7tARBS^f%m=EyG$Q-_Puql|8QMy(Y(`!S{t6ae-R3EeS4elt!qZd zhbsmgg{OA=Y_xdx*22ZZZMm(NuCBzEIs)3z8lDLLK&ru39~({L%TvjNYNK;fqWP=7w$cZ1r|oSjhHX zV5P=3Tc7%jCz{(9?s8>3xa#_st~b{%zi|**AUXBU^31#i0grfigx;{f3-DgJ&BR;k zOXSiEdQ%T9+#$53X{Y^Zm8mymeU3gp;Q!?Df$LG{mt_?yl|MKepxU^_e~pI0FTI`Z zvh!>geVj6{Duk;{G34;PRc>y~uLb8;ByRGlTh;eDWrah@%CLH!YMgFmq=OK+b zM@(A;mb_Xpt#<8_RBORyePZGkJi9GAdz7s%UOav#>-D1qpNOkr0%qTxug^0xTEA=O zCB`MijG0elUd=7PFk6_xufE~y3h%=VJJAs`3f7kfe(?H_iCIxG8v? zy!P37qu4=?ey8wg!}Gq!nXf6`f3P%VHV@B_iT=kU7QULX==55>?1&-;tJlk{>dibk zXO?Z2R7~a3RrwWGr7)wW`dQ|+keDx@J;SV;R+c7yvN%M`JT60`|jsmxUW{4!143S zj=1~l+4QTdE#!M{FAx73@OYE!?B8FjI&amlO4-17uDEGsgI~au#nX;;m)HqexCK37 z&t0Kz-1N{r$Nk1~E1v^l9Cmg7k!vq}tt$Wiu=>=C*_P+yzjpY4;chj!{PYjc3#V7Y zwz~ItrvLP0EHE=W``_kWM9A+Y75w1_h7ymBj_Fu4^p_k8C|-8|&4Pa4?kYXS8^#$O zWozC=NbXGM-Nd^63{!0e1^6r3ZT$5 zP{>o@0y7MZO-zi?#SBf&O)HO3ILu&}@sGcv#sGdIB^ zW)2nOLpU865|)#d`E8sWUEC}ToDB@jolIRU9W5-3Ok6CS4V*1qTuoe^fns(xgj7sk Q$S=%c#-*z2>hHz{06FRwSO5S3 diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3 index 3a98e6f..7c8c658 100644 --- a/docs/libcurl/curl_easy_escape.3 +++ b/docs/libcurl/curl_easy_escape.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -26,13 +26,13 @@ curl_easy_escape - URL encodes the given string .SH SYNOPSIS .B #include .sp -.BI "char *curl_easy_escape( CURL *" curl ", char *" url ", int "length " );" +.BI "char *curl_easy_escape( CURL *" curl ", char *" string ", int "length " );" .ad .SH DESCRIPTION -This function converts the given input string to an URL encoded string and -returns that as a new allocated string. All input characters that are not a-z, -A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" version -(%NN where NN is a two-digit hexadecimal number). +This function converts the given input \fBstring\fP to an URL encoded string +and returns that as a new allocated string. All input characters that are not +a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" +version (%NN where NN is a two-digit hexadecimal number). If the \fBlength\fP argument is set to 0 (zero), \fIcurl_easy_escape(3)\fP uses strlen() on the input \fBurl\fP to find out the size. @@ -42,5 +42,16 @@ You must \fIcurl_free(3)\fP the returned string when you're done with it. Added in 7.15.4 and replaces the old \fIcurl_escape(3)\fP function. .SH RETURN VALUE A pointer to a zero terminated string or NULL if it failed. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + char *output = curl_easy_escape(curl, "data to convert", 15); + if(output) { + printf("Encoded: %s\n", output); + curl_free(output); + } +}} +.fi .SH "SEE ALSO" -.BR curl_easy_unescape "(3), " curl_free "(3), " RFC 2396 +.BR curl_easy_unescape "(3), " curl_free "(3), " RFC 3986 diff --git a/docs/libcurl/curl_easy_escape.html b/docs/libcurl/curl_easy_escape.html index 64b65dc..1852342 100644 --- a/docs/libcurl/curl_easy_escape.html +++ b/docs/libcurl/curl_easy_escape.html @@ -48,13 +48,25 @@ p.roffit {

NAME

curl_easy_escape - URL encodes the given string

SYNOPSIS

#include <curl/curl.h> -

char *curl_easy_escape( CURL * curl , char * url , int length ); +

char *curl_easy_escape( CURL * curl , char * string , int length );

DESCRIPTION

-

This function converts the given input string to an URL encoded string and returns that as a new allocated string. All input characters that are not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number). -

If the length argument is set to 0 (zero), curl_easy_escape(3) uses strlen() on the input url to find out the size. -

You must curl_free(3) the returned string when you're done with it.

AVAILABILITY

-

Added in 7.15.4 and replaces the old curl_escape(3) function.

RETURN VALUE

-

A pointer to a zero terminated string or NULL if it failed.

SEE ALSO

-

curl_easy_unescape (3) curl_free (3) RFC 2396

+

This function converts the given input string to an URL encoded string and returns that as a new allocated string. All input characters that are not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number). +

If the length argument is set to 0 (zero), curl_easy_escape uses strlen() on the input url to find out the size. +

You must curl_free the returned string when you're done with it.

AVAILABILITY

+

Added in 7.15.4 and replaces the old curl_escape function.

RETURN VALUE

+

A pointer to a zero terminated string or NULL if it failed.

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   char *output = curl_easy_escape(curl, "data to convert", 15); +   if(output) { +   printf("Encoded: %sn", output); +   curl_free(output); +   } + }} +

+ +

SEE ALSO

+

curl_easy_unescape, curl_free, RFC 3986

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_escape.pdf b/docs/libcurl/curl_easy_escape.pdf index cf281c873f8d5c28a07014711b24b86945a9f8fb..d6ca4c26c2c8b226a4f0ee78866b11d58ed1e19d 100644 GIT binary patch delta 2073 zcma)&dpMg37KclVic*6{+-U_>8Q+)4mwYZUNZdy1GF7Xsk{}v&XSY#J(^*!l3|2}* znM7v@n;Ca?txl_&R$RudDsGGFD#do))z)_U*FH7-Y|mfkdC&Wt=XZ|8V9GGtl@pmI zbyj`fQ;7;VLUUo&UaXvyma0+9$rRVlSnmNZN@irxiQvGU{);{(4+Qqjwd>n*UB|6o z@9Vw%kNhyk_xV|0DegDl9Sma?*p4>Fn3-s(aI@4;>o~AeOgCfG6>PVHTKHDWKnyj8 zoz5afc&ame=+h0?pV?r3`qxXgE=PkuA*P_l#5Ud1*V#7?_X~7Nsfr~P>sVKj;kP2; zn*F^89*0_UrizTLH~QeWk*_D?f?5hLEHsfQtrtR}YPJ#>`9s=zTygZSu7Gl`usI0$ zrl6cmlszav7I|7#NJDnW-4dfz9M2~o2s4aU-C$jT2Rk9gN-lbh`h5DT{a3X{4ltdSD zE}@m%zSfP;PURyTEFsD8=&Wch5njs|ke{F>%p?uDHzF$wN}eOHB&=lSuI5rzt+aTi z^O;2SmoQpnVB2@MwwH3H3vl~W-Qh_7q~EOEF{gOYj9Mw|;;iW9#%PtDRXD>?{W1A; znjle&@0=|T%@tyA2vP*s_VvftnRJ}0w_8e z=D%}1_-Y2Z92vLL0QH9CwZy-=9s+By5$=F!R4iOE#NAEj%q<9y#~U=Ek&Fp;yqr{HjsUC2Qt%coE9S z(pZ#vAax{Q3B8%_Uac4$;HT0eI&s9HMH1zCpsB8z^H?8I&Rb zTSRJ!V1!FZZ)PvpqIwFGptrgc;ZD8+Rxs1BOK%-EjIR0Naia{1GE#r`n)|xEx=Q65 zd{Htvh z8mm+VZ+(Ybe~Uo98r12gXN;l~1cj_jD587vmsTY&^UQJOg4yu*Gja7}ZF+rCvAs6@ zp%vHp4A+Mp@<-3Pb+gq{!hOQrtmqQc3_i!VFIes+ul;pjII#(9w7HeS5=J6NTe`I; z=DHr`#q*%RaZGqc^9ZD`E#0|Vmh|NUw;)Yp_Um<*eKj`wI7MXhj;ih>orBv^^|ICC z)?dztol+vJxsXGz9z@j!PEPdJbwsb+uJlV6zsi69Mj^+NMS9UmHt!6ufo8qOK+fZ< ze(LGe^}~4$yI*T1RdcH<8Z&5g-!Vs15h z+*<~=E>suo+~n-;CttEN;3DL-WpRXB6FHLu#t;}1f(s6&VS*W0ItBzo85rP0VF<(! zJPpPYLKtu;H%8Gz2I3Ygp+8TTN08L<7y!fo#8Uul4HB%a;1dAI^+TBbF3&;0GB|D* z!uj*oLrN~6Cw^|=+IgjN8E5D?!qO=&l$OAZjv~_%Le0q5SOCNWAV36Qknr&YQvfji zpi!ek{+GcWQ9kp$H5(Gnrzx@(0j50)gYycddxQBrdj_|1mS`oNR6%&pXe(#6? zfuHKX<@}U^Fdo>$h(zpO2K)}gePqY}J3AJD_k_WM5Endb7l6m%C=fuPKv)Xi(Sd>k uL1!3Cq>#xtGK44MoJqF-*9bt6NQn3ZT3iAvE|h`55v%|N8cp$ZM*Iigy;ZUR delta 1926 zcmb7=dpOi-6vrQ-%a|S4YOob*7&S9~zu#PcOjBbK8Z@?;bssgN3p;K*iAFXhBVJGFh-{E77MXINSc#% zweY3++ud)4LB^K@vr_ciL7Q`eiGJ1M+tCr#Of>CDX8(q~#q?zC%@K`LnFoBDso`(z zF^%g99i}*?3M2g*e>7H<=X)HjifML9Nd5lv11Hb6oSn|fk;m5Uq=?=c#oa5-7p%YQ zRHGeGKur5-uJNWCAR6w%sf6k#6Pth7lvH3nn~I(t_RCC)i=x@L@84Xd@4Z;OF-F;| zu|RsI>}gWH4w?r!gC%a2q}!+U`VJ-UZ7{`iJw-R1Bh=UgSHTE$FZLnb6jfW~!mhn< z{lI)`{;=+7~+WRxuk_=9_+!B+?(^i78+u1Ifa!fB72Y+T?K z+BnWARi-~rDt_7PvtW@T#_lX|Pk#FbV|m9qWMU!#9X^ebrm~RUwf)Uce;utiPhrm{ zI*liGDx7Xr>vK&@38zB6CQuD^9 zL)$0y4xlBcLqhpMYJBm-{I%g;8wzjaQg&Uw(jm3|nQ?dkOH0`i54?V#J`Q)5YPOX5 zxZ*}%x8WX+oxy6kmK~Es=N3lZX-TY-uV$8{$#ot-zQmkr(Q5ep3_Q>j{pA#5AiS)n zzbB(ZIA<)ak84)x6P!rd@TQ=RFh=R^=N2_ZZDl4mRXQpyOHt___~Yogu4;~y^Ye~1 zHJ(iR9^>1ixdDS4lP0@vEnK+e(>8?ne4t!f6)ieBINq6~a1VA@BcODKOCQmLxLrT? z(?wRl&8!=-z{OnHoeB?X~3Glu(%!fIeac;wtK*q+x=4V zKr^pxi=t)hr+mqY?fYbx?k8MD)%z>5-qGY?9qqQzsL!%Dq#MUVmnD^SF^AVWD>1NFLVC8UjEfKwA!& zME)>@1prtq%Ur?^{hLA@hB8|oCj({0Ad@I2f9(@62{l1{cmPBaaRmcOH0sAXkO+z2 zqs)awU}cH|f-B@S3V9`4Zv0VukV=GBFbeq}80`bw`giXjOj==Pc|l@@_D)}z2~t3a zNv4qPzi^=0GfAKwm1#?*(x?MtkMKBnMh)8aDq#&FZgdmb(0D-~SyE!2K E1m^z*?EnA( diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3 index 62d8ae4..0f0fd2e 100644 --- a/docs/libcurl/curl_easy_getinfo.3 +++ b/docs/libcurl/curl_easy_getinfo.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -60,9 +60,9 @@ Pass a pointer to a long to receive the remote time of the retrieved document -1, it can be because of many reasons (unknown, the server hides it or the server doesn't support the command that tells document time etc) and the time of the document is unknown. Note that you must tell the server to collect this -information before the transfer is made, by using the CURLOPT_FILETIME option -to \fIcurl_easy_setopt(3)\fP or you will unconditionally get a -1 back. (Added -in 7.5) +information before the transfer is made, by using the +\fICURLOPT_FILETIME(3)\fP option to \fIcurl_easy_setopt(3)\fP or you will +unconditionally get a -1 back. (Added in 7.5) .IP CURLINFO_TOTAL_TIME Pass a pointer to a double to receive the total time in seconds for the previous transfer, including name resolving, TCP connect etc. @@ -76,8 +76,8 @@ start until the connect to the remote host (or proxy) was completed. Pass a pointer to a double to receive the time, in seconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed. This time is most often very near to the PRETRANSFER time, except for cases -such as HTTP pippelining where the pretransfer time can be delayed due to -waits in line for the pipeline and more. (Added in 7.19.0) +such as HTTP pipelining where the pretransfer time can be delayed due to waits +in line for the pipeline and more. (Added in 7.19.0) .IP CURLINFO_PRETRANSFER_TIME Pass a pointer to a double to receive the time, in seconds, it took from the start until the file transfer is just about to begin. This includes all @@ -99,17 +99,19 @@ Pass a pointer to a long to receive the total number of redirections that were actually followed. (Added in 7.9.7) .IP CURLINFO_REDIRECT_URL Pass a pointer to a char pointer to receive the URL a redirect \fIwould\fP -take you to if you would enable CURLOPT_FOLLOWLOCATION. This can come very -handy if you think using the built-in libcurl redirect logic isn't good enough -for you but you would still prefer to avoid implementing all the magic of -figuring out the new URL. (Added in 7.18.2) +take you to if you would enable \fICURLOPT_FOLLOWLOCATION(3)\fP. This can come +very handy if you think using the built-in libcurl redirect logic isn't good +enough for you but you would still prefer to avoid implementing all the magic +of figuring out the new URL. (Added in 7.18.2) .IP CURLINFO_SIZE_UPLOAD Pass a pointer to a double to receive the total amount of bytes that were uploaded. .IP CURLINFO_SIZE_DOWNLOAD Pass a pointer to a double to receive the total amount of bytes that were downloaded. The amount is only for the latest transfer and will be reset again -for each new transfer. +for each new transfer. This counts actual payload data, what's also commonly +called body. All meta and header data are excluded and will not be counted in +this number. .IP CURLINFO_SPEED_DOWNLOAD Pass a pointer to a double to receive the average download speed that curl measured for the complete download. Measured in bytes/second. @@ -125,8 +127,8 @@ requests. This is so far only for HTTP requests. Note that this may be more than one request if FOLLOWLOCATION is true. .IP CURLINFO_SSL_VERIFYRESULT Pass a pointer to a long to receive the result of the certification -verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to -\fIcurl_easy_setopt(3)\fP). +verification that was requested (using the \fICURLOPT_SSL_VERIFYPEER(3)\fP +option to \fIcurl_easy_setopt(3)\fP). .IP CURLINFO_SSL_ENGINES Pass the address of a 'struct curl_slist *' to receive a linked-list of OpenSSL crypto-engines supported. Note that engines are normally implemented @@ -148,14 +150,15 @@ it means that the server didn't send a valid Content-Type header or that the protocol used doesn't support this. .IP CURLINFO_PRIVATE Pass a pointer to a char pointer to receive the pointer to the private data -associated with the curl handle (set with the CURLOPT_PRIVATE option to -\fIcurl_easy_setopt(3)\fP). Please note that for internal reasons, the +associated with the curl handle (set with the \fICURLOPT_PRIVATE(3)\fP option +to \fIcurl_easy_setopt(3)\fP). Please note that for internal reasons, the value is returned as a char pointer, although effectively being a 'void *'. (Added in 7.10.3) .IP CURLINFO_HTTPAUTH_AVAIL Pass a pointer to a long to receive a bitmask indicating the authentication method(s) available. The meaning of the bits is explained in the -CURLOPT_HTTPAUTH option for \fIcurl_easy_setopt(3)\fP. (Added in 7.10.8) +\fICURLOPT_HTTPAUTH(3)\fP option for \fIcurl_easy_setopt(3)\fP. (Added in +7.10.8) .IP CURLINFO_PROXYAUTH_AVAIL Pass a pointer to a long to receive a bitmask indicating the authentication method(s) available for your proxy authentication. (Added in 7.10.8) @@ -199,8 +202,8 @@ Pass a pointer to a long to receive the last socket used by this curl session. If the socket is no longer valid, -1 is returned. When you finish working with the socket, you must call curl_easy_cleanup() as usual and let libcurl close the socket and cleanup other resources associated with the -handle. This is typically used in combination with \fICURLOPT_CONNECT_ONLY\fP. -(Added in 7.15.2) +handle. This is typically used in combination with +\fICURLOPT_CONNECT_ONLY(3)\fP. (Added in 7.15.2) NOTE: this API is not really working on win64, since the SOCKET type on win64 is 64 bit large while its 'long' is only 32 bits. @@ -214,17 +217,29 @@ Also works for SFTP since 7.21.4 .IP CURLINFO_CERTINFO Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to struct that holds a number of linked lists with info about the certificate -chain, assuming you had CURLOPT_CERTINFO enabled when the previous request was -done. The struct reports how many certs it found and then you can extract info -for each of those certs by following the linked lists. The info chain is -provided in a series of data in the format "name:content" where the content is -for the specific named data. See also the certinfo.c example. NOTE: this -option is only available in libcurl built with OpenSSL support. (Added in -7.19.1) +chain, assuming you had \fICURLOPT_CERTINFO(3)\fP enabled when the previous +request was done. The struct reports how many certs it found and then you can +extract info for each of those certs by following the linked lists. The info +chain is provided in a series of data in the format "name:content" where the +content is for the specific named data. See also the certinfo.c example. NOTE: +this option is only available in libcurl built with OpenSSL, NSS or GSKit +support. (Added in 7.19.1) +.IP CURLINFO_TLS_SESSION +Pass a pointer to a 'struct curl_tlssessioninfo *'. The pointer will be +initialized to refer to a 'struct curl_tlssessioninfo *' that will contain an +enum indicating the SSL library used for the handshake and the respective +internal TLS session structure of this underlying SSL library. + +This may then be used to extract certificate information in a format +convenient for further processing, such as manual validation. NOTE: this +option may not be available for all SSL backends; unsupported SSL backends +will return 'CURLSSLBACKEND_NONE' to indicate that they are not supported; +this does not mean that no SSL backend was used. (Added in 7.34.0) + .IP CURLINFO_CONDITION_UNMET Pass a pointer to a long to receive the number 1 if the condition provided in -the previous request didn't match (see \fICURLOPT_TIMECONDITION\fP). Alas, if -this returns a 1 you know that the reason you didn't get data in return is +the previous request didn't match (see \fICURLOPT_TIMECONDITION(3)\fP). Alas, +if this returns a 1 you know that the reason you didn't get data in return is because it didn't fulfill the condition. The long ths argument points to will get a zero stored if the condition instead was met. (Added in 7.19.4) .IP CURLINFO_RTSP_SESSION_ID diff --git a/docs/libcurl/curl_easy_getinfo.html b/docs/libcurl/curl_easy_getinfo.html index 6a9967d..af26a2f 100644 --- a/docs/libcurl/curl_easy_getinfo.html +++ b/docs/libcurl/curl_easy_getinfo.html @@ -61,7 +61,7 @@ p.roffit {

CURLINFO_HTTP_CONNECTCODE

Pass a pointer to a long to receive the last received proxy response code to a CONNECT request.

CURLINFO_FILETIME -

Pass a pointer to a long to receive the remote time of the retrieved document (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get -1, it can be because of many reasons (unknown, the server hides it or the server doesn't support the command that tells document time etc) and the time of the document is unknown. Note that you must tell the server to collect this information before the transfer is made, by using the CURLOPT_FILETIME option to curl_easy_setopt(3) or you will unconditionally get a -1 back. (Added in 7.5) +

Pass a pointer to a long to receive the remote time of the retrieved document (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get -1, it can be because of many reasons (unknown, the server hides it or the server doesn't support the command that tells document time etc) and the time of the document is unknown. Note that you must tell the server to collect this information before the transfer is made, by using the CURLOPT_FILETIME(3) option to curl_easy_setopt or you will unconditionally get a -1 back. (Added in 7.5)

CURLINFO_TOTAL_TIME

Pass a pointer to a double to receive the total time in seconds for the previous transfer, including name resolving, TCP connect etc.

CURLINFO_NAMELOOKUP_TIME @@ -69,7 +69,7 @@ p.roffit {

CURLINFO_CONNECT_TIME

Pass a pointer to a double to receive the time, in seconds, it took from the start until the connect to the remote host (or proxy) was completed.

CURLINFO_APPCONNECT_TIME -

Pass a pointer to a double to receive the time, in seconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed. This time is most often very near to the PRETRANSFER time, except for cases such as HTTP pippelining where the pretransfer time can be delayed due to waits in line for the pipeline and more. (Added in 7.19.0) +

Pass a pointer to a double to receive the time, in seconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed. This time is most often very near to the PRETRANSFER time, except for cases such as HTTP pipelining where the pretransfer time can be delayed due to waits in line for the pipeline and more. (Added in 7.19.0)

CURLINFO_PRETRANSFER_TIME

Pass a pointer to a double to receive the time, in seconds, it took from the start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. It does not involve the sending of the protocol- specific request that triggers a transfer.

CURLINFO_STARTTRANSFER_TIME @@ -79,11 +79,11 @@ p.roffit {

CURLINFO_REDIRECT_COUNT

Pass a pointer to a long to receive the total number of redirections that were actually followed. (Added in 7.9.7)

CURLINFO_REDIRECT_URL -

Pass a pointer to a char pointer to receive the URL a redirect would take you to if you would enable CURLOPT_FOLLOWLOCATION. This can come very handy if you think using the built-in libcurl redirect logic isn't good enough for you but you would still prefer to avoid implementing all the magic of figuring out the new URL. (Added in 7.18.2) +

Pass a pointer to a char pointer to receive the URL a redirect would take you to if you would enable CURLOPT_FOLLOWLOCATION(3). This can come very handy if you think using the built-in libcurl redirect logic isn't good enough for you but you would still prefer to avoid implementing all the magic of figuring out the new URL. (Added in 7.18.2)

CURLINFO_SIZE_UPLOAD

Pass a pointer to a double to receive the total amount of bytes that were uploaded.

CURLINFO_SIZE_DOWNLOAD -

Pass a pointer to a double to receive the total amount of bytes that were downloaded. The amount is only for the latest transfer and will be reset again for each new transfer. +

Pass a pointer to a double to receive the total amount of bytes that were downloaded. The amount is only for the latest transfer and will be reset again for each new transfer. This counts actual payload data, what's also commonly called body. All meta and header data are excluded and will not be counted in this number.

CURLINFO_SPEED_DOWNLOAD

Pass a pointer to a double to receive the average download speed that curl measured for the complete download. Measured in bytes/second.

CURLINFO_SPEED_UPLOAD @@ -93,9 +93,9 @@ p.roffit {

CURLINFO_REQUEST_SIZE

Pass a pointer to a long to receive the total size of the issued requests. This is so far only for HTTP requests. Note that this may be more than one request if FOLLOWLOCATION is true.

CURLINFO_SSL_VERIFYRESULT -

Pass a pointer to a long to receive the result of the certification verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to curl_easy_setopt(3)). +

Pass a pointer to a long to receive the result of the certification verification that was requested (using the CURLOPT_SSL_VERIFYPEER(3) option to curl_easy_setopt).

CURLINFO_SSL_ENGINES -

Pass the address of a 'struct curl_slist *' to receive a linked-list of OpenSSL crypto-engines supported. Note that engines are normally implemented in separate dynamic libraries. Hence not all the returned engines may be available at run-time. NOTE: you must call curl_slist_free_all(3) on the list pointer once you're done with it, as libcurl will not free the data for you. (Added in 7.12.3) +

Pass the address of a 'struct curl_slist *' to receive a linked-list of OpenSSL crypto-engines supported. Note that engines are normally implemented in separate dynamic libraries. Hence not all the returned engines may be available at run-time. NOTE: you must call curl_slist_free_all on the list pointer once you're done with it, as libcurl will not free the data for you. (Added in 7.12.3)

CURLINFO_CONTENT_LENGTH_DOWNLOAD

Pass a pointer to a double to receive the content-length of the download. This is the value read from the Content-Length: field. Since 7.19.4, this returns -1 if the size isn't known.

CURLINFO_CONTENT_LENGTH_UPLOAD @@ -103,15 +103,15 @@ p.roffit {

CURLINFO_CONTENT_TYPE

Pass a pointer to a char pointer to receive the content-type of the downloaded object. This is the value read from the Content-Type: field. If you get NULL, it means that the server didn't send a valid Content-Type header or that the protocol used doesn't support this.

CURLINFO_PRIVATE -

Pass a pointer to a char pointer to receive the pointer to the private data associated with the curl handle (set with the CURLOPT_PRIVATE option to curl_easy_setopt(3)). Please note that for internal reasons, the value is returned as a char pointer, although effectively being a 'void *'. (Added in 7.10.3) +

Pass a pointer to a char pointer to receive the pointer to the private data associated with the curl handle (set with the CURLOPT_PRIVATE(3) option to curl_easy_setopt). Please note that for internal reasons, the value is returned as a char pointer, although effectively being a 'void *'. (Added in 7.10.3)

CURLINFO_HTTPAUTH_AVAIL -

Pass a pointer to a long to receive a bitmask indicating the authentication method(s) available. The meaning of the bits is explained in the CURLOPT_HTTPAUTH option for curl_easy_setopt(3). (Added in 7.10.8) +

Pass a pointer to a long to receive a bitmask indicating the authentication method(s) available. The meaning of the bits is explained in the CURLOPT_HTTPAUTH(3) option for curl_easy_setopt. (Added in 7.10.8)

CURLINFO_PROXYAUTH_AVAIL

Pass a pointer to a long to receive a bitmask indicating the authentication method(s) available for your proxy authentication. (Added in 7.10.8)

CURLINFO_OS_ERRNO

Pass a pointer to a long to receive the errno variable from a connect failure. Note that the value is only set on failure, it is not reset upon a successful operation. (Added in 7.12.2)

CURLINFO_NUM_CONNECTS -

Pass a pointer to a long to receive how many new connections libcurl had to create to achieve the previous transfer (only the successful connects are counted). Combined with CURLINFO_REDIRECT_COUNT you are able to know how many times libcurl successfully reused existing connection(s) or not. See the Connection Options of curl_easy_setopt(3) to see how libcurl tries to make persistent connections to save time. (Added in 7.12.3) +

Pass a pointer to a long to receive how many new connections libcurl had to create to achieve the previous transfer (only the successful connects are counted). Combined with CURLINFO_REDIRECT_COUNT you are able to know how many times libcurl successfully reused existing connection(s) or not. See the Connection Options of curl_easy_setopt to see how libcurl tries to make persistent connections to save time. (Added in 7.12.3)

CURLINFO_PRIMARY_IP

Pass a pointer to a char pointer to receive the pointer to a zero-terminated string holding the IP address of the most recent connection done with this curl handle. This string may be IPv6 if that's enabled. Note that you get a pointer to a memory area that will be re-used at next request so you need to copy the string if you want to keep the information. (Added in 7.19.0)

CURLINFO_PRIMARY_PORT @@ -121,17 +121,21 @@ p.roffit {

CURLINFO_LOCAL_PORT

Pass a pointer to a long to receive the local (source) port of the most recent connection done with this curl handle. (Added in 7.21.0)

CURLINFO_COOKIELIST -

Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all cookies cURL knows (expired ones, too). Don't forget to curl_slist_free_all(3) the list after it has been used. If there are no cookies (cookies for the handle have not been enabled or simply none have been received) 'struct curl_slist *' will be set to point to NULL. (Added in 7.14.1) +

Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all cookies cURL knows (expired ones, too). Don't forget to curl_slist_free_all the list after it has been used. If there are no cookies (cookies for the handle have not been enabled or simply none have been received) 'struct curl_slist *' will be set to point to NULL. (Added in 7.14.1)

CURLINFO_LASTSOCKET -

Pass a pointer to a long to receive the last socket used by this curl session. If the socket is no longer valid, -1 is returned. When you finish working with the socket, you must call curl_easy_cleanup() as usual and let libcurl close the socket and cleanup other resources associated with the handle. This is typically used in combination with CURLOPT_CONNECT_ONLY. (Added in 7.15.2) +

Pass a pointer to a long to receive the last socket used by this curl session. If the socket is no longer valid, -1 is returned. When you finish working with the socket, you must call curl_easy_cleanup() as usual and let libcurl close the socket and cleanup other resources associated with the handle. This is typically used in combination with CURLOPT_CONNECT_ONLY(3). (Added in 7.15.2)

NOTE: this API is not really working on win64, since the SOCKET type on win64 is 64 bit large while its 'long' is only 32 bits.

CURLINFO_FTP_ENTRY_PATH

Pass a pointer to a char pointer to receive a pointer to a string holding the path of the entry path. That is the initial path libcurl ended up in when logging on to the remote FTP server. This stores a NULL as pointer if something is wrong. (Added in 7.15.4)

Also works for SFTP since 7.21.4

CURLINFO_CERTINFO -

Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to struct that holds a number of linked lists with info about the certificate chain, assuming you had CURLOPT_CERTINFO enabled when the previous request was done. The struct reports how many certs it found and then you can extract info for each of those certs by following the linked lists. The info chain is provided in a series of data in the format "name:content" where the content is for the specific named data. See also the certinfo.c example. NOTE: this option is only available in libcurl built with OpenSSL support. (Added in 7.19.1) +

Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to struct that holds a number of linked lists with info about the certificate chain, assuming you had CURLOPT_CERTINFO(3) enabled when the previous request was done. The struct reports how many certs it found and then you can extract info for each of those certs by following the linked lists. The info chain is provided in a series of data in the format "name:content" where the content is for the specific named data. See also the certinfo.c example. NOTE: this option is only available in libcurl built with OpenSSL, NSS or GSKit support. (Added in 7.19.1) +

CURLINFO_TLS_SESSION +

Pass a pointer to a 'struct curl_tlssessioninfo *'. The pointer will be initialized to refer to a 'struct curl_tlssessioninfo *' that will contain an enum indicating the SSL library used for the handshake and the respective internal TLS session structure of this underlying SSL library. +

This may then be used to extract certificate information in a format convenient for further processing, such as manual validation. NOTE: this option may not be available for all SSL backends; unsupported SSL backends will return 'CURLSSLBACKEND_NONE' to indicate that they are not supported; this does not mean that no SSL backend was used. (Added in 7.34.0) +

CURLINFO_CONDITION_UNMET -

Pass a pointer to a long to receive the number 1 if the condition provided in the previous request didn't match (see CURLOPT_TIMECONDITION). Alas, if this returns a 1 you know that the reason you didn't get data in return is because it didn't fulfill the condition. The long ths argument points to will get a zero stored if the condition instead was met. (Added in 7.19.4) +

Pass a pointer to a long to receive the number 1 if the condition provided in the previous request didn't match (see CURLOPT_TIMECONDITION(3)). Alas, if this returns a 1 you know that the reason you didn't get data in return is because it didn't fulfill the condition. The long ths argument points to will get a zero stored if the condition instead was met. (Added in 7.19.4)

CURLINFO_RTSP_SESSION_ID

Pass a pointer to a char pointer to receive a pointer to a string holding the most recent RTSP Session ID.

Applications wishing to resume an RTSP session on another connection should retrieve this info before closing the active connection. @@ -172,6 +176,6 @@ p.roffit {

REDIRECT

CURLINFO_REDIRECT_TIME. The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. So, this is zero if no redirection took place.

RETURN VALUE

If the operation was successful, CURLE_OK is returned. Otherwise an appropriate error code will be returned.

SEE ALSO

-

curl_easy_setopt (3)

+

curl_easy_setopt,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_getinfo.pdf b/docs/libcurl/curl_easy_getinfo.pdf index d5d43b6725c99972f855cba0afeb52ee0f38e0b5..9801b97f0f89b06e3a3cb9bf90d3784e3ac4adee 100644 GIT binary patch delta 14189 zcmb8VV{~R+w=Ei*Rk3X+Pi)&(#kT##NyWB}CuT(z+qUhBUFY5B{JHyk_igvw^=Hl2 z$C!QeKIV_r+L|LJ82l>|JV6Smv*EBgitfLn#gPE(ilmS|#g|MHsL2XFK1(o_%{Ix3W09*P4O$XxHJjjbl% zk=QI5^Z5vN;*-VL+e6BcN^PX=mwm*tw{ElbwBZlISEakUkjg2-p!@W8!QscmPi!Cv z1$4hg@#=3@XX-kGvZl`cu>KVsYd3xfb<)eS^0ujd)@c0DwO*p2iFMgS$HkyA+~}?g za;aq4Y_LTbC?nfVY&89|F?8hT+%da6IE>dKu4D2^NuTE3nRI#McFy+}QTJD5f-s&y zetTPcWJSwz;+yRgavnEPJo!!&7&eg6#L;?)wD`9Yvm%pD8HNRPo>yzPf;dpNvI*?x|1KHg>E^zg3OxClXHxDVeHALOI@2DkxpUgBt!f!l~wJ2pw8n zi0oVd5C3duUKHy0X)v42Z0oB7TX|fiMM@PkFPZPsZWoN)W=Uu<`()ybkZF^5D7BY}D8bQU|!JR%R zVZh%6Vdc0MUy2H{j8dnLcJMgS79S2%Mq7gl9$S*c`HBkeyKN$iK9qAz$Dc)>-<7VD zm=Meoo0P_Ss9JE>l3QC`%N=(2nDpZ?rDUa|R^(jfk9N0xQ=T)vM$Hm&q9(XDwM6$z zoHJ=UkQKCQ^$AboU6(*0n1j+D(7N@8N9l(?D)Ga>Q33q-k z7SG45_?t*E9$Zf;LCcbNSdrk5*J8SlU9Cm*>(P*jhp*r3z1>K>V-O@0yt`nR_)n`l z#8VPb?RR&n&|_evK_G-#7WGrz8H~^kdcO<`jslJM^VG*eW zz0}pH0h0~qN^Cp&$|e#d&mVF%a~0ZA7wzA9!(v3X&1Ft%GfaWz{~U#bUN$rARs7z=UzE-<4Pe{hHfxwxxZL~zIK zXuhNIm7pP0VvsTmxl~-lya$b?Y6;5?2g18BH{S17gN#G0M0@80Z~FnyX^Cwv)||ze zQl#oUDRP zK0XmPylF&#Az256p{T$7j%N7X4@vYe(Cg33C=V3dmW#P+&*K}Q6?jTg&U8%ZrKfa9 zzRep^d9N$*bn)SoQ=IvY3Q&)}`2x!>GLRBbL--4TN^Fel1Wsf%x)n!}Z%Av}xWmkW z_cdXYVgp}&H_zX;=__i7p%332_&2L)3FgxV;TM_i>aDmuozS&bTzHlWB#pFo2suh_ zvVgHeRTcmX%AbYzo^W935uB9lI-fK5hgqEIiydM}Bs1 z-MoG|4H|e0&2>B1P^nq!7!PIj+a@bC)dK?sNk-TX=Bn}X4nd+<6rXd6;5NyWJo`|j zS!d^6fi%}(wR@(J#lsZ|PagSHG=#OH#$zM$4pL!9M!Q8jA8&rHf#H{n0C1&m6pTwsQ<^}(fHZh7Wb(o}@{$FQDXQ~Y6r7ttLRiH~EsZ!LUerA~I7b($ItvYsF1M?K zBn!zyXyuValtyf&Y7Y$$eXwnxIJa;ht zog7QEvNP+;0%B?nNGQ4lCEy(!QamC;9r+Z@h8!5e2oX&sC+2453v4d!a%5q_eKg`b zt(pP#o=SPClB@rT5paOzs}Xc+2EVV?adCHR;LbF_9h^KV+!78 zGoL~H_Oxhgl@y9zY)?#k$5_XYv#d}1I9Rd{mfyr@p4^Dgh^8xXCY(Rwx#KSbn_d@A zmt{BTekaRxck7K&0qL(NX42lhC-3Y;JcqyU@wFa=E|-^BCFc+V{XX(vg(Mw%sb08# z#DP4yn(mvTQPVxOn$G+@e4Iaxc{{W7{j=gue#cVP4_e-O zpRd*uC#7i`G=Fa8jDLj5vE}5nJR;xz+&(Bnh%A}$^8bJHZmGVO? zkH_W9`pWaHVD*}#{Z_r1N~;@--Y6^W_t(6ZafIwC;#+CW67S9w7QUIavZU|sg5CLP z7w!<=MOlx!2i^{TRp!#Qm6T?( zPEHnfxeflx0@1Y;>r7y)4TY4Z+ZWb)D#}r6l7m26XV4|nal9LAGvtc%B;Z%`nobD! zc$Py?u5-DZ&P)^e$^{Yqxa7|D_w}~VRf5JkX{*jTAjvLY791a$>w;LS$2_FWP53ZP z)GvlKod%PmZV!c%czEv=zp@9k9$QqwCDyvbbWO5tIw*zI8qLNcJ5F%IcY|Ad%<-Re zQD6uMksE~xwI`-2bs?LLik1hxh4Br59cCu?-Wjd*gSWaWrWus|Lh(*9lxlh>zW|!k z)FX{PpntSIxe8xLZ&!vJ>oTDV`ZIY%ws?ZucRXh$Utw|Q#iNy)7X6s+zzv5>oeh0& zWgQaH0z--iwf^G=CWhGxFYS_<{#?3wiaK|J#H$C9v-9^>Y{?H2JsTYX8}8foFe?nz zqDAxwj4kQ)M^DK;{So?ty2+WSm+=`PfNP5zo;8lNYbS zSQO|)*KwGuBfc{gO#~$RUy~%+PRN;LTn4f)4TQY?IN`F+GlFUq6P51aLPkN~PjdQ7_cDl4bpq)-9=rX*YCB#c_-|Vj zz|4L#8Ka&t%3!(?>Jajp?4OcbTLo!*#kPb)UrS<NZQm-N$`t;CSShfo# zCt{|qS?@eAl-dPYo4J8ha>WNozEgkc%R?*cVQ}IS=;5Ern4&QkC>`!l=>8IVO6J+j z&-ks8cI{K`jWPk{8=)9MaZL39&R9(cSa|a)_}g<~^OXjHoue{HWjm(2V^3nHnHlDhtm}^Dx|8%9#Sx~KAd<#o%XDnW zg-0-bCfZ+Oa$TcOvDlZdM&b1b!Vj6aueITn=fu{kXb{p*tL(x$_G^%VR<<$rM2-8N z%gciT74B|~hJSM5<9UWaZ60$0Ksj%Mic)aeiEMb6X45Bseiff;1_?(-MK`mYQGh%3 zhoD2Xfdj@P)t0XLFSACPjinF>VpShjN!YjpmU>}l_tEy^V5reaj^gf{B+nVLy_eRF z=PPokIM5j{D?(gvQ*l!-Q0nD9>{r?@+AV$yvgn4pXgCCPPwl#FB9F-~uw6xZ3c?FI-4hhp?hTrmpbA#S5M!l%oFX$B#a!3Ww^XcYnYYOvj^3gpnw+D!8?+dMW z57X$8QuP`{D{M*3mFy0WCrL#9)`FOEMa7(48YDp!)Ce5eeKxCoypXWud=AFWj!kkm zl#mTPAiHd$c8g2=hVkPRC>cVcRxI>1&`5xYP=c+eBysXBL2RwN$o^1J*nxx^E+mf= z9NfGxOR;o5;gnDTp)>UG=eT(xPW~WVc~!y)_=^qkg0d%H0)l&z{CtF9F?mO3oRy)| zTfdKu#~yrq2EGNwnt$qt)HpEO?iAgBX30yEYQ=zk=%F1@OtoGF6k061BHfZUy~Ea{ zQn(8j=qskyb&&TgY;0pcSsJU=)_ORgQnAg7OeOA1bWJ%Z(sy`{+eZQXp3QLTu=R&S z0$3i|F=mVZ`V=8cNmW&xni|i|8Nkk4IgtTL9SdRf>7(qOTP**KzW*fQFL*($BrFXo zCLOU3D5C1q4i(A*Le-TmJOdSFy5o+E3lUccf_RQ-Qg=6h!mTwCuvW#jrpas-)jUFnO=h@J;_ORH5rm4m-qeO$=Pko-Tqg6t zqpMQ>)tn(0`kwh0acd6tV5PRpkJXD`u;(rcV!#?!WTa>x__%bZuk0r8hW}D2O!MQy z0Xj}@}$k~}M(&nO#Vf&B6KG&2tzI!-~f@dTIsFC(&%ZLJskPM^W z4a;jl%9if~@*JCsBPHJY$gM(=!$Bu+K~neVvxBp)uvyXppUZ`9ooeIEgR2f@E3Q|| z=?-Z{T9e+*z%|5(R692$ZGOJnU)*S}?=_}ll{yA(PEu`w)l>5@roLm>5v)CUS+^sv zA5{a0sBHt0gj+{@7165pCRU|V5w*#TfHOc1l2c1>;yfG`Rh<+f6O~fw@{< zT~!CLwxZ5hmbpGWf7UEscwp15-UN#T z@VRIW)7v)!c9%)?{Ny=9GrXFj|7)%)HDZDCc*|H3r-vCFI6yC@C}DfI8KC#-y{SPZ zIkPGNgz+pne%QaU#9p|-?l++6U?#Ka4v$CC-m5%WnsOc))i)rAz0w!^X_HS=D2%raZca4AS0x)h0vmQTbo7%|9IUzO2P zH)@+huX=7da5R(%WIB09nlILDbC&8(T&Y(Az0=$ERWxl|E>-Tyk$>WG*#45CTd!wo zlV}_+iIn*zTZN=OCOA%3%7q_nXO8Vtf>rk1prD88vNmxBMmlFJFsFe&_17ZCcM}d9z*&D)as{4y1`2}T zzJLd1rr>rsW7?0aHBg`UFc|&;s(b$oRSPVbA!}Od_wEU>_~IEonHK{el9PumSsOzF zcp!=8e?os=a|H5`psaMu{m}X{mhx~fFR?gIcBL{Xv7|7*4G{;}^l9sYfh;N^0mFCDT_$n0stZ|X~M0GZYxgAsL- zJ(v<)t}&q;H@gNkRN9+i_3~@Cm}_SlSZ$lig}Rcju9q@#K8{#NWv8(@OPy>@;(z`A z^I6T%;U04X_gVO%E-pkPZ zVlG;JpINj1JFv&sJ&2(w%b9)AA}(y}js0r&MDI7W6jT0fd$($rjP$*`%$R2bs4lTq zmDPe7psl`+&gwaB=!DgapsjCzg=T;kKmhfv2&&zqQm!?{ry(_v+7zAu#ON9DiUZ>MNdlVkad=qbcNi_ z+IW}rK4U*?HMO7pRi-iJ+DE;B4_ME}(Yh@g9d`9d^f3Yof3o|JkMQqkcGoXRncP7O{^*;tgeLdl4NNkctzMgIJaFXU-xJWz7bg)Fqh}OX3+uSIpR?y^`Fb zDLfLl^xsrcuIx&Z*X$O%UJMxJyX=_S@N;{|)Ft85MSW%@H;>RGWrw|iepHxj$IObM zw~$1o{!~QNCQlPXe`t7j;(YMTl*Ii5vR4M^eNC95X9xtg~*KsFO_m6Z+w8uuRRN+^0kt)_I}4ke?eS2_#p$fo8i2Bh$;@D0!#rCK<&x?bHTK4m1l09_Fi)nI#EMEgjYa0Rsp)1vwzCGS-yF#7w#Xx+O~BEtqQvvU zn8x7xP5+3Wd|AwZ^r%16ORoKMRqEa1^nJ05E|J#<)*sA>vFq`w9n(4ki~m%6vI zJ8Y`GTTC`!_I{{WHCXTwfu|3-bVL)L7a)pNb7uC9d`EmP=-VpQh5VDJfTbiW>MB|Hp6X-*(Mj+jsfp-F&>PeWT zgHaz|mTf>wzAs96aMG>2Z~I9?VGr>;(kejx@{9gEq4`799fTR!AUr1;7oQy%m~@jh zlANLfav7yQ&mTXOBGY8MUL%#SAu0NjkX*I!Q)})3?$L3u-dtFuVwcLaUG#=TVY2P% zka$>`X1L|vJ1KQQ<~^12y*m?IQ}840_ewC!n-U645Vh7vJOuSmbgX-``fE>;x8HdW zmd}uV?ay}*C1yMGyWM~M##-pWDdhZcSnY*uKyUa>&?u5o0O!;HDOVK?RhsWtO|!3+ z0>xbc9PoJ(7cev6*dzjW;8ENN|Bbad?F^cU~;X2Pc5!LI>g8A{T=xJGcOjy=LD`q2+F%IbhtvB;PDec~Y_} z$3fP*xE+PYD6Q*M730YQ25@~Mb(QH?bV_9SE34|| zKA$wM8O&LHKcQY>)k+nt2(giPm!?mT`c~veixtO3_NvlVrBs?Tu4K0^e2IW4ki;)j zFmMkOpfm=aTw=Z7tu>DPh!uJ1XL_s6NGy|%@h9p>0TxSTVX>Q-FSMYj$T|Ty(+?9tdSS4*UZrms}cJY9Gx^vI3D@(j>dS zdNo*zT{$?f^xvXJd$EPkNOnWojfspQlLr$th zrWzB&hB5FbQG)RGmNv`R?ut!h@;%X0v@YA{iHUI)b9q--v0@Xn~)tk%aNLHT~P3qOh zn=@?Ky$`0VioBTBkmGfJ0$&uM5M0YVQ4PS?Z2@ib&$9MzKBodw-JEwpv8j;iC2A;e zv4&r$L4WrNgmf_3ea{kkLZ9djDm@#7E|+0)J;pTkAsYb_{{lO4u|7 zADixUpQ*9QHcOi@^eiCsi?8{25V~UBrp!f=9){j5KZ#K0h576}Md-rTAw@k#yrrMb1E*D7Bsv3@pa*9T<*s*-uGiS6K!zriDqqIht~n+A=Lnsvr>v ze`M|m+FSw@!@W$}zOL{*`LIE&Q}Ab@3Vf`W0E=zGL9{qoQI{t#k6Xu&S0PTl_vGY1 z!~_r=?8&GkBETW-4VMkcZ~iA*@<$RzvZ5^Q#=KD5mY|eSV4qei>B9lag&H@gXEi~J34+h{fpRcdKv*6#WyQh7(L?)&g!vF{Vn z3C3U^e!9U6REmEawZTDAdPNwO9<7zQoS@#VwxU!`ENf*vAGbL1{O0ZwJE)ix*!cjH zR}HlJx&1wl!ecjU)_(&s@2DT+`@U~RN6?kiN=sv-HsOJYPbd0TZROy&#a}~6e5J=Y z|EegDDWapQ+KH>xrHE1h;Ntw)KS*8xYs=?GpEWStm2e`AlTSR?(!3JIYMJe{KAD9G zjf^KV9fD)4rzx-*Bq12tNPrda&{_bNuYLx$(Y4JGO?RQp z@rqaTwE*yJ&iN%0if4tfB~A0gu(ZuG{r>fmp}RZhhrGdjHAU+eL5ej+M1hSGzaG#T zvJr>dFW>E59KlWteGGb;iE8=7#YddNql`(%3C7>etMzi8z=3;skaFO} z4=?{|o}h6`EC#C5$CO}AQYC-8u_pZJWKbRgC9;C&c^KJPY$0OG5v+^s-VC{z3e+Of z*w3{n6JJa76VFAthp`tbYPYsv4g-fpo!M!I9M6`n?D7ni#EJrmb%EQ4*2}9EFe>RG z0=gui1-F7`#6ku6;lIDA;i+Yeq)2-{K%3mNQNLBP{c-^ZN`}gWZp=dGL0cF6Sm$kI zy1pnvtM*-}7+F;5h& z2nlMnrWv$!{R9;-s{%?4Hijf3RMhv#6azZTFs2< ze<=511plJh&bB@wDG5hACdUoTc0%la$?K4Q1`%IS^3w6_g?m(cWS1&m3M5*d zqkqHw16DL%JnAX(& zgn5loL6^EWR-RdFnJoP#PuniZtTc)Lsp7xY7c-Z{of=~`h#^2^6b*_f+E#J=sQ+$d zT!rcKa5Z{$G_N865Cm971)6tNdseV6;gV`ZA)qi=AI9ot*PY7qOtWh%%Jh4&P(DZ(H9j=h zvWZh5N(p1@)S8F*I5D+_8UL!DXw+PD)xVgFj0uG>W{gTALZH)dkDS4|~arwKQE=D<;iOrtMNmycO;4mLS9o4B`nn*otXg^;PW?@5 z+UAKeP||Rbol0Tay#!f;pIJ1)1xfaX>16wvC2SWxd5*?$bvuhLF%Fp8igX#6;#wfd z;fT4zUQI*>fWtyqbu!Q%dcoI)FjPNS_Rog)Jy`V^rkPK64hPX)F8vLsD|F(IK=gW7 zKU*p)hi48}pF|zCmzN0T9-_0x#5`;FnM0|4uea*SHTWQ)23~F~vPpe2?vwg@1o_gF z6o1i*#0DzrhlKA#(YFsz*F!xP;&JK}+aG!j+O1?Z|1*iz?+luqHQ*C^Tr(5^Jdd3~ zOmFq%!i~A|bVojt%d?I~#Z$)a%zZ`AYZa~(Pg;=7skT98mf(R+pb^cbC}Awo6j@im z7b5FI{l!n#qokL$6z*xcDUsk@OIBy1OPPd5D3->A?NKRK*(oslK0}!=jl^-4c=tJd zp7hUm1{f$8k%-Y&6-?@IwKr2MNr9?#VaZpR-_k zz|P(R{o>K?>)a!NC!bK|6`&VNh7m=27HF-o6AIRfG>k)jJ%6ed@B^=O*&& zTI^jS)kFgk@M6cpTNPXVHdNn&U(%q30^*Rl`B@&pDi`mpDzNpUEWrBF&8t+H+va%U z2<-X81X;s^^!t+uGKvVrkP5yS`-V*)@A=)HER{(*`YtFYIcT}YO+)%pl{lRcO+nhj zaUr(!7s8W&Dp9ZBPF%2YxGrY(xpeC4$e~z8AN>34@HwYxjZ2O(_Z_)FLrB04NHa2I z4L=kSGM+eNh{!)ka;GjzSqtltO`GH zHmt1F?ln5v*#b_UK9<_zoZO;cww}SAoN}JiITH=fZzX%Bmh_*E2C|vA;O)*^lYNVx zD~-;oVEY=wgiqAmVg=r3U8KdFfM4T84jBY|n*2Ol4svJi=TUg#^iuY?xG(}Dai>|e zMJzQ^{sAWLEzDe;9>rA8B}})<>rpYtnF;RQ^je`t@?h`YvSc*+z_D?$ucH3fykr6g z`no40dJcp+)DV9RUAdq%xqU|vKx&0V=!>Dq0W>nxMc#rafN5O&wc5}W_QG;EJbW^y=XmJc8_gMW zIO2a(4d*Qo`}p@Spz|v(<%779^rp8x&$a&S{xU{V_U=AkE_LFUyaw21wR+~9^4Z2i zC~Q!=c23jIVA8J)*`w$lble<#d~~!` zG98U_#ay~Kd}kVRl&{CX_XCFqbYyi?gQRuIj^C+%Bz^q|Ao(kAEE4mhr1R(cfb?M! z%^$0rga;O5hB8v}vyH>C@y-sQ-=2dL!Abq!J;md+!NU4f)z#HWTb;Rr^j1ui%1zu9_5pzEW-vwMz35 zKgCQj?cbiMZ9VwYB=TCqD)82X-01S#Bu_7g5iW_m3u=W5OuX{j5*Vy@K%=CPVKlO!rHfv6P_kfN)e;Y^;+oacw z*s)~Ja?cX+$iFUfP>@Th2*cRQi%ZHDswLe|6yT5yOZM^~Z-FfV%SA4SS1iDaL#%YY zD@vx{7Y-ta8Ri0WxO?2J17Qm;9FPVtemLC7`(F0vF<;fZay3>DiCDnC#^RGjNKP(c zdDSq!cqxk;z%;8d=QH>?c7hih66ka`L1|^m_3B@qf!qOO7{%pL%mL!xfnYm9?39m; zGFpa5MPdcuuKEtZG=}1Ug0red0iX^tZeE>c>&idBnB6rjCSxmwLZQL64jFh|MyDJ5 zS<>wpI~2wW4aE_|nm^$*{(hoDNzE~W+lYTbPxZk={ZZzK08Krcxl&0@|0X+V!txN! z%mE`4=WlLoJm`4)?i5W0?!zfTIZx0!|2}iy5~bJaaO(yGln5AW4TUjI(!cHVo(X$X zx2k%OxU$CB39Wf_U5Vpy6R1$I?8Spu1;c_qoiP{BDC+^~dwYcnQzv?iffy{>)l+Z- zYhFCX8bsuvSD4*@ijB6Uy|9MZtC8K!Z%s^&jC6Ng{glQ*jGj&F!w7V+_IJ>e(L041%ap|=G;=sF+7<0eIWD^nE241k*G zVDO-9ghIIay@(iC5vU1loPT-TigBSK>3zM)0`*%yiwa`I>JDLN*58YOFk_l^FE%MP z`1IpV6AQX9c08iq4v<*-TqsX1r_JegzXv(e3ULrHKtysP!vL?7jklPt5S(W5C9&jLMAk9rf=7~ zALL^2hqMH8h}qaV#|%f*X=A3K(NM_BOz>J{t-QN+5Tjwahx7finl`C{$M?1^+5wNZ zJ6#}7qLT}Z`r9&BHcz)=mNdj>(-juXXi-0qx~O1JQ7B(g4Cm*!5j(iD%?}(4)0Uv7 z8-s7H_D#jbp_9Z$4}*6AvXh-4SBfSW8$5oEek3CLF*_f2u|bbE2?vyMGZ zu|$|9KSnxPRe7 zfoi}L($LIv*Y%S3Y))pdn9W?aNsNdojI1S7(&pooq=aPLmK;Z9nkUZ+E{+sTFA8 zslQ~H7L_5g*)hZlo72Yr*fX@@7qcq@;ifzHp0>E}&Fs0jo3&5oakTaEVzZZ)63!1y z*B*o~jm23lYRvx%{_(k!`aE?kWpAS5;78TMgnJ}}y@^(S)?FI!dvq4nGkj?Ga`Sp( zS+pg-%OKnNl}Oa3tN$~>YVV1@iQIz?R+%+0*_}>&C6HsxwyKP%WQ%KQGv|8%kc7>r zvXEu2^9zP+LJ#B;OHT|L)U7~wDy97gu!GgoGu-;Y4HtZVO9{G)BYt}tCiy#@D+(X8 zH1P#HXo7~i7_%n^RQog}^?ETcL#nFmLp;Qso-41S0~1O2lj8XijcPL=aiV01sCp?) z3A3Y7H+Q06fvB7KhiHP~M4j|6@V5huQbOUwgpEi*6Ru(tDb3(O`s)(FQXYHKswe5j zR{{q7yDO(8Rv$N1#Hl<*5107z5szb*fmQ&?d0fi}bOH;A zP{S~>1YDhM&^i*X4?Rf`ere76vi94j%#9c)HB#8Tk05nZ#G{M8@6f~_5yjbCO@fVy zjqeq4wXBbP31-od_UZD)p-=m3f741j8XOP02jm#q(*ySL_k*oub3T=yC&A(~%aecX z-TW3FgqTgfWx~^$xTIkmEe+`v%|IC!SSvxw28@rj)i1V_sumV_ES-4qv zSh@bU32GJ=>VMJ{9L@gUGLjPo$o{d@EWjkp!OjjK`LBkukT{Sa{O<)TCxGprQPuyB zajVKmKSj9zMaaR$n(Qq29mxH!vt?!H`p;6V>>R8- z|6=6={5RkKxMt%Qc5UEBK$95Kd|rs delta 13342 zcma)i1yCJLv?dP0-GaO8-uwUE z+BY**)AiMvV2A%X3I!+p_v+B4igYAE>4XDM)hpFh>&+dqX7bNrEAvJEq z7wYNJB?Qbj^XAKh5D4TrEyb>@Llh$tvMmxt1BWOwA(}tRm9meO$M(N2-%P$(odkPo zQ~Fw?+uu1~9Ep^sj=fme-Kl?t#}bk`$G8D~4M9gSPnG7BUqBR-5X5Bh=5Gbn)mO7Q zTCNCg2oC|-|5RY4Je&TCc!^n8D2Z|UvWi}H-FQ0lwX56jDtFfyQ9V-t=J_+P@bAm` zR{}5#M&mW5^Vhd>D@^)TV%XGZE7iVzCW!D#fvj8l4%38&1adUq(Fid;0*so-*85;FvLRjJL z4!$sZi178=-o?+IUs;Kr-9vS4g|+q1_iqL6w4dDTDYNu+Q<3&idRCH~vv}%l4v*B= zt1kdfOa9tcjd9GOJ8`Qq=oDwtO-Ow^LP?%jZESE~~dY!dT#H zg5ew-^w{jYjV-16q;+MXpg&YjGFWK^q-z=@JPTS#{;J6sp$`!6w5pkmF8|9`n-la8 zMPCmt%3aEb{U`#-mh&Umewxkwvju1(y~G2~6`&Dw!@#18T7IV|lwBJKF6vswW)T z!CQ%C>|#u&C++baN4+sh3Cnnt^mcM=SrOYTnZB(t{<#$~LW*Wg@QW=o^|W9MRZ6DG zssLI{*H&ePt(7(Rogs^!MyeB@kR?G^2iSb74;2%%TfdNKsv&TuW~|uXBPn83K{+c2 zpr%+pvCZPJXPVQDGpw&2s^Gimrt)^P;gNF5GMO?=y-|0~Papl9uOQcCgoe6#aXK*> zcEA0a7_V5Ipm{8j@n>46zx%V(E+lMSSwy5Z4VY33d; zuxSg1+4F*H+m+^=urk1`9?-~fHaSb5N(K-2N)A8dkl)$7mbOkvPPDC zG_O=#nicG7-K*4w#R-r!!^Bg4h3o~FpAKCG0F3rW3!+R4rb6z8fzNL}*9$wmeEs;g z&Wx()kJ@gohfLt1cB&aR=EI;T)#=m=7?iRGSQ0p`;M;n@<$4+PV2DQ8Yj)sj4P0hJ zWI3&#qQ2a8`_l{fMJjZ8-i`3lZ>fZj3>H)1^?EcCWhxY=R}x7GEG?xMJReQ>Wu9oZ zSdCB58>!>70Mf2#`e~?A_Kfyc8YN}uCp|X0&5{ZWP1x zo?6QnKd7xT4$D~X>d{A8|jYz>i!!XW6f ztV9rJ`UYHwlnKKh#U6tmhU1~=_n3@l6JNRtS73hB7^K_UL5B7y8GCy51~GktQNJb{ zmJw#c=~477g^sKR-PyC#t?2Jz-dIrBdOWWqLD8OrE!DeK;gIBykT5B1URx2n9i)ix z`h$d!l*bWlVJa5v3NQvjs#uVPY;LY+=Uk@aq`D=lFD3JtR#9g=-U2|DPl_^8#Nct2 zCykh+)US2t#Qt||=-=Psw}_I+abp);Y+rgQb}HD+7_kHwf;_RocH^Dd2*hyij2N;! zo@k6ZEZgSQ*?)DV8;4QqcU7OAv|jgy4P(j1%^8agp)S;p+S zO;C*DQ7VjvN2(P$r=PyGKK@-@)652;@3wY24QFzxEo-eby?$z;BLruCdie}x9lGyi zvb$Fp+Hk9LMA%B?73Mt<`d5&_HiJ(xI7<|qH7z<#;k{a}h?1=+0>_d!^0Gb`q$WZq zlmtWk%idP>uuf8B75QgPNS_}sA5}KaJ--yBfr46LqYq%-(UIM$uqY9vs42J)*ry-- zVqu|6MO_AEQ947cMcD?(H5Sj9jQ;)hy>PQCcd6mJ|t9N zfv9H00e|W|D3Tbeyruf8^4Qhq%o4?3YSMi0SjZl6=H0H*}h#-rFkCpA;LtQx5U*E|gRsJmOt zw2%xya~GGJy3w%oC@G$q%c{++P|=jvEt+&wUMPzqgidIQ&XJXGE50+xW=t;7DUAHn zB-P%3So1Ef03z%dd!4dwjBXPKiMCR5vr;aFcbdmI4Ep>crK1zonoI}=?`*t7$#)Lt zTRK{NadWjabwK_*ax$|;22yZP{KuP%hYOUbj4TUY)E>+1P5NMtaNo%YBxRGhAj|BWMA zz2=wQ+WF~4>T1XOH|=ICu>6IH1VO?o^(*@4d=t~t71gnXTdae4Qs)#w5<`7mZ2}ON z1DO+8tA2cR^*C}bAib8#cq)5X<00mZH~*H8wWHA_lsxx^{&6t=V=dzw?I`uh>-@{j z?&;3s_<&!^SnMR*r-^;g@bJN326$#2k^R6jJcnXXO2DSpzB4ty6yw(#RS|RcMConA zgC@URGBT>QP+4^`SbvNkQZ(5#X3^ciMi2xh^{vyTIV5Ns+zG}zU#>&CKU>?1_ha3t z@3e>>D|cPq{DQ(g|L3&1dZBWFS}}8h^<)IdKDV(k6wl9^S>_u2yoNqd3mS|eH8%H0 z`E&jKb%BRfoVJsM&oxL%z@Ccd9K^J=+Szy$)>WuzmN~$q3sA6=$l7ko><5`U-`GAlPX8m-Be=+s17;Ww_bP+Yc$;lF&|TxCj9*TjV;`Hj73 zPH9MolT;JDRv&Ya*pnYymwbw!s<(MiG3xTFt(p26@lvPYmFjsOk5_mDbTe`VE{ERO zu1hW@H8e3&=uU%>I%C~ahh|E|x#5txC{t4u@E%{Etmv`P8TB}T?kWexC`&yk#A=Ob zZq$G6->`Y)>AL)s$t@DlEV7wC^eO0?Mck|SvuZ?m*=28I;a_vqvx8rtDi^LMO;X>O zCucto6DBu{cNP>ygkvTA?97!5?ou{V>VWFIH%cU|Mp23$qZ0i&W4H zQ;A!#6&vzRbk|5$X?j2-(=QE^hu6iTIC??@Gd%)US9l=D>#$siGzKmm>^N)SQcuIR zfr~AgoCuq(6#)m_`MQ*Z`c<$5I1S4nEOQ&{0x#tFBMcm72Bx4&6dn!bg^1PP6?p3xO7C^Q zx?46xHIl4`1Zo=N)TAeFZn$?Q3RYMT1vShWPYTt|7sCHFJinkSw46Dm15IB7Xu_@1 zeDudHGmUC$8ouRs$@IwJH0h#8u+glJru6EF(=xTN&=hyxX`HVgxV5H=N(8ImXR+P4 zg|-wHbt<-qzDG&d>&us$o2>Osk|XR)_W&UwFu3w1c;rGcQbuWF(r09HCLuzr{#mqf z_$eL|BtRAoJ~K3Wn`r;O3xoG4HXZCt*@_@;Xw=w+iDG^;RY&DOf2^-)Bk=$wRBn;{ z**bXdBdht#(5x*j__s8yR>w*Tr=y8Vdvm$%u!XLBg}?yL?x`77Qnx2-scLjJ9d}&A z4jP)^Oqn!q@U1JWoYV8m>a+=GlI%+*@t7);gs)vVzHv1GnJp@C!UH+-FbB%uN28s_ zpB7DRW-O@@B9Pp2UmgxZ_t zzbxM))~WAB!AdbpiPk1Tq8ZdPL3B*6*mRI z!akq{PYYJZ632IHPH2~xAwz=dL zUOnEOr$Yfy$u1NcX2gj%#izncwka7J2G9L-av&%Db} z=vF?HzpJY6d4;&<>g{tqx%{%b^K-vpv|?74rB(}5XLwXBn6bxuya(ZUbEkHTWdDVC z*KcFYxzV&BVYq$#r{ytWVp)TL9>l$c1ee%B7i01WSY!6vJQv}X%%E-VnIK;c{n>mC z%&MQK_ zsw1F}PC+8p*3(Wc?rkV*rW|R%y=I1Ys#4czxlzSsK$-yHlE*c1!L6j(k7bs}3KiAB zUGHF1;7&G$sB0PftlU3;(#HG=uKMg)jSW%2U-icmh4f8wU|0spqv$0GoENRqUX}5%5s{erG%Zhe*L}5?^fKG zm-Xl;w3_PAwkmqI-^Dse@*^KRc>_AQGs49LoYzcm7Njp6B?b{M$>5p%73z5ARIy5( z(aH`E=hV$eUhd;sJXxGJxRNT;&3u!iN-)ZyKIC=gz%>(dpCUW3O zf>&km{STOrSzT*%s+b@L(Udm;Za6|SA3EkSvkx64bMds&36wXW8|g`5_vrybq#|v$ zKo-sHQQ_xP^=;;Bg9*VW^X>_4-%q)Nr(YTl>Lz`S?^~bZ(%G-^o}W=cG;XHNYqOKi z_$c^4x-*OHn^$%OU8pClJbiPs9!uD&!4?Z^#{MY|Mr;-GgFmxsseYCy)2Uo;tOQ|jE4!Kqc1 zy82t8l1*)FH2%h;ZDU7Uj=JY4Ammf*Afs)3kf;8|RP-x==+D(~TfDuIX>5Hqe*MeZ zdadoSo`InTj;UWOb0m{~tG!1e2o-#^vwA*Txg?{L#M)RWs9>SX+OJ(u!K1Of?yO1}RT6UC;B8=7=tj_L&W$cZ*DPzA?bmH5b`iOPx zHX8dF3u)7kEt31W%DKWDwXTSLx-jJ8a83O2#m7Y|9CZ!wA(()EMjZdwqJ>(&BZ+5Z zzg7I1fsbgMqeD@`a^;@jyE>a&rve+uF1cqIfNBQX&A+zjcOVNY^~xFq)2m@gok!yI z3T+|C=7xucr}+yCkVqapmeN!C(;Q!CR+1SlV?D=pl)>ZL_OmpR`X;H?H$h6{R-T(k zQm`<;X(|#?^3317ClNCD~2rmBzqyKTPTo%+S+Zetu@O zsHs0*@zsI&8(4MtcbbDYoB@7FhyA{4hMs}b!b!QKW>f2ko9OBl*ziF};M0>L1O~IL zwm<&kLo;U9t1brp7IIF8n#XUGT(uA1Ct-wNuzFBZ5rsDUAb}VX364(Ere~=OsuR*g zir-Eo<1bI^-1u2-Y3#UDcocai8}L80k4}HLmYgruETX=-Z8fKk(JC@#z+5R&GnjdX;iP4yQnchqD8cTT+O&Qpv0&kYoM~!dkT}1ntmwk0ili*??M~1nI(9=GL7!5)huL7A~zY zIBDx%!($ojURM?auy*Uw-q`isKkU^dK>dcX{4gN2?~Pu!ej6&SOUcf~Kw}%Pc0eyt z`Kz=B%8>@couR(BarLBAlU1`ok#A!`G9{INRa{TS2F!z|eW3ZUnY#PfSTCpjlW|P+ zQF;x{SpONJ21(%opqEHL?c?DHLmGF4CH$v__qC?C(2C!pITQXuq=;vK&>!ebik9iQ z{lqQ`I1*wHK%bgs-b8&nbj}d|y4M)_9kLS|Pts0mk}K+}yk{y$J<2hzVme$#SP))Ye3kNSO`Z>(D$+9VYw2BACW=RIo!LlFqew+{Y0{yDmT^v4 z)GUypQ*ay3yDX=uS@1EwHLpC^xsdxdM~*7k9z0cxMci)F@Y{jN4tU*WpRrd0Wjge9 zsbMzwL*3i;GUt1KVqfrbC_xFg4B2dmaxphF=i_VIRPnVH>T8x(O}lwT_b!}< zo_&YA*0HH7q#bhcXY}&eP5-{A)BKuD{(}zdIlXa5-LDS?YfIOE|505e;R(tpJs#W7 z*WgTpn6Bs^Y1#U|)yq=S-zn4fAUUcQC#i{ctyEKw8pkQ!Z`0N--c7xjn&wG*RPd?9 z>b5z@E@pW#2J-+J$G9qZ0HugHHUuRr*w(!&gQ&~^K0W{8n@HmUw2;>X#s;ZkQ?E$M zVr=3;AdZQ<3)jb%VkEUsHv$-5yA^>`I$#+q%l)ZsdEFxmDK}UR)hNPcN9UFhTwL&s zeDn}YTXa&O)fuPS*tWh5kp;pL#tW-{ewcPWqA0nEL}!ZaOCkjBnbisR=pOMcbfhIf~Lv1B}6)HZvnun}n&!gV!tC#NAC$gqMQ7|%T zab_9w1s3wmE=3G3X-|w}bsO{d9ZM2#QX=Hp2RFABe(B2EbtZLbAm*40I}z%fI?_i8 zlOp*Z8#J>}VM~_^1KQDgmk@6xtH~DuUva|a4AoiQ^cI-xj|Cc0O480+n${>R{(7%$ z3_mU>#D!3U{@hQ}W6=sJWXEbte+IJ)CETiA!cqhKQwWxe{Tk+g!xHhD9IqZbSOVsM zi{BaBKQxWX`PxKbpf@thb#yLWiw^L})YqPk_OFsotlD())OobnYRXGAfw5e}_?nDo zfNT(PR2g)k$jF297^%7D@Nc82OE=yhnbhp&_e_O+7<3y_PjMi-`BrKAA+YtNRpjrU zI312-(wXZ6dg+vYITXm-?VP=GU9(zKLPdEuJ=N%qzo)lq9CT9_lUYx(s|Y%7TFu9B zC?343G9IL6As``3@f>T3p7Q!qVG+g3utuM{3RM7UkO6rcL{vNQPH&*9+E zK&Xe};{I^wv!>(?g&@a&)b+8$Wur&Bl@#9C8PD&E3-y*-plJ2-sQ2x1etMaKc;k8@ z@Mn%4OwX@B@X@-*TOF|7U8~HcC8hhirc1v))#K44W=Zh!^v&wi<-v_(h1_=p&KTeI zj>lu;V@1BJpRD0znJYO_>tx?ZBL|e{KL*Afo|)OA=lxQ;V5)_SOJ(>NI%V2hKprChIj~8G zX07EjDZ;!JFnT)FCmqZy_T()5*ck0cnbpf;_UNOQ`omth|!RW9Zi0S|HN_O zL}yy654YLg3so&)t1fa~m%Dz$NJN`47(e=Y&OmX87#h(<5dvPgf5sjeWw&yTND!^B zv~=av^rhm{73EgD4Z%Gj>8_wG@)dD+S~Tx9HGl^|ZwtPMj~mJU-oW0;4qbf+^2F z8uu975u2onBcWiWys-Ql=+B@2u8qAPfkL#0E&Yj%7@WlXJ+JIn86PI)Z!?33)WVe~ z$R_UIqCdSOmQU{wCZ1D}z;FN)Q7J{i<2tLZt3z1+2ikdelA9?!zc*w2)h*f!Dp_n~ zz0~#9BH+J@V{sx)L0RiPB7ohLCQ;dF_99;rk_=N6U?8)QgRJwM*zW_arqkrF+>j_E zW!RlMGTq-hhdW`T>}apl5JGU|rHBl9e?`1c=*J)jxcI(bLt!B53Gw|e)a$X}^Km!r zy)W@|%Gc7<76ave9ND3D@t;wito$5(@f#|8{8Di{Xh1n&zn7W^a_UxIPd{p-7?%BM z_UHKYl)X@ex!>aVtL2qZR;*F(YAj!#IAh+0_@$k5uzpaVON@m(o7vF13EJ!>av=MR zCB(vw)pgxrDSuJ}{uT@Sg(+DN9vYYl{JR6&U(**dM5=?T2khUXG6y`@;v(gWs026; z9>yXJ{O!|@q9n%93#aCdS>hMDpJFSr@j#BMO5@cAwi4o6zWaa=|Rx)8#j zIYiGalUQY{k-x3w%=N88UiS81Z+XNs*i+;sa`B{khEU|F&z@?J8dRRZ9e$s>y4$^d z1%7s?4K%EdZqQ$<0?wevIxH~dN*j99clfTX-5qF-kqQdLX{3zsV{cY%Vp`9*K)Y2R zj59?hGKCMwBJB^BPXpDE1v@1lPUtEzMb0kcYDEf*XvQ?*_5ADvZT2* zC6p!tsqiJqT8_{JwUe;HT?c{@X`fs2JI0`MicKRvT>2BQk~OqCWXk5S8gGgEbYPEH zGxaABy&J%ORNk9-P_wvQS(2}49@n)#=}S-?Z?Aufqf~#c)FsbihMRJ()}EQN3N4+b znVg5#*JtI|*$ovEqoJQQ2rOAe#F3G=-3?|yDInrAn@)kE-{k+^(>1rpM8y$?n|lnkLU>HLJR2lA*p6RJG5W3jaL#f&ClwE2Eg_@gkNUG2H_x#4T_!BT7YRF}Z+Ol8OIqb2&A zj_$|BzpKV~7dG8dQIaaOeaW?krSL?QyM3!I3jn;4Wjqa-hI$AwF;o)ycC80;fkws|BKutvMB3y24QCSt-1$ zV!T-|{w*ay7?q~ofOmo!t|XAC`Lx6cxftF#Pg$h=;m=%90^4*e7t}m)`$c$mIB3aP z&f@D45GzVt-^smn{`?z3<(6-FJt}^2{G#-t#AQc|azcB236gDgH2AyI-9;+eW@1{M zR6Oer;8Nl_zJ=kL!$vH|#PTh13OD+h4;qC*FRkL06#^OpGO`?UOWJ0rAK(jMuGO{9 zOYi;HJ~T4SAM-xBns{bdmyyAYv2X^)??wW-lb2HPVDwXwYp{gmeS-A#s^U&TeX3Dp zs=4$7z4DA7TU`~D3fci%tXq2Z;WVP?$HlZxB(SyD16K+ z%IlWigth=moxWTB(O;i> zN9i52hA|2P%29H%TOH^(2OU*_#X3tQ4VsammUN>cCPnoE=&hgcYn~#ov6ERximbhC zDFiUlvNtJ`-0TXCtwy&Mu2-8aLx1;npgRCzRh?^XCAw|qlK8552fBUprYW}toaB{QNMt7>&9N|MTp`^|{=UZz=8|8mNm|9G!f3{*! zfz+F;)u;#w^DP<@TB5G?*4Dr`vCXGU7mujwWyT1SEZLkm0Au?CFz6cV3iX@#^Cpx! z^}+zXNJ`k=wrNW?*LS7kwt*_KVCig{6L;BY&p|EjRZL$<1i`a-lD_(Oi~$O;^$ zb;X9gm?X1=)0hNAj2o^X){)VA6j;4p8=zUQQ+l4Zd(#5hU%Dw31We7jIwozI*^1J@ zuldFkvkj%Mui88*A~$&zbce`T2A#OKji$mGyEPZ;QRr9C8ge_o>yCdx6bF}*#eZa6 zNs=mHRt95ki{)V6sq0B-u~ zQ;>3sJ$(6_{=$ls7>!S2&)k>^4Lv81LjvR8;ix1UAH?&?AG(k)YKBGJPVY1jX(-=~ z-Jz^=mFZK#-Cjid;B#e0=s%gkeLrE|r_g;t5YqF!MJUl93w?nhotbKLwEU1Se3J%6 z#^|q?6S=YgJNe2wyw1c+id}V%gL|cU( z{_*!iGg0^8-m2KI32h2?9ex6p=i-i6P^bMIH_u0=ig(1bz$01sK&6^mP`m^sYc zD$J{GHKlTj@NSIIK-xzo>t#A_;RSR&)eh@2T|2)Cp~-LslG`dBLSPEaW5P*GVX^!{ zdjH>3nuDL)lv!H5|Edjh{h!(}5X6;e#UcjQ{!3DUnEs2}n^hKrVo>Xsr6nU#`jW1+ z?d%?d;;M1u->7gC61J6uDaj!NAv8tSbhlyL&EMc_eeX_}_Xs37BqajIHvB+7Em6~7 zxTy}kZ!9I|skp#bq))8y!4hwAj?z9Dl69eG`#azA-9QC^UM$HYo14wu(00FV-D~jE z&Dd(eN`&+v*iBWpaxX&QPVDQ4@a$M!_aQkq$l5FYD=eF(Gow|0=VGi1|3|)~v%#a0 z*8x`~{NHopM+j?(h*`2B-!cP;qbY@#(qkF=O#2DF(0~*1qmonvgm>5}a8~)k__o7+ zKH6daU00h~-&Vc59Fpy9e;$}`&^Lk`e6~s%y9=6^T-?5)rA<+|)?f8}Oe!%29ZMq+NQ|9bHoH7{&A!sD?!6A+%vIj_5!m?%oihx9H06S~+VquX z_bj@fI1GO!wDksPm7(lX0*WRqj-({sMzb0>EFkuuuBf0m<5WU8m7thm=c&#(zt!G2 zC8qzPH(RNVeGN5Fo!xLs)YkBwMdHaJnVI-OtntB{QuGuWzbG@{k{nmzA=N_ymiB z2OEjsB<8oUYeNfKt#q8uw~bWuui>gK_of~(R~0Hu-0pT`Jw8n3LB{+P?t)uK_S4|> zj@IcB;bd>->p$J)8cUeMfTp(C%8z(K#jKDDh#5Aq z@5MHlq5LJ(Hz`V);QSr^1JZh?h;Ee?DaRk9dRuPbN`lGpeGZU)`LjMX&gm`8;YFe$ z72r5~ngRbT5+0kpQo8oxDTgoksAx>_}`gUW#6q4PJdplg;D zDmxTao=ua5f=Yy%dqMW@gAxhA#nXO+QAg-f#EXhmIY2Ky@@m>9Pb6Z*x=bt?o>##q zha_bFJfYe*MLIPDVNN@NY0zTmCiw4v^?UwB9|raFH@M~>2Y@(zTB>1q42#?k)fYXX z;e%cndlW5Q;Rrn7DexCS`F(-pAuUlEhL1$~0d1*+2P-T`P7siAY>jBKQ2%+>1-CBx6;@@FhX$3?`d?-ZrR_D*^Z22_^ana&;;{8M@CZ%K=42K^ zweD+VSOHWV*=5CSb>QV?LiFnR5!mq~DHP;wpKOh(a0~ZEKXoWYizAqy58dnmkX89w zp;IRX^TN3IZm+rnn{MKPpYb|3VwAV}@Ado6q!&#Io5SSX{`olserXA^bK&_v_GBX3 zwmXupl3Ss{wZ$AfhsH)I8uqHRJ{#_tM-zNF1m2Mmp2k*ugT&q^(IzCm&49ql4fcaW zr_>QqAWTpiL^+z`<)IpCM|acCXw4Rgl$OGclW{D^sTo9al?58VQ(31--#(h%RwhE( zbT4Hl+Jf;|{86w4MKW?n@$H!yE}7bBQEY^bW>>>dq`yite`nk(^KNa}y4UPoB^eKVs#moCo2RZ)c`k#St@N)9~ z*ChS5&+&J1KwSS)$PME8H^#xk@ec<%c)9-LNc_J$&B4dR_fL$Qm*e01c){HN2D$z{ zR~&r2|1`|W#RK@4VQyZ~KeNEe&ByUC48RHE{!a%n{>wK7;Ns#-+!Yrz0s;Y?e7roo zKrwC*kb{$pQ;JuDmxGH#f=hx2#KR>aEcpMGFhmv>M*iYv>gwj@YH5Yc$-~P5M5d*c IRF*>iUoA}oa{vGU diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3 index 837ba32..4f7f004 100644 --- a/docs/libcurl/curl_easy_init.3 +++ b/docs/libcurl/curl_easy_init.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -26,26 +26,34 @@ curl_easy_init - Start a libcurl easy session .B #include .BI "CURL *curl_easy_init( );" - .SH DESCRIPTION This function must be the first function to call, and it returns a CURL easy -handle that you must use as input to other easy-functions. curl_easy_init -initializes curl and this call \fBMUST\fP have a corresponding call to +handle that you must use as input to other functions in the easy +interface. This call \fBMUST\fP have a corresponding call to \fIcurl_easy_cleanup(3)\fP when the operation is complete. -If you did not already call \fIcurl_global_init(3)\fP, -\fIcurl_easy_init(3)\fP does it automatically. -This may be lethal in multi-threaded cases, since \fIcurl_global_init(3)\fP is -not thread-safe, and it may result in resource problems because there is -no corresponding cleanup. - -You are strongly advised to not allow this automatic behaviour, by -calling \fIcurl_global_init(3)\fP yourself properly. -See the description in \fBlibcurl\fP(3) of global environment -requirements for details of how to use this function. +If you did not already call \fIcurl_global_init(3)\fP, \fIcurl_easy_init(3)\fP +does it automatically. This may be lethal in multi-threaded cases, since +\fIcurl_global_init(3)\fP is not thread-safe, and it may result in resource +problems because there is no corresponding cleanup. +You are strongly advised to not allow this automatic behaviour, by calling +\fIcurl_global_init(3)\fP yourself properly. See the description in +\fBlibcurl\fP(3) of global environment requirements for details of how to use +this function. .SH RETURN VALUE If this function returns NULL, something went wrong and you cannot use the other curl functions. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); +} +.fi .SH "SEE ALSO" -.BR curl_easy_cleanup "(3), " curl_global_init "(3), " curl_easy_reset "(3)" +.BR curl_easy_cleanup "(3), " curl_global_init "(3), " curl_easy_reset "(3), " +.BR curl_easy_perform "(3) " diff --git a/docs/libcurl/curl_easy_init.html b/docs/libcurl/curl_easy_init.html index 2f547dc..28ec035 100644 --- a/docs/libcurl/curl_easy_init.html +++ b/docs/libcurl/curl_easy_init.html @@ -48,13 +48,22 @@ p.roffit {

NAME

curl_easy_init - Start a libcurl easy session

SYNOPSIS

#include <curl/curl.h> -

CURL *curl_easy_init( ); -

DESCRIPTION

-

This function must be the first function to call, and it returns a CURL easy handle that you must use as input to other easy-functions. curl_easy_init initializes curl and this call MUST have a corresponding call to curl_easy_cleanup(3) when the operation is complete. -

If you did not already call curl_global_init(3), curl_easy_init(3) does it automatically. This may be lethal in multi-threaded cases, since curl_global_init(3) is not thread-safe, and it may result in resource problems because there is no corresponding cleanup. -

You are strongly advised to not allow this automatic behaviour, by calling curl_global_init(3) yourself properly. See the description in libcurl(3) of global environment requirements for details of how to use this function. -

RETURN VALUE

-

If this function returns NULL, something went wrong and you cannot use the other curl functions.

SEE ALSO

-

curl_easy_cleanup (3) curl_global_init (3) curl_easy_reset (3)

+

CURL *curl_easy_init( );

DESCRIPTION

+

This function must be the first function to call, and it returns a CURL easy handle that you must use as input to other functions in the easy interface. This call MUST have a corresponding call to curl_easy_cleanup when the operation is complete. +

If you did not already call curl_global_init, curl_easy_init does it automatically. This may be lethal in multi-threaded cases, since curl_global_init is not thread-safe, and it may result in resource problems because there is no corresponding cleanup. +

You are strongly advised to not allow this automatic behaviour, by calling curl_global_init yourself properly. See the description in libcurl(3) of global environment requirements for details of how to use this function.

RETURN VALUE

+

If this function returns NULL, something went wrong and you cannot use the other curl functions.

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   CURLcode res; +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +   res = curl_easy_perform(curl); +   curl_easy_cleanup(curl); + } +

+ +

SEE ALSO

+

curl_easy_cleanup, curl_global_init, curl_easy_reset, curl_easy_perform,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_init.pdf b/docs/libcurl/curl_easy_init.pdf index 18cdc7cf8a5eb722d8ba9b39e8042416a49a0538..faa85c12938b1476dd6d477fd7311fe0e25c70a2 100644 GIT binary patch delta 2073 zcmb7>dpy(s9>+Jr&&W<~GWluqLsnYbcXsqp#%dmcZt0xzj_ucK{ickKiJ@j|9_8{hctgmN=LH0ToMY<{1BLB*xbGgPB z+-|_bdsBvDE|xVhGK&@)aI<c_e7#+Rmi{3XRrTEQ~M z8Ld_fxPy{K<*k{rg|-2Rs#C3bgDoW6H()4j!SX|kqHU~Qnw*zJ)73jJa9vVo>+PhD z%w|pc8UF(N{l9OjRTLx(&K+*%jpl+ zz3pF`c>`Heeetuy!==-OJ1sW)45c)$WJ0KgrCG#^D2??Fh^ljUl;JI85Se)4spG|F zRhhadZzs~dj_ zvbc-3cb310crZ%bykMH~OZ{R%LRl_uHZOwyCeF5wBfj;ICFN=@#o7Li2$ir?p#1)n z!qSgSF?+#0Q7O>Rp7(SjM{yu8s@$QeveWXq$=68jC8(Qv?}Gv%G4#~X_9n+lXYP%T zv%8S>r>-AmE{1)`P~Q$?+g(+UQq$n%hShC74wZSlSG5AJhx|wbV<3T6F{Uf&s%12z z={9KVgCa5d{M+bhY_`JRys$P+iJMQN68dbzRq4wtP)gsAeOOZxuj%@02zsu-=dMnw zne=^qZ*MUkC1?~H)qTchaZZ{%lJy)u;JziZEpKEx@|@j^6Xl0ZdtI({y}`{FJ~ct5 zH>Nmtw;#36mbH6`AHx-FS*p*14N$k~b10ssq=~344*YQO*d#FG{%C`v{@VRQy40n;D|GkPZ1lncO z6??7wJ|u`#9}m1H?ErMi%wa1qV?N%ii*q&;86Q$AxpgyDtfUHG6)3-5PHUuZs88UJ+Yncec4smaPK z!ob-(5qarC)1b&0lqD3743Q_E0{?&-o$Ztlz$=6s|GpuH2#BIo)gLvl$2gu2xru!7o((<<*FMnG> z%;09+iyvZ%2hxy?W=ZwoW3_V^H{cRS8DMU5=$F*O9DoCt9!aWCGoPF5#cxBFU5Ff%Ehx9>DaBmJNe0pN$HhyaBuGKcTtP#FN3Ol7bDB7;UUC7Tf`1~j4plfiknKmrgKLJ{JOdJ3J delta 1898 zcmaE=@IZb-VEqf{r%KNzP0hTc3wnDMzoYj*zE zkI%jxew9_a=UVa`<6rlmriPW&OFP#cy72x3|J{E**IhHXE9>jGtJu$(>>!tB@6@>7 znEPt_ztW9W_2pj`_wL#|b6SnhInCfx)8^!TZnG&%z2@YZa@|xnQu8-w}Q%-y?k8l<@|3vF)Q%p`wJ*D_>o_chbD7i^6Qua+Lq5ZQU9a%cVf zD4rO{UANk1@c)#mx>nm%UljYKe)ciBNCn+R?lH>B+qQNt@#3l7AHOu+gyU4onqQyS z9t)lzGJVC&mM(?Bh1M)})oacNu$=s`EOZ*j$`m8XJYLbz(%f0Kp?RM^ojiExg5!}) zm8Oj!bDw@FFsoquvPR-PqwMQ*T+D7atRMP&)dz6){(fTi@$|JR+cK}-yK>8nr*mc5 z??YSKq9i<>gwGhcS4LjZ*~lMndn+&Z6R)OrKy{$>Udx^z>JEze67!g9wN`D_^W(8P zDCvH{_tNJl@pD=yGdQZg3cVZ8eQaSvOaBsM_g~AHTpJupu7_E#kS&z|;Q4Z0%Dh9C zBD{YtmE_bb^CwQ|abh@D_N(C&`=xDF8S@sz^c+hx;YeK{ccJ{^v(IJSH8Xhy*d{-0 zGI@|)>^G-D#W!r zbGP1)G4M+k^L4*>D@97TOU&d*8pBr4%QMUT2KyN-e)X-U97m>>ohTM$&b!H8m#O|%+9%_- zxfjE%7d5ilQX4M5K5u!!sFOEZ;n|w`qVxZBf7KD0q}KDh{meV5^m5O`kB=}k95@}> z&Zx{S^zVQ4nuHx3rVH5XnXmO~%FTUtV3pH~!UPBLgV&l@L?*C{t_czBac*Ac_cG1X z;+$Hwtb}>qs(hcxSAX8??I_wc=YV>m$%Kde(UrSQ8_y?f&|!OjeOL68tICD0!ola9 z?mX>ey0q}Tb?~EeKQ2Apdhq^+;#E=ywpi&))#OD-?qZ$V7&=*i!ENP2!wdDLip(Zk z;!7tV+fZRLZEE4WBXUL(wqAWQeBG`4_HJu`dNRhcy!*?)cWr+RA3JhbH~gM{`gg1E z?`vj9IdA!Wd$B<_|J`)&85~#n*tn`*vSwB|-i?0z=*HQS&Q%Y>cFe-aQJqVkLc5HtzBN}Wu1R^GCcfx(NK`LucLHs zZfAnej&Q>}@BVi7ZuQuE|KVqS!z~Prlh?6IF&mj0Z$8Z`&7xvpmTZ({WNxl&Y+;zB zYiO97s%roQx+w<9sYw=TmZ_;p=99U&d>Bn9Tl1(Ar+fjIov^X4fdvqS7+6}Fm|7Vb zY8x0${>Y_)Ra}SLlF?{#8n+v9#$VueCr%-;4&L0tvyxH8RFg~JxhOTUBr`wHC9xz` z!^O(Tz|h#h0thWlOd(zf=-|m` z_-$eh4csh^O)QL!+>D*gEG!JnjGWDkTue<|O-&8WTrC~#YzV4|<+8KmDlSPZDyb++ SP2(~)Gc@E, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -31,15 +31,17 @@ curl_easy_pause - pause and unpause a connection Using this function, you can explicitly mark a running connection to get paused, and you can unpause a connection that was previously paused. -A connection can be paused by using this function or by letting the read -or the write callbacks return the proper magic return code +A connection can be paused by using this function or by letting the read or +the write callbacks return the proper magic return code (\fICURL_READFUNC_PAUSE\fP and \fICURL_WRITEFUNC_PAUSE\fP). A write callback that returns pause signals to the library that it couldn't take care of any data at all, and that data will then be delivered again to the callback when the writing is later unpaused. -NOTE: while it may feel tempting, take care and notice that you cannot call -this function from another thread. +While it may feel tempting, take care and notice that you cannot call this +function from another thread. To unpause, you may for example call it from the +progress callback (\fICURLOPT_PROGRESSFUNCTION(3)\fP), which gets called at +least once per second, even if the connection is paused. When this function is called to unpause reading, the chance is high that you will get your write callback called before this function returns. @@ -52,11 +54,11 @@ connection. The following bits can be used: .IP CURLPAUSE_RECV Pause receiving data. There will be no data received on this connection until this function is called again without this bit set. Thus, the write callback -(\fICURLOPT_WRITEFUNCTION\fP) won't be called. +(\fICURLOPT_WRITEFUNCTION(3)\fP) won't be called. .IP CURLPAUSE_SEND Pause sending data. There will be no data sent on this connection until this function is called again without this bit set. Thus, the read callback -(\fICURLOPT_READFUNCTION\fP) won't be called. +(\fICURLOPT_READFUNCTION(3)\fP) won't be called. .IP CURLPAUSE_ALL Convenience define that pauses both directions. .IP CURLPAUSE_CONT @@ -65,6 +67,10 @@ Convenience define that unpauses both directions CURLE_OK (zero) means that the option was set properly, and a non-zero return code means something wrong occurred after the new state was set. See the \fIlibcurl-errors(3)\fP man page for the full list with descriptions. +.SH LIMITATIONS +The pausing of transfers does not work with protocols that work without +network connectivity, like FILE://. Trying to pause such a transfer, in any +direction, will cause problems in the worst case or an error in the best case. .SH AVAILABILITY This function was added in libcurl 7.18.0. Before this version, there was no explicit support for pausing transfers. diff --git a/docs/libcurl/curl_easy_pause.html b/docs/libcurl/curl_easy_pause.html index 866a848..bb646e5 100644 --- a/docs/libcurl/curl_easy_pause.html +++ b/docs/libcurl/curl_easy_pause.html @@ -52,24 +52,25 @@ p.roffit {

DESCRIPTION

Using this function, you can explicitly mark a running connection to get paused, and you can unpause a connection that was previously paused.

A connection can be paused by using this function or by letting the read or the write callbacks return the proper magic return code (CURL_READFUNC_PAUSE and CURL_WRITEFUNC_PAUSE). A write callback that returns pause signals to the library that it couldn't take care of any data at all, and that data will then be delivered again to the callback when the writing is later unpaused. -

NOTE: while it may feel tempting, take care and notice that you cannot call this function from another thread. +

While it may feel tempting, take care and notice that you cannot call this function from another thread. To unpause, you may for example call it from the progress callback (CURLOPT_PROGRESSFUNCTION(3)), which gets called at least once per second, even if the connection is paused.

When this function is called to unpause reading, the chance is high that you will get your write callback called before this function returns.

The handle argument is of course identifying the handle that operates on the connection you want to pause or unpause.

The bitmask argument is a set of bits that sets the new state of the connection. The following bits can be used:

CURLPAUSE_RECV -

Pause receiving data. There will be no data received on this connection until this function is called again without this bit set. Thus, the write callback (CURLOPT_WRITEFUNCTION) won't be called. +

Pause receiving data. There will be no data received on this connection until this function is called again without this bit set. Thus, the write callback (CURLOPT_WRITEFUNCTION(3)) won't be called.

CURLPAUSE_SEND -

Pause sending data. There will be no data sent on this connection until this function is called again without this bit set. Thus, the read callback (CURLOPT_READFUNCTION) won't be called. +

Pause sending data. There will be no data sent on this connection until this function is called again without this bit set. Thus, the read callback (CURLOPT_READFUNCTION(3)) won't be called.

CURLPAUSE_ALL

Convenience define that pauses both directions.

CURLPAUSE_CONT

Convenience define that unpauses both directions

RETURN VALUE

-

CURLE_OK (zero) means that the option was set properly, and a non-zero return code means something wrong occurred after the new state was set. See the libcurl-errors(3) man page for the full list with descriptions.

AVAILABILITY

+

CURLE_OK (zero) means that the option was set properly, and a non-zero return code means something wrong occurred after the new state was set. See the libcurl-errors man page for the full list with descriptions.

LIMITATIONS

+

The pausing of transfers does not work with protocols that work without network connectivity, like FILE://. Trying to pause such a transfer, in any direction, will cause problems in the worst case or an error in the best case.

AVAILABILITY

This function was added in libcurl 7.18.0. Before this version, there was no explicit support for pausing transfers.

USAGE WITH THE MULTI-SOCKET INTERFACE

Before libcurl 7.32.0, when a specific handle was unpaused with this function, there was no particular forced rechecking or similar of the socket's state, which made the continuation of the transfer get delayed until next multi-socket call invoke or even longer. Alternatively, the user could forcibly call for example curl_multi_socket_all(3) - with a rather hefty performance penalty.

Starting in libcurl 7.32.0, unpausing a transfer will schedule a timeout trigger for that handle 1 millisecond into the future, so that a curl_multi_socket_action( ... CURL_SOCKET_TIMEOUT) can be used immediately afterwards to get the transfer going again as desired.

MEMORY USE

When pausing a read by returning the magic return code from a write callback, the read data is already in libcurl's internal buffers so it'll have to keep it in an allocated buffer until the reading is again unpaused using this function.

If the downloaded data is compressed and is asked to get uncompressed automatically on download, libcurl will continue to uncompress the entire downloaded chunk and it will cache the data uncompressed. This has the side- effect that if you download something that is compressed a lot, it can result in a very large data amount needing to be allocated to save the data during the pause. This said, you should probably consider not using paused reading if you allow libcurl to uncompress data automatically.

SEE ALSO

-

curl_easy_cleanup (3) curl_easy_reset (3)

+

curl_easy_cleanup, curl_easy_reset,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_pause.pdf b/docs/libcurl/curl_easy_pause.pdf index 86196a350d87f76dc0c0c3ada2005605a42b351c..1ce558fac63282fdf609b04f897e82dc3bb4bcda 100644 GIT binary patch delta 4932 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 RTL2s;1p(Z+p{lC}_#dLiAXESV diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3 index 8f8517f..e40c1e4 100644 --- a/docs/libcurl/curl_easy_perform.3 +++ b/docs/libcurl/curl_easy_perform.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -21,37 +21,55 @@ .\" ************************************************************************** .TH curl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libcurl Manual" .SH NAME -curl_easy_perform - Perform a file transfer +curl_easy_perform - perform a blocking file transfer .SH SYNOPSIS .B #include .sp -.BI "CURLcode curl_easy_perform(CURL *" handle ");" +.BI "CURLcode curl_easy_perform(CURL *" easy_handle ");" .ad .SH DESCRIPTION -This function is called after the init and all the \fIcurl_easy_setopt(3)\fP -calls are made, and will perform the transfer as described in the options. It -must be called with the same -.I handle -as input as the curl_easy_init call returned. +Invoke this function after \fIcurl_easy_init(3)\fP and all the +\fIcurl_easy_setopt(3)\fP calls are made, and will perform the transfer as +described in the options. It must be called with the same \fBeasy_handle\fP as +input as the \fIcurl_easy_init(3)\fP call returned. + +\fIcurl_easy_perform(3)\fP performs the entire request in a blocking manner +and returns when done, or if it failed. For non-blocking behavior, see +\fIcurl_multi_perform(3)\fP. You can do any amount of calls to \fIcurl_easy_perform(3)\fP while using the -same handle. If you intend to transfer more than one file, you are even -encouraged to do so. libcurl will then attempt to re-use the same connection -for the following transfers, thus making the operations faster, less CPU -intense and using less network resources. Just note that you will have to use -\fIcurl_easy_setopt(3)\fP between the invokes to set options for the following -curl_easy_perform. +same \fBeasy_handle\fP. If you intend to transfer more than one file, you are +even encouraged to do so. libcurl will then attempt to re-use the same +connection for the following transfers, thus making the operations faster, +less CPU intense and using less network resources. Just note that you will +have to use \fIcurl_easy_setopt(3)\fP between the invokes to set options for +the following curl_easy_perform. You must never call this function simultaneously from two places using the -same handle. Let the function return first before invoking it another time. If -you want parallel transfers, you must use several curl handles. +same \fBeasy_handle\fP. Let the function return first before invoking it +another time. If you want parallel transfers, you must use several curl +easy_handles. + +While the \fBeasy_handle\fP is added to a multi handle, it cannot be used by +\fIcurl_easy_perform(3)\fP. .SH RETURN VALUE -0 means everything was ok, non-zero means an error occurred as +CURLE_OK (0) means everything was ok, non-zero means an error occurred as .I -defines. If the CURLOPT_ERRORBUFFER was set with -.I curl_easy_setopt -there will be a readable error message in the error buffer when non-zero is -returned. +defines - see \fIlibcurl-errors(3)\fP. If the \fBCURLOPT_ERRORBUFFER(3)\fP was +set with \fIcurl_easy_setopt(3)\fP there will be a readable error message in +the error buffer when non-zero is returned. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); +}} +.fi .SH "SEE ALSO" .BR curl_easy_init "(3), " curl_easy_setopt "(3), " +.BR curl_multi_add_handle "(3), " curl_multi_perform "(3), " +.BR libcurl-errors "(3), " diff --git a/docs/libcurl/curl_easy_perform.html b/docs/libcurl/curl_easy_perform.html index f50024b..c5b90b2 100644 --- a/docs/libcurl/curl_easy_perform.html +++ b/docs/libcurl/curl_easy_perform.html @@ -46,15 +46,28 @@ p.roffit {

NAME

-

curl_easy_perform - Perform a file transfer

SYNOPSIS

+

curl_easy_perform - perform a blocking file transfer

SYNOPSIS

#include <curl/curl.h> -

CURLcode curl_easy_perform(CURL * handle ); +

CURLcode curl_easy_perform(CURL * easy_handle );

DESCRIPTION

-

This function is called after the init and all the curl_easy_setopt(3) calls are made, and will perform the transfer as described in the options. It must be called with the same handle as input as the curl_easy_init call returned. -

You can do any amount of calls to curl_easy_perform(3) while using the same handle. If you intend to transfer more than one file, you are even encouraged to do so. libcurl will then attempt to re-use the same connection for the following transfers, thus making the operations faster, less CPU intense and using less network resources. Just note that you will have to use curl_easy_setopt(3) between the invokes to set options for the following curl_easy_perform. -

You must never call this function simultaneously from two places using the same handle. Let the function return first before invoking it another time. If you want parallel transfers, you must use several curl handles.

RETURN VALUE

-

0 means everything was ok, non-zero means an error occurred as <curl/curl.h> defines. If the CURLOPT_ERRORBUFFER was set with curl_easy_setopt there will be a readable error message in the error buffer when non-zero is returned.

SEE ALSO

-

curl_easy_init (3) curl_easy_setopt (3) +

Invoke this function after curl_easy_init and all the curl_easy_setopt calls are made, and will perform the transfer as described in the options. It must be called with the same easy_handle as input as the curl_easy_init call returned. +

curl_easy_perform performs the entire request in a blocking manner and returns when done, or if it failed. For non-blocking behavior, see curl_multi_perform. +

You can do any amount of calls to curl_easy_perform while using the same easy_handle. If you intend to transfer more than one file, you are even encouraged to do so. libcurl will then attempt to re-use the same connection for the following transfers, thus making the operations faster, less CPU intense and using less network resources. Just note that you will have to use curl_easy_setopt between the invokes to set options for the following curl_easy_perform. +

You must never call this function simultaneously from two places using the same easy_handle. Let the function return first before invoking it another time. If you want parallel transfers, you must use several curl easy_handles. +

While the easy_handle is added to a multi handle, it cannot be used by curl_easy_perform.

RETURN VALUE

+

CURLE_OK (0) means everything was ok, non-zero means an error occurred as <curl/curl.h> defines - see libcurl-errors. If the CURLOPT_ERRORBUFFER(3) was set with curl_easy_setopt there will be a readable error message in the error buffer when non-zero is returned.

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   CURLcode res; +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +   res = curl_easy_perform(curl); +   curl_easy_cleanup(curl); + }} +

+ +

SEE ALSO

+

curl_easy_init, curl_easy_setopt, curl_multi_add_handle, curl_multi_perform, libcurl-errors,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_perform.pdf b/docs/libcurl/curl_easy_perform.pdf index 72e34cb1660e9ad239da46bf8bbe6df0201608e1..2f47acbff85a9ba7b0583ed52324d42f152da973 100644 GIT binary patch delta 2912 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 delta 2318 zcma)(c~n!^7RDJhgqdiNp_1@I0&3*mn;97cgkq&MTA37uNI-^wL_~>(AOREw1QCr4 zY6J;G2nu2mMTvk#smP#E8D!8h)!=}Lh)A*j_0hMU=bW|9Ucd9Ly}tdOd92JllOag< z=0x?8^}bB)b_y`V8iK8c?q{wBI`+jmo*+Ij4RIXSNoIAWBHg#RmNGt=d@4MMajpM- z01*&0ET=KDf1lW>EE<`oNQn2C57A{ak;o%HZ9R)= zBW$%}E|=8VqaX-gNI8xiubV$Bj!Jg%DA>-k4j&7TnNx|}-M$9*p(^jxIe~W%WsD;9 zH4HfD|7P1R&dFF@N9AZ+&!}$v$48>-_MmI=H5$(cWE*e5BZ>nb`6g*-zi42w(%RQ+ zw*I-=;?A1HAce`kPJG=b6ZwA*va6;e0u>xZ}r3 zPQjp)c^tbs!3X7(K6cU)DcXk2r<6n-5Ka|6p39`@cKd`}v6UeNKdi}^(>yTQk!%Bh zzP&SPb#D_&bek7ug2;JmhYCulv5I~O{%2TUuH9b~(OY+VQ-neZ-?d)urp{62w{rF{ zsl}z%j<-m~GD$=E_gha9DWlj+aK);j@K-#XEg3%=`Z1qB=*}uQQ&wSI^r7Wx1=CHc zr$4H{3Ek{sh8-7NS*6x6C^*z2KDwj8dzNpP*=SlgZO8M%C-i19 z!j7k2H3wp?J&vs4R9yA;{57nljPBdj@~#vl*X+FRr}MH}@CUNp>aC+@$@V7`)n)4@ zY>-3OqZHejB{a?GTu9$^1J{4@lhy`5?ev*(;RJX83T zqx(LQ-o@v>9b*Mbo#K^EN#j1&HH_D?DE}N3*wrSxpl-{R;?P6=tq~S^LYkyBFl?sNUIe_7DOPP6qQ2}x54|_z zmn#JMy(SuY@0^u1Sog4>Q3!5?O5aRu%KF;X>qO^-X=_IlQU{oj-g}9ZTzGX&__1qM z!cN$kv+)&wJ`6|+wJBAJ6RQlI{vCbk?F15G&{f)qtk&>qol#60ERZCoKjVw#c_;g> z)Y}n--HJ1kat}vFMB)&S87!*xKxbz5WeLU!dP;4l%`jCOlOZUrhG+7#`v`+iUl{FW z)_nBthUau|N;C59Y2O&8nc5R9?!=j>M`(o##va7dFovfnn%ODYO$DF5jPOaDjmdJ} z&3*TbQ?Byg&%eXg*4FJ3?2>s+XR3LZ|3c27HtWwcp}iI&$_Kx^{gq1!PEN_C#0p3@ z84mhBT7-F@g<>n%iN+4@D)3z5aAC|t?QowJ@QaG7O`-*z+XlhvTbOqnpEZK>hG`Z) zNejodru-JEx$9oW4|=a6f46yWfAR>7StvAW;p;mgu;o2x%JsJx2nWX9nz*UYclPh( z&$=~DbW=7~?tcBKftvRzVf~0$F7SgvcF{FTr&-Eb`-Tf=@?cLMe@Tdj5ZxrH=1b_s9y0mFT(%&QC006fn^N0%iUyAHhee{)B2nL;#jCkW5;}02*aE z1OJ5)zcPz|xQ7VfGBXf?OwArKu=S@CNdTQpq`4AYU7g4@XBRpE5Qz|hLU(4+i7qbo gw*Ob*54X36?~e)O#vJ0ZgW-gw*x?oyuAU6|Uxd`Z)&Kwi diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3 index 0de6037..c661f4b 100644 --- a/docs/libcurl/curl_easy_recv.3 +++ b/docs/libcurl/curl_easy_recv.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -41,7 +41,7 @@ data. \fBbuflen\fP is the maximum amount of data you can get in that buffer. The variable \fBn\fP points to will receive the number of received bytes. -To establish the connection, set \fBCURLOPT_CONNECT_ONLY\fP option before +To establish the connection, set \fBCURLOPT_CONNECT_ONLY(3)\fP option before calling \fIcurl_easy_perform(3)\fP. Note that \fIcurl_easy_recv(3)\fP does not work on connections that were created without this option. diff --git a/docs/libcurl/curl_easy_recv.html b/docs/libcurl/curl_easy_recv.html index 48ba906..1eb2534 100644 --- a/docs/libcurl/curl_easy_recv.html +++ b/docs/libcurl/curl_easy_recv.html @@ -50,10 +50,10 @@ p.roffit {

#include <curl/easy.h>

CURLcode curl_easy_recv( CURL * curl , void * buffer , size_t buflen , size_t * n );

DESCRIPTION

-

This function receives raw data from the established connection. You may use it together with curl_easy_send(3) to implement custom protocols using libcurl. This functionality can be particularly useful if you use proxies and/or SSL encryption: libcurl will take care of proxy negotiation and connection set-up. +

This function receives raw data from the established connection. You may use it together with curl_easy_send to implement custom protocols using libcurl. This functionality can be particularly useful if you use proxies and/or SSL encryption: libcurl will take care of proxy negotiation and connection set-up.

buffer is a pointer to your buffer that will get the received data. buflen is the maximum amount of data you can get in that buffer. The variable n points to will receive the number of received bytes. -

To establish the connection, set CURLOPT_CONNECT_ONLY option before calling curl_easy_perform(3). Note that curl_easy_recv(3) does not work on connections that were created without this option. -

You must ensure that the socket has data to read before calling curl_easy_recv(3), otherwise the call will return CURLE_AGAIN - the socket is used in non-blocking mode internally. Use curl_easy_getinfo(3) with CURLINFO_LASTSOCKET to obtain the socket; use your operating system facilities like select(2) to check if it has any data you can read.

AVAILABILITY

+

To establish the connection, set CURLOPT_CONNECT_ONLY(3) option before calling curl_easy_perform. Note that curl_easy_recv does not work on connections that were created without this option. +

You must ensure that the socket has data to read before calling curl_easy_recv, otherwise the call will return CURLE_AGAIN - the socket is used in non-blocking mode internally. Use curl_easy_getinfo with CURLINFO_LASTSOCKET to obtain the socket; use your operating system facilities like select(2) to check if it has any data you can read.

AVAILABILITY

Added in 7.18.2.

RETURN VALUE

On success, returns CURLE_OK, stores the received data into buffer, and the number of bytes it actually read into *n.

On failure, returns the appropriate error code. @@ -61,6 +61,6 @@ p.roffit {

Reading exactly 0 bytes would indicate a closed connection.

If there's no socket available to use from the previous transfer, this function returns CURLE_UNSUPPORTED_PROTOCOL.

EXAMPLE

See sendrecv.c in docs/examples directory for usage example.

SEE ALSO

-

curl_easy_setopt (3) curl_easy_perform (3) curl_easy_getinfo (3) curl_easy_send (3)

+

curl_easy_setopt, curl_easy_perform, curl_easy_getinfo, curl_easy_send,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_recv.pdf b/docs/libcurl/curl_easy_recv.pdf index 521cd2ab339c54e84cb93a835e8acbffb4004b2a..afdd743bec6eac99b61942be6bf72100964a443d 100644 GIT binary patch delta 3290 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 I7KVcV1cnO6dH?_b delta 3292 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, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -39,5 +39,6 @@ This function was added in libcurl 7.12.1 .SH RETURN VALUE Nothing .SH "SEE ALSO" -.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_setopt "(3) +.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_setopt "(3)," +.BR curl_easy_duphandle "(3)" diff --git a/docs/libcurl/curl_easy_reset.html b/docs/libcurl/curl_easy_reset.html index a7dc70c..6a290fb 100644 --- a/docs/libcurl/curl_easy_reset.html +++ b/docs/libcurl/curl_easy_reset.html @@ -50,11 +50,11 @@ p.roffit {

#include <curl/curl.h>

void curl_easy_reset(CURL *handle );

DESCRIPTION

-

Re-initializes all options previously set on a specified CURL handle to the default values. This puts back the handle to the same state as it was in when it was just created with curl_easy_init(3). +

Re-initializes all options previously set on a specified CURL handle to the default values. This puts back the handle to the same state as it was in when it was just created with curl_easy_init.

It does not change the following information kept in the handle: live connections, the Session ID cache, the DNS cache, the cookies and shares.

AVAILABILITY

This function was added in libcurl 7.12.1

RETURN VALUE

Nothing

SEE ALSO

-

curl_easy_init (3) curl_easy_cleanup (3) curl_easy_setopt (3) +

curl_easy_init, curl_easy_cleanup, curl_easy_setopt, curl_easy_duphandle,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_reset.pdf b/docs/libcurl/curl_easy_reset.pdf index ba8e1714d197db7fa94555b295abb839b2a178f8..58ce522d1a84dce484fb8d8af755348447500a9a 100644 GIT binary patch delta 1595 zcmaDX^HpYoSN&}>f!gcgJQv!7T#u-(td15b*i={WpdvV0TH%8jqw+=V)YOw3mzYk< zf8k!P;T3s$_7;akho;Jzmc{30UQADz!hCuE!@2L)t}f;H-h1@HyxA3FcePLF zlV1Mg_f`!{>9xLbMmodnXoE9K|YtcHX73B)eQ*H zR4kmID5$ivo4gXtxwk&=UY=O}?B&VKuNawsu3T|x(`k`E>zd=D*PA(pv)zwu`1Y!7Z%cgDqjlHj^ad&FD6-}0J^cQs<%;yS_iygc zn|^HZj9*MLA=jsr+uq+3rGHPYd-l~SFPC#k_8!`hUbS}4BCT6a(~gE;_2ICSsaBDx zzxp{QPvJ#(bE{nUuIy9#3rZcIshY4)6{}y(^UKLs^TM?Y&$x`XZnjk3q#a$crPcj$ z$4{4ObF(y5DjRR^+Sb@_RBLcfYV*9?N!}$ZG9S3T`*`tGSYytDjE60iTPkB0{SPlV z6>7Tf^-}-X%T84x70S)Q7oSaU>M&T;Xm9XOWl4S7NsIbJnGI{)a}wGw+*4jB9(3Q; z)y8?|gL#enGZa@(e7eewBjWhpSJ^kNrbgaAWWK@QwY2|0`PV}ItpXns7Vk`&&%KCm zt=`Md*7%K#$NZku<)1mQeBJZjteiXJ7rAH<`i!#s0tv5@5uCVrXyOZ^*QwvV2ep|2D9xR_9*Vp6O{75oQ z;q1MGZ=`c%L>M<21niAC7pFI^`^n!B{&lDKH*8bgd$=t2>h$)o3oTs=m+B@&wz)Zk z9S;-=($kQS`Ka6xy=k8M_Sd3&Ht+1trNx_FaR2Mn&4|Eg=?9_%C}bG%J<)+h1V8Q&1D*@_5Ss=oJlY z_qnH*wtp_PaO*alby|(l_p<8>DT|Dp#phe+@O`(Hw|8bqKlPgL__TyGub+Nu`gr4M6nzn%N*8SDjqYNzI<6i?pBEXHJMxcMZrG>eLvVM>Z|a&n?>a+*<+uAyOSnyvv5 z=o*?PC#D%ES*DtpT1@8P@L@Jn*PnclU70uy^Em8;O?3?nbqy>+3@oh-&8 zzvs}vDz3$8$!I(|h0~2VStb~Xf6 f#B$l$aTS*&7L`;KrKWKi8<|*esj9mAyKw;kR!wQP delta 1554 zcmew=^H^qrSN&`cf!gQVUbotF!xk>zotd|L_0%~%@-mk5)|_?evRU2XP_58>(9j_4 z6YuYf(Z0^dDui64BAIsThd!TU6Boxe zx$YG`Mq(4pJ+G>&*1X^F*ZG@^ zcyy-gy)$orT$T(wxFUtoBIZTzvX8NcnAy)*YkIHX&kYRcy<+X*cH+W{Wd}n~OxDt# z>RHfs!qJ28d*%)08++pK?zvm9W9EOH?Fuv7C-1t&l4oB#@$^v{X?|=ovX7pZw%q^?r@y#{bR2kyl1nNU-d^l>JmB^rDz&WKHN|XYVX_wxL8m6<3OONi?YM!@ZAyY1I?mC5F>)FPWN>aJ|w@onN zn(01iQ!sCnUuQsj8eJFWj`J!F!4|f0B;a{To;GkQvtDLxt zY?SXy&(`}J8ISoriOcu7zj)o0Rp*?ep34 z%(U6F<^7hel-FN#;+WyW++Rsj&EBVK)#lx_(iP?VdDtXqfv;@qe`OgyW*K?$ixy9x zFYIY$@+_@hEZ93w{FC*a$#QjO9CB56AI=c$IT;uCvOivEo$}e_*ZF_`vhQVo(lL2I zvlNrL@#fpi(kv!#|#ukQ2x`u|Ssk#P0plgOf|Xmor_WvOEUBGToOxCHC(KW3=EA8EP&9`#1!I%L>>`7G@)i5C7|n< z@#xzdTAC?<0?$ApPk{@}FfcYS#}G3#G&V<9XJBb=K3RlUt=`lEUCPkN%n(D&)X)?| z%*50HL(JI12vf`eiF0YT9}#{TN>Kg5L6M%WoO4#T#{H+Qc;we#${||Y`~?e>gw;t1psTIPlNyf diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3 index 777735f..28e8866 100644 --- a/docs/libcurl/curl_easy_send.3 +++ b/docs/libcurl/curl_easy_send.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -39,7 +39,7 @@ connection set-up. \fBbuffer\fP is a pointer to the data of length \fBbuflen\fP that you want sent. The variable \fBn\fP points to will receive the number of sent bytes. -To establish the connection, set \fBCURLOPT_CONNECT_ONLY\fP option before +To establish the connection, set \fBCURLOPT_CONNECT_ONLY(3)\fP option before calling \fIcurl_easy_perform(3)\fP. Note that \fIcurl_easy_send(3)\fP will not work on connections that were created without this option. diff --git a/docs/libcurl/curl_easy_send.html b/docs/libcurl/curl_easy_send.html index 4a85a27..4d52db5 100644 --- a/docs/libcurl/curl_easy_send.html +++ b/docs/libcurl/curl_easy_send.html @@ -50,15 +50,15 @@ p.roffit {

#include <curl/easy.h>

CURLcode curl_easy_send( CURL * curl , const void * buffer , size_t buflen , size_t * n );

DESCRIPTION

-

This function sends arbitrary data over the established connection. You may use it together with curl_easy_recv(3) to implement custom protocols using libcurl. This functionality can be particularly useful if you use proxies and/or SSL encryption: libcurl will take care of proxy negotiation and connection set-up. +

This function sends arbitrary data over the established connection. You may use it together with curl_easy_recv to implement custom protocols using libcurl. This functionality can be particularly useful if you use proxies and/or SSL encryption: libcurl will take care of proxy negotiation and connection set-up.

buffer is a pointer to the data of length buflen that you want sent. The variable n points to will receive the number of sent bytes. -

To establish the connection, set CURLOPT_CONNECT_ONLY option before calling curl_easy_perform(3). Note that curl_easy_send(3) will not work on connections that were created without this option. -

You must ensure that the socket is writable before calling curl_easy_send(3), otherwise the call will return CURLE_AGAIN - the socket is used in non-blocking mode internally. Use curl_easy_getinfo(3) with CURLINFO_LASTSOCKET to obtain the socket; use your operating system facilities like select(2) to check if it can be written to.

AVAILABILITY

+

To establish the connection, set CURLOPT_CONNECT_ONLY(3) option before calling curl_easy_perform. Note that curl_easy_send will not work on connections that were created without this option. +

You must ensure that the socket is writable before calling curl_easy_send, otherwise the call will return CURLE_AGAIN - the socket is used in non-blocking mode internally. Use curl_easy_getinfo with CURLINFO_LASTSOCKET to obtain the socket; use your operating system facilities like select(2) to check if it can be written to.

AVAILABILITY

Added in 7.18.2.

RETURN VALUE

On success, returns CURLE_OK and stores the number of bytes actually sent into *n. Note that this may very well be less than the amount you wanted to send.

On failure, returns the appropriate error code.

If there's no socket available to use from the previous transfer, this function returns CURLE_UNSUPPORTED_PROTOCOL.

EXAMPLE

See sendrecv.c in docs/examples directory for usage example.

SEE ALSO

-

curl_easy_setopt (3) curl_easy_perform (3) curl_easy_getinfo (3) curl_easy_recv (3)

+

curl_easy_setopt, curl_easy_perform, curl_easy_getinfo, curl_easy_recv,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_send.pdf b/docs/libcurl/curl_easy_send.pdf index bb73bfcafff2f3980e3e404b3dd35c7d7cf73813..32e30a17a5750a81bce0d70cd62a56343a1f0fdb 100644 GIT binary patch delta 2981 zcma)&c{tRK7RPNbMV3|~8S4x+`prILmzfEXEmce5179xF7bY2)u zcU+agY1C?#JL`~Fig1lLWrWKZUO?fiNC#q58=8ZA6<=x%$je;(}~ln+->O z9YV_Jkr-VA<1Q)`rJQ0k-sbx@JfGPjXVMS&SlS&Z+FnFliR+wLww=jx<39I!CgbW( zvdSr!jJ_tqCz!!;L7Auq+VP%zaD1GQ-TAETYAVSn)82q9bM3g(QuNMFh{`k>8S`i8 zmTyf%eNFAeWzToBt&56trkRD$ssg&L42AMe(<@gV=U#oArc}`7xT{_D73Qx)?T140 z)x3I7T^Lw5p8};jxU)~*%1>v)x))tarThfs1IYrj$2aPeGT;`8?!hvznFi-7K~_3x zYg9dCceaeT)n_$rKb8uAO=HAXQvMZ81%7KJ`hu|W!r4nBa24c7zo|!Z!=L0u&zK-x zi)$5W%!f+paOh|8Z;r1RCi?os>k7f|GW608F-_u=bKT3<6Ts%hUNDR5v=kx>(x)w) zm*L1qZY`RN-M?C8@BsaaZDvJZ2_WF<)C=!LkIvH+)SBBUy>hmwv)o0m#wZ0IZHm1l zk09SesY~#0l^HyG^18vs(%rct=po57ao*~QhDnh7plIy@t#s$&x_jHlV>5(;mexFD1Gdrj^ml`CM zQe!Iebz4~~uP0y&A~5LdARE+4>CK<1A0FDH{<(-}S&JLhe}5ZPA`!Kq%xRv`2Jj^a zb?$o%kGG8pxu>HRmKht_j8A?Z242+uczDkuyRyDfDOBE+9$R~Oc_wZWHsZb6zz<(A zOo$0K8BAZ~5O!bSo0Yzl5l7>YpmKD0+VW06{&$Zyuk_D zeh%}R`v#(S4ILcCB6v%@-nF?stC>*0rXbGR9pP)jtqR zDZuw?Wj$<70^ce=gb@S{RJokryL-w0-oO4%9QX4+pt=H3%*f)vW@P;Ya_810*ohA7OCz;+3}?95UZiRYeOuUrCdg$!NhWh7<*YPXhK|%IpGSPzH=0&vJ~tgZn%7gV z+oWH}Vb-rAILsH@?5_{)j@dF>74_E8Yt`15 zS6B+wEtw&E0DX_rNsnvOshrpazAk?e_C&1}%gg&6Q#8HC^%M2FRrJ6Lxg~0%Iehj~ z&0!DjZC`yelR;5W#(+Z_zB)`K?Zkr6=y$co8&aHE)lv*KQ3-9B9eG2?OdGV-0B+ z9a!~nCrV#64huJ-&cnubp4-BBqHa?3a`oC>;o;*q!*YS;ot^;hUsW zQKz!NZ964vYZnyXl&=(I@r^hDCixJpo1O}-&FY5=^l{*BC#=^hAA8a#__Ve}{e!%{ zbK=I-hNLlXmAzfB16TW0fDGi1Q!uZRu$Rqa5{e;)yvEehX$sWh1y6Faich}X_FSxu zQY4fjGj#8qVYsep=HL^x>3MV0{vt-=risF#$8qmV->hdJy}1$28YjitIP&Uuj*f18 z`C{E95ws^jYpibAx1pw#`}GKv8d}{5^Y(rkJ4&-fUdblM!^^ zI?(`hYHk~Sb9FT=^>&0{CdEKdEHuW!*zxv#@M@n9qcqFiilgus| z3p?@M2&`Gq^Q0?@QJkTXtS-*Z1Xq~{s+(_oDlH@W=0)9;jp*U!3(b#P>Pz}OKV0Y% zBPiM~E#4S8TylM$$#dYC+rfh=yZ*4?Au?uL;u@P564E?~f&wrofISc3RA3kt6mSB7G0KG?|HxTFI8FouB24_P?Q~(?-}1f-EBuaE zP7ry_`Qx~c`ws&s00v+I91Qb!UN8WF75PsYdOPAteohd)3LJp_ufaeakol3^^1vxg z6b=RY_uBxF7l{Aw20)^an4cLOg+Twp5EwM0^?(8u_3H?Y27cBN01EpvgX7?^Ul<1a z4-EJRhWHN?{IBeA?A?QhjsWnVmm*+rBqRHv+GUgufQREx6LH!&9i$F{0K?+62`C~C pfNASsF>r#0+W$2!^J{4EQ~XF|zaX-cGd~go!1(3m2}VTze*s)+FhBqR delta 3019 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 EPo{`2UH||9 diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index bebf8c0..ecfa38f 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -20,7 +20,7 @@ .\" * .\" ************************************************************************** .\" -.TH curl_easy_setopt 3 "1 Jan 2010" "libcurl 7.20.0" "libcurl Manual" +.TH curl_easy_setopt 3 "25 Jun 2014" "libcurl 7.38.0" "libcurl Manual" .SH NAME curl_easy_setopt \- set options for a curl easy handle .SH SYNOPSIS @@ -28,14 +28,14 @@ curl_easy_setopt \- set options for a curl easy handle CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); .SH DESCRIPTION -curl_easy_setopt() is used to tell libcurl how to behave. By using the -appropriate options to \fIcurl_easy_setopt\fP, you can change libcurl's -behavior. All options are set with the \fIoption\fP followed by a -\fIparameter\fP. That parameter can be a \fBlong\fP, a \fBfunction pointer\fP, -an \fBobject pointer\fP or a \fBcurl_off_t\fP, depending on what the specific -option expects. Read this manual carefully as bad input values may cause -libcurl to behave badly! You can only set one option in each function call. A -typical application uses many curl_easy_setopt() calls in the setup phase. +\fIcurl_easy_setopt(3)\fP is used to tell libcurl how to behave. By setting +the appropriate options, the application can change libcurl's behavior. All +options are set with an \fIoption\fP followed by a \fIparameter\fP. That +parameter can be a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject +pointer\fP or a \fBcurl_off_t\fP, depending on what the specific option +expects. Read this manual carefully as bad input values may cause libcurl to +behave badly! You can only set one option in each function call. A typical +application uses many \fIcurl_easy_setopt(3)\fP calls in the setup phase. Options set with this function call are valid for all forthcoming transfers performed using this \fIhandle\fP. The options are not in any way reset @@ -45,8 +45,10 @@ options back to internal default with \fIcurl_easy_reset(3)\fP. Strings passed to libcurl as 'char *' arguments, are copied by the library; thus the string storage associated to the pointer argument may be overwritten -after curl_easy_setopt() returns. Exceptions to this rule are described in -the option details below. +after \fIcurl_easy_setopt(3)\fP returns. The only exception to this rule is +really \fICURLOPT_POSTFIELDS(3)\fP, but the alternative that copies the string +\fICURLOPT_COPYPOSTFIELDS(3)\fP has some usage characteristics you need to +read up on. Before version 7.17.0, strings were not copied. Instead the user was forced keep them available until libcurl no longer needed them. @@ -55,2619 +57,460 @@ The \fIhandle\fP is the return code from a \fIcurl_easy_init(3)\fP or \fIcurl_easy_duphandle(3)\fP call. .SH BEHAVIOR OPTIONS .IP CURLOPT_VERBOSE -Set the parameter to 1 to get the library to display a lot of verbose -information about its operations. Very useful for libcurl and/or protocol -debugging and understanding. The verbose information will be sent to stderr, -or the stream set with \fICURLOPT_STDERR\fP. The default value for this -parameter is 0. - -You hardly ever want this set in production use, you will almost always want -this when you debug/report problems. Another neat option for debugging is the -\fICURLOPT_DEBUGFUNCTION\fP. +Display verbose information. See \fICURLOPT_VERBOSE(3)\fP .IP CURLOPT_HEADER -A parameter set to 1 tells the library to include the header in the body -output. This is only relevant for protocols that actually have headers -preceding the data (like HTTP). The default value for this parameter is 0. +Include the header in the body output. See \fICURLOPT_HEADER(3)\fP .IP CURLOPT_NOPROGRESS -Pass a long. If set to 1, it tells the library to shut off the progress meter -completely. It will also prevent the \fICURLOPT_PROGRESSFUNCTION\fP from -getting called. The default value for this parameter is 1. - -Future versions of libcurl are likely to not have any built-in progress meter -at all. +Shut off the progress meter. See \fICURLOPT_NOPROGRESS(3)\fP .IP CURLOPT_NOSIGNAL -Pass a long. If it is 1, libcurl will not use any functions that -install signal handlers or any functions that cause signals to be sent to the -process. This option is mainly here to allow multi-threaded unix applications -to still set/use all timeout options etc, without risking getting signals. -The default value for this parameter is 0. -(Added in 7.10) - -If this option is set and libcurl has been built with the standard name -resolver, timeouts will not occur while the name resolve takes place. -Consider building libcurl with c-ares support to enable asynchronous DNS -lookups, which enables nice timeouts for name resolves without signals. - -Setting \fICURLOPT_NOSIGNAL\fP to 1 makes libcurl NOT ask the system to ignore -SIGPIPE signals, which otherwise are sent by the system when trying to send -data to a socket which is closed in the other end. libcurl makes an effort to -never cause such SIGPIPEs to trigger, but some operating systems have no way -to avoid them and even on those that have there are some corner cases when -they may still happen, contrary to our desire. In addition, using -\fICURLAUTH_NTLM_WB\fP authentication could cause a SIGCHLD signal to be -raised. +Do not install signal handlers. See \fICURLOPT_NOSIGNAL(3)\fP .IP CURLOPT_WILDCARDMATCH -Set this option to 1 if you want to transfer multiple files according to a -file name pattern. The pattern can be specified as part of the -\fICURLOPT_URL\fP option, using an fnmatch-like pattern (Shell Pattern -Matching) in the last part of URL (file name). - -By default, libcurl uses its internal wildcard matching implementation. You -can provide your own matching function by the \fICURLOPT_FNMATCH_FUNCTION\fP -option. - -This feature is only supported by the FTP download for now. - -A brief introduction of its syntax follows: -.RS -.IP "* - ASTERISK" -\&ftp://example.com/some/path/\fB*.txt\fP (for all txt's from the root -directory) -.RE -.RS -.IP "? - QUESTION MARK" -Question mark matches any (exactly one) character. - -\&ftp://example.com/some/path/\fBphoto?.jpeg\fP -.RE -.RS -.IP "[ - BRACKET EXPRESSION" -The left bracket opens a bracket expression. The question mark and asterisk have -no special meaning in a bracket expression. Each bracket expression ends by the -right bracket and matches exactly one character. Some examples follow: - -\fB[a-zA-Z0\-9]\fP or \fB[f\-gF\-G]\fP \- character interval - -\fB[abc]\fP - character enumeration - -\fB[^abc]\fP or \fB[!abc]\fP - negation - -\fB[[:\fP\fIname\fP\fB:]]\fP class expression. Supported classes are -\fBalnum\fP,\fBlower\fP, \fBspace\fP, \fBalpha\fP, \fBdigit\fP, \fBprint\fP, -\fBupper\fP, \fBblank\fP, \fBgraph\fP, \fBxdigit\fP. - -\fB[][-!^]\fP - special case \- matches only '\-', ']', '[', '!' or '^'. These -characters have no special purpose. - -\fB[\\[\\]\\\\]\fP - escape syntax. Matches '[', ']' or '\\'. - -Using the rules above, a file name pattern can be constructed: - -\&ftp://example.com/some/path/\fB[a-z[:upper:]\\\\].jpeg\fP -.RE -.PP -(This was added in 7.21.0) +Transfer multiple files according to a file name pattern. See \fICURLOPT_WILDCARDMATCH(3)\fP .SH CALLBACK OPTIONS .IP CURLOPT_WRITEFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBsize_t function( char *ptr, size_t size, size_t nmemb, void *userdata);\fP -This function gets called by libcurl as soon as there is data received that -needs to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP -multiplied with \fInmemb\fP, it will not be zero terminated. Return the number -of bytes actually taken care of. If that amount differs from the amount passed -to your function, it'll signal an error to the library. This will abort the -transfer and return \fICURLE_WRITE_ERROR\fP. - -From 7.18.0, the function can return CURL_WRITEFUNC_PAUSE which then will -cause writing to this connection to become paused. See -\fIcurl_easy_pause(3)\fP for further details. - -This function may be called with zero bytes data if the transferred file is -empty. - -Set this option to NULL to get the internal default function. The internal -default function will write the data to the FILE * given with -\fICURLOPT_WRITEDATA\fP. - -Set the \fIuserdata\fP argument with the \fICURLOPT_WRITEDATA\fP option. - -The callback function will be passed as much data as possible in all invokes, -but you cannot possibly make any assumptions. It may be one byte, it may be -thousands. The maximum amount of body data that can be passed to the write -callback is defined in the curl.h header file: CURL_MAX_WRITE_SIZE (the usual -default is 16K). If you however have \fICURLOPT_HEADER\fP set, which sends -header data to the write callback, you can get up to -\fICURL_MAX_HTTP_HEADER\fP bytes of header data passed into it. This usually -means 100K. +Callback for writing data. See \fICURLOPT_WRITEFUNCTION(3)\fP .IP CURLOPT_WRITEDATA -Data pointer to pass to the file write function. If you use the -\fICURLOPT_WRITEFUNCTION\fP option, this is the pointer you'll get as -input. If you don't use a callback, you must pass a 'FILE *' (cast -to 'void *') as libcurl will pass this to fwrite() when writing data. -By default, the value of this parameter is unspecified. - -The internal \fICURLOPT_WRITEFUNCTION\fP will write the data to the FILE * -given with this option, or to stdout if this option hasn't been set. - -If you're using libcurl as a win32 DLL, you \fBMUST\fP use the -\fICURLOPT_WRITEFUNCTION\fP if you set this option or you will experience -crashes. - -This option is also known with the older name \fICURLOPT_FILE\fP, the name -\fICURLOPT_WRITEDATA\fP was introduced in 7.9.7. +Data pointer to pass to the write callback. See \fICURLOPT_WRITEDATA(3)\fP .IP CURLOPT_READFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBsize_t function( void *ptr, size_t size, size_t nmemb, void *userdata);\fP -This function gets called by libcurl as soon as it needs to read data in order -to send it to the peer. The data area pointed at by the pointer \fIptr\fP may -be filled with at most \fIsize\fP multiplied with \fInmemb\fP number of -bytes. Your function must return the actual number of bytes that you stored in -that memory area. Returning 0 will signal end-of-file to the library and cause -it to stop the current transfer. - -If you stop the current transfer by returning 0 "pre-maturely" (i.e before the -server expected it, like when you've said you will upload N bytes and you -upload less than N bytes), you may experience that the server "hangs" waiting -for the rest of the data that won't come. - -The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current -operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error -code from the transfer (Added in 7.12.1) - -From 7.18.0, the function can return CURL_READFUNC_PAUSE which then will cause -reading from this connection to become paused. See \fIcurl_easy_pause(3)\fP -for further details. - -\fBBugs\fP: when doing TFTP uploads, you must return the exact amount of data -that the callback wants, or it will be considered the final packet by the -server end and the transfer will end there. - -If you set this callback pointer to NULL, or don't set it at all, the default -internal read function will be used. It is doing an fread() on the FILE * -userdata set with \fICURLOPT_READDATA\fP. +Callback for reading data. See \fICURLOPT_READFUNCTION(3)\fP .IP CURLOPT_READDATA -Data pointer to pass to the file read function. If you use the -\fICURLOPT_READFUNCTION\fP option, this is the pointer you'll get as input. If -you don't specify a read callback but instead rely on the default internal -read function, this data must be a valid readable FILE * (cast to 'void *'). - -If you're using libcurl as a win32 DLL, you MUST use a -\fICURLOPT_READFUNCTION\fP if you set this option. - -This option was also known by the older name \fICURLOPT_INFILE\fP, the name -\fICURLOPT_READDATA\fP was introduced in 7.9.7. +Data pointer to pass to the read callback. See \fICURLOPT_READDATA(3)\fP .IP CURLOPT_IOCTLFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBcurlioerr function(CURL *handle, int cmd, void *clientp);\fP. This function -gets called by libcurl when something special I/O-related needs to be done -that the library can't do by itself. For now, rewinding the read data stream -is the only action it can request. The rewinding of the read data stream may -be necessary when doing a HTTP PUT or POST with a multi-pass authentication -method. By default, this parameter is set to NULL. (Option added in 7.12.3). - -Use \fICURLOPT_SEEKFUNCTION\fP instead to provide seeking! If -\fICURLOPT_SEEKFUNCTION\fP is set, this parameter will be ignored when seeking. +Callback for I/O operations. See \fICURLOPT_IOCTLFUNCTION(3)\fP .IP CURLOPT_IOCTLDATA -Pass a pointer that will be untouched by libcurl and passed as the 3rd -argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP. -By default, the value of this parameter is unspecified. (Option added in -7.12.3) +Data pointer to pass to the I/O callback. See \fICURLOPT_IOCTLDATA(3)\fP .IP CURLOPT_SEEKFUNCTION -Pass a pointer to a function that matches the following prototype: \fBint -function(void *instream, curl_off_t offset, int origin);\fP This function gets -called by libcurl to seek to a certain position in the input stream and can be -used to fast forward a file in a resumed upload (instead of reading all -uploaded bytes with the normal read function/callback). It is also called to -rewind a stream when doing a HTTP PUT or POST with a multi-pass authentication -method. The function shall work like "fseek" or "lseek" and accepted SEEK_SET, -SEEK_CUR and SEEK_END as argument for origin, although (in 7.18.0) libcurl -only passes SEEK_SET. The callback must return 0 (CURL_SEEKFUNC_OK) on -success, 1 (CURL_SEEKFUNC_FAIL) to cause the upload operation to fail or 2 -(CURL_SEEKFUNC_CANTSEEK) to indicate that while the seek failed, libcurl is -free to work around the problem if possible. The latter can sometimes be done -by instead reading from the input or similar. - -By default, this parameter is unset. - -If you forward the input arguments directly to "fseek" or "lseek", note that -the data type for \fIoffset\fP is not the same as defined for curl_off_t on -many systems! (Option added in 7.18.0) +Callback for seek operations. See \fICURLOPT_SEEKFUNCTION(3)\fP .IP CURLOPT_SEEKDATA -Data pointer to pass to the file seek function. If you use the -\fICURLOPT_SEEKFUNCTION\fP option, this is the pointer you'll get as input. If -you don't specify a seek callback, NULL is passed. (Option added in 7.18.0) +Data pointer to pass to the seek callback. See \fICURLOPT_SEEKDATA(3)\fP .IP CURLOPT_SOCKOPTFUNCTION -Pass a pointer to a function that matches the following prototype: \fBint -function(void *clientp, curl_socket_t curlfd, curlsocktype purpose);\fP. By -default, this parameter is unset. If set, this -function gets called by libcurl after the socket() call but before the -connect() call. The callback's \fIpurpose\fP argument identifies the exact -purpose for this particular socket: - -\fICURLSOCKTYPE_IPCXN\fP for actively created connections or since 7.28.0 -\fICURLSOCKTYPE_ACCEPT\fP for FTP when the connection was setup with PORT/EPSV -(in earlier versions these sockets weren't passed to this callback). - -Future versions of libcurl may support more purposes. It passes the newly -created socket descriptor so additional setsockopt() calls can be done at the -user's discretion. Return 0 (zero) from the callback on success. Return 1 -from the callback function to signal an unrecoverable error to the library and -it will close the socket and return \fICURLE_COULDNT_CONNECT\fP. (Option -added in 7.16.0) - -Added in 7.21.5, the callback function may return -\fICURL_SOCKOPT_ALREADY_CONNECTED\fP, which tells libcurl that the socket is -in fact already connected and then libcurl will not attempt to connect it. +Callback for sockopt operations. See \fICURLOPT_SOCKOPTFUNCTION(3)\fP .IP CURLOPT_SOCKOPTDATA -Pass a pointer that will be untouched by libcurl and passed as the first -argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION\fP. -The default value of this parameter is unspecified. -(Option added in 7.16.0) +Data pointer to pass to the sockopt callback. See \fICURLOPT_SOCKOPTDATA(3)\fP .IP CURLOPT_OPENSOCKETFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBcurl_socket_t function(void *clientp, curlsocktype purpose, struct -curl_sockaddr *address);\fP. This function gets called by libcurl instead of -the \fIsocket(2)\fP call. The callback's \fIpurpose\fP argument identifies the -exact purpose for this particular socket: \fICURLSOCKTYPE_IPCXN\fP is for IP -based connections. Future versions of libcurl may support more purposes. It -passes the resolved peer address as a \fIaddress\fP argument so the callback -can modify the address or refuse to connect at all. The callback function -should return the socket or \fICURL_SOCKET_BAD\fP in case no connection could -be established or another error was detected. Any additional -\fIsetsockopt(2)\fP calls can be done on the socket at the user's discretion. -\fICURL_SOCKET_BAD\fP return value from the callback function will signal an -unrecoverable error to the library and it will return -\fICURLE_COULDNT_CONNECT\fP. This return code can be used for IP address -blacklisting. The default behavior is: -.nf - return socket(addr->family, addr->socktype, addr->protocol); -.fi -(Option added in 7.17.1.) +Callback for socket creation. See \fICURLOPT_OPENSOCKETFUNCTION(3)\fP .IP CURLOPT_OPENSOCKETDATA -Pass a pointer that will be untouched by libcurl and passed as the first -argument in the opensocket callback set with \fICURLOPT_OPENSOCKETFUNCTION\fP. -The default value of this parameter is unspecified. -(Option added in 7.17.1.) +Data pointer to pass to the open socket callback. See \fICURLOPT_OPENSOCKETDATA(3)\fP .IP CURLOPT_CLOSESOCKETFUNCTION -Pass a pointer to a function that matches the following prototype: \fBint -function(void *clientp, curl_socket_t item);\fP. This function gets called by -libcurl instead of the \fIclose(3)\fP or \fIclosesocket(3)\fP call when -sockets are closed (not for any other file descriptors). This is pretty much -the reverse to the \fICURLOPT_OPENSOCKETFUNCTION\fP option. Return 0 to signal -success and 1 if there was an error. (Option added in 7.21.7) +Callback for closing socket. See \fICURLOPT_CLOSESOCKETFUNCTION(3)\fP .IP CURLOPT_CLOSESOCKETDATA -Pass a pointer that will be untouched by libcurl and passed as the first -argument in the closesocket callback set with -\fICURLOPT_CLOSESOCKETFUNCTION\fP. -The default value of this parameter is unspecified. -(Option added in 7.21.7) +Data pointer to pass to the close socket callback. See \fICURLOPT_CLOSESOCKETDATA(3)\fP .IP CURLOPT_PROGRESSFUNCTION -Pass a pointer to a function that matches the following prototype: - -\fBint function(void *clientp, double dltotal, double dlnow, double ultotal, -double ulnow);\fP - -This function gets called by libcurl instead of its internal equivalent with a -frequent interval. While data is being transferred it will be called very -frequently, and during slow periods like when nothing is being transferred it -can slow down to about one call per second. - -\fIclientp\fP is the pointer set with \fICURLOPT_PROGRESSDATA\fP, it is not -actually used by libcurl but is only passed along from the application to the -callback. - -The callback gets told how much data libcurl will transfer and has -transferred, in number of bytes. \fIdltotal\fP is the total number of bytes -libcurl expects to download in this transfer. \fIdlnow\fP is the number of -bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl -expects to upload in this transfer. \fIulnow\fP is the number of bytes -uploaded so far. - -Unknown/unused argument values passed to the callback will be set to zero -(like if you only download data, the upload size will remain 0). Many times -the callback will be called one or more times first, before it knows the data -sizes so a program must be made to handle that. - -Returning a non-zero value from this callback will cause libcurl to abort the -transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. - -If you transfer data with the multi interface, this function will not be -called during periods of idleness unless you call the appropriate libcurl -function that performs transfers. - -\fICURLOPT_NOPROGRESS\fP must be set to 0 to make this function actually -get called. -.IP CURLOPT_XFERINFOFUNCTION -Pass a pointer to a function that matches the following prototype: - -.nf -\fBint function(void *clientp, curl_off_t dltotal, curl_off_t dlnow, - curl_off_t ultotal, curl_off_t ulnow);\fP -.fi - -This function gets called by libcurl instead of its internal equivalent with a -frequent interval. While data is being transferred it will be called very -frequently, and during slow periods like when nothing is being transferred it -can slow down to about one call per second. - -\fIclientp\fP is the pointer set with \fICURLOPT_XFERINFODATA\fP, it is only -passed along from the application to the callback. - -The callback gets told how much data libcurl will transfer and has -transferred, in number of bytes. \fIdltotal\fP is the total number of bytes -libcurl expects to download in this transfer. \fIdlnow\fP is the number of -bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl -expects to upload in this transfer. \fIulnow\fP is the number of bytes -uploaded so far. - -Unknown/unused argument values passed to the callback will be set to zero -(like if you only download data, the upload size will remain 0). Many times -the callback will be called one or more times first, before it knows the data -sizes so a program must be made to handle that. - -Returning a non-zero value from this callback will cause libcurl to abort the -transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. - -If you transfer data with the multi interface, this function will not be -called during periods of idleness unless you call the appropriate libcurl -function that performs transfers. - -\fICURLOPT_NOPROGRESS\fP must be set to 0 to make this function actually -get called. - -(Added in 7.32.0) +OBSOLETE callback for progress meter. See \fICURLOPT_PROGRESSFUNCTION(3)\fP .IP CURLOPT_PROGRESSDATA -Pass a pointer that will be untouched by libcurl and passed as the first -argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP. -The default value of this parameter is unspecified. +Data pointer to pass to the progress meter callback. See \fICURLOPT_PROGRESSDATA(3)\fP +.IP CURLOPT_XFERINFOFUNCTION +Callback for progress meter. See \fICURLOPT_XFERINFOFUNCTION(3)\fP .IP CURLOPT_XFERINFODATA -Pass a pointer that will be untouched by libcurl and passed as the first -argument in the progress callback set with \fICURLOPT_XFERINFOFUNCTION\fP. -The default value of this parameter is unspecified. This option is an alias -for CURLOPT_PROGRESSDATA. (Added in 7.32.0) +Data pointer to pass to the progress meter callback. See \fICURLOPT_XFERINFODATA(3)\fP .IP CURLOPT_HEADERFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBsize_t function( void *ptr, size_t size, size_t nmemb, void -*userdata);\fP. This function gets called by libcurl as soon as it has -received header data. The header callback will be called once for each header -and only complete header lines are passed on to the callback. Parsing headers -is very easy using this. The size of the data pointed to by \fIptr\fP is -\fIsize\fP multiplied with \fInmemb\fP. Do not assume that the header line is -zero terminated! The pointer named \fIuserdata\fP is the one you set with the -\fICURLOPT_WRITEHEADER\fP option. The callback function must return the number -of bytes actually taken care of. If that amount differs from the amount passed -to your function, it'll signal an error to the library. This will abort the -transfer and return \fICURL_WRITE_ERROR\fP. - -A complete HTTP header that is passed to this function can be up to -\fICURL_MAX_HTTP_HEADER\fP (100K) bytes. - -If this option is not set, or if it is set to NULL, but -\fICURLOPT_HEADERDATA\fP (\fICURLOPT_WRITEHEADER\fP) is set to anything but -NULL, the function used to accept response data will be used instead. That is, -it will be the function specified with \fICURLOPT_WRITEFUNCTION\fP, or if it -is not specified or NULL - the default, stream-writing function. - -It's important to note that the callback will be invoked for the headers of -all responses received after initiating a request and not just the final -response. This includes all responses which occur during authentication -negotiation. If you need to operate on only the headers from the final -response, you will need to collect headers in the callback yourself and use -HTTP status lines, for example, to delimit response boundaries. - -When a server sends a chunked encoded transfer, it may contain a trailer. That -trailer is identical to a HTTP header and if such a trailer is received it is -passed to the application using this callback as well. There are several ways -to detect it being a trailer and not an ordinary header: 1) it comes after the -response-body. 2) it comes after the final header line (CR LF) 3) a Trailer: -header among the regular response-headers mention what header(s) to expect in -the trailer. - -For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get -called with the server responses to the commands that libcurl sends. -.IP CURLOPT_WRITEHEADER -(This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be -used to write the header part of the received data to. If you don't use -\fICURLOPT_WRITEFUNCTION\fP or \fICURLOPT_HEADERFUNCTION\fP to take care of -the writing, this must be a valid FILE * as the internal default will then be -a plain fwrite(). See also the \fICURLOPT_HEADERFUNCTION\fP option above on -how to set a custom get-all-headers callback. +Callback for writing received headers. See \fICURLOPT_HEADERFUNCTION(3)\fP +.IP CURLOPT_HEADERDATA +Data pointer to pass to the header callback. See \fICURLOPT_HEADERDATA(3)\fP .IP CURLOPT_DEBUGFUNCTION -Pass a pointer to a function that matches the following prototype: \fBint -curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP -\fICURLOPT_DEBUGFUNCTION\fP replaces the standard debug function used when -\fICURLOPT_VERBOSE \fP is in effect. This callback receives debug information, -as specified with the \fBcurl_infotype\fP argument. This function must return -0. The data pointed to by the char * passed to this function WILL NOT be zero -terminated, but will be exactly of the size as told by the size_t argument. - -Available curl_infotype values: -.RS -.IP CURLINFO_TEXT -The data is informational text. -.IP CURLINFO_HEADER_IN -The data is header (or header-like) data received from the peer. -.IP CURLINFO_HEADER_OUT -The data is header (or header-like) data sent to the peer. -.IP CURLINFO_DATA_IN -The data is protocol data received from the peer. -.IP CURLINFO_DATA_OUT -The data is protocol data sent to the peer. -.RE +Callback for debug information. See \fICURLOPT_DEBUGFUNCTION(3)\fP .IP CURLOPT_DEBUGDATA -Pass a pointer to whatever you want passed in to your -\fICURLOPT_DEBUGFUNCTION\fP in the last void * argument. This pointer is not -used by libcurl, it is only passed to the callback. +Data pointer to pass to the debug callback. See \fICURLOPT_DEBUGDATA(3)\fP .IP CURLOPT_SSL_CTX_FUNCTION -This option does only function for libcurl powered by OpenSSL. If libcurl was -built against another SSL library, this functionality is absent. - -Pass a pointer to a function that matches the following prototype: -\fBCURLcode sslctxfun(CURL *curl, void *sslctx, void *parm);\fP This function -gets called by libcurl just before the initialization of a SSL connection -after having processed all other SSL related options to give a last chance to -an application to modify the behaviour of openssl's ssl initialization. The -\fIsslctx\fP parameter is actually a pointer to an openssl \fISSL_CTX\fP. If -an error is returned no attempt to establish a connection is made and the -perform operation will return the error code from this callback function. Set -the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This -option was introduced in 7.11.0. - -This function will get called on all new connections made to a server, during -the SSL negotiation. The SSL_CTX pointer will be a new one every time. - -To use this properly, a non-trivial amount of knowledge of the openssl -libraries is necessary. For example, using this function allows you to use -openssl callbacks to add additional validation code for certificates, and even -to change the actual URI of a HTTPS request (example used in the lib509 test -case). See also the example section for a replacement of the key, certificate -and trust file settings. +Callback for SSL context logic. See \fICURLOPT_SSL_CTX_FUNCTION(3)\fP .IP CURLOPT_SSL_CTX_DATA -Data pointer to pass to the ssl context callback set by the option -\fICURLOPT_SSL_CTX_FUNCTION\fP, this is the pointer you'll get as third -parameter, otherwise \fBNULL\fP. (Added in 7.11.0) +Data pointer to pass to the SSL context callback. See \fICURLOPT_SSL_CTX_DATA(3)\fP .IP CURLOPT_CONV_TO_NETWORK_FUNCTION +Callback for code base conversion. See \fICURLOPT_CONV_TO_NETWORK_FUNCTION(3)\fP .IP CURLOPT_CONV_FROM_NETWORK_FUNCTION +Callback for code base conversion. See \fICURLOPT_CONV_FROM_NETWORK_FUNCTION(3)\fP .IP CURLOPT_CONV_FROM_UTF8_FUNCTION -Pass a pointer to a function that matches the following prototype: -\fBCURLcode function(char *ptr, size_t length);\fP - -These three options apply to non-ASCII platforms only. They are available -only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built. When -this is the case, \fIcurl_version_info(3)\fP will return the CURL_VERSION_CONV -feature bit set. - -The data to be converted is in a buffer pointed to by the ptr parameter. The -amount of data to convert is indicated by the length parameter. The converted -data overlays the input data in the buffer pointed to by the ptr parameter. -CURLE_OK should be returned upon successful conversion. A CURLcode return -value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an -error was encountered. - -\fBCURLOPT_CONV_TO_NETWORK_FUNCTION\fP and -\fBCURLOPT_CONV_FROM_NETWORK_FUNCTION\fP convert between the host encoding and -the network encoding. They are used when commands or ASCII data are -sent/received over the network. - -\fBCURLOPT_CONV_FROM_UTF8_FUNCTION\fP is called to convert from UTF8 into the -host encoding. It is required only for SSL processing. - -If you set a callback pointer to NULL, or don't set it at all, the built-in -libcurl iconv functions will be used. If HAVE_ICONV was not defined when -libcurl was built, and no callback has been established, conversion will -return the CURLE_CONV_REQD error code. - -If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. -For example: - - \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047" - -The iconv code in libcurl will default the network and UTF8 codeset names as -follows: - - \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" - - \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" - -You will need to override these definitions if they are different on your -system. +Callback for code base conversion. See \fICURLOPT_CONV_FROM_UTF8_FUNCTION(3)\fP .IP CURLOPT_INTERLEAVEFUNCTION -Pass a pointer to a function that matches the following prototype: -\fBsize_t function( void *ptr, size_t size, size_t nmemb, void -*userdata)\fP. This function gets called by libcurl as soon as it has received -interleaved RTP data. This function gets called for each $ block and therefore -contains exactly one upper-layer protocol unit (e.g. one RTP packet). Curl -writes the interleaved header as well as the included data for each call. The -first byte is always an ASCII dollar sign. The dollar sign is followed by a -one byte channel identifier and then a 2 byte integer length in network byte -order. See \fIRFC2326 Section 10.12\fP for more information on how RTP -interleaving behaves. If unset or set to NULL, curl will use the default write -function. - -Interleaved RTP poses some challenges for the client application. Since the -stream data is sharing the RTSP control connection, it is critical to service -the RTP in a timely fashion. If the RTP data is not handled quickly, -subsequent response processing may become unreasonably delayed and the -connection may close. The application may use \fICURL_RTSPREQ_RECEIVE\fP to -service RTP data when no requests are desired. If the application makes a -request, (e.g. \fICURL_RTSPREQ_PAUSE\fP) then the response handler will -process any pending RTP data before marking the request as finished. (Added -in 7.20.0) +Callback for RTSP interleaved data. See \fICURLOPT_INTERLEAVEFUNCTION(3)\fP .IP CURLOPT_INTERLEAVEDATA -This is the userdata pointer that will be passed to -\fICURLOPT_INTERLEAVEFUNCTION\fP when interleaved RTP data is received. (Added -in 7.20.0) +Data pointer to pass to the RTSP interleave callback. See \fICURLOPT_INTERLEAVEDATA(3)\fP .IP CURLOPT_CHUNK_BGN_FUNCTION -Pass a pointer to a function that matches the following prototype: -\fBlong function (const void *transfer_info, void *ptr, int remains)\fP. This -function gets called by libcurl before a part of the stream is going to be -transferred (if the transfer supports chunks). - -This callback makes sense only when using the \fICURLOPT_WILDCARDMATCH\fP -option for now. - -The target of transfer_info parameter is a "feature depended" structure. For -the FTP wildcard download, the target is curl_fileinfo structure (see -\fIcurl/curl.h\fP). The parameter ptr is a pointer given by -\fICURLOPT_CHUNK_DATA\fP. The parameter remains contains number of chunks -remaining per the transfer. If the feature is not available, the parameter has -zero value. - -Return \fICURL_CHUNK_BGN_FUNC_OK\fP if everything is fine, -\fICURL_CHUNK_BGN_FUNC_SKIP\fP if you want to skip the concrete chunk or -\fICURL_CHUNK_BGN_FUNC_FAIL\fP to tell libcurl to stop if some error occurred. -(This was added in 7.21.0) +Callback for wildcard download start of chunk. See \fICURLOPT_CHUNK_BGN_FUNCTION(3)\fP .IP CURLOPT_CHUNK_END_FUNCTION -Pass a pointer to a function that matches the following prototype: -\fBlong function(void *ptr)\fP. This function gets called by libcurl as soon -as a part of the stream has been transferred (or skipped). - -Return \fICURL_CHUNK_END_FUNC_OK\fP if everything is fine or -\fBCURL_CHUNK_END_FUNC_FAIL\fP to tell the lib to stop if some error occurred. -(This was added in 7.21.0) +Callback for wildcard download end of chunk. See \fICURLOPT_CHUNK_END_FUNCTION(3)\fP .IP CURLOPT_CHUNK_DATA -Pass a pointer that will be untouched by libcurl and passed as the ptr -argument to the \fICURL_CHUNK_BGN_FUNTION\fP and \fICURL_CHUNK_END_FUNTION\fP. -(This was added in 7.21.0) +Data pointer to pass to the chunk callbacks. See \fICURLOPT_CHUNK_DATA(3)\fP .IP CURLOPT_FNMATCH_FUNCTION -Pass a pointer to a function that matches the following prototype: \fBint -function(void *ptr, const char *pattern, const char *string)\fP prototype (see -\fIcurl/curl.h\fP). It is used internally for the wildcard matching feature. - -Return \fICURL_FNMATCHFUNC_MATCH\fP if pattern matches the string, -\fICURL_FNMATCHFUNC_NOMATCH\fP if not or \fICURL_FNMATCHFUNC_FAIL\fP if an -error occurred. (This was added in 7.21.0) +Callback for wildcard matching. See \fICURLOPT_FNMATCH_FUNCTION(3)\fP .IP CURLOPT_FNMATCH_DATA -Pass a pointer that will be untouched by libcurl and passed as the ptr argument -to the \fICURL_FNMATCH_FUNCTION\fP. (This was added in 7.21.0) +Data pointer to pass to the wildcard matching callback. See \fICURLOPT_FNMATCH_DATA(3)\fP .SH ERROR OPTIONS .IP CURLOPT_ERRORBUFFER -Pass a char * to a buffer that the libcurl may store human readable error -messages in. This may be more helpful than just the return code from -\fIcurl_easy_perform\fP. The buffer must be at least CURL_ERROR_SIZE big. -Although this argument is a 'char *', it does not describe an input string. -Therefore the (probably undefined) contents of the buffer is NOT copied by the -library. You must keep the associated storage available until libcurl no -longer needs it. Failing to do so will cause very odd behavior or even -crashes. libcurl will need it until you call \fIcurl_easy_cleanup(3)\fP or you -set the same option again to use a different pointer. - -Use \fICURLOPT_VERBOSE\fP and \fICURLOPT_DEBUGFUNCTION\fP to better -debug/trace why errors happen. - -If the library does not return an error, the buffer may not have been -touched. Do not rely on the contents in those cases. - +Error message buffer. See \fICURLOPT_ERRORBUFFER(3)\fP .IP CURLOPT_STDERR -Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr -when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data. +stderr replacement stream. See \fICURLOPT_STDERR(3)\fP .IP CURLOPT_FAILONERROR -A parameter set to 1 tells the library to fail silently if the HTTP code -returned is equal to or larger than 400. The default action would be to return -the page normally, ignoring that code. - -This method is not fail-safe and there are occasions where non-successful -response codes will slip through, especially when authentication is involved -(response codes 401 and 407). - -You might get some amounts of headers transferred before this situation is -detected, like when a "100-continue" is received as a response to a -POST/PUT and a 401 or 407 is received immediately afterwards. +Fail on HTTP 4xx errors. \fICURLOPT_FAILONERROR(3)\fP .SH NETWORK OPTIONS .IP CURLOPT_URL -Pass in a pointer to the actual URL to deal with. The parameter should be a -char * to a zero terminated string which must be URL-encoded in the following -format: - -scheme://host:port/path - -For a greater explanation of the format please see RFC3986. - -If the given URL lacks the scheme (such as "http://" or "ftp://" etc) then -libcurl will attempt to resolve the protocol based on one of the following -given host names: - -HTTP, FTP, DICT, LDAP, IMAP, POP3 or SMTP - -(POP3 and SMTP added in 7.31.0) - -Should the protocol, either that specified by the scheme or deduced by libcurl -from the host name, not be supported by libcurl then -(\fICURLE_UNSUPPORTED_PROTOCOL\fP) will be returned from either the -\fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP functions when you -call them. Use \fIcurl_version_info(3)\fP for detailed information of which -protocols are supported by the build of libcurl you are using. - -The host part of the URL contains the address of the server that you want to -connect to. This can be the fully qualified domain name of the server, the -local network name of the machine on your network or the IP address of the -server or machine represented by either an IPv4 or IPv6 address. For example: - -http://www.example.com/ - -http://hostname/ - -http://192.168.0.1/ - -http://[2001:1890:1112:1::20]/ - -It is also possible to specify the user name, password and any supported login -options as part of the host, for the following protocols, when connecting to -servers that require authentication: - -http://user:password@www.example.com - -ftp://user:password@ftp.example.com - -imap://user:password;options@mail.example.com - -pop3://user:password;options@mail.example.com - -smtp://user:password;options@mail.example.com - -At present only IMAP, POP3 and SMTP support login options as part of the host. -For more information about the login options in URL syntax please see RFC2384, -RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). - -The port is optional and when not specified libcurl will use the default port -based on the determined or specified protocol: 80 for HTTP, 21 for FTP and 25 -for SMTP, etc. The following examples show how to specify the port: - -http://www.example.com:8080/ - This will connect to a web server using port -8080 rather than 80. - -smtp://mail.example.com:587/ - This will connect to a SMTP server on the -alternative mail port. - -The path part of the URL is protocol specific and whilst some examples are -given below this list is not conclusive: - -.B HTTP - -The path part of a HTTP request specifies the file to retrieve and from what -directory. If the directory is not specified then the web server's root -directory is used. If the file is omitted then the default document will be -retrieved for either the directory specified or the root directory. The -exact resource returned for each URL is entirely dependent on the server's -configuration. - -http://www.example.com - This gets the main page from the web server. - -http://www.example.com/index.html - This returns the main page by explicitly -requesting it. - -http://www.example.com/contactus/ - This returns the default document from -the contactus directory. - -.B FTP - -The path part of an FTP request specifies the file to retrieve and from what -directory. If the file part is omitted then libcurl downloads the directory -listing for the directory specified. If the directory is omitted then -the directory listing for the root / home directory will be returned. - -ftp://ftp.example.com - This retrieves the directory listing for the root -directory. - -ftp://ftp.example.com/readme.txt - This downloads the file readme.txt from the -root directory. - -ftp://ftp.example.com/libcurl/readme.txt - This downloads readme.txt from the -libcurl directory. - -ftp://user:password@ftp.example.com/readme.txt - This retrieves the readme.txt -file from the user's home directory. When a username and password is -specified, everything that is specified in the path part is relative to the -user's home directory. To retrieve files from the root directory or a -directory underneath the root directory then the absolute path must be -specified by prepending an additional forward slash to the beginning of the -path. - -ftp://user:password@ftp.example.com//readme.txt - This retrieves the readme.txt -from the root directory when logging in as a specified user. - -.B SMTP - -The path part of a SMTP request specifies the host name to present during -communication with the mail server. If the path is omitted then libcurl will -attempt to resolve the local computer's host name. However, this may not -return the fully qualified domain name that is required by some mail servers -and specifying this path allows you to set an alternative name, such as -your machine's fully qualified domain name, which you might have obtained -from an external function such as gethostname or getaddrinfo. - -smtp://mail.example.com - This connects to the mail server at example.com and -sends your local computer's host name in the HELO / EHLO command. - -smtp://mail.example.com/client.example.com - This will send client.example.com in -the HELO / EHLO command to the mail server at example.com. - -.B POP3 - -The path part of a POP3 request specifies the message ID to retrieve. If the -ID is not specified then a list of waiting messages is returned instead. - -pop3://user:password@mail.example.com - This lists the available messages for -the user - -pop3://user:password@mail.example.com/1 - This retrieves the first message for -the user - -.B IMAP - -The path part of an IMAP request not only specifies the mailbox to list (Added -in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the -mailbox and to specify the UID and SECTION of the message to fetch (Added in -7.30.0). - -imap://user:password@mail.example.com - Performs a top level folder list - -imap://user:password@mail.example.com/INBOX - Performs a folder list on the -user's inbox - -imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox -and fetches message 1 - -imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects -the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches -message 2 if it is - -imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the -user's inbox and fetches message 3 with only the text portion of the message - -For more information about the individual components of an IMAP URL please -see RFC5092. - -.B SCP - -The path part of a SCP request specifies the file to retrieve and from what -directory. The file part may not be omitted. The file is taken as an absolute -path from the root directory on the server. To specify a path relative to -the user's home directory on the server, prepend ~/ to the path portion. -If the user name is not embedded in the URL, it can be set with the -\fICURLOPT_USERPWD\fP or \fBCURLOPT_USERNAME\fP option. - -scp://user@example.com/etc/issue - This specifies the file /etc/issue - -scp://example.com/~/my-file - This specifies the file my-file in the -user's home directory on the server - -.B SFTP - -The path part of a SFTP request specifies the file to retrieve and from what -directory. If the file part is omitted then libcurl downloads the directory -listing for the directory specified. If the path ends in a / then a directory -listing is returned instead of a file. If the path is omitted entirely then -the directory listing for the root / home directory will be returned. -If the user name is not embedded in the URL, it can be set with the -\fICURLOPT_USERPWD\fP or \fBCURLOPT_USERNAME\fP option. - -sftp://user:password@example.com/etc/issue - This specifies the file -/etc/issue - -sftp://user@example.com/~/my-file - This specifies the file my-file in the -user's home directory - -sftp://ssh.example.com/~/Documents/ - This requests a directory listing -of the Documents directory under the user's home directory - -.B LDAP - -The path part of a LDAP request can be used to specify the: Distinguished -Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field -is separated by a question mark and when that field is not required an empty -string with the question mark separator should be included. - -ldap://ldap.example.com/o=My%20Organisation - This will perform a LDAP search -with the DN as My Organisation. - -ldap://ldap.example.com/o=My%20Organisation?postalAddress - This will perform -the same search but will only return postalAddress attributes. - -ldap://ldap.example.com/?rootDomainNamingContext - This specifies an empty DN -and requests information about the rootDomainNamingContext attribute for an -Active Directory server. - -For more information about the individual components of a LDAP URL please -see RFC4516. - -.B NOTES - -Starting with version 7.20.0, the fragment part of the URI will not be sent as -part of the path, which was previously the case. - -\fICURLOPT_URL\fP is the only option that \fBmust\fP be set before -\fIcurl_easy_perform(3)\fP is called. - -\fICURLOPT_PROTOCOLS\fP can be used to limit what protocols libcurl will use -for this transfer, independent of what libcurl has been compiled to -support. That may be useful if you accept the URL from an external source and -want to limit the accessibility. +URL to work on. See \fICURLOPT_URL(3)\fP .IP CURLOPT_PROTOCOLS -Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask -limits what protocols libcurl may use in the transfer. This allows you to have -a libcurl built to support a wide range of protocols but still limit specific -transfers to only be allowed to use a subset of them. By default libcurl will -accept all protocols it supports. See also -\fICURLOPT_REDIR_PROTOCOLS\fP. (Added in 7.19.4) +Allowed protocols. See \fICURLOPT_PROTOCOLS(3)\fP .IP CURLOPT_REDIR_PROTOCOLS -Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask -limits what protocols libcurl may use in a transfer that it follows to in a -redirect when \fICURLOPT_FOLLOWLOCATION\fP is enabled. This allows you to -limit specific transfers to only be allowed to use a subset of protocols in -redirections. By default libcurl will allow all protocols except for FILE and -SCP. This is a difference compared to pre-7.19.4 versions which -unconditionally would follow to all protocols supported. (Added in 7.19.4) +Protocols to allow redirects to. See \fICURLOPT_REDIR_PROTOCOLS(3)\fP .IP CURLOPT_PROXY -Set HTTP proxy to use. The parameter should be a char * to a zero terminated -string holding the host name or dotted IP address. To specify port number in -this string, append :[port] to the end of the host name. The proxy string may -be prefixed with [protocol]:// since any such prefix will be ignored. The -proxy's port number may optionally be specified with the separate option. If -not specified, libcurl will default to using port 1080 for proxies. -\fICURLOPT_PROXYPORT\fP. - -When you tell the library to use a HTTP proxy, libcurl will transparently -convert operations to HTTP even if you specify an FTP URL etc. This may have -an impact on what other features of the library you can use, such as -\fICURLOPT_QUOTE\fP and similar FTP specifics that don't work unless you -tunnel through the HTTP proxy. Such tunneling is activated with -\fICURLOPT_HTTPPROXYTUNNEL\fP. - -libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP, -\fBall_proxy\fP etc, if any of those are set. The \fICURLOPT_PROXY\fP option -does however override any possibly set environment variables. - -Setting the proxy string to "" (an empty string) will explicitly disable the -use of a proxy, even if there is an environment variable set for it. - -Since 7.14.1, the proxy host string given in environment variables can be -specified the exact same way as the proxy can be set with \fICURLOPT_PROXY\fP, -include protocol prefix (http://) and embedded user + password. - -Since 7.21.7, the proxy string may be specified with a protocol:// prefix to -specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or -socks5h:// (the last one to enable socks5 and asking the proxy to do the -resolving, also known as CURLPROXY_SOCKS5_HOSTNAME type) to request the -specific SOCKS version to be used. No protocol specified, http:// and all -others will be treated as HTTP proxies. +Proxy to use. See \fICURLOPT_PROXY(3)\fP .IP CURLOPT_PROXYPORT -Pass a long with this option to set the proxy port to connect to unless it is -specified in the proxy string \fICURLOPT_PROXY\fP. +Proxy port to use. See \fICURLOPT_PROXYPORT(3)\fP .IP CURLOPT_PROXYTYPE -Pass a long with this option to set type of the proxy. Available options for -this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_HTTP_1_0\fP (added in 7.19.4), -\fICURLPROXY_SOCKS4\fP (added in 7.10), \fICURLPROXY_SOCKS5\fP, -\fICURLPROXY_SOCKS4A\fP (added in 7.18.0) and \fICURLPROXY_SOCKS5_HOSTNAME\fP -(added in 7.18.0). The HTTP type is default. (Added in 7.10) - -If you set \fBCURLOPT_PROXYTYPE\fP to \fICURLPROXY_HTTP_1_0\fP, it will only -affect how libcurl speaks to a proxy when CONNECT is used. The HTTP version -used for "regular" HTTP requests is instead controlled with -\fICURLOPT_HTTP_VERSION\fP. +Proxy type. See \fICURLOPT_PROXYTYPE(3)\fP .IP CURLOPT_NOPROXY -Pass a pointer to a zero terminated string. The string consists of a comma -separated list of host names that do not require a proxy to get reached, even -if one is specified. The only wildcard available is a single * character, -which matches all hosts, and effectively disables the proxy. Each name in this -list is matched as either a domain which contains the hostname, or the -hostname itself. For example, example.com would match example.com, -example.com:80, and www.example.com, but not www.notanexample.com. (Added in -7.19.4) +Filter out hosts from proxy use. \fICURLOPT_NOPROXY(3)\fP .IP CURLOPT_HTTPPROXYTUNNEL -Set the parameter to 1 to make the library tunnel all operations through a -given HTTP proxy. There is a big difference between using a proxy and to -tunnel through it. If you don't know what this means, you probably don't want -this tunneling option. +Tunnel through the HTTP proxy. \fICURLOPT_HTTPPROXYTUNNEL(3)\fP .IP CURLOPT_SOCKS5_GSSAPI_SERVICE -Pass a char * as parameter to a string holding the name of the service. The -default service name for a SOCKS5 server is rcmd/server-fqdn. This option -allows you to change it. (Added in 7.19.4) +Socks5 GSSAPI service name. \fICURLOPT_SOCKS5_GSSAPI_SERVICE(3)\fP .IP CURLOPT_SOCKS5_GSSAPI_NEC -Pass a long set to 1 to enable or 0 to disable. As part of the gssapi -negotiation a protection mode is negotiated. The RFC1961 says in section -4.3/4.4 it should be protected, but the NEC reference implementation does not. -If enabled, this option allows the unprotected exchange of the protection mode -negotiation. (Added in 7.19.4). +Socks5 GSSAPI NEC mode. See \fICURLOPT_SOCKS5_GSSAPI_NEC(3)\fP .IP CURLOPT_INTERFACE -Pass a char * as parameter. This sets the interface name to use as outgoing -network interface. The name can be an interface name, an IP address, or a host -name. - -Starting with 7.24.0: If the parameter starts with "if!" then it is treated as -only as interface name and no attempt will ever be named to do treat it as an -IP address or to do name resolution on it. If the parameter starts with -\&"host!" it is treated as either an IP address or a hostname. Hostnames are -resolved synchronously. Using the if! format is highly recommended when using -the multi interfaces to avoid allowing the code to block. If "if!" is -specified but the parameter does not match an existing interface, -CURLE_INTERFACE_FAILED is returned. +Bind connection locally to this. See \fICURLOPT_INTERFACE(3)\fP .IP CURLOPT_LOCALPORT -Pass a long. This sets the local port number of the socket used for -connection. This can be used in combination with \fICURLOPT_INTERFACE\fP and -you are recommended to use \fICURLOPT_LOCALPORTRANGE\fP as well when this is -set. Valid port numbers are 1 - 65535. (Added in 7.15.2) +Bind connection locally to this port. See \fICURLOPT_LOCALPORT(3)\fP .IP CURLOPT_LOCALPORTRANGE -Pass a long. This is the number of attempts libcurl will make to find a -working local port number. It starts with the given \fICURLOPT_LOCALPORT\fP -and adds one to the number for each retry. Setting this to 1 or below will -make libcurl do only one try for the exact port number. Port numbers by nature -are scarce resources that will be busy at times so setting this value to -something too low might cause unnecessary connection setup failures. (Added in -7.15.2) +Bind connection locally to port range. See \fICURLOPT_LOCALPORTRANGE(3)\fP .IP CURLOPT_DNS_CACHE_TIMEOUT -Pass a long, this sets the timeout in seconds. Name resolves will be kept in -memory for this number of seconds. Set to zero to completely disable -caching, or set to -1 to make the cached entries remain forever. By default, -libcurl caches this info for 60 seconds. - -The name resolve functions of various libc implementations don't re-read name -server information unless explicitly told so (for example, by calling -\fIres_init(3)\fP). This may cause libcurl to keep using the older server even -if DHCP has updated the server info, and this may look like a DNS cache issue -to the casual libcurl-app user. +Timeout for DNS cache. See \fICURLOPT_DNS_CACHE_TIMEOUT(3)\fP .IP CURLOPT_DNS_USE_GLOBAL_CACHE -Pass a long. If the value is 1, it tells curl to use a global DNS cache -that will survive between easy handle creations and deletions. This is not -thread-safe and this will use a global variable. - -\fBWARNING:\fP this option is considered obsolete. Stop using it. Switch over -to using the share interface instead! See \fICURLOPT_SHARE\fP and -\fIcurl_share_init(3)\fP. +OBSOLETE Enable global DNS cache. See \fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP .IP CURLOPT_BUFFERSIZE -Pass a long specifying your preferred size (in bytes) for the receive buffer -in libcurl. The main point of this would be that the write callback gets -called more often and with smaller chunks. This is just treated as a request, -not an order. You cannot be guaranteed to actually get the given size. (Added -in 7.10) - -This size is by default set as big as possible (CURL_MAX_WRITE_SIZE), so it -only makes sense to use this option if you want it smaller. +Ask for smaller buffer size. See \fICURLOPT_BUFFERSIZE(3)\fP .IP CURLOPT_PORT -Pass a long specifying what remote port number to connect to, instead of the -one specified in the URL or the default port for the used protocol. +Port number to connect to. See \fICURLOPT_PORT(3)\fP .IP CURLOPT_TCP_NODELAY -Pass a long specifying whether the TCP_NODELAY option is to be set or cleared -(1 = set, 0 = clear). The option is cleared by default. This will have no -effect after the connection has been established. - -Setting this option will disable TCP's Nagle algorithm. The purpose of this -algorithm is to try to minimize the number of small packets on the network -(where "small packets" means TCP segments less than the Maximum Segment Size -(MSS) for the network). - -Maximizing the amount of data sent per TCP segment is good because it -amortizes the overhead of the send. However, in some cases (most notably -telnet or rlogin) small segments may need to be sent without delay. This is -less efficient than sending larger amounts of data at a time, and can -contribute to congestion on the network if overdone. +Disable the Nagle algorithm. See \fICURLOPT_TCP_NODELAY(3)\fP .IP CURLOPT_ADDRESS_SCOPE -Pass a long specifying the scope_id value to use when connecting to IPv6 -link-local or site-local addresses. (Added in 7.19.0) +IPv6 scope for local addresses. See \fICURLOPT_ADDRESS_SCOPE(3)\fP .IP CURLOPT_TCP_KEEPALIVE -Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and -frequency of these probes can be controlled by the \fICURLOPT_TCP_KEEPIDLE\fP -and \fICURLOPT_TCP_KEEPINTVL\fP options, provided the operating system supports -them. Set to 0 (default behavior) to disable keepalive probes (Added in -7.25.0). +Enable TCP keep-alive. See \fICURLOPT_TCP_KEEPALIVE(3)\fP .IP CURLOPT_TCP_KEEPIDLE -Pass a long. Sets the delay, in seconds, that the operating system will wait -while the connection is idle before sending keepalive probes. Not all operating -systems support this option. (Added in 7.25.0) +Idle time before sending keep-alive. See \fICURLOPT_TCP_KEEPIDLE(3)\fP .IP CURLOPT_TCP_KEEPINTVL -Pass a long. Sets the interval, in seconds, that the operating system will wait -between sending keepalive probes. Not all operating systems support this -option. (Added in 7.25.0) +Interval between keep-alive probes. See \fICURLOPT_TCP_KEEPINTVL(3)\fP +.IP CURLOPT_UNIX_SOCKET_PATH +Path to a Unix domain socket. See \fICURLOPT_UNIX_SOCKET_PATH(3)\fP .SH NAMES and PASSWORDS OPTIONS (Authentication) .IP CURLOPT_NETRC -This parameter controls the preference of libcurl between using user names and -passwords from your \fI~/.netrc\fP file, relative to user names and passwords -in the URL supplied with \fICURLOPT_URL\fP. - -libcurl uses a user name (and supplied or prompted password) supplied with -\fICURLOPT_USERPWD\fP in preference to any of the options controlled by this -parameter. - -Pass a long, set to one of the values described below. -.RS -.IP CURL_NETRC_OPTIONAL -The use of your \fI~/.netrc\fP file is optional, and information in the URL is -to be preferred. The file will be scanned for the host and user name (to -find the password only) or for the host only, to find the first user name and -password after that \fImachine\fP, which ever information is not specified in -the URL. - -Undefined values of the option will have this effect. -.IP CURL_NETRC_IGNORED -The library will ignore the file and use only the information in the URL. - -This is the default. -.IP CURL_NETRC_REQUIRED -This value tells the library that use of the file is required, to ignore the -information in the URL, and to search the file for the host only. -.RE -Only machine name, user name and password are taken into account -(init macros and similar things aren't supported). - -libcurl does not verify that the file has the correct properties set (as the -standard Unix ftp client does). It should only be readable by user. +Enable .netrc parsing. See \fICURLOPT_NETRC(3)\fP .IP CURLOPT_NETRC_FILE -Pass a char * as parameter, pointing to a zero terminated string containing -the full path name to the file you want libcurl to use as .netrc file. If this -option is omitted, and \fICURLOPT_NETRC\fP is set, libcurl will attempt to -find a .netrc file in the current user's home directory. (Added in 7.10.9) +\&.netrc file name. See \fICURLOPT_NETRC_FILE(3)\fP .IP CURLOPT_USERPWD -Pass a char * as parameter, pointing to a zero terminated login details string -for the connection. The format of which is: [user name]:[password];[options]. - -When using NTLM, you can set the domain by prepending it to the user name and -separating the domain and name with a forward (/) or backward slash (\\). Like -this: "domain/user:password" or "domain\\user:password". Some HTTP servers (on -Windows) support this style even for Basic authentication. - -When using HTTP and \fICURLOPT_FOLLOWLOCATION\fP, libcurl might perform -several requests to possibly different hosts. libcurl will only send this user -and password information to hosts using the initial host name (unless -\fICURLOPT_UNRESTRICTED_AUTH\fP is set), so if libcurl follows locations to -other hosts it will not send the user and password to those. This is enforced -to prevent accidental information leakage. - -At present only IMAP, POP3 and SMTP support login options as part of the -details string. For more information about the login options please see -RFC2384, RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). - -Use \fICURLOPT_HTTPAUTH\fP to specify the authentication method for HTTP based -connections. +User name and password. See \fICURLOPT_USERPWD(3)\fP .IP CURLOPT_PROXYUSERPWD -Pass a char * as parameter, which should be [user name]:[password] to use for -the connection to the HTTP proxy. - -Use \fICURLOPT_PROXYAUTH\fP to specify the authentication method. +Proxy user name and password. See \fICURLOPT_PROXYUSERPWD(3)\fP .IP CURLOPT_USERNAME -Pass a char * as parameter, which should be pointing to the zero terminated -user name to use for the transfer. - -\fBCURLOPT_USERNAME\fP sets the user name to be used in protocol -authentication. You should not use this option together with the (older) -CURLOPT_USERPWD option. - -In order to specify the password to be used in conjunction with the user name -use the \fICURLOPT_PASSWORD\fP option. (Added in 7.19.1) +User name. See \fICURLOPT_USERNAME(3)\fP .IP CURLOPT_PASSWORD -Pass a char * as parameter, which should be pointing to the zero terminated -password to use for the transfer. - -The CURLOPT_PASSWORD option should be used in conjunction with -the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1) +Password. See \fICURLOPT_PASSWORD(3)\fP +.IP CURLOPT_LOGIN_OPTIONS +Login options. See \fICURLOPT_LOGIN_OPTIONS(3)\fP .IP CURLOPT_PROXYUSERNAME -Pass a char * as parameter, which should be pointing to the zero terminated -user name to use for the transfer while connecting to Proxy. - -The CURLOPT_PROXYUSERNAME option should be used in same way as the -\fICURLOPT_PROXYUSERPWD\fP is used. In comparison to -\fICURLOPT_PROXYUSERPWD\fP the CURLOPT_PROXYUSERNAME allows the username to -contain a colon, like in the following example: "sip:user@example.com". The -CURLOPT_PROXYUSERNAME option is an alternative way to set the user name while -connecting to Proxy. There is no meaning to use it together with the -\fICURLOPT_PROXYUSERPWD\fP option. - -In order to specify the password to be used in conjunction with the user name -use the \fICURLOPT_PROXYPASSWORD\fP option. (Added in 7.19.1) +Proxy user name. See \fICURLOPT_PROXYUSERNAME(3)\fP .IP CURLOPT_PROXYPASSWORD -Pass a char * as parameter, which should be pointing to the zero terminated -password to use for the transfer while connecting to Proxy. - -The CURLOPT_PROXYPASSWORD option should be used in conjunction with -the \fICURLOPT_PROXYUSERNAME\fP option. (Added in 7.19.1) +Proxy password. See \fICURLOPT_PROXYPASSWORD(3)\fP .IP CURLOPT_HTTPAUTH -Pass a long as parameter, which is set to a bitmask, to tell libcurl which -authentication method(s) you want it to use. The available bits are listed -below. If more than one bit is set, libcurl will first query the site to see -which authentication methods it supports and then pick the best one you allow -it to use. For some methods, this will induce an extra network round-trip. Set -the actual name and password with the \fICURLOPT_USERPWD\fP option or -with the \fICURLOPT_USERNAME\fP and the \fICURLOPT_PASSWORD\fP options. -(Added in 7.10.6) -.RS -.IP CURLAUTH_BASIC -HTTP Basic authentication. This is the default choice, and the only method -that is in wide-spread use and supported virtually everywhere. This sends -the user name and password over the network in plain text, easily captured by -others. -.IP CURLAUTH_DIGEST -HTTP Digest authentication. Digest authentication is defined in RFC2617 and -is a more secure way to do authentication over public networks than the -regular old-fashioned Basic method. -.IP CURLAUTH_DIGEST_IE -HTTP Digest authentication with an IE flavor. Digest authentication is -defined in RFC2617 and is a more secure way to do authentication over public -networks than the regular old-fashioned Basic method. The IE flavor is simply -that libcurl will use a special "quirk" that IE is known to have used before -version 7 and that some servers require the client to use. (This define was -added in 7.19.3) -.IP CURLAUTH_GSSNEGOTIATE -HTTP GSS-Negotiate authentication. The GSS-Negotiate (also known as plain -\&"Negotiate") method was designed by Microsoft and is used in their web -applications. It is primarily meant as a support for Kerberos5 authentication -but may also be used along with other authentication methods. For more -information see IETF draft draft-brezak-spnego-http-04.txt. - -You need to build libcurl with a suitable GSS-API library for this to work. -.IP CURLAUTH_NTLM -HTTP NTLM authentication. A proprietary protocol invented and used by -Microsoft. It uses a challenge-response and hash concept similar to Digest, to -prevent the password from being eavesdropped. - -You need to build libcurl with either OpenSSL, GnuTLS or NSS support for this -option to work, or build libcurl on Windows with SSPI support. -.IP CURLAUTH_NTLM_WB -NTLM delegating to winbind helper. Authentication is performed by a separate -binary application that is executed when needed. The name of the application -is specified at compile time but is typically /usr/bin/ntlm_auth -(Added in 7.22.0) - -Note that libcurl will fork when necessary to run the winbind application and -kill it when complete, calling waitpid() to await its exit when done. On POSIX -operating systems, killing the process will cause a SIGCHLD signal to be -raised (regardless of whether \fICURLOPT_NOSIGNAL\fP is set), which must be -handled intelligently by the application. In particular, the application must -not unconditionally call wait() in its SIGCHLD signal handler to avoid being -subject to a race condition. This behavior is subject to change in future -versions of libcurl. -.IP CURLAUTH_ANY -This is a convenience macro that sets all bits and thus makes libcurl pick any -it finds suitable. libcurl will automatically select the one it finds most -secure. -.IP CURLAUTH_ANYSAFE -This is a convenience macro that sets all bits except Basic and thus makes -libcurl pick any it finds suitable. libcurl will automatically select the one -it finds most secure. -.IP CURLAUTH_ONLY -This is a meta symbol. Or this value together with a single specific auth -value to force libcurl to probe for un-restricted auth and if not, only that -single auth algorithm is acceptable. (Added in 7.21.3) -.RE -.IP CURLOPT_TLSAUTH_TYPE -Pass a long as parameter, which is set to a bitmask, to tell libcurl which -authentication method(s) you want it to use for TLS authentication. -.RS -.IP CURLOPT_TLSAUTH_SRP -TLS-SRP authentication. Secure Remote Password authentication for TLS is -defined in RFC5054 and provides mutual authentication if both sides have a -shared secret. To use TLS-SRP, you must also set the -\fICURLOPT_TLSAUTH_USERNAME\fP and \fICURLOPT_TLSAUTH_PASSWORD\fP options. - -You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this -to work. (Added in 7.21.4) -.RE +HTTP server authentication methods. See \fICURLOPT_HTTPAUTH(3)\fP .IP CURLOPT_TLSAUTH_USERNAME -Pass a char * as parameter, which should point to the zero terminated username -to use for the TLS authentication method specified with the -\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the -\fICURLOPT_TLS_PASSWORD\fP option also be set. (Added in 7.21.4) +TLS authentication user name. See \fICURLOPT_TLSAUTH_USERNAME(3)\fP .IP CURLOPT_TLSAUTH_PASSWORD -Pass a char * as parameter, which should point to the zero terminated password -to use for the TLS authentication method specified with the -\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the -\fICURLOPT_TLS_USERNAME\fP option also be set. (Added in 7.21.4) +TLS authentication password. See \fICURLOPT_TLSAUTH_PASSWORD(3)\fP .IP CURLOPT_PROXYAUTH -Pass a long as parameter, which is set to a bitmask, to tell libcurl which -authentication method(s) you want it to use for your proxy authentication. If -more than one bit is set, libcurl will first query the site to see what -authentication methods it supports and then pick the best one you allow it to -use. For some methods, this will induce an extra network round-trip. Set the -actual name and password with the \fICURLOPT_PROXYUSERPWD\fP option. The -bitmask can be constructed by or'ing together the bits listed above for the -\fICURLOPT_HTTPAUTH\fP option. As of this writing, only Basic, Digest and NTLM -work. (Added in 7.10.7) +HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP .IP CURLOPT_SASL_IR -Pass a long. If the value is 1, curl will send the initial response to the -server in the first authentication packet in order to reduce the number of -ping pong requests. Only applicable to supporting SASL authentication -mechanisms and to the IMAP, POP3 and SMTP protocols. (Added in 7.31.0) - -Note: Whilst IMAP supports this option there is no need to explicitly set it, -as libcurl can determine the feature itself when the server supports the -SASL-IR CAPABILITY. +Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP +.IP CURLOPT_XOAUTH2_BEARER +OAuth2 bearer token. See \fICURLOPT_XOAUTH2_BEARER(3)\fP .SH HTTP OPTIONS .IP CURLOPT_AUTOREFERER -Pass a parameter set to 1 to enable this. When enabled, libcurl will -automatically set the Referer: field in requests where it follows a Location: -redirect. +Automatically set Referer: header. See \fICURLOPT_AUTOREFERER(3)\fP .IP CURLOPT_ACCEPT_ENCODING -Sets the contents of the Accept-Encoding: header sent in a HTTP request, and -enables decoding of a response when a Content-Encoding: header is received. -Three encodings are supported: \fIidentity\fP, which does nothing, -\fIdeflate\fP which requests the server to compress its response using the -zlib algorithm, and \fIgzip\fP which requests the gzip algorithm. If a -zero-length string is set, then an Accept-Encoding: header containing all -supported encodings is sent. - -This is a request, not an order; the server may or may not do it. This option -must be set (to any non-NULL value) or else any unsolicited encoding done by -the server is ignored. See the special file lib/README.encoding for details. - -(This option was called CURLOPT_ENCODING before 7.21.6) +Accept-Encoding and automatic decompressing data. See \fICURLOPT_ACCEPT_ENCODING(3)\fP .IP CURLOPT_TRANSFER_ENCODING -Adds a request for compressed Transfer Encoding in the outgoing HTTP -request. If the server supports this and so desires, it can respond with the -HTTP response sent using a compressed Transfer-Encoding that will be -automatically uncompressed by libcurl on reception. - -Transfer-Encoding differs slightly from the Content-Encoding you ask for with -\fBCURLOPT_ACCEPT_ENCODING\fP in that a Transfer-Encoding is strictly meant to -be for the transfer and thus MUST be decoded before the data arrives in the -client. Traditionally, Transfer-Encoding has been much less used and supported -by both HTTP clients and HTTP servers. - -(Added in 7.21.6) +Request Transfer-Encoding. See \fICURLOPT_TRANSFER_ENCODING(3)\fP .IP CURLOPT_FOLLOWLOCATION -A parameter set to 1 tells the library to follow any Location: header that the -server sends as part of a HTTP header. - -This means that the library will re-send the same request on the new location -and follow new Location: headers all the way until no more such headers are -returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number of redirects -libcurl will follow. - -Since 7.19.4, libcurl can limit what protocols it will automatically -follow. The accepted protocols are set with \fICURLOPT_REDIR_PROTOCOLS\fP and -it excludes the FILE protocol by default. +Follow HTTP redirects. See \fICURLOPT_FOLLOWLOCATION(3)\fP .IP CURLOPT_UNRESTRICTED_AUTH -A parameter set to 1 tells the library it can continue to send authentication -(user+password) when following locations, even when hostname changed. This -option is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP. +Do not restrict authentication to original host. \fICURLOPT_UNRESTRICTED_AUTH(3)\fP .IP CURLOPT_MAXREDIRS -Pass a long. The set number will be the redirection limit. If that many -redirections have been followed, the next redirect will cause an error -(\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the -\fICURLOPT_FOLLOWLOCATION\fP is used at the same time. Added in 7.15.1: -Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for -an infinite number of redirects (which is the default) +Maximum number of redirects to follow. See \fICURLOPT_MAXREDIRS(3)\fP .IP CURLOPT_POSTREDIR -Pass a bitmask to control how libcurl acts on redirects after POSTs that get a -301, 302 or 303 response back. A parameter with bit 0 set (value -\fBCURL_REDIR_POST_301\fP) tells the library to respect RFC2616/10.3.2 and not -convert POST requests into GET requests when following a 301 redirection. -Setting bit 1 (value \fBCURL_REDIR_POST_302\fP) makes libcurl maintain the -request method after a 302 redirect whilst setting bit 2 (value -\fBCURL_REDIR_POST_303\fP) makes libcurl maintain the request method after a -303 redirect. The value \fBCURL_REDIR_POST_ALL\fP is a convenience define that -sets all three bits. - -The non-RFC behaviour is ubiquitous in web browsers, so the library does the -conversion by default to maintain consistency. However, a server may require a -POST to remain a POST after such a redirection. This option is meaningful only -when setting \fICURLOPT_FOLLOWLOCATION\fP. (Added in 7.17.1) (This option was -known as CURLOPT_POST301 up to 7.19.0 as it only supported the 301 then) +How to act on redirects after POST. See \fICURLOPT_POSTREDIR(3)\fP .IP CURLOPT_PUT -A parameter set to 1 tells the library to use HTTP PUT to transfer data. The -data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP. - -This option is deprecated and starting with version 7.12.1 you should instead -use \fICURLOPT_UPLOAD\fP. +Issue a HTTP PUT request. See \fICURLOPT_PUT(3)\fP .IP CURLOPT_POST -A parameter set to 1 tells the library to do a regular HTTP post. This will -also make the library use a "Content-Type: -application/x-www-form-urlencoded" header. (This is by far the most commonly -used POST method). - -Use one of \fICURLOPT_POSTFIELDS\fP or \fICURLOPT_COPYPOSTFIELDS\fP options to -specify what data to post and \fICURLOPT_POSTFIELDSIZE\fP or -\fICURLOPT_POSTFIELDSIZE_LARGE\fP to set the data size. - -Optionally, you can provide data to POST using the \fICURLOPT_READFUNCTION\fP -and \fICURLOPT_READDATA\fP options but then you must make sure to not set -\fICURLOPT_POSTFIELDS\fP to anything but NULL. When providing data with a -callback, you must transmit it using chunked transfer-encoding or you must set -the size of the data with the \fICURLOPT_POSTFIELDSIZE\fP or -\fICURLOPT_POSTFIELDSIZE_LARGE\fP option. To enable chunked encoding, you -simply pass in the appropriate Transfer-Encoding header, see the -post-callback.c example. - -You can override the default POST Content-Type: header by setting your own -with \fICURLOPT_HTTPHEADER\fP. - -Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. -You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. - -If you use POST to a HTTP 1.1 server, you can send data without knowing the -size before starting the POST if you use chunked encoding. You enable this by -adding a header like "Transfer-Encoding: chunked" with -\fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must -specify the size in the request. - -When setting \fICURLOPT_POST\fP to 1, it will automatically set -\fICURLOPT_NOBODY\fP to 0 (since 7.14.1). - -If you issue a POST request and then want to make a HEAD or GET using the same -re-used handle, you must explicitly set the new request type using -\fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar. +Issue a HTTP POST request. See \fICURLOPT_POST(3)\fP .IP CURLOPT_POSTFIELDS -Pass a void * as parameter, which should be the full data to post in a HTTP -POST operation. You must make sure that the data is formatted the way you want -the server to receive it. libcurl will not convert or encode it for you. Most -web servers will assume this data to be url-encoded. - -The pointed data are NOT copied by the library: as a consequence, they must -be preserved by the calling application until the transfer finishes. - -This POST is a normal application/x-www-form-urlencoded kind (and libcurl will -set that Content-Type by default when this option is used), which is the most -commonly used one by HTML forms. See also the \fICURLOPT_POST\fP. Using -\fICURLOPT_POSTFIELDS\fP implies \fICURLOPT_POST\fP. - -If you want to do a zero-byte POST, you need to set -\fICURLOPT_POSTFIELDSIZE\fP explicitly to zero, as simply setting -\fICURLOPT_POSTFIELDS\fP to NULL or "" just effectively disables the sending -of the specified string. libcurl will instead assume that you'll send the POST -data using the read callback! - -Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. -You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. - -To make multipart/formdata posts (aka RFC2388-posts), check out the -\fICURLOPT_HTTPPOST\fP option. +Send a POST with this data. See \fICURLOPT_POSTFIELDS(3)\fP .IP CURLOPT_POSTFIELDSIZE -If you want to post data to the server without letting libcurl do a strlen() -to measure the data size, this option must be used. When this option is used -you can post fully binary data, which otherwise is likely to fail. If this -size is set to -1, the library will use strlen() to get the size. +The POST data is this big. See \fICURLOPT_POSTFIELDSIZE(3)\fP .IP CURLOPT_POSTFIELDSIZE_LARGE -Pass a curl_off_t as parameter. Use this to set the size of the -\fICURLOPT_POSTFIELDS\fP data to prevent libcurl from doing strlen() on the -data to figure out the size. This is the large file version of the -\fICURLOPT_POSTFIELDSIZE\fP option. (Added in 7.11.1) +The POST data is this big. See \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP .IP CURLOPT_COPYPOSTFIELDS -Pass a char * as parameter, which should be the full data to post in a HTTP -POST operation. It behaves as the \fICURLOPT_POSTFIELDS\fP option, but the -original data are copied by the library, allowing the application to overwrite -the original data after setting this option. - -Because data are copied, care must be taken when using this option in -conjunction with \fICURLOPT_POSTFIELDSIZE\fP or -\fICURLOPT_POSTFIELDSIZE_LARGE\fP: If the size has not been set prior to -\fICURLOPT_COPYPOSTFIELDS\fP, the data are assumed to be a NUL-terminated -string; else the stored size informs the library about the data byte count to -copy. In any case, the size must not be changed after -\fICURLOPT_COPYPOSTFIELDS\fP, unless another \fICURLOPT_POSTFIELDS\fP or -\fICURLOPT_COPYPOSTFIELDS\fP option is issued. -(Added in 7.17.1) +Send a POST with this data - and copy it. See \fICURLOPT_COPYPOSTFIELDS(3)\fP .IP CURLOPT_HTTPPOST -Tells libcurl you want a multipart/formdata HTTP POST to be made and you -instruct what data to pass on to the server. Pass a pointer to a linked list -of curl_httppost structs as parameter. The easiest way to create such a -list, is to use \fIcurl_formadd(3)\fP as documented. The data in this list -must remain intact until you close this curl handle again with -\fIcurl_easy_cleanup(3)\fP. - -Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. -You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. - -When setting \fICURLOPT_HTTPPOST\fP, it will automatically set -\fICURLOPT_NOBODY\fP to 0 (since 7.14.1). +Multipart formpost HTTP POST. See \fICURLOPT_HTTPPOST(3)\fP .IP CURLOPT_REFERER -Pass a pointer to a zero terminated string as parameter. It will be used to -set the Referer: header in the http request sent to the remote server. This -can be used to fool servers or scripts. You can also set any custom header -with \fICURLOPT_HTTPHEADER\fP. +Referer: header. See \fICURLOPT_REFERER(3)\fP .IP CURLOPT_USERAGENT -Pass a pointer to a zero terminated string as parameter. It will be used to -set the User-Agent: header in the http request sent to the remote server. This -can be used to fool servers or scripts. You can also set any custom header -with \fICURLOPT_HTTPHEADER\fP. +User-Agent: header. See \fICURLOPT_USERAGENT(3)\fP .IP CURLOPT_HTTPHEADER -Pass a pointer to a linked list of HTTP headers to pass to the server in your -HTTP request. The linked list should be a fully valid list of \fBstruct -curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to -create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire -list. If you add a header that is otherwise generated and used by libcurl -internally, your added one will be used instead. If you add a header with no -content as in 'Accept:' (no data on the right side of the colon), the -internally used header will get disabled. Thus, using this option you can add -new headers, replace internal headers and remove internal headers. To add a -header with no content (nothing to the right side of the colon), use the -form 'MyHeader;' (note the ending semicolon). - -The headers included in the linked list must not be CRLF-terminated, because -curl adds CRLF after each header item. Failure to comply with this will result -in strange bugs because the server will most likely ignore part of the headers -you specified. - -The first line in a request (containing the method, usually a GET or POST) is -not a header and cannot be replaced using this option. Only the lines -following the request-line are headers. Adding this method line in this list -of headers will only cause your request to send an invalid header. - -Pass a NULL to this to reset back to no custom headers. - -The most commonly replaced headers have "shortcuts" in the options -\fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP. +Custom HTTP headers. See \fICURLOPT_HTTPHEADER(3)\fP +.IP CURLOPT_HEADEROPT +Control custom headers. See \fICURLOPT_HEADEROPT(3)\fP +.IP CURLOPT_PROXYHEADER +Custom HTTP headers sent to proxy. See \fICURLOPT_PROXYHEADER(3)\fP .IP CURLOPT_HTTP200ALIASES -Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 -responses. Some servers respond with a custom header response line. For -example, IceCast servers respond with "ICY 200 OK". By including this string -in your list of aliases, the response will be treated as a valid HTTP header -line such as "HTTP/1.0 200 OK". (Added in 7.10.3) - -The linked list should be a fully valid list of struct curl_slist structs, and -be properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and -\fIcurl_slist_free_all(3)\fP to clean up an entire list. - -The alias itself is not parsed for any version strings. Before libcurl 7.16.3, -Libcurl used the value set by option \fICURLOPT_HTTP_VERSION\fP, but starting -with 7.16.3 the protocol is assumed to match HTTP 1.0 when an alias matched. +Alternative versions of 200 OK. See \fICURLOPT_HTTP200ALIASES(3)\fP .IP CURLOPT_COOKIE -Pass a pointer to a zero terminated string as parameter. It will be used to -set a cookie in the http request. The format of the string should be -NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie -should contain. - -If you need to set multiple cookies, you need to set them all using a single -option and thus you need to concatenate them all in one single string. Set -multiple cookies in one string like this: "name1=content1; name2=content2;" -etc. - -This option sets the cookie header explicitly in the outgoing request(s). If -multiple requests are done due to authentication, followed redirections or -similar, they will all get this cookie passed on. - -Using this option multiple times will only make the latest string override the -previous ones. +Cookie(s) to send. See \fICURLOPT_COOKIE(3)\fP .IP CURLOPT_COOKIEFILE -Pass a pointer to a zero terminated string as parameter. It should contain the -name of your file holding cookie data to read. The cookie data may be in -Netscape / Mozilla cookie data format or just regular HTTP-style headers -dumped to a file. - -Given an empty or non-existing file or by passing the empty string (""), this -option will enable cookies for this curl handle, making it understand and -parse received cookies and then use matching cookies in future requests. - -If you use this option multiple times, you just add more files to read. -Subsequent files will add more cookies. +File to read cookies from. See \fICURLOPT_COOKIEFILE(3)\fP .IP CURLOPT_COOKIEJAR -Pass a file name as char *, zero terminated. This will make libcurl write all -internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP -is called. If no cookies are known, no file will be created. Specify "-" to -instead have the cookies written to stdout. Using this option also enables -cookies for this session, so if you for example follow a location it will make -matching cookies get sent accordingly. - -If the cookie jar file can't be created or written to (when the -\fIcurl_easy_cleanup(3)\fP is called), libcurl will not and cannot report an -error for this. Using \fICURLOPT_VERBOSE\fP or \fICURLOPT_DEBUGFUNCTION\fP -will get a warning to display, but that is the only visible feedback you get -about this possibly lethal situation. +File to write cookies to. See \fICURLOPT_COOKIEJAR(3)\fP .IP CURLOPT_COOKIESESSION -Pass a long set to 1 to mark this as a new cookie "session". It will force -libcurl to ignore all cookies it is about to load that are "session cookies" -from the previous session. By default, libcurl always stores and loads all -cookies, independent if they are session cookies or not. Session cookies are -cookies without expiry date and they are meant to be alive and existing for -this "session" only. +Start a new cookie session. See \fICURLOPT_COOKIESESSION(3)\fP .IP CURLOPT_COOKIELIST -Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla -format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL -cookie engine was not enabled it will enable its cookie engine. Passing a -magic string \&"ALL" will erase all cookies known by cURL. (Added in 7.14.1) -Passing the special string \&"SESS" will only erase all session cookies known -by cURL. (Added in 7.15.4) Passing the special string \&"FLUSH" will write -all cookies known by cURL to the file specified by \fICURLOPT_COOKIEJAR\fP. -(Added in 7.17.1) +Add or control cookies. See \fICURLOPT_COOKIELIST(3)\fP .IP CURLOPT_HTTPGET -Pass a long. If the long is 1, this forces the HTTP request to get back -to GET. Usable if a POST, HEAD, PUT, or a custom request has been used -previously using the same curl handle. - -When setting \fICURLOPT_HTTPGET\fP to 1, it will automatically set -\fICURLOPT_NOBODY\fP to 0 and \fICURLOPT_UPLOAD\fP to 0. +Do a HTTP GET request. See \fICURLOPT_HTTPGET(3)\fP .IP CURLOPT_HTTP_VERSION -Pass a long, set to one of the values described below. They force libcurl to -use the specific HTTP versions. This is not sensible to do unless you have a -good reason. -.RS -.IP CURL_HTTP_VERSION_NONE -We don't care about what version the library uses. libcurl will use whatever -it thinks fit. -.IP CURL_HTTP_VERSION_1_0 -Enforce HTTP 1.0 requests. -.IP CURL_HTTP_VERSION_1_1 -Enforce HTTP 1.1 requests. -.RE +HTTP version to use. \fICURLOPT_HTTP_VERSION(3)\fP .IP CURLOPT_IGNORE_CONTENT_LENGTH -Ignore the Content-Length header. This is useful for Apache 1.x (and similar -servers) which will report incorrect content length for files over 2 -gigabytes. If this option is used, curl will not be able to accurately report -progress, and will simply stop the download when the server ends the -connection. (added in 7.14.1) +Ignore Content-Length. See \fICURLOPT_IGNORE_CONTENT_LENGTH(3)\fP .IP CURLOPT_HTTP_CONTENT_DECODING -Pass a long to tell libcurl how to act on content decoding. If set to zero, -content decoding will be disabled. If set to 1 it is enabled. Libcurl has no -default content decoding but requires you to use \fICURLOPT_ACCEPT_ENCODING\fP -for that. (added in 7.16.2) +Disable Content decoding. See \fICURLOPT_HTTP_CONTENT_DECODING(3)\fP .IP CURLOPT_HTTP_TRANSFER_DECODING -Pass a long to tell libcurl how to act on transfer decoding. If set to zero, -transfer decoding will be disabled, if set to 1 it is enabled -(default). libcurl does chunked transfer decoding by default unless this -option is set to zero. (added in 7.16.2) +Disable Transfer decoding. See \fICURLOPT_HTTP_TRANSFER_DECODING(3)\fP +.IP CURLOPT_EXPECT_100_TIMEOUT_MS +100-continue timeout. See \fICURLOPT_EXPECT_100_TIMEOUT_MS(3)\fP .SH SMTP OPTIONS .IP CURLOPT_MAIL_FROM -Pass a pointer to a zero terminated string as parameter. This should be used -to specify the sender's email address when sending SMTP mail with libcurl. - -An originator email address should be specified with angled brackets (<>) -around it, which if not specified, will be added by libcurl from version -7.21.4 onwards. Failing to provide such brackets may cause the server to -reject the email. - -If this parameter is not specified then an empty address will be sent to the -mail server which may or may not cause the email to be rejected. - -(Added in 7.20.0) +Address of the sender. See \fICURLOPT_MAIL_FROM(3)\fP .IP CURLOPT_MAIL_RCPT -Pass a pointer to a linked list of recipients to pass to the server in your -SMTP mail request. The linked list should be a fully valid list of \fBstruct -curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to -create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list. - -Each recipient should be specified within a pair of angled brackets (<>), -however, should you not use an angled bracket as the first character libcurl -will assume you provided a single email address and enclose that address -within brackets for you. - -(Added in 7.20.0) +Address of the recipients. See \fICURLOPT_MAIL_RCPT(3)\fP .IP CURLOPT_MAIL_AUTH -Pass a pointer to a zero terminated string as parameter. This will be used -to specify the authentication address (identity) of a submitted message that -is being relayed to another server. - -This optional parameter allows co-operating agents in a trusted environment to -communicate the authentication of individual messages and should only be used -by the application program, using libcurl, if the application is itself a -mail server acting in such an environment. If the application is operating as -such and the AUTH address is not known or is invalid, then an empty string -should be used for this parameter. - -Unlike CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT, the address should not be -specified within a pair of angled brackets (<>). However, if an empty string -is used then a pair of brackets will be sent by libcurl as required by -RFC2554. - -(Added in 7.25.0) +Authentication address. See \fICURLOPT_MAIL_AUTH(3)\fP .SH TFTP OPTIONS .IP CURLOPT_TFTP_BLKSIZE -Specify block size to use for TFTP data transmission. Valid range as per -RFC2348 is 8-65464 bytes. The default of 512 bytes will be used if this option -is not specified. The specified block size will only be used pending support -by the remote server. If the server does not return an option acknowledgement -or returns an option acknowledgement with no blksize, the default of 512 bytes -will be used. (added in 7.19.4) +TFTP block size. See \fICURLOPT_TFTP_BLKSIZE(3)\fP .SH FTP OPTIONS .IP CURLOPT_FTPPORT -Pass a pointer to a zero terminated string as parameter. It will be used to -get the IP address to use for the FTP PORT instruction. The PORT instruction -tells the remote server to connect to our specified IP address. The string may -be a plain IP address, a host name, a network interface name (under Unix) or -just a '-' symbol to let the library use your system's default IP -address. Default FTP operations are passive, and thus won't use PORT. - -The address can be followed by a ':' to specify a port, optionally followed by -a '-' to specify a port range. If the port specified is 0, the operating -system will pick a free port. If a range is provided and all ports in the -range are not available, libcurl will report CURLE_FTP_PORT_FAILED for the -handle. Invalid port/range settings are ignored. IPv6 addresses followed by -a port or portrange have to be in brackets. IPv6 addresses without port/range -specifier can be in brackets. (added in 7.19.5) - -Examples with specified ports: - -.nf - eth0:0 - 192.168.1.2:32000-33000 - curl.se:32123 - [::1]:1234-4567 -.fi - -You disable PORT again and go back to using the passive version by setting -this option to NULL. +Use active FTP. See \fICURLOPT_FTPPORT(3)\fP .IP CURLOPT_QUOTE -Pass a pointer to a linked list of FTP or SFTP commands to pass to the server -prior to your FTP request. This will be done before any other commands are -issued (even before the CWD command for FTP). The linked list should be a -fully valid list of 'struct curl_slist' structs properly filled in with text -strings. Use \fIcurl_slist_append(3)\fP to append strings (commands) to the -list, and clear the entire list afterwards with -\fIcurl_slist_free_all(3)\fP. Disable this operation again by setting a NULL -to this option. When speaking to a FTP (or SFTP since 7.24.0) server, prefix -the command with an asterisk (*) to make libcurl continue even if the command -fails as by default libcurl will stop at first failure. - -The set of valid FTP commands depends on the server (see RFC959 for a list of -mandatory commands). - -The valid SFTP commands are: chgrp, chmod, chown, ln, mkdir, pwd, rename, rm, -rmdir, symlink (see -.BR curl (1)) -(SFTP support added in 7.16.3) +Commands to run before transfer. See \fICURLOPT_QUOTE(3)\fP .IP CURLOPT_POSTQUOTE -Pass a pointer to a linked list of FTP or SFTP commands to pass to the server -after your FTP transfer request. The commands will only be run if no error -occurred. The linked list should be a fully valid list of struct curl_slist -structs properly filled in as described for \fICURLOPT_QUOTE\fP. Disable this -operation again by setting a NULL to this option. +Commands to run after transfer. See \fICURLOPT_POSTQUOTE(3)\fP .IP CURLOPT_PREQUOTE -Pass a pointer to a linked list of FTP commands to pass to the server after -the transfer type is set. The linked list should be a fully valid list of -struct curl_slist structs properly filled in as described for -\fICURLOPT_QUOTE\fP. Disable this operation again by setting a NULL to this -option. Before version 7.16.0, if you also set \fICURLOPT_NOBODY\fP to 1, this -option didn't work. -.IP CURLOPT_DIRLISTONLY -A parameter set to 1 tells the library to just list the names of files in a -directory, instead of doing a full directory listing that would include file -sizes, dates etc. This works for FTP and SFTP URLs. - -This causes an FTP NLST command to be sent on an FTP server. Beware that some -FTP servers list only files in their response to NLST; they might not include -subdirectories and symbolic links. - -Setting this option to 1 also implies a directory listing even if the URL -doesn't end with a slash, which otherwise is necessary. - -Do NOT use this option if you also use \fICURLOPT_WILDCARDMATCH\fP as it will -effectively break that feature then. - -(This option was known as CURLOPT_FTPLISTONLY up to 7.16.4) +Commands to run just before transfer. See \fICURLOPT_PREQUOTE(3)\fP .IP CURLOPT_APPEND -A parameter set to 1 tells the library to append to the remote file instead of -overwrite it. This is only useful when uploading to an FTP site. - -(This option was known as CURLOPT_FTPAPPEND up to 7.16.4) +Append to remote file. See \fICURLOPT_APPEND(3)\fP .IP CURLOPT_FTP_USE_EPRT -Pass a long. If the value is 1, it tells curl to use the EPRT (and -LPRT) command when doing active FTP downloads (which is enabled by -\fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use -EPRT and then LPRT before using PORT, but if you pass zero to this -option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5) - -If the server is an IPv6 host, this option will have no effect as of 7.12.3. +Use EPTR. See \fICURLOPT_FTP_USE_EPRT(3)\fP .IP CURLOPT_FTP_USE_EPSV -Pass a long. If the value is 1, it tells curl to use the EPSV command -when doing passive FTP downloads (which it always does by default). Using EPSV -means that it will first attempt to use EPSV before using PASV, but if you -pass zero to this option, it will not try using EPSV, only plain PASV. - -If the server is an IPv6 host, this option will have no effect as of 7.12.3. +Use EPSV. See \fICURLOPT_FTP_USE_EPSV(3)\fP .IP CURLOPT_FTP_USE_PRET -Pass a long. If the value is 1, it tells curl to send a PRET command before -PASV (and EPSV). Certain FTP servers, mainly drftpd, require this non-standard -command for directory listings as well as up and downloads in PASV mode. Has -no effect when using the active FTP transfers mode. (Added in 7.20.0) +Use PRET. See \fICURLOPT_FTP_USE_PRET(3)\fP .IP CURLOPT_FTP_CREATE_MISSING_DIRS -Pass a long. If the value is 1, curl will attempt to create any remote -directory that it fails to CWD into. CWD is the command that changes working -directory. (Added in 7.10.7) - -This setting also applies to SFTP-connections. curl will attempt to create -the remote directory if it can't obtain a handle to the target-location. The -creation will fail if a file of the same name as the directory to create -already exists or lack of permissions prevents creation. (Added in 7.16.3) - -Starting with 7.19.4, you can also set this value to 2, which will make -libcurl retry the CWD command again if the subsequent MKD command fails. This -is especially useful if you're doing many simultaneous connections against the -same server and they all have this option enabled, as then CWD may first fail -but then another connection does MKD before this connection and thus MKD fails -but trying CWD works! 7.19.4 also introduced the \fICURLFTP_CREATE_DIR\fP and -\fICURLFTP_CREATE_DIR_RETRY\fP enum names for these arguments. - -Before version 7.19.4, libcurl will simply ignore arguments set to 2 and act -as if 1 was selected. +Create missing directories on the remote server. See \fICURLOPT_FTP_CREATE_MISSING_DIRS(3)\fP .IP CURLOPT_FTP_RESPONSE_TIMEOUT -Pass a long. Causes curl to set a timeout period (in seconds) on the amount -of time that the server is allowed to take in order to generate a response -message for a command before the session is considered hung. While curl is -waiting for a response, this value overrides \fICURLOPT_TIMEOUT\fP. It is -recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set -\fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than -\fICURLOPT_TIMEOUT\fP. (Added in 7.10.8) +Timeout for FTP responses. See \fICURLOPT_FTP_RESPONSE_TIMEOUT(3)\fP .IP CURLOPT_FTP_ALTERNATIVE_TO_USER -Pass a char * as parameter, pointing to a string which will be used to -authenticate if the usual FTP "USER user" and "PASS password" negotiation -fails. This is currently only known to be required when connecting to -Tumbleweed's Secure Transport FTPS server using client certificates for -authentication. (Added in 7.15.5) +Alternative to USER. See \fICURLOPT_FTP_ALTERNATIVE_TO_USER(3)\fP .IP CURLOPT_FTP_SKIP_PASV_IP -Pass a long. If set to 1, it instructs libcurl to not use the IP address the -server suggests in its 227-response to libcurl's PASV command when libcurl -connects the data connection. Instead libcurl will re-use the same IP address -it already uses for the control connection. But it will use the port number -from the 227-response. (Added in 7.14.2) - -This option has no effect if PORT, EPRT or EPSV is used instead of PASV. +Ignore the IP address in the PASV response. See \fICURLOPT_FTP_SKIP_PASV_IP(3)\fP .IP CURLOPT_FTPSSLAUTH -Pass a long using one of the values from below, to alter how libcurl issues -\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see -\fICURLOPT_USE_SSL\fP). (Added in 7.12.2) -.RS -.IP CURLFTPAUTH_DEFAULT -Allow libcurl to decide. -.IP CURLFTPAUTH_SSL -Try "AUTH SSL" first, and only if that fails try "AUTH TLS". -.IP CURLFTPAUTH_TLS -Try "AUTH TLS" first, and only if that fails try "AUTH SSL". -.RE +Control how to do TLS. See \fICURLOPT_FTPSSLAUTH(3)\fP .IP CURLOPT_FTP_SSL_CCC -If enabled, this option makes libcurl use CCC (Clear Command Channel). It -shuts down the SSL/TLS layer after authenticating. The rest of the -control channel communication will be unencrypted. This allows NAT routers -to follow the FTP transaction. Pass a long using one of the values below. -(Added in 7.16.1) -.RS -.IP CURLFTPSSL_CCC_NONE -Don't attempt to use CCC. -.IP CURLFTPSSL_CCC_PASSIVE -Do not initiate the shutdown, but wait for the server to do it. Do not send -a reply. -.IP CURLFTPSSL_CCC_ACTIVE -Initiate the shutdown and wait for a reply. -.RE +Back to non-TLS again after authentication. See \fICURLOPT_FTP_SSL_CCC(3)\fP .IP CURLOPT_FTP_ACCOUNT -Pass a pointer to a zero terminated string (or NULL to disable). When an FTP -server asks for "account data" after user name and password has been provided, -this data is sent off using the ACCT command. (Added in 7.13.0) +Send ACCT command. See \fICURLOPT_FTP_ACCOUNT(3)\fP .IP CURLOPT_FTP_FILEMETHOD -Pass a long that should have one of the following values. This option controls -what method libcurl should use to reach a file on a FTP(S) server. The -argument should be one of the following alternatives: -.RS -.IP CURLFTPMETHOD_MULTICWD -libcurl does a single CWD operation for each path part in the given URL. For -deep hierarchies this means many commands. This is how RFC1738 says it -should be done. This is the default but the slowest behavior. -.IP CURLFTPMETHOD_NOCWD -libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a -full path to the server for all these commands. This is the fastest behavior. -.IP CURLFTPMETHOD_SINGLECWD -libcurl does one CWD with the full target directory and then operates on the -file \&"normally" (like in the multicwd case). This is somewhat more standards -compliant than 'nocwd' but without the full penalty of 'multicwd'. -.RE -(Added in 7.15.1) +Specify how to reach files. See \fICURLOPT_FTP_FILEMETHOD(3)\fP .SH RTSP OPTIONS .IP CURLOPT_RTSP_REQUEST -Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP -enum values. Unless noted otherwise, commands require the Session ID to be -initialized. (Added in 7.20.0) -.RS -.IP CURL_RTSPREQ_OPTIONS -Used to retrieve the available methods of the server. The application is -responsible for parsing and obeying the response. \fB(The session ID is not -needed for this method.)\fP (Added in 7.20.0) -.IP CURL_RTSPREQ_DESCRIBE -Used to get the low level description of a stream. The application should note -what formats it understands in the \fI'Accept:'\fP header. Unless set -manually, libcurl will automatically fill in \fI'Accept: -application/sdp'\fP. Time-condition headers will be added to Describe requests -if the \fICURLOPT_TIMECONDITION\fP option is active. \fB(The session ID is not -needed for this method)\fP (Added in 7.20.0) -.IP CURL_RTSPREQ_ANNOUNCE -When sent by a client, this method changes the description of the session. For -example, if a client is using the server to record a meeting, the client can -use Announce to inform the server of all the meta-information about the -session. ANNOUNCE acts like a HTTP PUT or POST just like -\fICURL_RTSPREQ_SET_PARAMETER\fP (Added in 7.20.0) -.IP CURL_RTSPREQ_SETUP -Setup is used to initialize the transport layer for the session. The -application must set the desired Transport options for a session by using the -\fICURLOPT_RTSP_TRANSPORT\fP option prior to calling setup. If no session ID -is currently set with \fICURLOPT_RTSP_SESSION_ID\fP, libcurl will extract and -use the session ID in the response to this request. \fB(The session ID is not -needed for this method).\fP (Added in 7.20.0) -.IP CURL_RTSPREQ_PLAY -Send a Play command to the server. Use the \fICURLOPT_RANGE\fP option to -modify the playback time (e.g. 'npt=10-15'). (Added in 7.20.0) -.IP CURL_RTSPREQ_PAUSE -Send a Pause command to the server. Use the \fICURLOPT_RANGE\fP option with a -single value to indicate when the stream should be halted. (e.g. npt='25') -(Added in 7.20.0) -.IP CURL_RTSPREQ_TEARDOWN -This command terminates an RTSP session. Simply closing a connection does not -terminate the RTSP session since it is valid to control an RTSP session over -different connections. (Added in 7.20.0) -.IP CURL_RTSPREQ_GET_PARAMETER -Retrieve a parameter from the server. By default, libcurl will automatically -include a \fIContent-Type: text/parameters\fP header on all non-empty requests -unless a custom one is set. GET_PARAMETER acts just like a HTTP PUT or POST -(see \fICURL_RTSPREQ_SET_PARAMETER\fP). -Applications wishing to send a heartbeat message (e.g. in the presence of a -server-specified timeout) should send use an empty GET_PARAMETER request. -(Added in 7.20.0) -.IP CURL_RTSPREQ_SET_PARAMETER -Set a parameter on the server. By default, libcurl will automatically include -a \fIContent-Type: text/parameters\fP header unless a custom one is set. The -interaction with SET_PARAMTER is much like a HTTP PUT or POST. An application -may either use \fICURLOPT_UPLOAD\fP with \fICURLOPT_READDATA\fP like a HTTP -PUT, or it may use \fICURLOPT_POSTFIELDS\fP like a HTTP POST. No chunked -transfers are allowed, so the application must set the -\fICURLOPT_INFILESIZE\fP in the former and \fICURLOPT_POSTFIELDSIZE\fP in the -latter. Also, there is no use of multi-part POSTs within RTSP. (Added in -7.20.0) -.IP CURL_RTSPREQ_RECORD -Used to tell the server to record a session. Use the \fICURLOPT_RANGE\fP -option to modify the record time. (Added in 7.20.0) -.IP CURL_RTSPREQ_RECEIVE -This is a special request because it does not send any data to the server. The -application may call this function in order to receive interleaved RTP -data. It will return after processing one read buffer of data in order to give -the application a chance to run. (Added in 7.20.0) -.RE +RTSP request. See \fICURLOPT_RTSP_REQUEST(3)\fP .IP CURLOPT_RTSP_SESSION_ID -Pass a char * as a parameter to set the value of the current RTSP Session ID -for the handle. Useful for resuming an in-progress session. Once this value is -set to any non-NULL value, libcurl will return \fICURLE_RTSP_SESSION_ERROR\fP -if ID received from the server does not match. If unset (or set to NULL), -libcurl will automatically set the ID the first time the server sets it in a -response. (Added in 7.20.0) +RTSP session-id. See \fICURLOPT_RTSP_SESSION_ID(3)\fP .IP CURLOPT_RTSP_STREAM_URI -Set the stream URI to operate on by passing a char * . For example, a single -session may be controlling \fIrtsp://foo/twister/audio\fP and -\fIrtsp://foo/twister/video\fP and the application can switch to the -appropriate stream using this option. If unset, libcurl will default to -operating on generic server options by passing '*' in the place of the RTSP -Stream URI. This option is distinct from \fICURLOPT_URL\fP. When working with -RTSP, the \fICURLOPT_STREAM_URI\fP indicates what URL to send to the server in -the request header while the \fICURLOPT_URL\fP indicates where to make the -connection to. (e.g. the \fICURLOPT_URL\fP for the above examples might be -set to \fIrtsp://foo/twister\fP (Added in 7.20.0) +RTSP stream URI. See \fICURLOPT_RTSP_STREAM_URI(3)\fP .IP CURLOPT_RTSP_TRANSPORT -Pass a char * to tell libcurl what to pass for the Transport: header for this -RTSP session. This is mainly a convenience method to avoid needing to set a -custom Transport: header for every SETUP request. The application must set a -Transport: header before issuing a SETUP request. (Added in 7.20.0) -.IP CURLOPT_RTSP_HEADER -This option is simply an alias for \fICURLOPT_HTTP_HEADER\fP. Use this to -replace the standard headers that RTSP and HTTP share. It is also valid to use -the shortcuts such as \fICURLOPT_USERAGENT\fP. (Added in 7.20.0) +RTSP Transport: header. See \fICURLOPT_RTSP_TRANSPORT(3)\fP .IP CURLOPT_RTSP_CLIENT_CSEQ -Manually set the the CSEQ number to issue for the next RTSP request. Useful if -the application is resuming a previously broken connection. The CSEQ will -increment from this new number henceforth. (Added in 7.20.0) +Client CSEQ number. See \fICURLOPT_RTSP_CLIENT_CSEQ(3)\fP .IP CURLOPT_RTSP_SERVER_CSEQ -Manually set the CSEQ number to expect for the next RTSP Server->Client -request. At the moment, this feature (listening for Server requests) is -unimplemented. (Added in 7.20.0) +CSEQ number for RTSP Server->Client request. See \fICURLOPT_RTSP_SERVER_CSEQ(3)\fP .SH PROTOCOL OPTIONS .IP CURLOPT_TRANSFERTEXT -A parameter set to 1 tells the library to use ASCII mode for FTP transfers, -instead of the default binary transfer. For win32 systems it does not set the -stdout to binary mode. This option can be usable when transferring text data -between systems with different views on certain characters, such as newlines -or similar. - -libcurl does not do a complete ASCII conversion when doing ASCII transfers -over FTP. This is a known limitation/flaw that nobody has rectified. libcurl -simply sets the mode to ASCII and performs a standard transfer. +Use text transfer. See \fICURLOPT_TRANSFERTEXT(3)\fP .IP CURLOPT_PROXY_TRANSFER_MODE -Pass a long. If the value is set to 1 (one), it tells libcurl to set the -transfer mode (binary or ASCII) for FTP transfers done via a HTTP proxy, by -appending ;type=a or ;type=i to the URL. Without this setting, or it being set -to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT\fP has no effect when doing -FTP via a proxy. Beware that not all proxies support this feature. (Added in -7.18.0) +Add transfer mode to URL over proxy. See \fICURLOPT_PROXY_TRANSFER_MODE(3)\fP .IP CURLOPT_CRLF -Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to -CRLF newlines on transfers. Disable this option again by setting the value to -0 (zero). +Convert newlines. See \fICURLOPT_CRLF(3)\fP .IP CURLOPT_RANGE -Pass a char * as parameter, which should contain the specified range you -want. It should be in the format "X-Y", where X or Y may be left out. HTTP -transfers also support several intervals, separated with commas as in -\fI"X-Y,N-M"\fP. Using this kind of multiple intervals will cause the HTTP -server to send the response document in pieces (using standard MIME separation -techniques). For RTSP, the formatting of a range should follow RFC2326 -Section 12.29. For RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges -should be given in npt, utc, or smpte formats. - -Pass a NULL to this option to disable the use of ranges. - -Ranges work on HTTP, FTP, FILE (since 7.18.0), and RTSP (since 7.20.0) -transfers only. +Range requests. See \fICURLOPT_RANGE(3)\fP .IP CURLOPT_RESUME_FROM -Pass a long as parameter. It contains the offset in number of bytes that you -want the transfer to start from. Set this option to 0 to make the transfer -start from the beginning (effectively disabling resume). For FTP, set this -option to -1 to make the transfer start from the end of the target file -(useful to continue an interrupted upload). - -When doing uploads with FTP, the resume position is where in the local/source -file libcurl should try to resume the upload from and it will then append the -source file to the remote target file. +Resume a transfer. See \fICURLOPT_RESUME_FROM(3)\fP .IP CURLOPT_RESUME_FROM_LARGE -Pass a curl_off_t as parameter. It contains the offset in number of bytes that -you want the transfer to start from. (Added in 7.11.0) +Resume a transfer. See \fICURLOPT_RESUME_FROM_LARGE(3)\fP .IP CURLOPT_CUSTOMREQUEST -Pass a pointer to a zero terminated string as parameter. It can be used to -specify the request instead of GET or HEAD when performing HTTP based -requests, instead of LIST and NLST when performing FTP directory listings and -instead of LIST and RETR when issuing POP3 based commands. This is -particularly useful, for example, for performing a HTTP DELETE request or a -POP3 DELE command. - -Please don't perform this at will, on HTTP based requests, by making sure -your server supports the command you are sending first. - -When you change the request method by setting \fBCURLOPT_CUSTOMREQUEST\fP to -something, you don't actually change how libcurl behaves or acts in regards -to the particular request method, it will only change the actual string sent -in the request. - -For example: - -With the HTTP protocol when you tell libcurl to do a HEAD request, but then -specify a GET though a custom request libcurl will still act as if it sent a -HEAD. To switch to a proper HEAD use \fICURLOPT_NOBODY\fP, to switch to a -proper POST use \fICURLOPT_POST\fP or \fICURLOPT_POSTFIELDS\fP and to switch -to a proper GET use CURLOPT_HTTPGET. - -With the POP3 protocol when you tell libcurl to use a custom request it will -behave like a LIST or RETR command was sent where it expects data to be -returned by the server. As such \fICURLOPT_NOBODY\fP should be used when -specifying commands such as DELE and NOOP for example. - -Restore to the internal default by setting this to NULL. - -Many people have wrongly used this option to replace the entire request with -their own, including multiple headers and POST contents. While that might -work in many cases, it will cause libcurl to send invalid requests and it -could possibly confuse the remote server badly. Use \fICURLOPT_POST\fP and -\fICURLOPT_POSTFIELDS\fP to set POST data. Use \fICURLOPT_HTTPHEADER\fP to -replace or extend the set of headers sent by libcurl. Use -\fICURLOPT_HTTP_VERSION\fP to change HTTP version. - -(Support for POP3 added in 7.26.0) +Custom request/method. See \fICURLOPT_CUSTOMREQUEST(3)\fP .IP CURLOPT_FILETIME -Pass a long. If it is 1, libcurl will attempt to get the modification date of -the remote document in this operation. This requires that the remote server -sends the time or replies to a time querying command. The -\fIcurl_easy_getinfo(3)\fP function with the \fICURLINFO_FILETIME\fP argument -can be used after a transfer to extract the received time (if any). +Request file modification date and time. See \fICURLOPT_FILETIME(3)\fP +.IP CURLOPT_DIRLISTONLY +List only. See \fICURLOPT_DIRLISTONLY(3)\fP .IP CURLOPT_NOBODY -A parameter set to 1 tells the library to not include the body-part in the -output. This is only relevant for protocols that have separate header and -body parts. On HTTP(S) servers, this will make libcurl do a HEAD request. - -To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change -request to POST with \fICURLOPT_POST\fP etc. +Do not get the body contents. See \fICURLOPT_NOBODY(3)\fP .IP CURLOPT_INFILESIZE -When uploading a file to a remote site, this option should be used to tell -libcurl what the expected size of the infile is. This value should be passed -as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP. - -For uploading using SCP, this option or \fICURLOPT_INFILESIZE_LARGE\fP is -mandatory. - -When sending emails using SMTP, this command can be used to specify the -optional SIZE parameter for the MAIL FROM command. (Added in 7.23.0) - -This option does not limit how much data libcurl will actually send, as that -is controlled entirely by what the read callback returns. +Size of file to send. \fICURLOPT_INFILESIZE(3)\fP .IP CURLOPT_INFILESIZE_LARGE -When uploading a file to a remote site, this option should be used to tell -libcurl what the expected size of the infile is. This value should be passed -as a curl_off_t. (Added in 7.11.0) - -For uploading using SCP, this option or \fICURLOPT_INFILESIZE\fP is mandatory. - -This option does not limit how much data libcurl will actually send, as that -is controlled entirely by what the read callback returns. +Size of file to send. \fICURLOPT_INFILESIZE_LARGE(3)\fP .IP CURLOPT_UPLOAD -A parameter set to 1 tells the library to prepare for an upload. The -\fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or -\fICURLOPT_INFILESIZE_LARGE\fP options are also interesting for uploads. If -the protocol is HTTP, uploading means using the PUT request unless you tell -libcurl otherwise. - -Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. -You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. - -If you use PUT to a HTTP 1.1 server, you can upload data without knowing the -size before starting the transfer if you use chunked encoding. You enable this -by adding a header like "Transfer-Encoding: chunked" with -\fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must -specify the size. +Upload data. See \fICURLOPT_UPLOAD(3)\fP .IP CURLOPT_MAXFILESIZE -Pass a long as parameter. This allows you to specify the maximum size (in -bytes) of a file to download. If the file requested is larger than this value, -the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. - -The file size is not always known prior to download, and for such files this -option has no effect even if the file transfer ends up being larger than this -given limit. This concerns both FTP and HTTP transfers. +Maximum file size to get. See \fICURLOPT_MAXFILESIZE(3)\fP .IP CURLOPT_MAXFILESIZE_LARGE -Pass a curl_off_t as parameter. This allows you to specify the maximum size -(in bytes) of a file to download. If the file requested is larger than this -value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will be -returned. (Added in 7.11.0) - -The file size is not always known prior to download, and for such files this -option has no effect even if the file transfer ends up being larger than this -given limit. This concerns both FTP and HTTP transfers. +Maximum file size to get. See \fICURLOPT_MAXFILESIZE_LARGE(3)\fP .IP CURLOPT_TIMECONDITION -Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time -value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP -or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP, FTP, RTSP, -and FILE. - -The last modification time of a file is not always known and in such instances -this feature will have no effect even if the given time condition would not -have been met. \fIcurl_easy_getinfo(3)\fP with the -\fICURLINFO_CONDITION_UNMET\fP option can be used after a transfer to learn if -a zero-byte successful "transfer" was due to this condition not matching. +Make a time conditional request. See \fICURLOPT_TIMECONDITION(3)\fP .IP CURLOPT_TIMEVALUE -Pass a long as parameter. This should be the time in seconds since 1 Jan 1970, -and the time will be used in a condition as specified with -\fICURLOPT_TIMECONDITION\fP. +Time value for the time conditional request. See \fICURLOPT_TIMEVALUE(3)\fP .SH CONNECTION OPTIONS .IP CURLOPT_TIMEOUT -Pass a long as parameter containing the maximum time in seconds that you allow -the libcurl transfer operation to take. Normally, name lookups can take a -considerable time and limiting operations to less than a few minutes risk -aborting perfectly normal operations. This option will cause curl to use the -SIGALRM to enable time-outing system calls. - -In unix-like systems, this might cause signals to be used unless -\fICURLOPT_NOSIGNAL\fP is set. - -Default timeout is 0 (zero) which means it never times out. +Timeout for the entire request. See \fICURLOPT_TIMEOUT(3)\fP .IP CURLOPT_TIMEOUT_MS -Like \fICURLOPT_TIMEOUT\fP but takes number of milliseconds instead. If -libcurl is built to use the standard system name resolver, that portion -of the transfer will still use full-second resolution for timeouts with -a minimum timeout allowed of one second. -(Added in 7.16.2) +Millisecond timeout for the entire request. See \fICURLOPT_TIMEOUT_MS(3)\fP .IP CURLOPT_LOW_SPEED_LIMIT -Pass a long as parameter. It contains the transfer speed in bytes per second -that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds -for the library to consider it too slow and abort. +Low speed limit to abort transfer. See \fICURLOPT_LOW_SPEED_LIMIT(3)\fP .IP CURLOPT_LOW_SPEED_TIME -Pass a long as parameter. It contains the time in seconds that the transfer -should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider -it too slow and abort. +Time to be below the speed to trigger low speed abort. See \fICURLOPT_LOW_SPEED_TIME(3)\fP .IP CURLOPT_MAX_SEND_SPEED_LARGE -Pass a curl_off_t as parameter. If an upload exceeds this speed (counted in -bytes per second) on cumulative average during the transfer, the transfer will -pause to keep the average rate less than or equal to the parameter value. -Defaults to unlimited speed. (Added in 7.15.5) +Cap the upload speed to this. See \fICURLOPT_MAX_SEND_SPEED_LARGE(3)\fP .IP CURLOPT_MAX_RECV_SPEED_LARGE -Pass a curl_off_t as parameter. If a download exceeds this speed (counted in -bytes per second) on cumulative average during the transfer, the transfer will -pause to keep the average rate less than or equal to the parameter -value. Defaults to unlimited speed. (Added in 7.15.5) +Cap the download speed to this. See \fICURLOPT_MAX_RECV_SPEED_LARGE(3)\fP .IP CURLOPT_MAXCONNECTS -Pass a long. The set number will be the persistent connection cache size. The -set amount will be the maximum amount of simultaneously open connections that -libcurl may cache in this easy handle. Default is 5, and there isn't much -point in changing this value unless you are perfectly aware of how this works -and changes libcurl's behaviour. This concerns connections using any of the -protocols that support persistent connections. - -When reaching the maximum limit, curl closes the oldest one in the cache to -prevent increasing the number of open connections. - -If you already have performed transfers with this curl handle, setting a -smaller MAXCONNECTS than before may cause open connections to get closed -unnecessarily. - -If you add this easy handle to a multi handle, this setting is not -acknowledged, and you must instead use \fIcurl_multi_setopt(3)\fP and the -\fICURLMOPT_MAXCONNECTS\fP option. -.IP CURLOPT_CLOSEPOLICY -(Obsolete) This option does nothing. +Maximum number of connections in the connection pool. See \fICURLOPT_MAXCONNECTS(3)\fP .IP CURLOPT_FRESH_CONNECT -Pass a long. Set to 1 to make the next transfer use a new (fresh) connection -by force. If the connection cache is full before this connection, one of the -existing connections will be closed as according to the selected or default -policy. This option should be used with caution and only if you understand -what it does. Set this to 0 to have libcurl attempt re-using an existing -connection (default behavior). +Use a new connection. \fICURLOPT_FRESH_CONNECT(3)\fP .IP CURLOPT_FORBID_REUSE -Pass a long. Set to 1 to make the next transfer explicitly close the -connection when done. Normally, libcurl keeps all connections alive when done -with one transfer in case a succeeding one follows that can re-use them. -This option should be used with caution and only if you understand what it -does. Set to 0 to have libcurl keep the connection open for possible later -re-use (default behavior). +Prevent subsequent connections from re-using this. See \fICURLOPT_FORBID_REUSE(3)\fP .IP CURLOPT_CONNECTTIMEOUT -Pass a long. It should contain the maximum time in seconds that you allow the -connection to the server to take. This only limits the connection phase, once -it has connected, this option is of no more use. Set to zero to switch to the -default built-in connection timeout - 300 seconds. See also the -\fICURLOPT_TIMEOUT\fP option. - -In unix-like systems, this might cause signals to be used unless -\fICURLOPT_NOSIGNAL\fP is set. +Timeout for the connection phase. See \fICURLOPT_CONNECTTIMEOUT(3)\fP .IP CURLOPT_CONNECTTIMEOUT_MS -Like \fICURLOPT_CONNECTTIMEOUT\fP but takes the number of milliseconds -instead. If libcurl is built to use the standard system name resolver, -that portion of the connect will still use full-second resolution for -timeouts with a minimum timeout allowed of one second. -(Added in 7.16.2) +Millisecond timeout for the connection phase. See \fICURLOPT_CONNECTTIMEOUT_MS(3)\fP .IP CURLOPT_IPRESOLVE -Allows an application to select what kind of IP addresses to use when -resolving host names. This is only interesting when using host names that -resolve addresses using more than one version of IP. The allowed values are: -.RS -.IP CURL_IPRESOLVE_WHATEVER -Default, resolves addresses to all IP versions that your system allows. -.IP CURL_IPRESOLVE_V4 -Resolve to IPv4 addresses. -.IP CURL_IPRESOLVE_V6 -Resolve to IPv6 addresses. -.RE +IP version to resolve to. See \fICURLOPT_IPRESOLVE(3)\fP .IP CURLOPT_CONNECT_ONLY -Pass a long. If the parameter equals 1, it tells the library to perform all -the required proxy authentication and connection setup, but no data transfer. -This option is implemented for HTTP, SMTP and POP3. - -The option can be used to simply test a connection to a server, but is more -useful when used with the \fICURLINFO_LASTSOCKET\fP option to -\fIcurl_easy_getinfo(3)\fP as the library can set up the connection and then -the application can obtain the most recently used socket for special data -transfers. (Added in 7.15.2) +Only connect, nothing else. See \fICURLOPT_CONNECT_ONLY(3)\fP .IP CURLOPT_USE_SSL -Pass a long using one of the values from below, to make libcurl use your -desired level of SSL for the transfer. (Added in 7.11.0) - -This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc. - -(This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants -were known as CURLFTPSSL_*) -.RS -.IP CURLUSESSL_NONE -Don't attempt to use SSL. -.IP CURLUSESSL_TRY -Try using SSL, proceed as normal otherwise. -.IP CURLUSESSL_CONTROL -Require SSL for the control connection or fail with \fICURLE_USE_SSL_FAILED\fP. -.IP CURLUSESSL_ALL -Require SSL for all communication or fail with \fICURLE_USE_SSL_FAILED\fP. -.RE +Use TLS/SSL. See \fICURLOPT_USE_SSL(3)\fP .IP CURLOPT_RESOLVE -Pass a pointer to a linked list of strings with host name resolve information -to use for requests with this handle. The linked list should be a fully valid -list of \fBstruct curl_slist\fP structs properly filled in. Use -\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP -to clean up an entire list. - -Each single name resolve string should be written using the format -HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve, PORT is -the port number of the service where libcurl wants to connect to the HOST and -ADDRESS is the numerical IP address. If libcurl is built to support IPv6, -ADDRESS can of course be either IPv4 or IPv6 style addressing. - -This option effectively pre-populates the DNS cache with entries for the -host+port pair so redirects and everything that operations against the -HOST+PORT will instead use your provided ADDRESS. - -You can remove names from the DNS cache again, to stop providing these fake -resolves, by including a string in the linked list that uses the format -\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name -and port number must exactly match what was already added previously. - -(Added in 7.21.3) -.IP CURLOPT_DNS_SERVERS -Set the list of DNS servers to be used instead of the system default. -The format of the dns servers option is: - -host[:port][,host[:port]]... - -For example: - -192.168.1.100,192.168.1.101,3.4.5.6 - -This option requires that libcurl was built with a resolver backend that -supports this operation. The c-ares backend is the only such one. - -(Added in 7.24.0) +Provide fixed/fake name resolves. See \fICURLOPT_RESOLVE(3)\fP +.IP CURLOPT_DNS_INTERFACE +Bind name resolves to this interface. See \fICURLOPT_DNS_INTERFACE(3)\fP +.IP CURLOPT_DNS_LOCAL_IP4 +Bind name resolves to this IP4 address. See \fICURLOPT_DNS_LOCAL_IP4(3)\fP +.IP CURLOPT_DNS_LOCAL_IP6 +Bind name resolves to this IP6 address. See \fICURLOPT_DNS_LOCAL_IP6(3)\fP .IP CURLOPT_ACCEPTTIMEOUT_MS -Pass a long telling libcurl the maximum number of milliseconds to wait for a -server to connect back to libcurl when an active FTP connection is used. If no -timeout is set, the internal default of 60000 will be used. (Added in 7.24.0) +Timeout for waiting for the server's connect back to be accepted. See \fICURLOPT_ACCEPTTIMEOUT_MS(3)\fP .SH SSL and SECURITY OPTIONS .IP CURLOPT_SSLCERT -Pass a pointer to a zero terminated string as parameter. The string should be -the file name of your certificate. The default format is "PEM" and can be -changed with \fICURLOPT_SSLCERTTYPE\fP. - -With NSS this can also be the nickname of the certificate you wish to -authenticate with. If you want to use a file from the current directory, please -precede it with "./" prefix, in order to avoid confusion with a nickname. - -(iOS and Mac OS X only) With Secure Transport, this string must match the name -of a certificate that's in the system or user keychain. You should encode this -string in UTF-8 format in case it contains non-ASCII characters. The private -key corresponding to the certificate, and certificate chain (if any), must -also be present in the keychain. (Added in 7.31.0) +Client cert. See \fICURLOPT_SSLCERT(3)\fP .IP CURLOPT_SSLCERTTYPE -Pass a pointer to a zero terminated string as parameter. The string should be -the format of your certificate. Supported formats are "PEM" and "DER". (Added -in 7.9.3) +Client cert type. See \fICURLOPT_SSLCERTTYPE(3)\fP .IP CURLOPT_SSLKEY -Pass a pointer to a zero terminated string as parameter. The string should be -the file name of your private key. The default format is "PEM" and can be -changed with \fICURLOPT_SSLKEYTYPE\fP. - -(iOS and Mac OS X only) This option is ignored if curl was built against Secure -Transport. Secure Transport expects the private key to be already present in -the keychain containing the certificate. +Client key. See \fICURLOPT_SSLKEY(3)\fP .IP CURLOPT_SSLKEYTYPE -Pass a pointer to a zero terminated string as parameter. The string should be -the format of your private key. Supported formats are "PEM", "DER" and "ENG". - -The format "ENG" enables you to load the private key from a crypto engine. In -this case \fICURLOPT_SSLKEY\fP is used as an identifier passed to the -engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP. -\&"DER" format key file currently does not work because of a bug in OpenSSL. +Client key type. See \fICURLOPT_SSLKEYTYPE(3)\fP .IP CURLOPT_KEYPASSWD -Pass a pointer to a zero terminated string as parameter. It will be used as -the password required to use the \fICURLOPT_SSLKEY\fP or -\fICURLOPT_SSH_PRIVATE_KEYFILE\fP private key. -You never needed a pass phrase to load a certificate but you need one to -load your private key. - -(This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and -CURLOPT_SSLCERTPASSWD up to 7.9.2) +Client key password. See \fICURLOPT_KEYPASSWD(3)\fP +.IP CURLOPT_SSL_ENABLE_ALPN +Enable use of ALPN. See \fICURLOPT_SSL_ENABLE_ALPN(3)\fP +.IP CURLOPT_SSL_ENABLE_NPN +Enable use of NPN. See \fICURLOPT_SSL_ENABLE_NPN(3)\fP .IP CURLOPT_SSLENGINE -Pass a pointer to a zero terminated string as parameter. It will be used as -the identifier for the crypto engine you want to use for your private -key. - -If the crypto device cannot be loaded, \fICURLE_SSL_ENGINE_NOTFOUND\fP is -returned. +Use identifier with SSL engine. See \fICURLOPT_SSLENGINE(3)\fP .IP CURLOPT_SSLENGINE_DEFAULT -Sets the actual crypto engine as the default for (asymmetric) crypto -operations. - -If the crypto device cannot be set, \fICURLE_SSL_ENGINE_SETFAILED\fP is -returned. - -Even though this option doesn't need any parameter, in some configurations -\fIcurl_easy_setopt\fP might be defined as a macro taking exactly three -arguments. Therefore, it's recommended to pass 1 as parameter to this option. +Default SSL engine. See \fICURLOPT_SSLENGINE_DEFAULT(3)\fP .IP CURLOPT_SSLVERSION -Pass a long as parameter to control what version of SSL/TLS to attempt to use. -The available options are: -.RS -.IP CURL_SSLVERSION_DEFAULT -The default action. This will attempt to figure out the remote SSL protocol -version, i.e. either SSLv3 or TLSv1 (but not SSLv2, which became disabled -by default with 7.18.1). -.IP CURL_SSLVERSION_TLSv1 -Force TLSv1 -.IP CURL_SSLVERSION_SSLv2 -Force SSLv2 -.IP CURL_SSLVERSION_SSLv3 -Force SSLv3 -.RE +SSL version to use. See \fICURLOPT_SSLVERSION(3)\fP .IP CURLOPT_SSL_VERIFYPEER -Pass a long as parameter. By default, curl assumes a value of 1. - -This option determines whether curl verifies the authenticity of the peer's -certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't. - -When negotiating a SSL connection, the server sends a certificate indicating -its identity. Curl verifies whether the certificate is authentic, i.e. that -you can trust that the server is who the certificate says it is. This trust -is based on a chain of digital signatures, rooted in certification authority -(CA) certificates you supply. curl uses a default bundle of CA certificates -(the path for that is determined at build time) and you can specify alternate -certificates with the \fICURLOPT_CAINFO\fP option or the \fICURLOPT_CAPATH\fP -option. - -When \fICURLOPT_SSL_VERIFYPEER\fP is nonzero, and the verification fails to -prove that the certificate is authentic, the connection fails. When the -option is zero, the peer certificate verification succeeds regardless. - -Authenticating the certificate is not by itself very useful. You typically -want to ensure that the server, as authentically identified by its -certificate, is the server you mean to be talking to. Use -\fICURLOPT_SSL_VERIFYHOST\fP to control that. The check that the host name in -the certificate is valid for the host name you're connecting to is done -independently of the \fICURLOPT_SSL_VERIFYPEER\fP option. +Verify the SSL certificate. See \fICURLOPT_SSL_VERIFYPEER(3)\fP .IP CURLOPT_CAINFO -Pass a char * to a zero terminated string naming a file holding one or more -certificates to verify the peer with. This makes sense only when used in -combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. If -\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAINFO\fP need not -even indicate an accessible file. - -This option is by default set to the system path where libcurl's cacert bundle -is assumed to be stored, as established at build time. - -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. +CA cert bundle. See \fICURLOPT_CAINFO(3)\fP .IP CURLOPT_ISSUERCERT -Pass a char * to a zero terminated string naming a file holding a CA -certificate in PEM format. If the option is set, an additional check against -the peer certificate is performed to verify the issuer is indeed the one -associated with the certificate provided by the option. This additional check -is useful in multi-level PKI where one needs to enforce that the peer -certificate is from a specific branch of the tree. - -This option makes sense only when used in combination with the -\fICURLOPT_SSL_VERIFYPEER\fP option. Otherwise, the result of the check is not -considered as failure. - -A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option, -which is returned if the setup of the SSL/TLS session has failed due to a -mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER\fP has -to be set too for the check to fail). (Added in 7.19.0) +Issuer certificate. See \fICURLOPT_ISSUERCERT(3)\fP .IP CURLOPT_CAPATH -Pass a char * to a zero terminated string naming a directory holding multiple -CA certificates to verify the peer with. If libcurl is built against OpenSSL, -the certificate directory must be prepared using the openssl c_rehash utility. -This makes sense only when used in combination with the -\fICURLOPT_SSL_VERIFYPEER\fP option. If \fICURLOPT_SSL_VERIFYPEER\fP is zero, -\fICURLOPT_CAPATH\fP need not even indicate an accessible path. The -\fICURLOPT_CAPATH\fP function apparently does not work in Windows due to some -limitation in openssl. This option is OpenSSL-specific and does nothing if -libcurl is built to use GnuTLS. NSS-powered libcurl provides the option only -for backward compatibility. +Path to CA cert bundle. See \fICURLOPT_CAPATH(3)\fP .IP CURLOPT_CRLFILE -Pass a char * to a zero terminated string naming a file with the concatenation -of CRL (in PEM format) to use in the certificate validation that occurs during -the SSL exchange. - -When curl is built to use NSS or GnuTLS, there is no way to influence the use -of CRL passed to help in the verification process. When libcurl is built with -OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both -set, requiring CRL check against all the elements of the certificate chain if -a CRL file is passed. - -This option makes sense only when used in combination with the -\fICURLOPT_SSL_VERIFYPEER\fP option. - -A specific error code (CURLE_SSL_CRL_BADFILE) is defined with the option. It -is returned when the SSL exchange fails because the CRL file cannot be loaded. -A failure in certificate verification due to a revocation information found in -the CRL does not trigger this specific error. (Added in 7.19.0) +Certificate Revocation List. See \fICURLOPT_CRLFILE(3)\fP .IP CURLOPT_SSL_VERIFYHOST -Pass a long as parameter. - -This option determines whether libcurl verifies that the server cert is for -the server it is known as. - -When negotiating a SSL connection, the server sends a certificate indicating -its identity. - -When \fICURLOPT_SSL_VERIFYHOST\fP is 2, that certificate must indicate that -the server is the server to which you meant to connect, or the connection -fails. - -Curl considers the server the intended one when the Common Name field or a -Subject Alternate Name field in the certificate matches the host name in the -URL to which you told Curl to connect. - -When the value is 1, libcurl will return a failure. It was previously (in -7.28.0 and earlier) a debug option of some sorts, but it is no longer -supported due to frequently leading to programmer mistakes. - -When the value is 0, the connection succeeds regardless of the names in the -certificate. - -The default value for this option is 2. - -This option controls checking the server's certificate's claimed identity. -The server could be lying. To control lying, see -\fICURLOPT_SSL_VERIFYPEER\fP. If libcurl is built against NSS and -\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_SSL_VERIFYHOST\fP -is ignored. - +Verify the host name in the SSL certificate. See \fICURLOPT_SSL_VERIFYHOST(3)\fP .IP CURLOPT_CERTINFO -Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With -this enabled, libcurl (if built with OpenSSL) will extract lots of information -and data about the certificates in the certificate chain used in the SSL -connection. This data is then possible to extract after a transfer using -\fIcurl_easy_getinfo(3)\fP and its option \fICURLINFO_CERTINFO\fP. (Added in -7.19.1) +Extract certificate info. See \fICURLOPT_CERTINFO(3)\fP +.IP CURLOPT_PINNEDPUBLICKEY +Set pinned SSL public key . See \fICURLOPT_PINNEDPUBLICKEY(3)\fP .IP CURLOPT_RANDOM_FILE -Pass a char * to a zero terminated file name. The file will be used to read -from to seed the random engine for SSL. The more random the specified file is, -the more secure the SSL connection will become. +Provide source for entropy random data. See \fICURLOPT_RANDOM_FILE(3)\fP .IP CURLOPT_EGDSOCKET -Pass a char * to the zero terminated path name to the Entropy Gathering Daemon -socket. It will be used to seed the random engine for SSL. +Identify EGD socket for entropy. See \fICURLOPT_EGDSOCKET(3)\fP .IP CURLOPT_SSL_CIPHER_LIST -Pass a char *, pointing to a zero terminated string holding the list of -ciphers to use for the SSL connection. The list must be syntactically correct, -it consists of one or more cipher strings separated by colons. Commas or -spaces are also acceptable separators but colons are normally used, \&!, \&- -and \&+ can be used as operators. - -For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA', -\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you -compile OpenSSL. - -You'll find more details about cipher lists on this URL: -\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP - -For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5', -\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses -this option then all known ciphers are disabled and only those passed in -are enabled. - -You'll find more details about the NSS cipher lists on this URL: -\fIhttp://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP - +Ciphers to use. See \fICURLOPT_SSL_CIPHER_LIST(3)\fP .IP CURLOPT_SSL_SESSIONID_CACHE -Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set -this to 1 to enable it. By default all transfers are done using the -cache. While nothing ever should get hurt by attempting to reuse SSL -session-IDs, there seem to be broken SSL implementations in the wild that may -require you to disable this in order for you to succeed. (Added in 7.16.0) +Disable SSL session-id cache. See \fICURLOPT_SSL_SESSIONID_CACHE(3)\fP .IP CURLOPT_SSL_OPTIONS -Pass a long with a bitmask to tell libcurl about specific SSL behaviors. - -CURLSSLOPT_ALLOW_BEAST is the only supported bit and by setting this the user -will tell libcurl to not attempt to use any workarounds for a security flaw -in the SSL3 and TLS1.0 protocols. If this option isn't used or this bit is -set to 0, the SSL layer libcurl uses may use a work-around for this flaw -although it might cause interoperability problems with some (older) SSL -implementations. WARNING: avoiding this work-around loosens the security, and -by setting this option to 1 you ask for exactly that. (Added in 7.25.0) +Control SSL behavior. See \fICURLOPT_SSL_OPTIONS(3)\fP .IP CURLOPT_KRBLEVEL -Pass a char * as parameter. Set the kerberos security level for FTP; this also -enables kerberos awareness. This is a string, \&'clear', \&'safe', -\&'confidential' or \&'private'. If the string is set but doesn't match one -of these, 'private' will be used. Set the string to NULL to disable kerberos -support for FTP. - -(This option was known as CURLOPT_KRB4LEVEL up to 7.16.3) +Kerberos security level. See \fICURLOPT_KRBLEVEL(3)\fP .IP CURLOPT_GSSAPI_DELEGATION -Set the parameter to CURLGSSAPI_DELEGATION_FLAG to allow unconditional GSSAPI -credential delegation. The delegation is disabled by default since 7.21.7. -Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG to delegate only if -the OK-AS-DELEGATE flag is set in the service ticket in case this feature is -supported by the GSSAPI implementation and the definition of -GSS_C_DELEG_POLICY_FLAG was available at compile-time. -(Added in 7.22.0) +Disable GSS-API delegation. See \fICURLOPT_GSSAPI_DELEGATION(3)\fP .SH SSH OPTIONS .IP CURLOPT_SSH_AUTH_TYPES -Pass a long set to a bitmask consisting of one or more of -CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, -CURLSSH_AUTH_KEYBOARD and CURLSSH_AUTH_AGENT. Set CURLSSH_AUTH_ANY to let -libcurl pick a suitable one. Currently CURLSSH_AUTH_HOST has no effect. (Added -in 7.16.1) If CURLSSH_AUTH_AGENT is used, libcurl attempts to connect to -ssh-agent or pageant and let the agent attempt the authentication. (Added in -7.28.0) +SSH authentication types. See \fICURLOPT_SSH_AUTH_TYPES(3)\fP .IP CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 -Pass a char * pointing to a string containing 32 hexadecimal digits. The -string should be the 128 bit MD5 checksum of the remote host's public key, and -libcurl will reject the connection to the host unless the md5sums match. This -option is only for SCP and SFTP transfers. (Added in 7.17.1) +MD5 of host's public key. See \fICURLOPT_SSH_HOST_PUBLIC_KEY_MD5(3)\fP .IP CURLOPT_SSH_PUBLIC_KEYFILE -Pass a char * pointing to a file name for your public key. If not used, -libcurl defaults to \fB$HOME/.ssh/id_dsa.pub\fP if the HOME environment -variable is set, and just "id_dsa.pub" in the current directory if HOME is not -set. (Added in 7.16.1) -If an empty string is passed, libcurl will pass no public key to libssh2 -which then tries to compute it from the private key, this is known to work -when libssh2 1.4.0+ is linked against OpenSSL. (Added in 7.26.0) +File name of public key. See \fICURLOPT_SSH_PUBLIC_KEYFILE(3)\fP .IP CURLOPT_SSH_PRIVATE_KEYFILE -Pass a char * pointing to a file name for your private key. If not used, -libcurl defaults to \fB$HOME/.ssh/id_dsa\fP if the HOME environment variable -is set, and just "id_dsa" in the current directory if HOME is not set. If the -file is password-protected, set the password with -\fICURLOPT_KEYPASSWD\fP. (Added in 7.16.1) +File name of private key. See \fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP .IP CURLOPT_SSH_KNOWNHOSTS -Pass a pointer to a zero terminated string holding the file name of the -known_host file to use. The known_hosts file should use the OpenSSH file -format as supported by libssh2. If this file is specified, libcurl will only -accept connections with hosts that are known and present in that file, with a -matching public key. Use \fICURLOPT_SSH_KEYFUNCTION\fP to alter the default -behavior on host and key (mis)matching. (Added in 7.19.6) +File name with known hosts. See \fICURLOPT_SSH_KNOWNHOSTS(3)\fP .IP CURLOPT_SSH_KEYFUNCTION -Pass a pointer to a curl_sshkeycallback function. It gets called when the -known_host matching has been done, to allow the application to act and decide -for libcurl how to proceed. The callback will only be called if -\fICURLOPT_SSH_KNOWNHOSTS\fP is also set. - -The curl_sshkeycallback function gets passed the CURL handle, the key from the -known_hosts file, the key from the remote site, info from libcurl on the -matching status and a custom pointer (set with \fICURLOPT_SSH_KEYDATA\fP). It -MUST return one of the following return codes to tell libcurl how to act: -.RS -.IP CURLKHSTAT_FINE_ADD_TO_FILE -The host+key is accepted and libcurl will append it to the known_hosts file -before continuing with the connection. This will also add the host+key combo -to the known_host pool kept in memory if it wasn't already present there. The -adding of data to the file is done by completely replacing the file with a new -copy, so the permissions of the file must allow this. -.IP CURLKHSTAT_FINE -The host+key is accepted libcurl will continue with the connection. This will -also add the host+key combo to the known_host pool kept in memory if it wasn't -already present there. -.IP CURLKHSTAT_REJECT -The host+key is rejected. libcurl will deny the connection to continue and it -will be closed. -.IP CURLKHSTAT_DEFER -The host+key is rejected, but the SSH connection is asked to be kept alive. -This feature could be used when the app wants to somehow return back and act -on the host+key situation and then retry without needing the overhead of -setting it up from scratch again. -.RE - (Added in 7.19.6) +Callback for known hosts handling. See \fICURLOPT_SSH_KEYFUNCTION(3)\fP .IP CURLOPT_SSH_KEYDATA -Pass a void * as parameter. This pointer will be passed along verbatim to the -callback set with \fICURLOPT_SSH_KEYFUNCTION\fP. (Added in 7.19.6) +Custom pointer to pass to ssh key callback. See \fICURLOPT_SSH_KEYDATA(3)\fP .SH OTHER OPTIONS .IP CURLOPT_PRIVATE -Pass a void * as parameter, pointing to data that should be associated with -this curl handle. The pointer can subsequently be retrieved using -\fIcurl_easy_getinfo(3)\fP with the CURLINFO_PRIVATE option. libcurl itself -does nothing with this data. (Added in 7.10.3) +Private pointer to store. See \fICURLOPT_PRIVATE(3)\fP .IP CURLOPT_SHARE -Pass a share handle as a parameter. The share handle must have been created by -a previous call to \fIcurl_share_init(3)\fP. Setting this option, will make -this curl handle use the data from the shared handle instead of keeping the -data to itself. This enables several curl handles to share data. If the curl -handles are used simultaneously in multiple threads, you \fBMUST\fP use the -locking methods in the share handle. See \fIcurl_share_setopt(3)\fP for -details. - -If you add a share that is set to share cookies, your easy handle will use -that cookie cache and get the cookie engine enabled. If you unshare an object -that was using cookies (or change to another object that doesn't share -cookies), the easy handle will get its cookie engine disabled. - -Data that the share object is not set to share will be dealt with the usual -way, as if no share was used. +Share object to use. See \fICURLOPT_SHARE(3)\fP .IP CURLOPT_NEW_FILE_PERMS -Pass a long as a parameter, containing the value of the permissions that will -be assigned to newly created files on the remote server. The default value is -\fI0644\fP, but any valid value can be used. The only protocols that can use -this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP. (Added in 7.16.4) +Mode for creating new remote files. See \fICURLOPT_NEW_FILE_PERMS(3)\fP .IP CURLOPT_NEW_DIRECTORY_PERMS -Pass a long as a parameter, containing the value of the permissions that will -be assigned to newly created directories on the remote server. The default -value is \fI0755\fP, but any valid value can be used. The only protocols that -can use this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP. -(Added in 7.16.4) +Mode for creating new remote directories. See \fICURLOPT_NEW_DIRECTORY_PERMS(3)\fP .SH TELNET OPTIONS .IP CURLOPT_TELNETOPTIONS -Provide a pointer to a curl_slist with variables to pass to the telnet -negotiations. The variables should be in the format . libcurl -supports the options 'TTYPE', 'XDISPLOC' and 'NEW_ENV'. See the TELNET -standard for details. +TELNET options. See \fICURLOPT_TELNETOPTIONS(3)\fP .SH RETURN VALUE -CURLE_OK (zero) means that the option was set properly, non-zero means an +\fICURLE_OK\fP (zero) means that the option was set properly, non-zero means an error occurred as \fI\fP defines. See the \fIlibcurl-errors(3)\fP man page for the full list with descriptions. If you try to set an option that libcurl doesn't know about, perhaps because the library is too old to support it or the option was removed in a recent -version, this function will return \fICURLE_FAILED_INIT\fP. +version, this function will return \fICURLE_UNKNOWN_OPTION\fP. If support for +the option was disabled at compile-time, it will return +\fICURLE_NOT_BUILT_IN\fP. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); +}} +.fi .SH "SEE ALSO" -.BR curl_easy_init "(3), " curl_easy_cleanup "(3), " curl_easy_reset "(3)" +.BR curl_easy_init "(3), " curl_easy_cleanup "(3), " curl_easy_reset "(3), " +.BR curl_multi_setopt "(3), " diff --git a/docs/libcurl/curl_easy_setopt.html b/docs/libcurl/curl_easy_setopt.html index f39674f..43e0b43 100644 --- a/docs/libcurl/curl_easy_setopt.html +++ b/docs/libcurl/curl_easy_setopt.html @@ -49,927 +49,460 @@ p.roffit {

curl_easy_setopt - set options for a curl easy handle

SYNOPSIS

#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

DESCRIPTION

-

curl_easy_setopt() is used to tell libcurl how to behave. By using the appropriate options to curl_easy_setopt, you can change libcurl's behavior. All options are set with the option followed by a parameter. That parameter can be a long, a function pointer, an object pointer or a curl_off_t, depending on what the specific option expects. Read this manual carefully as bad input values may cause libcurl to behave badly! You can only set one option in each function call. A typical application uses many curl_easy_setopt() calls in the setup phase. -

Options set with this function call are valid for all forthcoming transfers performed using this handle. The options are not in any way reset between transfers, so if you want subsequent transfers with different options, you must change them between the transfers. You can optionally reset all options back to internal default with curl_easy_reset(3). -

Strings passed to libcurl as 'char *' arguments, are copied by the library; thus the string storage associated to the pointer argument may be overwritten after curl_easy_setopt() returns. Exceptions to this rule are described in the option details below. +

curl_easy_setopt is used to tell libcurl how to behave. By setting the appropriate options, the application can change libcurl's behavior. All options are set with an option followed by a parameter. That parameter can be a long, a function pointer, an object pointer or a curl_off_t, depending on what the specific option expects. Read this manual carefully as bad input values may cause libcurl to behave badly! You can only set one option in each function call. A typical application uses many curl_easy_setopt calls in the setup phase. +

Options set with this function call are valid for all forthcoming transfers performed using this handle. The options are not in any way reset between transfers, so if you want subsequent transfers with different options, you must change them between the transfers. You can optionally reset all options back to internal default with curl_easy_reset. +

Strings passed to libcurl as 'char *' arguments, are copied by the library; thus the string storage associated to the pointer argument may be overwritten after curl_easy_setopt returns. The only exception to this rule is really CURLOPT_POSTFIELDS(3), but the alternative that copies the string CURLOPT_COPYPOSTFIELDS(3) has some usage characteristics you need to read up on.

Before version 7.17.0, strings were not copied. Instead the user was forced keep them available until libcurl no longer needed them. -

The handle is the return code from a curl_easy_init(3) or curl_easy_duphandle(3) call.

BEHAVIOR OPTIONS

+

The handle is the return code from a curl_easy_init or curl_easy_duphandle call.

BEHAVIOR OPTIONS

CURLOPT_VERBOSE -

Set the parameter to 1 to get the library to display a lot of verbose information about its operations. Very useful for libcurl and/or protocol debugging and understanding. The verbose information will be sent to stderr, or the stream set with CURLOPT_STDERR. The default value for this parameter is 0. -

You hardly ever want this set in production use, you will almost always want this when you debug/report problems. Another neat option for debugging is the CURLOPT_DEBUGFUNCTION. +

Display verbose information. See CURLOPT_VERBOSE(3)

CURLOPT_HEADER -

A parameter set to 1 tells the library to include the header in the body output. This is only relevant for protocols that actually have headers preceding the data (like HTTP). The default value for this parameter is 0. +

Include the header in the body output. See CURLOPT_HEADER(3)

CURLOPT_NOPROGRESS -

Pass a long. If set to 1, it tells the library to shut off the progress meter completely. It will also prevent the CURLOPT_PROGRESSFUNCTION from getting called. The default value for this parameter is 1. -

Future versions of libcurl are likely to not have any built-in progress meter at all. +

Shut off the progress meter. See CURLOPT_NOPROGRESS(3)

CURLOPT_NOSIGNAL -

Pass a long. If it is 1, libcurl will not use any functions that install signal handlers or any functions that cause signals to be sent to the process. This option is mainly here to allow multi-threaded unix applications to still set/use all timeout options etc, without risking getting signals. The default value for this parameter is 0. (Added in 7.10) -

If this option is set and libcurl has been built with the standard name resolver, timeouts will not occur while the name resolve takes place. Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals. -

Setting CURLOPT_NOSIGNAL to 1 makes libcurl NOT ask the system to ignore SIGPIPE signals, which otherwise are sent by the system when trying to send data to a socket which is closed in the other end. libcurl makes an effort to never cause such SIGPIPEs to trigger, but some operating systems have no way to avoid them and even on those that have there are some corner cases when they may still happen, contrary to our desire. In addition, using CURLAUTH_NTLM_WB authentication could cause a SIGCHLD signal to be raised. +

Do not install signal handlers. See CURLOPT_NOSIGNAL(3)

CURLOPT_WILDCARDMATCH -

Set this option to 1 if you want to transfer multiple files according to a file name pattern. The pattern can be specified as part of the CURLOPT_URL option, using an fnmatch-like pattern (Shell Pattern Matching) in the last part of URL (file name). -

By default, libcurl uses its internal wildcard matching implementation. You can provide your own matching function by the CURLOPT_FNMATCH_FUNCTION option. -

This feature is only supported by the FTP download for now. -

A brief introduction of its syntax follows: -

-

* - ASTERISK -

ftp://example.com/some/path/*.txt (for all txt's from the root directory) -

-

-

? - QUESTION MARK -

Question mark matches any (exactly one) character. -

ftp://example.com/some/path/photo?.jpeg -

-

-

[ - BRACKET EXPRESSION -

The left bracket opens a bracket expression. The question mark and asterisk have no special meaning in a bracket expression. Each bracket expression ends by the right bracket and matches exactly one character. Some examples follow: -

[a-zA-Z0-9] or [f-gF-G] - character interval -

[abc] - character enumeration -

[^abc] or [!abc] - negation -

[[:name:]] class expression. Supported classes are alnum,lower, space, alpha, digit, print, upper, blank, graph, xdigit. -

[][-!^] - special case - matches only '-', ']', '[', '!' or '^'. These characters have no special purpose. -

[\[\]\\] - escape syntax. Matches '[', ']' or '´. -

Using the rules above, a file name pattern can be constructed: -

ftp://example.com/some/path/[a-z[:upper:]\\].jpeg -

-

(This was added in 7.21.0)

CALLBACK OPTIONS

+

Transfer multiple files according to a file name pattern. See CURLOPT_WILDCARDMATCH(3)

CALLBACK OPTIONS

CURLOPT_WRITEFUNCTION -

Pass a pointer to a function that matches the following prototype: size_t function( char *ptr, size_t size, size_t nmemb, void *userdata); This function gets called by libcurl as soon as there is data received that needs to be saved. The size of the data pointed to by ptr is size multiplied with nmemb, it will not be zero terminated. Return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library. This will abort the transfer and return CURLE_WRITE_ERROR. -

From 7.18.0, the function can return CURL_WRITEFUNC_PAUSE which then will cause writing to this connection to become paused. See curl_easy_pause(3) for further details. -

This function may be called with zero bytes data if the transferred file is empty. -

Set this option to NULL to get the internal default function. The internal default function will write the data to the FILE * given with CURLOPT_WRITEDATA. -

Set the userdata argument with the CURLOPT_WRITEDATA option. -

The callback function will be passed as much data as possible in all invokes, but you cannot possibly make any assumptions. It may be one byte, it may be thousands. The maximum amount of body data that can be passed to the write callback is defined in the curl.h header file: CURL_MAX_WRITE_SIZE (the usual default is 16K). If you however have CURLOPT_HEADER set, which sends header data to the write callback, you can get up to CURL_MAX_HTTP_HEADER bytes of header data passed into it. This usually means 100K. +

Callback for writing data. See CURLOPT_WRITEFUNCTION(3)

CURLOPT_WRITEDATA -

Data pointer to pass to the file write function. If you use the CURLOPT_WRITEFUNCTION option, this is the pointer you'll get as input. If you don't use a callback, you must pass a 'FILE *' (cast to 'void *') as libcurl will pass this to fwrite() when writing data. By default, the value of this parameter is unspecified. -

The internal CURLOPT_WRITEFUNCTION will write the data to the FILE * given with this option, or to stdout if this option hasn't been set. -

If you're using libcurl as a win32 DLL, you MUST use the CURLOPT_WRITEFUNCTION if you set this option or you will experience crashes. -

This option is also known with the older name CURLOPT_FILE, the name CURLOPT_WRITEDATA was introduced in 7.9.7. +

Data pointer to pass to the write callback. See CURLOPT_WRITEDATA(3)

CURLOPT_READFUNCTION -

Pass a pointer to a function that matches the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata); This function gets called by libcurl as soon as it needs to read data in order to send it to the peer. The data area pointed at by the pointer ptr may be filled with at most size multiplied with nmemb number of bytes. Your function must return the actual number of bytes that you stored in that memory area. Returning 0 will signal end-of-file to the library and cause it to stop the current transfer. -

If you stop the current transfer by returning 0 "pre-maturely" (i.e before the server expected it, like when you've said you will upload N bytes and you upload less than N bytes), you may experience that the server "hangs" waiting for the rest of the data that won't come. -

The read callback may return CURL_READFUNC_ABORT to stop the current operation immediately, resulting in a CURLE_ABORTED_BY_CALLBACK error code from the transfer (Added in 7.12.1) -

From 7.18.0, the function can return CURL_READFUNC_PAUSE which then will cause reading from this connection to become paused. See curl_easy_pause(3) for further details. -

Bugs: when doing TFTP uploads, you must return the exact amount of data that the callback wants, or it will be considered the final packet by the server end and the transfer will end there. -

If you set this callback pointer to NULL, or don't set it at all, the default internal read function will be used. It is doing an fread() on the FILE * userdata set with CURLOPT_READDATA. +

Callback for reading data. See CURLOPT_READFUNCTION(3)

CURLOPT_READDATA -

Data pointer to pass to the file read function. If you use the CURLOPT_READFUNCTION option, this is the pointer you'll get as input. If you don't specify a read callback but instead rely on the default internal read function, this data must be a valid readable FILE * (cast to 'void *'). -

If you're using libcurl as a win32 DLL, you MUST use a CURLOPT_READFUNCTION if you set this option. -

This option was also known by the older name CURLOPT_INFILE, the name CURLOPT_READDATA was introduced in 7.9.7. +

Data pointer to pass to the read callback. See CURLOPT_READDATA(3)

CURLOPT_IOCTLFUNCTION -

Pass a pointer to a function that matches the following prototype: curlioerr function(CURL *handle, int cmd, void *clientp);. This function gets called by libcurl when something special I/O-related needs to be done that the library can't do by itself. For now, rewinding the read data stream is the only action it can request. The rewinding of the read data stream may be necessary when doing a HTTP PUT or POST with a multi-pass authentication method. By default, this parameter is set to NULL. (Option added in 7.12.3). -

Use CURLOPT_SEEKFUNCTION instead to provide seeking! If CURLOPT_SEEKFUNCTION is set, this parameter will be ignored when seeking. +

Callback for I/O operations. See CURLOPT_IOCTLFUNCTION(3)

CURLOPT_IOCTLDATA -

Pass a pointer that will be untouched by libcurl and passed as the 3rd argument in the ioctl callback set with CURLOPT_IOCTLFUNCTION. By default, the value of this parameter is unspecified. (Option added in 7.12.3) +

Data pointer to pass to the I/O callback. See CURLOPT_IOCTLDATA(3)

CURLOPT_SEEKFUNCTION -

Pass a pointer to a function that matches the following prototype: int function(void *instream, curl_off_t offset, int origin); This function gets called by libcurl to seek to a certain position in the input stream and can be used to fast forward a file in a resumed upload (instead of reading all uploaded bytes with the normal read function/callback). It is also called to rewind a stream when doing a HTTP PUT or POST with a multi-pass authentication method. The function shall work like "fseek" or "lseek" and accepted SEEK_SET, SEEK_CUR and SEEK_END as argument for origin, although (in 7.18.0) libcurl only passes SEEK_SET. The callback must return 0 (CURL_SEEKFUNC_OK) on success, 1 (CURL_SEEKFUNC_FAIL) to cause the upload operation to fail or 2 (CURL_SEEKFUNC_CANTSEEK) to indicate that while the seek failed, libcurl is free to work around the problem if possible. The latter can sometimes be done by instead reading from the input or similar. -

By default, this parameter is unset. -

If you forward the input arguments directly to "fseek" or "lseek", note that the data type for offset is not the same as defined for curl_off_t on many systems! (Option added in 7.18.0) +

Callback for seek operations. See CURLOPT_SEEKFUNCTION(3)

CURLOPT_SEEKDATA -

Data pointer to pass to the file seek function. If you use the CURLOPT_SEEKFUNCTION option, this is the pointer you'll get as input. If you don't specify a seek callback, NULL is passed. (Option added in 7.18.0) +

Data pointer to pass to the seek callback. See CURLOPT_SEEKDATA(3)

CURLOPT_SOCKOPTFUNCTION -

Pass a pointer to a function that matches the following prototype: int function(void *clientp, curl_socket_t curlfd, curlsocktype purpose);. By default, this parameter is unset. If set, this function gets called by libcurl after the socket() call but before the connect() call. The callback's purpose argument identifies the exact purpose for this particular socket: -

CURLSOCKTYPE_IPCXN for actively created connections or since 7.28.0 CURLSOCKTYPE_ACCEPT for FTP when the connection was setup with PORT/EPSV (in earlier versions these sockets weren't passed to this callback). -

Future versions of libcurl may support more purposes. It passes the newly created socket descriptor so additional setsockopt() calls can be done at the user's discretion. Return 0 (zero) from the callback on success. Return 1 from the callback function to signal an unrecoverable error to the library and it will close the socket and return CURLE_COULDNT_CONNECT. (Option added in 7.16.0) -

Added in 7.21.5, the callback function may return CURL_SOCKOPT_ALREADY_CONNECTED, which tells libcurl that the socket is in fact already connected and then libcurl will not attempt to connect it. +

Callback for sockopt operations. See CURLOPT_SOCKOPTFUNCTION(3)

CURLOPT_SOCKOPTDATA -

Pass a pointer that will be untouched by libcurl and passed as the first argument in the sockopt callback set with CURLOPT_SOCKOPTFUNCTION. The default value of this parameter is unspecified. (Option added in 7.16.0) +

Data pointer to pass to the sockopt callback. See CURLOPT_SOCKOPTDATA(3)

CURLOPT_OPENSOCKETFUNCTION -

Pass a pointer to a function that matches the following prototype: curl_socket_t function(void *clientp, curlsocktype purpose, struct curl_sockaddr *address);. This function gets called by libcurl instead of the socket(2) call. The callback's purpose argument identifies the exact purpose for this particular socket: CURLSOCKTYPE_IPCXN is for IP based connections. Future versions of libcurl may support more purposes. It passes the resolved peer address as a address argument so the callback can modify the address or refuse to connect at all. The callback function should return the socket or CURL_SOCKET_BAD in case no connection could be established or another error was detected. Any additional setsockopt(2) calls can be done on the socket at the user's discretion. CURL_SOCKET_BAD return value from the callback function will signal an unrecoverable error to the library and it will return CURLE_COULDNT_CONNECT. This return code can be used for IP address blacklisting. The default behavior is:

-

  return socket(addr->family, addr->socktype, addr->protocol); -

- -

(Option added in 7.17.1.) +

Callback for socket creation. See CURLOPT_OPENSOCKETFUNCTION(3)

CURLOPT_OPENSOCKETDATA -

Pass a pointer that will be untouched by libcurl and passed as the first argument in the opensocket callback set with CURLOPT_OPENSOCKETFUNCTION. The default value of this parameter is unspecified. (Option added in 7.17.1.) +

Data pointer to pass to the open socket callback. See CURLOPT_OPENSOCKETDATA(3)

CURLOPT_CLOSESOCKETFUNCTION -

Pass a pointer to a function that matches the following prototype: int function(void *clientp, curl_socket_t item);. This function gets called by libcurl instead of the close(3) or closesocket(3) call when sockets are closed (not for any other file descriptors). This is pretty much the reverse to the CURLOPT_OPENSOCKETFUNCTION option. Return 0 to signal success and 1 if there was an error. (Option added in 7.21.7) +

Callback for closing socket. See CURLOPT_CLOSESOCKETFUNCTION(3)

CURLOPT_CLOSESOCKETDATA -

Pass a pointer that will be untouched by libcurl and passed as the first argument in the closesocket callback set with CURLOPT_CLOSESOCKETFUNCTION. The default value of this parameter is unspecified. (Option added in 7.21.7) +

Data pointer to pass to the close socket callback. See CURLOPT_CLOSESOCKETDATA(3)

CURLOPT_PROGRESSFUNCTION -

Pass a pointer to a function that matches the following prototype: -

int function(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow); -

This function gets called by libcurl instead of its internal equivalent with a frequent interval. While data is being transferred it will be called very frequently, and during slow periods like when nothing is being transferred it can slow down to about one call per second. -

clientp is the pointer set with CURLOPT_PROGRESSDATA, it is not actually used by libcurl but is only passed along from the application to the callback. -

The callback gets told how much data libcurl will transfer and has transferred, in number of bytes. dltotal is the total number of bytes libcurl expects to download in this transfer. dlnow is the number of bytes downloaded so far. ultotal is the total number of bytes libcurl expects to upload in this transfer. ulnow is the number of bytes uploaded so far. -

Unknown/unused argument values passed to the callback will be set to zero (like if you only download data, the upload size will remain 0). Many times the callback will be called one or more times first, before it knows the data sizes so a program must be made to handle that. -

Returning a non-zero value from this callback will cause libcurl to abort the transfer and return CURLE_ABORTED_BY_CALLBACK. -

If you transfer data with the multi interface, this function will not be called during periods of idleness unless you call the appropriate libcurl function that performs transfers. -

CURLOPT_NOPROGRESS must be set to 0 to make this function actually get called. -

CURLOPT_XFERINFOFUNCTION -

Pass a pointer to a function that matches the following prototype: -

-

int function(void *clientp, curl_off_t dltotal, curl_off_t dlnow, -   curl_off_t ultotal, curl_off_t ulnow); -

- -

-

This function gets called by libcurl instead of its internal equivalent with a frequent interval. While data is being transferred it will be called very frequently, and during slow periods like when nothing is being transferred it can slow down to about one call per second. -

clientp is the pointer set with CURLOPT_XFERINFODATA, it is only passed along from the application to the callback. -

The callback gets told how much data libcurl will transfer and has transferred, in number of bytes. dltotal is the total number of bytes libcurl expects to download in this transfer. dlnow is the number of bytes downloaded so far. ultotal is the total number of bytes libcurl expects to upload in this transfer. ulnow is the number of bytes uploaded so far. -

Unknown/unused argument values passed to the callback will be set to zero (like if you only download data, the upload size will remain 0). Many times the callback will be called one or more times first, before it knows the data sizes so a program must be made to handle that. -

Returning a non-zero value from this callback will cause libcurl to abort the transfer and return CURLE_ABORTED_BY_CALLBACK. -

If you transfer data with the multi interface, this function will not be called during periods of idleness unless you call the appropriate libcurl function that performs transfers. -

CURLOPT_NOPROGRESS must be set to 0 to make this function actually get called. -

(Added in 7.32.0) +

OBSOLETE callback for progress meter. See CURLOPT_PROGRESSFUNCTION(3)

CURLOPT_PROGRESSDATA -

Pass a pointer that will be untouched by libcurl and passed as the first argument in the progress callback set with CURLOPT_PROGRESSFUNCTION. The default value of this parameter is unspecified. +

Data pointer to pass to the progress meter callback. See CURLOPT_PROGRESSDATA(3) +

CURLOPT_XFERINFOFUNCTION +

Callback for progress meter. See CURLOPT_XFERINFOFUNCTION(3)

CURLOPT_XFERINFODATA -

Pass a pointer that will be untouched by libcurl and passed as the first argument in the progress callback set with CURLOPT_XFERINFOFUNCTION. The default value of this parameter is unspecified. This option is an alias for CURLOPT_PROGRESSDATA. (Added in 7.32.0) +

Data pointer to pass to the progress meter callback. See CURLOPT_XFERINFODATA(3)

CURLOPT_HEADERFUNCTION -

Pass a pointer to a function that matches the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);. This function gets called by libcurl as soon as it has received header data. The header callback will be called once for each header and only complete header lines are passed on to the callback. Parsing headers is very easy using this. The size of the data pointed to by ptr is size multiplied with nmemb. Do not assume that the header line is zero terminated! The pointer named userdata is the one you set with the CURLOPT_WRITEHEADER option. The callback function must return the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library. This will abort the transfer and return CURL_WRITE_ERROR. -

A complete HTTP header that is passed to this function can be up to CURL_MAX_HTTP_HEADER (100K) bytes. -

If this option is not set, or if it is set to NULL, but CURLOPT_HEADERDATA (CURLOPT_WRITEHEADER) is set to anything but NULL, the function used to accept response data will be used instead. That is, it will be the function specified with CURLOPT_WRITEFUNCTION, or if it is not specified or NULL - the default, stream-writing function. -

It's important to note that the callback will be invoked for the headers of all responses received after initiating a request and not just the final response. This includes all responses which occur during authentication negotiation. If you need to operate on only the headers from the final response, you will need to collect headers in the callback yourself and use HTTP status lines, for example, to delimit response boundaries. -

When a server sends a chunked encoded transfer, it may contain a trailer. That trailer is identical to a HTTP header and if such a trailer is received it is passed to the application using this callback as well. There are several ways to detect it being a trailer and not an ordinary header: 1) it comes after the response-body. 2) it comes after the final header line (CR LF) 3) a Trailer: header among the regular response-headers mention what header(s) to expect in the trailer. -

For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get called with the server responses to the commands that libcurl sends. -

CURLOPT_WRITEHEADER -

(This option is also known as CURLOPT_HEADERDATA) Pass a pointer to be used to write the header part of the received data to. If you don't use CURLOPT_WRITEFUNCTION or CURLOPT_HEADERFUNCTION to take care of the writing, this must be a valid FILE * as the internal default will then be a plain fwrite(). See also the CURLOPT_HEADERFUNCTION option above on how to set a custom get-all-headers callback. +

Callback for writing received headers. See CURLOPT_HEADERFUNCTION(3) +

CURLOPT_HEADERDATA +

Data pointer to pass to the header callback. See CURLOPT_HEADERDATA(3)

CURLOPT_DEBUGFUNCTION -

Pass a pointer to a function that matches the following prototype: int curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *); CURLOPT_DEBUGFUNCTION replaces the standard debug function used when CURLOPT_VERBOSE is in effect. This callback receives debug information, as specified with the curl_infotype argument. This function must return 0. The data pointed to by the char * passed to this function WILL NOT be zero terminated, but will be exactly of the size as told by the size_t argument. -

Available curl_infotype values: -

-

CURLINFO_TEXT -

The data is informational text. -

CURLINFO_HEADER_IN -

The data is header (or header-like) data received from the peer. -

CURLINFO_HEADER_OUT -

The data is header (or header-like) data sent to the peer. -

CURLINFO_DATA_IN -

The data is protocol data received from the peer. -

CURLINFO_DATA_OUT -

The data is protocol data sent to the peer. -

+

Callback for debug information. See CURLOPT_DEBUGFUNCTION(3)

CURLOPT_DEBUGDATA -

Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in the last void * argument. This pointer is not used by libcurl, it is only passed to the callback. +

Data pointer to pass to the debug callback. See CURLOPT_DEBUGDATA(3)

CURLOPT_SSL_CTX_FUNCTION -

This option does only function for libcurl powered by OpenSSL. If libcurl was built against another SSL library, this functionality is absent. -

Pass a pointer to a function that matches the following prototype: CURLcode sslctxfun(CURL *curl, void *sslctx, void *parm); This function gets called by libcurl just before the initialization of a SSL connection after having processed all other SSL related options to give a last chance to an application to modify the behaviour of openssl's ssl initialization. The sslctx parameter is actually a pointer to an openssl SSL_CTX. If an error is returned no attempt to establish a connection is made and the perform operation will return the error code from this callback function. Set the parm argument with the CURLOPT_SSL_CTX_DATA option. This option was introduced in 7.11.0. -

This function will get called on all new connections made to a server, during the SSL negotiation. The SSL_CTX pointer will be a new one every time. -

To use this properly, a non-trivial amount of knowledge of the openssl libraries is necessary. For example, using this function allows you to use openssl callbacks to add additional validation code for certificates, and even to change the actual URI of a HTTPS request (example used in the lib509 test case). See also the example section for a replacement of the key, certificate and trust file settings. +

Callback for SSL context logic. See CURLOPT_SSL_CTX_FUNCTION(3)

CURLOPT_SSL_CTX_DATA -

Data pointer to pass to the ssl context callback set by the option CURLOPT_SSL_CTX_FUNCTION, this is the pointer you'll get as third parameter, otherwise NULL. (Added in 7.11.0) +

Data pointer to pass to the SSL context callback. See CURLOPT_SSL_CTX_DATA(3)

CURLOPT_CONV_TO_NETWORK_FUNCTION -

+

Callback for code base conversion. See CURLOPT_CONV_TO_NETWORK_FUNCTION(3)

CURLOPT_CONV_FROM_NETWORK_FUNCTION -

+

Callback for code base conversion. See CURLOPT_CONV_FROM_NETWORK_FUNCTION(3)

CURLOPT_CONV_FROM_UTF8_FUNCTION -

Pass a pointer to a function that matches the following prototype: CURLcode function(char *ptr, size_t length); -

These three options apply to non-ASCII platforms only. They are available only if CURL_DOES_CONVERSIONS was defined when libcurl was built. When this is the case, curl_version_info(3) will return the CURL_VERSION_CONV feature bit set. -

The data to be converted is in a buffer pointed to by the ptr parameter. The amount of data to convert is indicated by the length parameter. The converted data overlays the input data in the buffer pointed to by the ptr parameter. CURLE_OK should be returned upon successful conversion. A CURLcode return value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an error was encountered. -

CURLOPT_CONV_TO_NETWORK_FUNCTION and CURLOPT_CONV_FROM_NETWORK_FUNCTION convert between the host encoding and the network encoding. They are used when commands or ASCII data are sent/received over the network. -

CURLOPT_CONV_FROM_UTF8_FUNCTION is called to convert from UTF8 into the host encoding. It is required only for SSL processing. -

If you set a callback pointer to NULL, or don't set it at all, the built-in libcurl iconv functions will be used. If HAVE_ICONV was not defined when libcurl was built, and no callback has been established, conversion will return the CURLE_CONV_REQD error code. -

If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. For example: -

 #define CURL_ICONV_CODESET_OF_HOST "IBM-1047" -

The iconv code in libcurl will default the network and UTF8 codeset names as follows: -

 #define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" -

 #define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" -

You will need to override these definitions if they are different on your system. +

Callback for code base conversion. See CURLOPT_CONV_FROM_UTF8_FUNCTION(3)

CURLOPT_INTERLEAVEFUNCTION -

Pass a pointer to a function that matches the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata). This function gets called by libcurl as soon as it has received interleaved RTP data. This function gets called for each $ block and therefore contains exactly one upper-layer protocol unit (e.g. one RTP packet). Curl writes the interleaved header as well as the included data for each call. The first byte is always an ASCII dollar sign. The dollar sign is followed by a one byte channel identifier and then a 2 byte integer length in network byte order. See RFC 2326 Section 10.12 for more information on how RTP interleaving behaves. If unset or set to NULL, curl will use the default write function. -

Interleaved RTP poses some challenges for the client application. Since the stream data is sharing the RTSP control connection, it is critical to service the RTP in a timely fashion. If the RTP data is not handled quickly, subsequent response processing may become unreasonably delayed and the connection may close. The application may use CURL_RTSPREQ_RECEIVE to service RTP data when no requests are desired. If the application makes a request, (e.g. CURL_RTSPREQ_PAUSE) then the response handler will process any pending RTP data before marking the request as finished. (Added in 7.20.0) +

Callback for RTSP interleaved data. See CURLOPT_INTERLEAVEFUNCTION(3)

CURLOPT_INTERLEAVEDATA -

This is the userdata pointer that will be passed to CURLOPT_INTERLEAVEFUNCTION when interleaved RTP data is received. (Added in 7.20.0) +

Data pointer to pass to the RTSP interleave callback. See CURLOPT_INTERLEAVEDATA(3)

CURLOPT_CHUNK_BGN_FUNCTION -

Pass a pointer to a function that matches the following prototype: long function (const void *transfer_info, void *ptr, int remains). This function gets called by libcurl before a part of the stream is going to be transferred (if the transfer supports chunks). -

This callback makes sense only when using the CURLOPT_WILDCARDMATCH option for now. -

The target of transfer_info parameter is a "feature depended" structure. For the FTP wildcard download, the target is curl_fileinfo structure (see curl/curl.h). The parameter ptr is a pointer given by CURLOPT_CHUNK_DATA. The parameter remains contains number of chunks remaining per the transfer. If the feature is not available, the parameter has zero value. -

Return CURL_CHUNK_BGN_FUNC_OK if everything is fine, CURL_CHUNK_BGN_FUNC_SKIP if you want to skip the concrete chunk or CURL_CHUNK_BGN_FUNC_FAIL to tell libcurl to stop if some error occurred. (This was added in 7.21.0) +

Callback for wildcard download start of chunk. See CURLOPT_CHUNK_BGN_FUNCTION(3)

CURLOPT_CHUNK_END_FUNCTION -

Pass a pointer to a function that matches the following prototype: long function(void *ptr). This function gets called by libcurl as soon as a part of the stream has been transferred (or skipped). -

Return CURL_CHUNK_END_FUNC_OK if everything is fine or CURL_CHUNK_END_FUNC_FAIL to tell the lib to stop if some error occurred. (This was added in 7.21.0) +

Callback for wildcard download end of chunk. See CURLOPT_CHUNK_END_FUNCTION(3)

CURLOPT_CHUNK_DATA -

Pass a pointer that will be untouched by libcurl and passed as the ptr argument to the CURL_CHUNK_BGN_FUNTION and CURL_CHUNK_END_FUNTION. (This was added in 7.21.0) +

Data pointer to pass to the chunk callbacks. See CURLOPT_CHUNK_DATA(3)

CURLOPT_FNMATCH_FUNCTION -

Pass a pointer to a function that matches the following prototype: int function(void *ptr, const char *pattern, const char *string) prototype (see curl/curl.h). It is used internally for the wildcard matching feature. -

Return CURL_FNMATCHFUNC_MATCH if pattern matches the string, CURL_FNMATCHFUNC_NOMATCH if not or CURL_FNMATCHFUNC_FAIL if an error occurred. (This was added in 7.21.0) +

Callback for wildcard matching. See CURLOPT_FNMATCH_FUNCTION(3)

CURLOPT_FNMATCH_DATA -

Pass a pointer that will be untouched by libcurl and passed as the ptr argument to the CURL_FNMATCH_FUNCTION. (This was added in 7.21.0)

ERROR OPTIONS

+

Data pointer to pass to the wildcard matching callback. See CURLOPT_FNMATCH_DATA(3)

ERROR OPTIONS

CURLOPT_ERRORBUFFER -

Pass a char * to a buffer that the libcurl may store human readable error messages in. This may be more helpful than just the return code from curl_easy_perform. The buffer must be at least CURL_ERROR_SIZE big. Although this argument is a 'char *', it does not describe an input string. Therefore the (probably undefined) contents of the buffer is NOT copied by the library. You must keep the associated storage available until libcurl no longer needs it. Failing to do so will cause very odd behavior or even crashes. libcurl will need it until you call curl_easy_cleanup(3) or you set the same option again to use a different pointer. -

Use CURLOPT_VERBOSE and CURLOPT_DEBUGFUNCTION to better debug/trace why errors happen. -

If the library does not return an error, the buffer may not have been touched. Do not rely on the contents in those cases. -

+

Error message buffer. See CURLOPT_ERRORBUFFER(3)

CURLOPT_STDERR -

Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr when showing the progress meter and displaying CURLOPT_VERBOSE data. +

stderr replacement stream. See CURLOPT_STDERR(3)

CURLOPT_FAILONERROR -

A parameter set to 1 tells the library to fail silently if the HTTP code returned is equal to or larger than 400. The default action would be to return the page normally, ignoring that code. -

This method is not fail-safe and there are occasions where non-successful response codes will slip through, especially when authentication is involved (response codes 401 and 407). -

You might get some amounts of headers transferred before this situation is detected, like when a "100-continue" is received as a response to a POST/PUT and a 401 or 407 is received immediately afterwards.

NETWORK OPTIONS

+

Fail on HTTP 4xx errors. CURLOPT_FAILONERROR(3)

NETWORK OPTIONS

CURLOPT_URL -

Pass in a pointer to the actual URL to deal with. The parameter should be a char * to a zero terminated string which must be URL-encoded in the following format: -

scheme://host:port/path -

For a greater explanation of the format please see RFC 3986. -

If the given URL lacks the scheme (such as "http://" or "ftp://" etc) then libcurl will attempt to resolve the protocol based on one of the following given host names: -

HTTP, FTP, DICT, LDAP, IMAP, POP3 or SMTP -

(POP3 and SMTP added in 7.31.0) -

Should the protocol, either that specified by the scheme or deduced by libcurl from the host name, not be supported by libcurl then (CURLE_UNSUPPORTED_PROTOCOL) will be returned from either the curl_easy_perform(3) or curl_multi_perform(3) functions when you call them. Use curl_version_info(3) for detailed information of which protocols are supported by the build of libcurl you are using. -

The host part of the URL contains the address of the server that you want to connect to. This can be the fully qualified domain name of the server, the local network name of the machine on your network or the IP address of the server or machine represented by either an IPv4 or IPv6 address. For example: -

http://www.example.com/ -

http://hostname/ -

http://192.168.0.1/ -

http://[2001:1890:1112:1::20]/ -

It is also possible to specify the user name, password and any supported login options as part of the host, for the following protocols, when connecting to servers that require authentication: -

http://user:password@www.example.com -

ftp://user:password@ftp.example.com -

imap://user:password;options@mail.example.com -

pop3://user:password;options@mail.example.com -

smtp://user:password;options@mail.example.com -

At present only IMAP, POP3 and SMTP support login options as part of the host. For more information about the login options in URL syntax please see RFC 2384, RFC 5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). -

The port is optional and when not specified libcurl will use the default port based on the determined or specified protocol: 80 for HTTP, 21 for FTP and 25 for SMTP, etc. The following examples show how to specify the port: -

http://www.example.com:8080/ - This will connect to a web server using port 8080 rather than 80. -

smtp://mail.example.com:587/ - This will connect to a SMTP server on the alternative mail port. -

The path part of the URL is protocol specific and whilst some examples are given below this list is not conclusive: -

HTTP -

The path part of a HTTP request specifies the file to retrieve and from what directory. If the directory is not specified then the web server's root directory is used. If the file is omitted then the default document will be retrieved for either the directory specified or the root directory. The exact resource returned for each URL is entirely dependent on the server's configuration. -

http://www.example.com - This gets the main page from the web server. -

http://www.example.com/index.html - This returns the main page by explicitly requesting it. -

http://www.example.com/contactus/ - This returns the default document from the contactus directory. -

FTP -

The path part of an FTP request specifies the file to retrieve and from what directory. If the file part is omitted then libcurl downloads the directory listing for the directory specified. If the directory is omitted then the directory listing for the root / home directory will be returned. -

ftp://ftp.example.com - This retrieves the directory listing for the root directory. -

ftp://ftp.example.com/readme.txt - This downloads the file readme.txt from the root directory. -

ftp://ftp.example.com/libcurl/readme.txt - This downloads readme.txt from the libcurl directory. -

ftp://user:password@ftp.example.com/readme.txt - This retrieves the readme.txt file from the user's home directory. When a username and password is specified, everything that is specified in the path part is relative to the user's home directory. To retrieve files from the root directory or a directory underneath the root directory then the absolute path must be specified by prepending an additional forward slash to the beginning of the path. -

ftp://user:password@ftp.example.com//readme.txt - This retrieves the readme.txt from the root directory when logging in as a specified user. -

SMTP -

The path part of a SMTP request specifies the host name to present during communication with the mail server. If the path is omitted then libcurl will attempt to resolve the local computer's host name. However, this may not return the fully qualified domain name that is required by some mail servers and specifying this path allows you to set an alternative name, such as your machine's fully qualified domain name, which you might have obtained from an external function such as gethostname or getaddrinfo. -

smtp://mail.example.com - This connects to the mail server at example.com and sends your local computer's host name in the HELO / EHLO command. -

smtp://mail.example.com/client.example.com - This will send client.example.com in the HELO / EHLO command to the mail server at example.com. -

POP3 -

The path part of a POP3 request specifies the message ID to retrieve. If the ID is not specified then a list of waiting messages is returned instead. -

pop3://user:password@mail.example.com - This lists the available messages for the user -

pop3://user:password@mail.example.com/1 - This retrieves the first message for the user -

IMAP -

The path part of an IMAP request not only specifies the mailbox to list (Added in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the mailbox and to specify the UID and SECTION of the message to fetch (Added in 7.30.0). -

imap://user:password@mail.example.com - Performs a top level folder list -

imap://user:password@mail.example.com/INBOX - Performs a folder list on the user's inbox -

imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox and fetches message 1 -

imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches message 2 if it is -

imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the user's inbox and fetches message 3 with only the text portion of the message -

For more information about the individual components of an IMAP URL please see RFC 5092. -

SCP -

The path part of a SCP request specifies the file to retrieve and from what directory. The file part may not be omitted. The file is taken as an absolute path from the root directory on the server. To specify a path relative to the user's home directory on the server, prepend ~/ to the path portion. If the user name is not embedded in the URL, it can be set with the CURLOPT_USERPWD or CURLOPT_USERNAME option. -

scp://user@example.com/etc/issue - This specifies the file /etc/issue -

scp://example.com/~/my-file - This specifies the file my-file in the user's home directory on the server -

SFTP -

The path part of a SFTP request specifies the file to retrieve and from what directory. If the file part is omitted then libcurl downloads the directory listing for the directory specified. If the path ends in a / then a directory listing is returned instead of a file. If the path is omitted entirely then the directory listing for the root / home directory will be returned. If the user name is not embedded in the URL, it can be set with the CURLOPT_USERPWD or CURLOPT_USERNAME option. -

sftp://user:password@example.com/etc/issue - This specifies the file /etc/issue -

sftp://user@example.com/~/my-file - This specifies the file my-file in the user's home directory -

sftp://ssh.example.com/~/Documents/ - This requests a directory listing of the Documents directory under the user's home directory -

LDAP -

The path part of a LDAP request can be used to specify the: Distinguished Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field is separated by a question mark and when that field is not required an empty string with the question mark separator should be included. -

ldap://ldap.example.com/o=My%20Organisation - This will perform a LDAP search with the DN as My Organisation. -

ldap://ldap.example.com/o=My%20Organisation?postalAddress - This will perform the same search but will only return postalAddress attributes. -

ldap://ldap.example.com/?rootDomainNamingContext - This specifies an empty DN and requests information about the rootDomainNamingContext attribute for an Active Directory server. -

For more information about the individual components of a LDAP URL please see RFC 4516. -

NOTES -

Starting with version 7.20.0, the fragment part of the URI will not be sent as part of the path, which was previously the case. -

CURLOPT_URL is the only option that must be set before curl_easy_perform(3) is called. -

CURLOPT_PROTOCOLS can be used to limit what protocols libcurl will use for this transfer, independent of what libcurl has been compiled to support. That may be useful if you accept the URL from an external source and want to limit the accessibility. +

URL to work on. See CURLOPT_URL(3)

CURLOPT_PROTOCOLS -

Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask limits what protocols libcurl may use in the transfer. This allows you to have a libcurl built to support a wide range of protocols but still limit specific transfers to only be allowed to use a subset of them. By default libcurl will accept all protocols it supports. See also CURLOPT_REDIR_PROTOCOLS. (Added in 7.19.4) +

Allowed protocols. See CURLOPT_PROTOCOLS(3)

CURLOPT_REDIR_PROTOCOLS -

Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask limits what protocols libcurl may use in a transfer that it follows to in a redirect when CURLOPT_FOLLOWLOCATION is enabled. This allows you to limit specific transfers to only be allowed to use a subset of protocols in redirections. By default libcurl will allow all protocols except for FILE and SCP. This is a difference compared to pre-7.19.4 versions which unconditionally would follow to all protocols supported. (Added in 7.19.4) +

Protocols to allow redirects to. See CURLOPT_REDIR_PROTOCOLS(3)

CURLOPT_PROXY -

Set HTTP proxy to use. The parameter should be a char * to a zero terminated string holding the host name or dotted IP address. To specify port number in this string, append :[port] to the end of the host name. The proxy string may be prefixed with [protocol]:// since any such prefix will be ignored. The proxy's port number may optionally be specified with the separate option. If not specified, libcurl will default to using port 1080 for proxies. CURLOPT_PROXYPORT. -

When you tell the library to use a HTTP proxy, libcurl will transparently convert operations to HTTP even if you specify an FTP URL etc. This may have an impact on what other features of the library you can use, such as CURLOPT_QUOTE and similar FTP specifics that don't work unless you tunnel through the HTTP proxy. Such tunneling is activated with CURLOPT_HTTPPROXYTUNNEL. -

libcurl respects the environment variables http_proxy, ftp_proxy, all_proxy etc, if any of those are set. The CURLOPT_PROXY option does however override any possibly set environment variables. -

Setting the proxy string to "" (an empty string) will explicitly disable the use of a proxy, even if there is an environment variable set for it. -

Since 7.14.1, the proxy host string given in environment variables can be specified the exact same way as the proxy can be set with CURLOPT_PROXY, include protocol prefix (http://) and embedded user + password. -

Since 7.21.7, the proxy string may be specified with a protocol:// prefix to specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or socks5h:// (the last one to enable socks5 and asking the proxy to do the resolving, also known as CURLPROXY_SOCKS5_HOSTNAME type) to request the specific SOCKS version to be used. No protocol specified, http:// and all others will be treated as HTTP proxies. +

Proxy to use. See CURLOPT_PROXY(3)

CURLOPT_PROXYPORT -

Pass a long with this option to set the proxy port to connect to unless it is specified in the proxy string CURLOPT_PROXY. +

Proxy port to use. See CURLOPT_PROXYPORT(3)

CURLOPT_PROXYTYPE -

Pass a long with this option to set type of the proxy. Available options for this are CURLPROXY_HTTP, CURLPROXY_HTTP_1_0 (added in 7.19.4), CURLPROXY_SOCKS4 (added in 7.10), CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A (added in 7.18.0) and CURLPROXY_SOCKS5_HOSTNAME (added in 7.18.0). The HTTP type is default. (Added in 7.10) -

If you set CURLOPT_PROXYTYPE to CURLPROXY_HTTP_1_0, it will only affect how libcurl speaks to a proxy when CONNECT is used. The HTTP version used for "regular" HTTP requests is instead controlled with CURLOPT_HTTP_VERSION. +

Proxy type. See CURLOPT_PROXYTYPE(3)

CURLOPT_NOPROXY -

Pass a pointer to a zero terminated string. The string consists of a comma separated list of host names that do not require a proxy to get reached, even if one is specified. The only wildcard available is a single * character, which matches all hosts, and effectively disables the proxy. Each name in this list is matched as either a domain which contains the hostname, or the hostname itself. For example, example.com would match example.com, example.com:80, and www.example.com, but not www.notanexample.com. (Added in 7.19.4) +

Filter out hosts from proxy use. CURLOPT_NOPROXY(3)

CURLOPT_HTTPPROXYTUNNEL -

Set the parameter to 1 to make the library tunnel all operations through a given HTTP proxy. There is a big difference between using a proxy and to tunnel through it. If you don't know what this means, you probably don't want this tunneling option. +

Tunnel through the HTTP proxy. CURLOPT_HTTPPROXYTUNNEL(3)

CURLOPT_SOCKS5_GSSAPI_SERVICE -

Pass a char * as parameter to a string holding the name of the service. The default service name for a SOCKS5 server is rcmd/server-fqdn. This option allows you to change it. (Added in 7.19.4) +

Socks5 GSSAPI service name. CURLOPT_SOCKS5_GSSAPI_SERVICE(3)

CURLOPT_SOCKS5_GSSAPI_NEC -

Pass a long set to 1 to enable or 0 to disable. As part of the gssapi negotiation a protection mode is negotiated. The RFC 1961 says in section 4.3/4.4 it should be protected, but the NEC reference implementation does not. If enabled, this option allows the unprotected exchange of the protection mode negotiation. (Added in 7.19.4). +

Socks5 GSSAPI NEC mode. See CURLOPT_SOCKS5_GSSAPI_NEC(3)

CURLOPT_INTERFACE -

Pass a char * as parameter. This sets the interface name to use as outgoing network interface. The name can be an interface name, an IP address, or a host name. -

Starting with 7.24.0: If the parameter starts with "if!" then it is treated as only as interface name and no attempt will ever be named to do treat it as an IP address or to do name resolution on it. If the parameter starts with "host!" it is treated as either an IP address or a hostname. Hostnames are resolved synchronously. Using the if! format is highly recommended when using the multi interfaces to avoid allowing the code to block. If "if!" is specified but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED is returned. +

Bind connection locally to this. See CURLOPT_INTERFACE(3)

CURLOPT_LOCALPORT -

Pass a long. This sets the local port number of the socket used for connection. This can be used in combination with CURLOPT_INTERFACE and you are recommended to use CURLOPT_LOCALPORTRANGE as well when this is set. Valid port numbers are 1 - 65535. (Added in 7.15.2) +

Bind connection locally to this port. See CURLOPT_LOCALPORT(3)

CURLOPT_LOCALPORTRANGE -

Pass a long. This is the number of attempts libcurl will make to find a working local port number. It starts with the given CURLOPT_LOCALPORT and adds one to the number for each retry. Setting this to 1 or below will make libcurl do only one try for the exact port number. Port numbers by nature are scarce resources that will be busy at times so setting this value to something too low might cause unnecessary connection setup failures. (Added in 7.15.2) +

Bind connection locally to port range. See CURLOPT_LOCALPORTRANGE(3)

CURLOPT_DNS_CACHE_TIMEOUT -

Pass a long, this sets the timeout in seconds. Name resolves will be kept in memory for this number of seconds. Set to zero to completely disable caching, or set to -1 to make the cached entries remain forever. By default, libcurl caches this info for 60 seconds. -

The name resolve functions of various libc implementations don't re-read name server information unless explicitly told so (for example, by calling res_init(3)). This may cause libcurl to keep using the older server even if DHCP has updated the server info, and this may look like a DNS cache issue to the casual libcurl-app user. +

Timeout for DNS cache. See CURLOPT_DNS_CACHE_TIMEOUT(3)

CURLOPT_DNS_USE_GLOBAL_CACHE -

Pass a long. If the value is 1, it tells curl to use a global DNS cache that will survive between easy handle creations and deletions. This is not thread-safe and this will use a global variable. -

WARNING: this option is considered obsolete. Stop using it. Switch over to using the share interface instead! See CURLOPT_SHARE and curl_share_init(3). +

OBSOLETE Enable global DNS cache. See CURLOPT_DNS_USE_GLOBAL_CACHE(3)

CURLOPT_BUFFERSIZE -

Pass a long specifying your preferred size (in bytes) for the receive buffer in libcurl. The main point of this would be that the write callback gets called more often and with smaller chunks. This is just treated as a request, not an order. You cannot be guaranteed to actually get the given size. (Added in 7.10) -

This size is by default set as big as possible (CURL_MAX_WRITE_SIZE), so it only makes sense to use this option if you want it smaller. +

Ask for smaller buffer size. See CURLOPT_BUFFERSIZE(3)

CURLOPT_PORT -

Pass a long specifying what remote port number to connect to, instead of the one specified in the URL or the default port for the used protocol. +

Port number to connect to. See CURLOPT_PORT(3)

CURLOPT_TCP_NODELAY -

Pass a long specifying whether the TCP_NODELAY option is to be set or cleared (1 = set, 0 = clear). The option is cleared by default. This will have no effect after the connection has been established. -

Setting this option will disable TCP's Nagle algorithm. The purpose of this algorithm is to try to minimize the number of small packets on the network (where "small packets" means TCP segments less than the Maximum Segment Size (MSS) for the network). -

Maximizing the amount of data sent per TCP segment is good because it amortizes the overhead of the send. However, in some cases (most notably telnet or rlogin) small segments may need to be sent without delay. This is less efficient than sending larger amounts of data at a time, and can contribute to congestion on the network if overdone. +

Disable the Nagle algorithm. See CURLOPT_TCP_NODELAY(3)

CURLOPT_ADDRESS_SCOPE -

Pass a long specifying the scope_id value to use when connecting to IPv6 link-local or site-local addresses. (Added in 7.19.0) +

IPv6 scope for local addresses. See CURLOPT_ADDRESS_SCOPE(3)

CURLOPT_TCP_KEEPALIVE -

Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and frequency of these probes can be controlled by the CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL options, provided the operating system supports them. Set to 0 (default behavior) to disable keepalive probes (Added in 7.25.0). +

Enable TCP keep-alive. See CURLOPT_TCP_KEEPALIVE(3)

CURLOPT_TCP_KEEPIDLE -

Pass a long. Sets the delay, in seconds, that the operating system will wait while the connection is idle before sending keepalive probes. Not all operating systems support this option. (Added in 7.25.0) +

Idle time before sending keep-alive. See CURLOPT_TCP_KEEPIDLE(3)

CURLOPT_TCP_KEEPINTVL -

Pass a long. Sets the interval, in seconds, that the operating system will wait between sending keepalive probes. Not all operating systems support this option. (Added in 7.25.0)

NAMES and PASSWORDS OPTIONS (Authentication)

+

Interval between keep-alive probes. See CURLOPT_TCP_KEEPINTVL(3) +

CURLOPT_UNIX_SOCKET_PATH +

Path to a Unix domain socket. See CURLOPT_UNIX_SOCKET_PATH(3)

NAMES and PASSWORDS OPTIONS (Authentication)

CURLOPT_NETRC -

This parameter controls the preference of libcurl between using user names and passwords from your ~/.netrc file, relative to user names and passwords in the URL supplied with CURLOPT_URL. -

libcurl uses a user name (and supplied or prompted password) supplied with CURLOPT_USERPWD in preference to any of the options controlled by this parameter. -

Pass a long, set to one of the values described below. -

-

CURL_NETRC_OPTIONAL -

The use of your ~/.netrc file is optional, and information in the URL is to be preferred. The file will be scanned for the host and user name (to find the password only) or for the host only, to find the first user name and password after that machine, which ever information is not specified in the URL. -

Undefined values of the option will have this effect. -

CURL_NETRC_IGNORED -

The library will ignore the file and use only the information in the URL. -

This is the default. -

CURL_NETRC_REQUIRED -

This value tells the library that use of the file is required, to ignore the information in the URL, and to search the file for the host only. -

Only machine name, user name and password are taken into account (init macros and similar things aren't supported). -

libcurl does not verify that the file has the correct properties set (as the standard Unix ftp client does). It should only be readable by user. +

Enable .netrc parsing. See CURLOPT_NETRC(3)

CURLOPT_NETRC_FILE -

Pass a char * as parameter, pointing to a zero terminated string containing the full path name to the file you want libcurl to use as .netrc file. If this option is omitted, and CURLOPT_NETRC is set, libcurl will attempt to find a .netrc file in the current user's home directory. (Added in 7.10.9) +

.netrc file name. See CURLOPT_NETRC_FILE(3)

CURLOPT_USERPWD -

Pass a char * as parameter, pointing to a zero terminated login details string for the connection. The format of which is: [user name]:[password];[options]. -

When using NTLM, you can set the domain by prepending it to the user name and separating the domain and name with a forward (/) or backward slash (\). Like this: "domain/user:password" or "domain\user:password". Some HTTP servers (on Windows) support this style even for Basic authentication. -

When using HTTP and CURLOPT_FOLLOWLOCATION, libcurl might perform several requests to possibly different hosts. libcurl will only send this user and password information to hosts using the initial host name (unless CURLOPT_UNRESTRICTED_AUTH is set), so if libcurl follows locations to other hosts it will not send the user and password to those. This is enforced to prevent accidental information leakage. -

At present only IMAP, POP3 and SMTP support login options as part of the details string. For more information about the login options please see RFC 2384, RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). -

Use CURLOPT_HTTPAUTH to specify the authentication method for HTTP based connections. +

User name and password. See CURLOPT_USERPWD(3)

CURLOPT_PROXYUSERPWD -

Pass a char * as parameter, which should be [user name]:[password] to use for the connection to the HTTP proxy. -

Use CURLOPT_PROXYAUTH to specify the authentication method. +

Proxy user name and password. See CURLOPT_PROXYUSERPWD(3)

CURLOPT_USERNAME -

Pass a char * as parameter, which should be pointing to the zero terminated user name to use for the transfer. -

CURLOPT_USERNAME sets the user name to be used in protocol authentication. You should not use this option together with the (older) CURLOPT_USERPWD option. -

In order to specify the password to be used in conjunction with the user name use the CURLOPT_PASSWORD option. (Added in 7.19.1) +

User name. See CURLOPT_USERNAME(3)

CURLOPT_PASSWORD -

Pass a char * as parameter, which should be pointing to the zero terminated password to use for the transfer. -

The CURLOPT_PASSWORD option should be used in conjunction with the CURLOPT_USERNAME option. (Added in 7.19.1) +

Password. See CURLOPT_PASSWORD(3) +

CURLOPT_LOGIN_OPTIONS +

Login options. See CURLOPT_LOGIN_OPTIONS(3)

CURLOPT_PROXYUSERNAME -

Pass a char * as parameter, which should be pointing to the zero terminated user name to use for the transfer while connecting to Proxy. -

The CURLOPT_PROXYUSERNAME option should be used in same way as the CURLOPT_PROXYUSERPWD is used. In comparison to CURLOPT_PROXYUSERPWD the CURLOPT_PROXYUSERNAME allows the username to contain a colon, like in the following example: "sip:user@example.com". The CURLOPT_PROXYUSERNAME option is an alternative way to set the user name while connecting to Proxy. There is no meaning to use it together with the CURLOPT_PROXYUSERPWD option. -

In order to specify the password to be used in conjunction with the user name use the CURLOPT_PROXYPASSWORD option. (Added in 7.19.1) +

Proxy user name. See CURLOPT_PROXYUSERNAME(3)

CURLOPT_PROXYPASSWORD -

Pass a char * as parameter, which should be pointing to the zero terminated password to use for the transfer while connecting to Proxy. -

The CURLOPT_PROXYPASSWORD option should be used in conjunction with the CURLOPT_PROXYUSERNAME option. (Added in 7.19.1) +

Proxy password. See CURLOPT_PROXYPASSWORD(3)

CURLOPT_HTTPAUTH -

Pass a long as parameter, which is set to a bitmask, to tell libcurl which authentication method(s) you want it to use. The available bits are listed below. If more than one bit is set, libcurl will first query the site to see which authentication methods it supports and then pick the best one you allow it to use. For some methods, this will induce an extra network round-trip. Set the actual name and password with the CURLOPT_USERPWD option or with the CURLOPT_USERNAME and the CURLOPT_PASSWORD options. (Added in 7.10.6) -

-

CURLAUTH_BASIC -

HTTP Basic authentication. This is the default choice, and the only method that is in wide-spread use and supported virtually everywhere. This sends the user name and password over the network in plain text, easily captured by others. -

CURLAUTH_DIGEST -

HTTP Digest authentication. Digest authentication is defined in RFC 2617 and is a more secure way to do authentication over public networks than the regular old-fashioned Basic method. -

CURLAUTH_DIGEST_IE -

HTTP Digest authentication with an IE flavor. Digest authentication is defined in RFC 2617 and is a more secure way to do authentication over public networks than the regular old-fashioned Basic method. The IE flavor is simply that libcurl will use a special "quirk" that IE is known to have used before version 7 and that some servers require the client to use. (This define was added in 7.19.3) -

CURLAUTH_GSSNEGOTIATE -

HTTP GSS-Negotiate authentication. The GSS-Negotiate (also known as plain "Negotiate") method was designed by Microsoft and is used in their web applications. It is primarily meant as a support for Kerberos5 authentication but may also be used along with other authentication methods. For more information see IETF draft draft-brezak-spnego-http-04.txt. -

You need to build libcurl with a suitable GSS-API library for this to work. -

CURLAUTH_NTLM -

HTTP NTLM authentication. A proprietary protocol invented and used by Microsoft. It uses a challenge-response and hash concept similar to Digest, to prevent the password from being eavesdropped. -

You need to build libcurl with either OpenSSL, GnuTLS or NSS support for this option to work, or build libcurl on Windows with SSPI support. -

CURLAUTH_NTLM_WB -

NTLM delegating to winbind helper. Authentication is performed by a separate binary application that is executed when needed. The name of the application is specified at compile time but is typically /usr/bin/ntlm_auth (Added in 7.22.0) -

Note that libcurl will fork when necessary to run the winbind application and kill it when complete, calling waitpid() to await its exit when done. On POSIX operating systems, killing the process will cause a SIGCHLD signal to be raised (regardless of whether CURLOPT_NOSIGNAL is set), which must be handled intelligently by the application. In particular, the application must not unconditionally call wait() in its SIGCHLD signal handler to avoid being subject to a race condition. This behavior is subject to change in future versions of libcurl. -

CURLAUTH_ANY -

This is a convenience macro that sets all bits and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. -

CURLAUTH_ANYSAFE -

This is a convenience macro that sets all bits except Basic and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. -

CURLAUTH_ONLY -

This is a meta symbol. Or this value together with a single specific auth value to force libcurl to probe for un-restricted auth and if not, only that single auth algorithm is acceptable. (Added in 7.21.3) -

-

CURLOPT_TLSAUTH_TYPE -

Pass a long as parameter, which is set to a bitmask, to tell libcurl which authentication method(s) you want it to use for TLS authentication. -

-

CURLOPT_TLSAUTH_SRP -

TLS-SRP authentication. Secure Remote Password authentication for TLS is defined in RFC 5054 and provides mutual authentication if both sides have a shared secret. To use TLS-SRP, you must also set the CURLOPT_TLSAUTH_USERNAME and CURLOPT_TLSAUTH_PASSWORD options. -

You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this to work. (Added in 7.21.4) -

+

HTTP server authentication methods. See CURLOPT_HTTPAUTH(3)

CURLOPT_TLSAUTH_USERNAME -

Pass a char * as parameter, which should point to the zero terminated username to use for the TLS authentication method specified with the CURLOPT_TLSAUTH_TYPE option. Requires that the CURLOPT_TLS_PASSWORD option also be set. (Added in 7.21.4) +

TLS authentication user name. See CURLOPT_TLSAUTH_USERNAME(3)

CURLOPT_TLSAUTH_PASSWORD -

Pass a char * as parameter, which should point to the zero terminated password to use for the TLS authentication method specified with the CURLOPT_TLSAUTH_TYPE option. Requires that the CURLOPT_TLS_USERNAME option also be set. (Added in 7.21.4) +

TLS authentication password. See CURLOPT_TLSAUTH_PASSWORD(3)

CURLOPT_PROXYAUTH -

Pass a long as parameter, which is set to a bitmask, to tell libcurl which authentication method(s) you want it to use for your proxy authentication. If more than one bit is set, libcurl will first query the site to see what authentication methods it supports and then pick the best one you allow it to use. For some methods, this will induce an extra network round-trip. Set the actual name and password with the CURLOPT_PROXYUSERPWD option. The bitmask can be constructed by or'ing together the bits listed above for the CURLOPT_HTTPAUTH option. As of this writing, only Basic, Digest and NTLM work. (Added in 7.10.7) +

HTTP proxy authentication methods. See CURLOPT_PROXYAUTH(3)

CURLOPT_SASL_IR -

Pass a long. If the value is 1, curl will send the initial response to the server in the first authentication packet in order to reduce the number of ping pong requests. Only applicable to supporting SASL authentication mechanisms and to the IMAP, POP3 and SMTP protocols. (Added in 7.31.0) -

Note: Whilst IMAP supports this option there is no need to explicitly set it, as libcurl can determine the feature itself when the server supports the SASL-IR CAPABILITY.

HTTP OPTIONS

+

Enable SASL initial response. See CURLOPT_SASL_IR(3) +

CURLOPT_XOAUTH2_BEARER +

OAuth2 bearer token. See CURLOPT_XOAUTH2_BEARER(3)

HTTP OPTIONS

CURLOPT_AUTOREFERER -

Pass a parameter set to 1 to enable this. When enabled, libcurl will automatically set the Referer: field in requests where it follows a Location: redirect. +

Automatically set Referer: header. See CURLOPT_AUTOREFERER(3)

CURLOPT_ACCEPT_ENCODING -

Sets the contents of the Accept-Encoding: header sent in a HTTP request, and enables decoding of a response when a Content-Encoding: header is received. Three encodings are supported: identity, which does nothing, deflate which requests the server to compress its response using the zlib algorithm, and gzip which requests the gzip algorithm. If a zero-length string is set, then an Accept-Encoding: header containing all supported encodings is sent. -

This is a request, not an order; the server may or may not do it. This option must be set (to any non-NULL value) or else any unsolicited encoding done by the server is ignored. See the special file lib/README.encoding for details. -

(This option was called CURLOPT_ENCODING before 7.21.6) +

Accept-Encoding and automatic decompressing data. See CURLOPT_ACCEPT_ENCODING(3)

CURLOPT_TRANSFER_ENCODING -

Adds a request for compressed Transfer Encoding in the outgoing HTTP request. If the server supports this and so desires, it can respond with the HTTP response sent using a compressed Transfer-Encoding that will be automatically uncompressed by libcurl on reception. -

Transfer-Encoding differs slightly from the Content-Encoding you ask for with CURLOPT_ACCEPT_ENCODING in that a Transfer-Encoding is strictly meant to be for the transfer and thus MUST be decoded before the data arrives in the client. Traditionally, Transfer-Encoding has been much less used and supported by both HTTP clients and HTTP servers. -

(Added in 7.21.6) +

Request Transfer-Encoding. See CURLOPT_TRANSFER_ENCODING(3)

CURLOPT_FOLLOWLOCATION -

A parameter set to 1 tells the library to follow any Location: header that the server sends as part of a HTTP header. -

This means that the library will re-send the same request on the new location and follow new Location: headers all the way until no more such headers are returned. CURLOPT_MAXREDIRS can be used to limit the number of redirects libcurl will follow. -

Since 7.19.4, libcurl can limit what protocols it will automatically follow. The accepted protocols are set with CURLOPT_REDIR_PROTOCOLS and it excludes the FILE protocol by default. +

Follow HTTP redirects. See CURLOPT_FOLLOWLOCATION(3)

CURLOPT_UNRESTRICTED_AUTH -

A parameter set to 1 tells the library it can continue to send authentication (user+password) when following locations, even when hostname changed. This option is meaningful only when setting CURLOPT_FOLLOWLOCATION. +

Do not restrict authentication to original host. CURLOPT_UNRESTRICTED_AUTH(3)

CURLOPT_MAXREDIRS -

Pass a long. The set number will be the redirection limit. If that many redirections have been followed, the next redirect will cause an error (CURLE_TOO_MANY_REDIRECTS). This option only makes sense if the CURLOPT_FOLLOWLOCATION is used at the same time. Added in 7.15.1: Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for an infinite number of redirects (which is the default) +

Maximum number of redirects to follow. See CURLOPT_MAXREDIRS(3)

CURLOPT_POSTREDIR -

Pass a bitmask to control how libcurl acts on redirects after POSTs that get a 301, 302 or 303 response back. A parameter with bit 0 set (value CURL_REDIR_POST_301) tells the library to respect RFC 2616/10.3.2 and not convert POST requests into GET requests when following a 301 redirection. Setting bit 1 (value CURL_REDIR_POST_302) makes libcurl maintain the request method after a 302 redirect whilst setting bit 2 (value CURL_REDIR_POST_303) makes libcurl maintain the request method after a 303 redirect. The value CURL_REDIR_POST_ALL is a convenience define that sets all three bits. -

The non-RFC behaviour is ubiquitous in web browsers, so the library does the conversion by default to maintain consistency. However, a server may require a POST to remain a POST after such a redirection. This option is meaningful only when setting CURLOPT_FOLLOWLOCATION. (Added in 7.17.1) (This option was known as CURLOPT_POST301 up to 7.19.0 as it only supported the 301 then) +

How to act on redirects after POST. See CURLOPT_POSTREDIR(3)

CURLOPT_PUT -

A parameter set to 1 tells the library to use HTTP PUT to transfer data. The data should be set with CURLOPT_READDATA and CURLOPT_INFILESIZE. -

This option is deprecated and starting with version 7.12.1 you should instead use CURLOPT_UPLOAD. +

Issue a HTTP PUT request. See CURLOPT_PUT(3)

CURLOPT_POST -

A parameter set to 1 tells the library to do a regular HTTP post. This will also make the library use a "Content-Type: application/x-www-form-urlencoded" header. (This is by far the most commonly used POST method). -

Use one of CURLOPT_POSTFIELDS or CURLOPT_COPYPOSTFIELDS options to specify what data to post and CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE to set the data size. -

Optionally, you can provide data to POST using the CURLOPT_READFUNCTION and CURLOPT_READDATA options but then you must make sure to not set CURLOPT_POSTFIELDS to anything but NULL. When providing data with a callback, you must transmit it using chunked transfer-encoding or you must set the size of the data with the CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE option. To enable chunked encoding, you simply pass in the appropriate Transfer-Encoding header, see the post-callback.c example. -

You can override the default POST Content-Type: header by setting your own with CURLOPT_HTTPHEADER. -

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. -

If you use POST to a HTTP 1.1 server, you can send data without knowing the size before starting the POST if you use chunked encoding. You enable this by adding a header like "Transfer-Encoding: chunked" with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size in the request. -

When setting CURLOPT_POST to 1, it will automatically set CURLOPT_NOBODY to 0 (since 7.14.1). -

If you issue a POST request and then want to make a HEAD or GET using the same re-used handle, you must explicitly set the new request type using CURLOPT_NOBODY or CURLOPT_HTTPGET or similar. +

Issue a HTTP POST request. See CURLOPT_POST(3)

CURLOPT_POSTFIELDS -

Pass a void * as parameter, which should be the full data to post in a HTTP POST operation. You must make sure that the data is formatted the way you want the server to receive it. libcurl will not convert or encode it for you. Most web servers will assume this data to be url-encoded. -

The pointed data are NOT copied by the library: as a consequence, they must be preserved by the calling application until the transfer finishes. -

This POST is a normal application/x-www-form-urlencoded kind (and libcurl will set that Content-Type by default when this option is used), which is the most commonly used one by HTML forms. See also the CURLOPT_POST. Using CURLOPT_POSTFIELDS implies CURLOPT_POST. -

If you want to do a zero-byte POST, you need to set CURLOPT_POSTFIELDSIZE explicitly to zero, as simply setting CURLOPT_POSTFIELDS to NULL or "" just effectively disables the sending of the specified string. libcurl will instead assume that you'll send the POST data using the read callback! -

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. -

To make multipart/formdata posts (aka RFC 2388-posts), check out the CURLOPT_HTTPPOST option. +

Send a POST with this data. See CURLOPT_POSTFIELDS(3)

CURLOPT_POSTFIELDSIZE -

If you want to post data to the server without letting libcurl do a strlen() to measure the data size, this option must be used. When this option is used you can post fully binary data, which otherwise is likely to fail. If this size is set to -1, the library will use strlen() to get the size. +

The POST data is this big. See CURLOPT_POSTFIELDSIZE(3)

CURLOPT_POSTFIELDSIZE_LARGE -

Pass a curl_off_t as parameter. Use this to set the size of the CURLOPT_POSTFIELDS data to prevent libcurl from doing strlen() on the data to figure out the size. This is the large file version of the CURLOPT_POSTFIELDSIZE option. (Added in 7.11.1) +

The POST data is this big. See CURLOPT_POSTFIELDSIZE_LARGE(3)

CURLOPT_COPYPOSTFIELDS -

Pass a char * as parameter, which should be the full data to post in a HTTP POST operation. It behaves as the CURLOPT_POSTFIELDS option, but the original data are copied by the library, allowing the application to overwrite the original data after setting this option. -

Because data are copied, care must be taken when using this option in conjunction with CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE: If the size has not been set prior to CURLOPT_COPYPOSTFIELDS, the data are assumed to be a NUL-terminated string; else the stored size informs the library about the data byte count to copy. In any case, the size must not be changed after CURLOPT_COPYPOSTFIELDS, unless another CURLOPT_POSTFIELDS or CURLOPT_COPYPOSTFIELDS option is issued. (Added in 7.17.1) +

Send a POST with this data - and copy it. See CURLOPT_COPYPOSTFIELDS(3)

CURLOPT_HTTPPOST -

Tells libcurl you want a multipart/formdata HTTP POST to be made and you instruct what data to pass on to the server. Pass a pointer to a linked list of curl_httppost structs as parameter. The easiest way to create such a list, is to use curl_formadd(3) as documented. The data in this list must remain intact until you close this curl handle again with curl_easy_cleanup(3). -

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. -

When setting CURLOPT_HTTPPOST, it will automatically set CURLOPT_NOBODY to 0 (since 7.14.1). +

Multipart formpost HTTP POST. See CURLOPT_HTTPPOST(3)

CURLOPT_REFERER -

Pass a pointer to a zero terminated string as parameter. It will be used to set the Referer: header in the http request sent to the remote server. This can be used to fool servers or scripts. You can also set any custom header with CURLOPT_HTTPHEADER. +

Referer: header. See CURLOPT_REFERER(3)

CURLOPT_USERAGENT -

Pass a pointer to a zero terminated string as parameter. It will be used to set the User-Agent: header in the http request sent to the remote server. This can be used to fool servers or scripts. You can also set any custom header with CURLOPT_HTTPHEADER. +

User-Agent: header. See CURLOPT_USERAGENT(3)

CURLOPT_HTTPHEADER -

Pass a pointer to a linked list of HTTP headers to pass to the server in your HTTP request. The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. If you add a header that is otherwise generated and used by libcurl internally, your added one will be used instead. If you add a header with no content as in 'Accept:' (no data on the right side of the colon), the internally used header will get disabled. Thus, using this option you can add new headers, replace internal headers and remove internal headers. To add a header with no content (nothing to the right side of the colon), use the form 'MyHeader;' (note the ending semicolon). -

The headers included in the linked list must not be CRLF-terminated, because curl adds CRLF after each header item. Failure to comply with this will result in strange bugs because the server will most likely ignore part of the headers you specified. -

The first line in a request (containing the method, usually a GET or POST) is not a header and cannot be replaced using this option. Only the lines following the request-line are headers. Adding this method line in this list of headers will only cause your request to send an invalid header. -

Pass a NULL to this to reset back to no custom headers. -

The most commonly replaced headers have "shortcuts" in the options CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER. +

Custom HTTP headers. See CURLOPT_HTTPHEADER(3) +

CURLOPT_HEADEROPT +

Control custom headers. See CURLOPT_HEADEROPT(3) +

CURLOPT_PROXYHEADER +

Custom HTTP headers sent to proxy. See CURLOPT_PROXYHEADER(3)

CURLOPT_HTTP200ALIASES -

Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 responses. Some servers respond with a custom header response line. For example, IceCast servers respond with "ICY 200 OK". By including this string in your list of aliases, the response will be treated as a valid HTTP header line such as "HTTP/1.0 200 OK". (Added in 7.10.3) -

The linked list should be a fully valid list of struct curl_slist structs, and be properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. -

The alias itself is not parsed for any version strings. Before libcurl 7.16.3, Libcurl used the value set by option CURLOPT_HTTP_VERSION, but starting with 7.16.3 the protocol is assumed to match HTTP 1.0 when an alias matched. +

Alternative versions of 200 OK. See CURLOPT_HTTP200ALIASES(3)

CURLOPT_COOKIE -

Pass a pointer to a zero terminated string as parameter. It will be used to set a cookie in the http request. The format of the string should be NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie should contain. -

If you need to set multiple cookies, you need to set them all using a single option and thus you need to concatenate them all in one single string. Set multiple cookies in one string like this: "name1=content1; name2=content2;" etc. -

This option sets the cookie header explicitly in the outgoing request(s). If multiple requests are done due to authentication, followed redirections or similar, they will all get this cookie passed on. -

Using this option multiple times will only make the latest string override the previous ones. +

Cookie(s) to send. See CURLOPT_COOKIE(3)

CURLOPT_COOKIEFILE -

Pass a pointer to a zero terminated string as parameter. It should contain the name of your file holding cookie data to read. The cookie data may be in Netscape / Mozilla cookie data format or just regular HTTP-style headers dumped to a file. -

Given an empty or non-existing file or by passing the empty string (""), this option will enable cookies for this curl handle, making it understand and parse received cookies and then use matching cookies in future requests. -

If you use this option multiple times, you just add more files to read. Subsequent files will add more cookies. +

File to read cookies from. See CURLOPT_COOKIEFILE(3)

CURLOPT_COOKIEJAR -

Pass a file name as char *, zero terminated. This will make libcurl write all internally known cookies to the specified file when curl_easy_cleanup(3) is called. If no cookies are known, no file will be created. Specify "-" to instead have the cookies written to stdout. Using this option also enables cookies for this session, so if you for example follow a location it will make matching cookies get sent accordingly. -

If the cookie jar file can't be created or written to (when the curl_easy_cleanup(3) is called), libcurl will not and cannot report an error for this. Using CURLOPT_VERBOSE or CURLOPT_DEBUGFUNCTION will get a warning to display, but that is the only visible feedback you get about this possibly lethal situation. +

File to write cookies to. See CURLOPT_COOKIEJAR(3)

CURLOPT_COOKIESESSION -

Pass a long set to 1 to mark this as a new cookie "session". It will force libcurl to ignore all cookies it is about to load that are "session cookies" from the previous session. By default, libcurl always stores and loads all cookies, independent if they are session cookies or not. Session cookies are cookies without expiry date and they are meant to be alive and existing for this "session" only. +

Start a new cookie session. See CURLOPT_COOKIESESSION(3)

CURLOPT_COOKIELIST -

Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL cookie engine was not enabled it will enable its cookie engine. Passing a magic string "ALL" will erase all cookies known by cURL. (Added in 7.14.1) Passing the special string "SESS" will only erase all session cookies known by cURL. (Added in 7.15.4) Passing the special string "FLUSH" will write all cookies known by cURL to the file specified by CURLOPT_COOKIEJAR. (Added in 7.17.1) +

Add or control cookies. See CURLOPT_COOKIELIST(3)

CURLOPT_HTTPGET -

Pass a long. If the long is 1, this forces the HTTP request to get back to GET. Usable if a POST, HEAD, PUT, or a custom request has been used previously using the same curl handle. -

When setting CURLOPT_HTTPGET to 1, it will automatically set CURLOPT_NOBODY to 0 and CURLOPT_UPLOAD to 0. +

Do a HTTP GET request. See CURLOPT_HTTPGET(3)

CURLOPT_HTTP_VERSION -

Pass a long, set to one of the values described below. They force libcurl to use the specific HTTP versions. This is not sensible to do unless you have a good reason. -

-

CURL_HTTP_VERSION_NONE -

We don't care about what version the library uses. libcurl will use whatever it thinks fit. -

CURL_HTTP_VERSION_1_0 -

Enforce HTTP 1.0 requests. -

CURL_HTTP_VERSION_1_1 -

Enforce HTTP 1.1 requests. -

+

HTTP version to use. CURLOPT_HTTP_VERSION(3)

CURLOPT_IGNORE_CONTENT_LENGTH -

Ignore the Content-Length header. This is useful for Apache 1.x (and similar servers) which will report incorrect content length for files over 2 gigabytes. If this option is used, curl will not be able to accurately report progress, and will simply stop the download when the server ends the connection. (added in 7.14.1) +

Ignore Content-Length. See CURLOPT_IGNORE_CONTENT_LENGTH(3)

CURLOPT_HTTP_CONTENT_DECODING -

Pass a long to tell libcurl how to act on content decoding. If set to zero, content decoding will be disabled. If set to 1 it is enabled. Libcurl has no default content decoding but requires you to use CURLOPT_ACCEPT_ENCODING for that. (added in 7.16.2) +

Disable Content decoding. See CURLOPT_HTTP_CONTENT_DECODING(3)

CURLOPT_HTTP_TRANSFER_DECODING -

Pass a long to tell libcurl how to act on transfer decoding. If set to zero, transfer decoding will be disabled, if set to 1 it is enabled (default). libcurl does chunked transfer decoding by default unless this option is set to zero. (added in 7.16.2)

SMTP OPTIONS

+

Disable Transfer decoding. See CURLOPT_HTTP_TRANSFER_DECODING(3) +

CURLOPT_EXPECT_100_TIMEOUT_MS +

100-continue timeout. See CURLOPT_EXPECT_100_TIMEOUT_MS(3)

SMTP OPTIONS

CURLOPT_MAIL_FROM -

Pass a pointer to a zero terminated string as parameter. This should be used to specify the sender's email address when sending SMTP mail with libcurl. -

An originator email address should be specified with angled brackets (<>) around it, which if not specified, will be added by libcurl from version 7.21.4 onwards. Failing to provide such brackets may cause the server to reject the email. -

If this parameter is not specified then an empty address will be sent to the mail server which may or may not cause the email to be rejected. -

(Added in 7.20.0) +

Address of the sender. See CURLOPT_MAIL_FROM(3)

CURLOPT_MAIL_RCPT -

Pass a pointer to a linked list of recipients to pass to the server in your SMTP mail request. The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. -

Each recipient should be specified within a pair of angled brackets (<>), however, should you not use an angled bracket as the first character libcurl will assume you provided a single email address and enclose that address within brackets for you. -

(Added in 7.20.0) +

Address of the recipients. See CURLOPT_MAIL_RCPT(3)

CURLOPT_MAIL_AUTH -

Pass a pointer to a zero terminated string as parameter. This will be used to specify the authentication address (identity) of a submitted message that is being relayed to another server. -

This optional parameter allows co-operating agents in a trusted environment to communicate the authentication of individual messages and should only be used by the application program, using libcurl, if the application is itself a mail server acting in such an environment. If the application is operating as such and the AUTH address is not known or is invalid, then an empty string should be used for this parameter. -

Unlike CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT, the address should not be specified within a pair of angled brackets (<>). However, if an empty string is used then a pair of brackets will be sent by libcurl as required by RFC 2554. -

(Added in 7.25.0)

TFTP OPTIONS

+

Authentication address. See CURLOPT_MAIL_AUTH(3)

TFTP OPTIONS

CURLOPT_TFTP_BLKSIZE -

Specify block size to use for TFTP data transmission. Valid range as per RFC 2348 is 8-65464 bytes. The default of 512 bytes will be used if this option is not specified. The specified block size will only be used pending support by the remote server. If the server does not return an option acknowledgement or returns an option acknowledgement with no blksize, the default of 512 bytes will be used. (added in 7.19.4)

FTP OPTIONS

+

TFTP block size. See CURLOPT_TFTP_BLKSIZE(3)

FTP OPTIONS

CURLOPT_FTPPORT -

Pass a pointer to a zero terminated string as parameter. It will be used to get the IP address to use for the FTP PORT instruction. The PORT instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a host name, a network interface name (under Unix) or just a '-' symbol to let the library use your system's default IP address. Default FTP operations are passive, and thus won't use PORT. -

The address can be followed by a ':' to specify a port, optionally followed by a '-' to specify a port range. If the port specified is 0, the operating system will pick a free port. If a range is provided and all ports in the range are not available, libcurl will report CURLE_FTP_PORT_FAILED for the handle. Invalid port/range settings are ignored. IPv6 addresses followed by a port or portrange have to be in brackets. IPv6 addresses without port/range specifier can be in brackets. (added in 7.19.5) -

Examples with specified ports: -

-

  eth0:0 -   192.168.1.2:32000-33000 -   curl.se:32123 -   [::1]:1234-4567 -

- -

-

You disable PORT again and go back to using the passive version by setting this option to NULL. +

Use active FTP. See CURLOPT_FTPPORT(3)

CURLOPT_QUOTE -

Pass a pointer to a linked list of FTP or SFTP commands to pass to the server prior to your FTP request. This will be done before any other commands are issued (even before the CWD command for FTP). The linked list should be a fully valid list of 'struct curl_slist' structs properly filled in with text strings. Use curl_slist_append(3) to append strings (commands) to the list, and clear the entire list afterwards with curl_slist_free_all(3). Disable this operation again by setting a NULL to this option. When speaking to a FTP (or SFTP since 7.24.0) server, prefix the command with an asterisk (*) to make libcurl continue even if the command fails as by default libcurl will stop at first failure. -

The set of valid FTP commands depends on the server (see RFC 959 for a list of mandatory commands). -

The valid SFTP commands are: chgrp, chmod, chown, ln, mkdir, pwd, rename, rm, rmdir, symlink (see curl (1)) (SFTP support added in 7.16.3) +

Commands to run before transfer. See CURLOPT_QUOTE(3)

CURLOPT_POSTQUOTE -

Pass a pointer to a linked list of FTP or SFTP commands to pass to the server after your FTP transfer request. The commands will only be run if no error occurred. The linked list should be a fully valid list of struct curl_slist structs properly filled in as described for CURLOPT_QUOTE. Disable this operation again by setting a NULL to this option. +

Commands to run after transfer. See CURLOPT_POSTQUOTE(3)

CURLOPT_PREQUOTE -

Pass a pointer to a linked list of FTP commands to pass to the server after the transfer type is set. The linked list should be a fully valid list of struct curl_slist structs properly filled in as described for CURLOPT_QUOTE. Disable this operation again by setting a NULL to this option. Before version 7.16.0, if you also set CURLOPT_NOBODY to 1, this option didn't work. -

CURLOPT_DIRLISTONLY -

A parameter set to 1 tells the library to just list the names of files in a directory, instead of doing a full directory listing that would include file sizes, dates etc. This works for FTP and SFTP URLs. -

This causes an FTP NLST command to be sent on an FTP server. Beware that some FTP servers list only files in their response to NLST; they might not include subdirectories and symbolic links. -

Setting this option to 1 also implies a directory listing even if the URL doesn't end with a slash, which otherwise is necessary. -

Do NOT use this option if you also use CURLOPT_WILDCARDMATCH as it will effectively break that feature then. -

(This option was known as CURLOPT_FTPLISTONLY up to 7.16.4) +

Commands to run just before transfer. See CURLOPT_PREQUOTE(3)

CURLOPT_APPEND -

A parameter set to 1 tells the library to append to the remote file instead of overwrite it. This is only useful when uploading to an FTP site. -

(This option was known as CURLOPT_FTPAPPEND up to 7.16.4) +

Append to remote file. See CURLOPT_APPEND(3)

CURLOPT_FTP_USE_EPRT -

Pass a long. If the value is 1, it tells curl to use the EPRT (and LPRT) command when doing active FTP downloads (which is enabled by CURLOPT_FTPPORT). Using EPRT means that it will first attempt to use EPRT and then LPRT before using PORT, but if you pass zero to this option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5) -

If the server is an IPv6 host, this option will have no effect as of 7.12.3. +

Use EPTR. See CURLOPT_FTP_USE_EPRT(3)

CURLOPT_FTP_USE_EPSV -

Pass a long. If the value is 1, it tells curl to use the EPSV command when doing passive FTP downloads (which it always does by default). Using EPSV means that it will first attempt to use EPSV before using PASV, but if you pass zero to this option, it will not try using EPSV, only plain PASV. -

If the server is an IPv6 host, this option will have no effect as of 7.12.3. +

Use EPSV. See CURLOPT_FTP_USE_EPSV(3)

CURLOPT_FTP_USE_PRET -

Pass a long. If the value is 1, it tells curl to send a PRET command before PASV (and EPSV). Certain FTP servers, mainly drftpd, require this non-standard command for directory listings as well as up and downloads in PASV mode. Has no effect when using the active FTP transfers mode. (Added in 7.20.0) +

Use PRET. See CURLOPT_FTP_USE_PRET(3)

CURLOPT_FTP_CREATE_MISSING_DIRS -

Pass a long. If the value is 1, curl will attempt to create any remote directory that it fails to CWD into. CWD is the command that changes working directory. (Added in 7.10.7) -

This setting also applies to SFTP-connections. curl will attempt to create the remote directory if it can't obtain a handle to the target-location. The creation will fail if a file of the same name as the directory to create already exists or lack of permissions prevents creation. (Added in 7.16.3) -

Starting with 7.19.4, you can also set this value to 2, which will make libcurl retry the CWD command again if the subsequent MKD command fails. This is especially useful if you're doing many simultaneous connections against the same server and they all have this option enabled, as then CWD may first fail but then another connection does MKD before this connection and thus MKD fails but trying CWD works! 7.19.4 also introduced the CURLFTP_CREATE_DIR and CURLFTP_CREATE_DIR_RETRY enum names for these arguments. -

Before version 7.19.4, libcurl will simply ignore arguments set to 2 and act as if 1 was selected. +

Create missing directories on the remote server. See CURLOPT_FTP_CREATE_MISSING_DIRS(3)

CURLOPT_FTP_RESPONSE_TIMEOUT -

Pass a long. Causes curl to set a timeout period (in seconds) on the amount of time that the server is allowed to take in order to generate a response message for a command before the session is considered hung. While curl is waiting for a response, this value overrides CURLOPT_TIMEOUT. It is recommended that if used in conjunction with CURLOPT_TIMEOUT, you set CURLOPT_FTP_RESPONSE_TIMEOUT to a value smaller than CURLOPT_TIMEOUT. (Added in 7.10.8) +

Timeout for FTP responses. See CURLOPT_FTP_RESPONSE_TIMEOUT(3)

CURLOPT_FTP_ALTERNATIVE_TO_USER -

Pass a char * as parameter, pointing to a string which will be used to authenticate if the usual FTP "USER user" and "PASS password" negotiation fails. This is currently only known to be required when connecting to Tumbleweed's Secure Transport FTPS server using client certificates for authentication. (Added in 7.15.5) +

Alternative to USER. See CURLOPT_FTP_ALTERNATIVE_TO_USER(3)

CURLOPT_FTP_SKIP_PASV_IP -

Pass a long. If set to 1, it instructs libcurl to not use the IP address the server suggests in its 227-response to libcurl's PASV command when libcurl connects the data connection. Instead libcurl will re-use the same IP address it already uses for the control connection. But it will use the port number from the 227-response. (Added in 7.14.2) -

This option has no effect if PORT, EPRT or EPSV is used instead of PASV. +

Ignore the IP address in the PASV response. See CURLOPT_FTP_SKIP_PASV_IP(3)

CURLOPT_FTPSSLAUTH -

Pass a long using one of the values from below, to alter how libcurl issues "AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see CURLOPT_USE_SSL). (Added in 7.12.2) -

-

CURLFTPAUTH_DEFAULT -

Allow libcurl to decide. -

CURLFTPAUTH_SSL -

Try "AUTH SSL" first, and only if that fails try "AUTH TLS". -

CURLFTPAUTH_TLS -

Try "AUTH TLS" first, and only if that fails try "AUTH SSL". -

+

Control how to do TLS. See CURLOPT_FTPSSLAUTH(3)

CURLOPT_FTP_SSL_CCC -

If enabled, this option makes libcurl use CCC (Clear Command Channel). It shuts down the SSL/TLS layer after authenticating. The rest of the control channel communication will be unencrypted. This allows NAT routers to follow the FTP transaction. Pass a long using one of the values below. (Added in 7.16.1) -

-

CURLFTPSSL_CCC_NONE -

Don't attempt to use CCC. -

CURLFTPSSL_CCC_PASSIVE -

Do not initiate the shutdown, but wait for the server to do it. Do not send a reply. -

CURLFTPSSL_CCC_ACTIVE -

Initiate the shutdown and wait for a reply. -

+

Back to non-TLS again after authentication. See CURLOPT_FTP_SSL_CCC(3)

CURLOPT_FTP_ACCOUNT -

Pass a pointer to a zero terminated string (or NULL to disable). When an FTP server asks for "account data" after user name and password has been provided, this data is sent off using the ACCT command. (Added in 7.13.0) +

Send ACCT command. See CURLOPT_FTP_ACCOUNT(3)

CURLOPT_FTP_FILEMETHOD -

Pass a long that should have one of the following values. This option controls what method libcurl should use to reach a file on a FTP(S) server. The argument should be one of the following alternatives: -

-

CURLFTPMETHOD_MULTICWD -

libcurl does a single CWD operation for each path part in the given URL. For deep hierarchies this means many commands. This is how RFC 1738 says it should be done. This is the default but the slowest behavior. -

CURLFTPMETHOD_NOCWD -

libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a full path to the server for all these commands. This is the fastest behavior. -

CURLFTPMETHOD_SINGLECWD -

libcurl does one CWD with the full target directory and then operates on the file "normally" (like in the multicwd case). This is somewhat more standards compliant than 'nocwd' but without the full penalty of 'multicwd'. -

(Added in 7.15.1)

RTSP OPTIONS

+

Specify how to reach files. See CURLOPT_FTP_FILEMETHOD(3)

RTSP OPTIONS

CURLOPT_RTSP_REQUEST -

Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP enum values. Unless noted otherwise, commands require the Session ID to be initialized. (Added in 7.20.0) -

-

CURL_RTSPREQ_OPTIONS -

Used to retrieve the available methods of the server. The application is responsible for parsing and obeying the response. (The session ID is not needed for this method.) (Added in 7.20.0) -

CURL_RTSPREQ_DESCRIBE -

Used to get the low level description of a stream. The application should note what formats it understands in the 'Accept:' header. Unless set manually, libcurl will automatically fill in 'Accept: application/sdp'. Time-condition headers will be added to Describe requests if the CURLOPT_TIMECONDITION option is active. (The session ID is not needed for this method) (Added in 7.20.0) -

CURL_RTSPREQ_ANNOUNCE -

When sent by a client, this method changes the description of the session. For example, if a client is using the server to record a meeting, the client can use Announce to inform the server of all the meta-information about the session. ANNOUNCE acts like a HTTP PUT or POST just like CURL_RTSPREQ_SET_PARAMETER (Added in 7.20.0) -

CURL_RTSPREQ_SETUP -

Setup is used to initialize the transport layer for the session. The application must set the desired Transport options for a session by using the CURLOPT_RTSP_TRANSPORT option prior to calling setup. If no session ID is currently set with CURLOPT_RTSP_SESSION_ID, libcurl will extract and use the session ID in the response to this request. (The session ID is not needed for this method). (Added in 7.20.0) -

CURL_RTSPREQ_PLAY -

Send a Play command to the server. Use the CURLOPT_RANGE option to modify the playback time (e.g. 'npt=10-15'). (Added in 7.20.0) -

CURL_RTSPREQ_PAUSE -

Send a Pause command to the server. Use the CURLOPT_RANGE option with a single value to indicate when the stream should be halted. (e.g. npt='25') (Added in 7.20.0) -

CURL_RTSPREQ_TEARDOWN -

This command terminates an RTSP session. Simply closing a connection does not terminate the RTSP session since it is valid to control an RTSP session over different connections. (Added in 7.20.0) -

CURL_RTSPREQ_GET_PARAMETER -

Retrieve a parameter from the server. By default, libcurl will automatically include a Content-Type: text/parameters header on all non-empty requests unless a custom one is set. GET_PARAMETER acts just like a HTTP PUT or POST (see CURL_RTSPREQ_SET_PARAMETER). Applications wishing to send a heartbeat message (e.g. in the presence of a server-specified timeout) should send use an empty GET_PARAMETER request. (Added in 7.20.0) -

CURL_RTSPREQ_SET_PARAMETER -

Set a parameter on the server. By default, libcurl will automatically include a Content-Type: text/parameters header unless a custom one is set. The interaction with SET_PARAMTER is much like a HTTP PUT or POST. An application may either use CURLOPT_UPLOAD with CURLOPT_READDATA like a HTTP PUT, or it may use CURLOPT_POSTFIELDS like a HTTP POST. No chunked transfers are allowed, so the application must set the CURLOPT_INFILESIZE in the former and CURLOPT_POSTFIELDSIZE in the latter. Also, there is no use of multi-part POSTs within RTSP. (Added in 7.20.0) -

CURL_RTSPREQ_RECORD -

Used to tell the server to record a session. Use the CURLOPT_RANGE option to modify the record time. (Added in 7.20.0) -

CURL_RTSPREQ_RECEIVE -

This is a special request because it does not send any data to the server. The application may call this function in order to receive interleaved RTP data. It will return after processing one read buffer of data in order to give the application a chance to run. (Added in 7.20.0) -

+

RTSP request. See CURLOPT_RTSP_REQUEST(3)

CURLOPT_RTSP_SESSION_ID -

Pass a char * as a parameter to set the value of the current RTSP Session ID for the handle. Useful for resuming an in-progress session. Once this value is set to any non-NULL value, libcurl will return CURLE_RTSP_SESSION_ERROR if ID received from the server does not match. If unset (or set to NULL), libcurl will automatically set the ID the first time the server sets it in a response. (Added in 7.20.0) +

RTSP session-id. See CURLOPT_RTSP_SESSION_ID(3)

CURLOPT_RTSP_STREAM_URI -

Set the stream URI to operate on by passing a char * . For example, a single session may be controlling rtsp://foo/twister/audio and rtsp://foo/twister/video and the application can switch to the appropriate stream using this option. If unset, libcurl will default to operating on generic server options by passing '*' in the place of the RTSP Stream URI. This option is distinct from CURLOPT_URL. When working with RTSP, the CURLOPT_STREAM_URI indicates what URL to send to the server in the request header while the CURLOPT_URL indicates where to make the connection to. (e.g. the CURLOPT_URL for the above examples might be set to rtsp://foo/twister (Added in 7.20.0) +

RTSP stream URI. See CURLOPT_RTSP_STREAM_URI(3)

CURLOPT_RTSP_TRANSPORT -

Pass a char * to tell libcurl what to pass for the Transport: header for this RTSP session. This is mainly a convenience method to avoid needing to set a custom Transport: header for every SETUP request. The application must set a Transport: header before issuing a SETUP request. (Added in 7.20.0) -

CURLOPT_RTSP_HEADER -

This option is simply an alias for CURLOPT_HTTP_HEADER. Use this to replace the standard headers that RTSP and HTTP share. It is also valid to use the shortcuts such as CURLOPT_USERAGENT. (Added in 7.20.0) +

RTSP Transport: header. See CURLOPT_RTSP_TRANSPORT(3)

CURLOPT_RTSP_CLIENT_CSEQ -

Manually set the the CSEQ number to issue for the next RTSP request. Useful if the application is resuming a previously broken connection. The CSEQ will increment from this new number henceforth. (Added in 7.20.0) +

Client CSEQ number. See CURLOPT_RTSP_CLIENT_CSEQ(3)

CURLOPT_RTSP_SERVER_CSEQ -

Manually set the CSEQ number to expect for the next RTSP Server->Client request. At the moment, this feature (listening for Server requests) is unimplemented. (Added in 7.20.0)

PROTOCOL OPTIONS

+

CSEQ number for RTSP Server->Client request. See CURLOPT_RTSP_SERVER_CSEQ(3)

PROTOCOL OPTIONS

CURLOPT_TRANSFERTEXT -

A parameter set to 1 tells the library to use ASCII mode for FTP transfers, instead of the default binary transfer. For win32 systems it does not set the stdout to binary mode. This option can be usable when transferring text data between systems with different views on certain characters, such as newlines or similar. -

libcurl does not do a complete ASCII conversion when doing ASCII transfers over FTP. This is a known limitation/flaw that nobody has rectified. libcurl simply sets the mode to ASCII and performs a standard transfer. +

Use text transfer. See CURLOPT_TRANSFERTEXT(3)

CURLOPT_PROXY_TRANSFER_MODE -

Pass a long. If the value is set to 1 (one), it tells libcurl to set the transfer mode (binary or ASCII) for FTP transfers done via a HTTP proxy, by appending ;type=a or ;type=i to the URL. Without this setting, or it being set to 0 (zero, the default), CURLOPT_TRANSFERTEXT has no effect when doing FTP via a proxy. Beware that not all proxies support this feature. (Added in 7.18.0) +

Add transfer mode to URL over proxy. See CURLOPT_PROXY_TRANSFER_MODE(3)

CURLOPT_CRLF -

Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to CRLF newlines on transfers. Disable this option again by setting the value to 0 (zero). +

Convert newlines. See CURLOPT_CRLF(3)

CURLOPT_RANGE -

Pass a char * as parameter, which should contain the specified range you want. It should be in the format "X-Y", where X or Y may be left out. HTTP transfers also support several intervals, separated with commas as in "X-Y,N-M". Using this kind of multiple intervals will cause the HTTP server to send the response document in pieces (using standard MIME separation techniques). For RTSP, the formatting of a range should follow RFC 2326 Section 12.29. For RTSP, byte ranges are not permitted. Instead, ranges should be given in npt, utc, or smpte formats. -

Pass a NULL to this option to disable the use of ranges. -

Ranges work on HTTP, FTP, FILE (since 7.18.0), and RTSP (since 7.20.0) transfers only. +

Range requests. See CURLOPT_RANGE(3)

CURLOPT_RESUME_FROM -

Pass a long as parameter. It contains the offset in number of bytes that you want the transfer to start from. Set this option to 0 to make the transfer start from the beginning (effectively disabling resume). For FTP, set this option to -1 to make the transfer start from the end of the target file (useful to continue an interrupted upload). -

When doing uploads with FTP, the resume position is where in the local/source file libcurl should try to resume the upload from and it will then append the source file to the remote target file. +

Resume a transfer. See CURLOPT_RESUME_FROM(3)

CURLOPT_RESUME_FROM_LARGE -

Pass a curl_off_t as parameter. It contains the offset in number of bytes that you want the transfer to start from. (Added in 7.11.0) +

Resume a transfer. See CURLOPT_RESUME_FROM_LARGE(3)

CURLOPT_CUSTOMREQUEST -

Pass a pointer to a zero terminated string as parameter. It can be used to specify the request instead of GET or HEAD when performing HTTP based requests, instead of LIST and NLST when performing FTP directory listings and instead of LIST and RETR when issuing POP3 based commands. This is particularly useful, for example, for performing a HTTP DELETE request or a POP3 DELE command. -

Please don't perform this at will, on HTTP based requests, by making sure your server supports the command you are sending first. -

When you change the request method by setting CURLOPT_CUSTOMREQUEST to something, you don't actually change how libcurl behaves or acts in regards to the particular request method, it will only change the actual string sent in the request. -

For example: -

With the HTTP protocol when you tell libcurl to do a HEAD request, but then specify a GET though a custom request libcurl will still act as if it sent a HEAD. To switch to a proper HEAD use CURLOPT_NOBODY, to switch to a proper POST use CURLOPT_POST or CURLOPT_POSTFIELDS and to switch to a proper GET use CURLOPT_HTTPGET. -

With the POP3 protocol when you tell libcurl to use a custom request it will behave like a LIST or RETR command was sent where it expects data to be returned by the server. As such CURLOPT_NOBODY should be used when specifying commands such as DELE and NOOP for example. -

Restore to the internal default by setting this to NULL. -

Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CURLOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -

(Support for POP3 added in 7.26.0) +

Custom request/method. See CURLOPT_CUSTOMREQUEST(3)

CURLOPT_FILETIME -

Pass a long. If it is 1, libcurl will attempt to get the modification date of the remote document in this operation. This requires that the remote server sends the time or replies to a time querying command. The curl_easy_getinfo(3) function with the CURLINFO_FILETIME argument can be used after a transfer to extract the received time (if any). +

Request file modification date and time. See CURLOPT_FILETIME(3) +

CURLOPT_DIRLISTONLY +

List only. See CURLOPT_DIRLISTONLY(3)

CURLOPT_NOBODY -

A parameter set to 1 tells the library to not include the body-part in the output. This is only relevant for protocols that have separate header and body parts. On HTTP(S) servers, this will make libcurl do a HEAD request. -

To change request to GET, you should use CURLOPT_HTTPGET. Change request to POST with CURLOPT_POST etc. +

Do not get the body contents. See CURLOPT_NOBODY(3)

CURLOPT_INFILESIZE -

When uploading a file to a remote site, this option should be used to tell libcurl what the expected size of the infile is. This value should be passed as a long. See also CURLOPT_INFILESIZE_LARGE. -

For uploading using SCP, this option or CURLOPT_INFILESIZE_LARGE is mandatory. -

When sending emails using SMTP, this command can be used to specify the optional SIZE parameter for the MAIL FROM command. (Added in 7.23.0) -

This option does not limit how much data libcurl will actually send, as that is controlled entirely by what the read callback returns. +

Size of file to send. CURLOPT_INFILESIZE(3)

CURLOPT_INFILESIZE_LARGE -

When uploading a file to a remote site, this option should be used to tell libcurl what the expected size of the infile is. This value should be passed as a curl_off_t. (Added in 7.11.0) -

For uploading using SCP, this option or CURLOPT_INFILESIZE is mandatory. -

This option does not limit how much data libcurl will actually send, as that is controlled entirely by what the read callback returns. +

Size of file to send. CURLOPT_INFILESIZE_LARGE(3)

CURLOPT_UPLOAD -

A parameter set to 1 tells the library to prepare for an upload. The CURLOPT_READDATA and CURLOPT_INFILESIZE or CURLOPT_INFILESIZE_LARGE options are also interesting for uploads. If the protocol is HTTP, uploading means using the PUT request unless you tell libcurl otherwise. -

Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. -

If you use PUT to a HTTP 1.1 server, you can upload data without knowing the size before starting the transfer if you use chunked encoding. You enable this by adding a header like "Transfer-Encoding: chunked" with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size. +

Upload data. See CURLOPT_UPLOAD(3)

CURLOPT_MAXFILESIZE -

Pass a long as parameter. This allows you to specify the maximum size (in bytes) of a file to download. If the file requested is larger than this value, the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. -

The file size is not always known prior to download, and for such files this option has no effect even if the file transfer ends up being larger than this given limit. This concerns both FTP and HTTP transfers. +

Maximum file size to get. See CURLOPT_MAXFILESIZE(3)

CURLOPT_MAXFILESIZE_LARGE -

Pass a curl_off_t as parameter. This allows you to specify the maximum size (in bytes) of a file to download. If the file requested is larger than this value, the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. (Added in 7.11.0) -

The file size is not always known prior to download, and for such files this option has no effect even if the file transfer ends up being larger than this given limit. This concerns both FTP and HTTP transfers. +

Maximum file size to get. See CURLOPT_MAXFILESIZE_LARGE(3)

CURLOPT_TIMECONDITION -

Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is treated. You can set this parameter to CURL_TIMECOND_IFMODSINCE or CURL_TIMECOND_IFUNMODSINCE. This feature applies to HTTP, FTP, RTSP, and FILE. -

The last modification time of a file is not always known and in such instances this feature will have no effect even if the given time condition would not have been met. curl_easy_getinfo(3) with the CURLINFO_CONDITION_UNMET option can be used after a transfer to learn if a zero-byte successful "transfer" was due to this condition not matching. +

Make a time conditional request. See CURLOPT_TIMECONDITION(3)

CURLOPT_TIMEVALUE -

Pass a long as parameter. This should be the time in seconds since 1 Jan 1970, and the time will be used in a condition as specified with CURLOPT_TIMECONDITION.

CONNECTION OPTIONS

+

Time value for the time conditional request. See CURLOPT_TIMEVALUE(3)

CONNECTION OPTIONS

CURLOPT_TIMEOUT -

Pass a long as parameter containing the maximum time in seconds that you allow the libcurl transfer operation to take. Normally, name lookups can take a considerable time and limiting operations to less than a few minutes risk aborting perfectly normal operations. This option will cause curl to use the SIGALRM to enable time-outing system calls. -

In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set. -

Default timeout is 0 (zero) which means it never times out. +

Timeout for the entire request. See CURLOPT_TIMEOUT(3)

CURLOPT_TIMEOUT_MS -

Like CURLOPT_TIMEOUT but takes number of milliseconds instead. If libcurl is built to use the standard system name resolver, that portion of the transfer will still use full-second resolution for timeouts with a minimum timeout allowed of one second. (Added in 7.16.2) +

Millisecond timeout for the entire request. See CURLOPT_TIMEOUT_MS(3)

CURLOPT_LOW_SPEED_LIMIT -

Pass a long as parameter. It contains the transfer speed in bytes per second that the transfer should be below during CURLOPT_LOW_SPEED_TIME seconds for the library to consider it too slow and abort. +

Low speed limit to abort transfer. See CURLOPT_LOW_SPEED_LIMIT(3)

CURLOPT_LOW_SPEED_TIME -

Pass a long as parameter. It contains the time in seconds that the transfer should be below the CURLOPT_LOW_SPEED_LIMIT for the library to consider it too slow and abort. +

Time to be below the speed to trigger low speed abort. See CURLOPT_LOW_SPEED_TIME(3)

CURLOPT_MAX_SEND_SPEED_LARGE -

Pass a curl_off_t as parameter. If an upload exceeds this speed (counted in bytes per second) on cumulative average during the transfer, the transfer will pause to keep the average rate less than or equal to the parameter value. Defaults to unlimited speed. (Added in 7.15.5) +

Cap the upload speed to this. See CURLOPT_MAX_SEND_SPEED_LARGE(3)

CURLOPT_MAX_RECV_SPEED_LARGE -

Pass a curl_off_t as parameter. If a download exceeds this speed (counted in bytes per second) on cumulative average during the transfer, the transfer will pause to keep the average rate less than or equal to the parameter value. Defaults to unlimited speed. (Added in 7.15.5) +

Cap the download speed to this. See CURLOPT_MAX_RECV_SPEED_LARGE(3)

CURLOPT_MAXCONNECTS -

Pass a long. The set number will be the persistent connection cache size. The set amount will be the maximum amount of simultaneously open connections that libcurl may cache in this easy handle. Default is 5, and there isn't much point in changing this value unless you are perfectly aware of how this works and changes libcurl's behaviour. This concerns connections using any of the protocols that support persistent connections. -

When reaching the maximum limit, curl closes the oldest one in the cache to prevent increasing the number of open connections. -

If you already have performed transfers with this curl handle, setting a smaller MAXCONNECTS than before may cause open connections to get closed unnecessarily. -

If you add this easy handle to a multi handle, this setting is not acknowledged, and you must instead use curl_multi_setopt(3) and the CURLMOPT_MAXCONNECTS option. -

CURLOPT_CLOSEPOLICY -

(Obsolete) This option does nothing. +

Maximum number of connections in the connection pool. See CURLOPT_MAXCONNECTS(3)

CURLOPT_FRESH_CONNECT -

Pass a long. Set to 1 to make the next transfer use a new (fresh) connection by force. If the connection cache is full before this connection, one of the existing connections will be closed as according to the selected or default policy. This option should be used with caution and only if you understand what it does. Set this to 0 to have libcurl attempt re-using an existing connection (default behavior). +

Use a new connection. CURLOPT_FRESH_CONNECT(3)

CURLOPT_FORBID_REUSE -

Pass a long. Set to 1 to make the next transfer explicitly close the connection when done. Normally, libcurl keeps all connections alive when done with one transfer in case a succeeding one follows that can re-use them. This option should be used with caution and only if you understand what it does. Set to 0 to have libcurl keep the connection open for possible later re-use (default behavior). +

Prevent subsequent connections from re-using this. See CURLOPT_FORBID_REUSE(3)

CURLOPT_CONNECTTIMEOUT -

Pass a long. It should contain the maximum time in seconds that you allow the connection to the server to take. This only limits the connection phase, once it has connected, this option is of no more use. Set to zero to switch to the default built-in connection timeout - 300 seconds. See also the CURLOPT_TIMEOUT option. -

In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set. +

Timeout for the connection phase. See CURLOPT_CONNECTTIMEOUT(3)

CURLOPT_CONNECTTIMEOUT_MS -

Like CURLOPT_CONNECTTIMEOUT but takes the number of milliseconds instead. If libcurl is built to use the standard system name resolver, that portion of the connect will still use full-second resolution for timeouts with a minimum timeout allowed of one second. (Added in 7.16.2) +

Millisecond timeout for the connection phase. See CURLOPT_CONNECTTIMEOUT_MS(3)

CURLOPT_IPRESOLVE -

Allows an application to select what kind of IP addresses to use when resolving host names. This is only interesting when using host names that resolve addresses using more than one version of IP. The allowed values are: -

-

CURL_IPRESOLVE_WHATEVER -

Default, resolves addresses to all IP versions that your system allows. -

CURL_IPRESOLVE_V4 -

Resolve to IPv4 addresses. -

CURL_IPRESOLVE_V6 -

Resolve to IPv6 addresses. -

+

IP version to resolve to. See CURLOPT_IPRESOLVE(3)

CURLOPT_CONNECT_ONLY -

Pass a long. If the parameter equals 1, it tells the library to perform all the required proxy authentication and connection setup, but no data transfer. This option is implemented for HTTP, SMTP and POP3. -

The option can be used to simply test a connection to a server, but is more useful when used with the CURLINFO_LASTSOCKET option to curl_easy_getinfo(3) as the library can set up the connection and then the application can obtain the most recently used socket for special data transfers. (Added in 7.15.2) +

Only connect, nothing else. See CURLOPT_CONNECT_ONLY(3)

CURLOPT_USE_SSL -

Pass a long using one of the values from below, to make libcurl use your desired level of SSL for the transfer. (Added in 7.11.0) -

This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc. -

(This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants were known as CURLFTPSSL_*) -

-

CURLUSESSL_NONE -

Don't attempt to use SSL. -

CURLUSESSL_TRY -

Try using SSL, proceed as normal otherwise. -

CURLUSESSL_CONTROL -

Require SSL for the control connection or fail with CURLE_USE_SSL_FAILED. -

CURLUSESSL_ALL -

Require SSL for all communication or fail with CURLE_USE_SSL_FAILED. -

+

Use TLS/SSL. See CURLOPT_USE_SSL(3)

CURLOPT_RESOLVE -

Pass a pointer to a linked list of strings with host name resolve information to use for requests with this handle. The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. -

Each single name resolve string should be written using the format HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve, PORT is the port number of the service where libcurl wants to connect to the HOST and ADDRESS is the numerical IP address. If libcurl is built to support IPv6, ADDRESS can of course be either IPv4 or IPv6 style addressing. -

This option effectively pre-populates the DNS cache with entries for the host+port pair so redirects and everything that operations against the HOST+PORT will instead use your provided ADDRESS. -

You can remove names from the DNS cache again, to stop providing these fake resolves, by including a string in the linked list that uses the format "-HOST:PORT". The host name must be prefixed with a dash, and the host name and port number must exactly match what was already added previously. -

(Added in 7.21.3) -

CURLOPT_DNS_SERVERS -

Set the list of DNS servers to be used instead of the system default. The format of the dns servers option is: -

host[:port][,host[:port]]... -

For example: -

192.168.1.100,192.168.1.101,3.4.5.6 -

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. -

(Added in 7.24.0) +

Provide fixed/fake name resolves. See CURLOPT_RESOLVE(3) +

CURLOPT_DNS_INTERFACE +

Bind name resolves to this interface. See CURLOPT_DNS_INTERFACE(3) +

CURLOPT_DNS_LOCAL_IP4 +

Bind name resolves to this IP4 address. See CURLOPT_DNS_LOCAL_IP4(3) +

CURLOPT_DNS_LOCAL_IP6 +

Bind name resolves to this IP6 address. See CURLOPT_DNS_LOCAL_IP6(3)

CURLOPT_ACCEPTTIMEOUT_MS -

Pass a long telling libcurl the maximum number of milliseconds to wait for a server to connect back to libcurl when an active FTP connection is used. If no timeout is set, the internal default of 60000 will be used. (Added in 7.24.0)

SSL and SECURITY OPTIONS

+

Timeout for waiting for the server's connect back to be accepted. See CURLOPT_ACCEPTTIMEOUT_MS(3)

SSL and SECURITY OPTIONS

CURLOPT_SSLCERT -

Pass a pointer to a zero terminated string as parameter. The string should be the file name of your certificate. The default format is "PEM" and can be changed with CURLOPT_SSLCERTTYPE. -

With NSS this can also be the nickname of the certificate you wish to authenticate with. If you want to use a file from the current directory, please precede it with "./" prefix, in order to avoid confusion with a nickname. -

(iOS and Mac OS X only) With Secure Transport, this string must match the name of a certificate that's in the system or user keychain. You should encode this string in UTF-8 format in case it contains non-ASCII characters. The private key corresponding to the certificate, and certificate chain (if any), must also be present in the keychain. (Added in 7.31.0) +

Client cert. See CURLOPT_SSLCERT(3)

CURLOPT_SSLCERTTYPE -

Pass a pointer to a zero terminated string as parameter. The string should be the format of your certificate. Supported formats are "PEM" and "DER". (Added in 7.9.3) +

Client cert type. See CURLOPT_SSLCERTTYPE(3)

CURLOPT_SSLKEY -

Pass a pointer to a zero terminated string as parameter. The string should be the file name of your private key. The default format is "PEM" and can be changed with CURLOPT_SSLKEYTYPE. -

(iOS and Mac OS X only) This option is ignored if curl was built against Secure Transport. Secure Transport expects the private key to be already present in the keychain containing the certificate. +

Client key. See CURLOPT_SSLKEY(3)

CURLOPT_SSLKEYTYPE -

Pass a pointer to a zero terminated string as parameter. The string should be the format of your private key. Supported formats are "PEM", "DER" and "ENG". -

The format "ENG" enables you to load the private key from a crypto engine. In this case CURLOPT_SSLKEY is used as an identifier passed to the engine. You have to set the crypto engine with CURLOPT_SSLENGINE. "DER" format key file currently does not work because of a bug in OpenSSL. +

Client key type. See CURLOPT_SSLKEYTYPE(3)

CURLOPT_KEYPASSWD -

Pass a pointer to a zero terminated string as parameter. It will be used as the password required to use the CURLOPT_SSLKEY or CURLOPT_SSH_PRIVATE_KEYFILE private key. You never needed a pass phrase to load a certificate but you need one to load your private key. -

(This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and CURLOPT_SSLCERTPASSWD up to 7.9.2) +

Client key password. See CURLOPT_KEYPASSWD(3) +

CURLOPT_SSL_ENABLE_ALPN +

Enable use of ALPN. See CURLOPT_SSL_ENABLE_ALPN(3) +

CURLOPT_SSL_ENABLE_NPN +

Enable use of NPN. See CURLOPT_SSL_ENABLE_NPN(3)

CURLOPT_SSLENGINE -

Pass a pointer to a zero terminated string as parameter. It will be used as the identifier for the crypto engine you want to use for your private key. -

If the crypto device cannot be loaded, CURLE_SSL_ENGINE_NOTFOUND is returned. +

Use identifier with SSL engine. See CURLOPT_SSLENGINE(3)

CURLOPT_SSLENGINE_DEFAULT -

Sets the actual crypto engine as the default for (asymmetric) crypto operations. -

If the crypto device cannot be set, CURLE_SSL_ENGINE_SETFAILED is returned. -

Even though this option doesn't need any parameter, in some configurations curl_easy_setopt might be defined as a macro taking exactly three arguments. Therefore, it's recommended to pass 1 as parameter to this option. +

Default SSL engine. See CURLOPT_SSLENGINE_DEFAULT(3)

CURLOPT_SSLVERSION -

Pass a long as parameter to control what version of SSL/TLS to attempt to use. The available options are: -

-

CURL_SSLVERSION_DEFAULT -

The default action. This will attempt to figure out the remote SSL protocol version, i.e. either SSLv3 or TLSv1 (but not SSLv2, which became disabled by default with 7.18.1). -

CURL_SSLVERSION_TLSv1 -

Force TLSv1 -

CURL_SSLVERSION_SSLv2 -

Force SSLv2 -

CURL_SSLVERSION_SSLv3 -

Force SSLv3 -

+

SSL version to use. See CURLOPT_SSLVERSION(3)

CURLOPT_SSL_VERIFYPEER -

Pass a long as parameter. By default, curl assumes a value of 1. -

This option determines whether curl verifies the authenticity of the peer's certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't. -

When negotiating a SSL connection, the server sends a certificate indicating its identity. Curl verifies whether the certificate is authentic, i.e. that you can trust that the server is who the certificate says it is. This trust is based on a chain of digital signatures, rooted in certification authority (CA) certificates you supply. curl uses a default bundle of CA certificates (the path for that is determined at build time) and you can specify alternate certificates with the CURLOPT_CAINFO option or the CURLOPT_CAPATH option. -

When CURLOPT_SSL_VERIFYPEER is nonzero, and the verification fails to prove that the certificate is authentic, the connection fails. When the option is zero, the peer certificate verification succeeds regardless. -

Authenticating the certificate is not by itself very useful. You typically want to ensure that the server, as authentically identified by its certificate, is the server you mean to be talking to. Use CURLOPT_SSL_VERIFYHOST to control that. The check that the host name in the certificate is valid for the host name you're connecting to is done independently of the CURLOPT_SSL_VERIFYPEER option. +

Verify the SSL certificate. See CURLOPT_SSL_VERIFYPEER(3)

CURLOPT_CAINFO -

Pass a char * to a zero terminated string naming a file holding one or more certificates to verify the peer with. This makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. If CURLOPT_SSL_VERIFYPEER is zero, CURLOPT_CAINFO need not even indicate an accessible file. -

This option is by default set to the system path where libcurl's cacert bundle is assumed to be stored, as established at build time. -

If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module (libnsspem.so) needs to be available for this option to work properly. +

CA cert bundle. See CURLOPT_CAINFO(3)

CURLOPT_ISSUERCERT -

Pass a char * to a zero terminated string naming a file holding a CA certificate in PEM format. If the option is set, an additional check against the peer certificate is performed to verify the issuer is indeed the one associated with the certificate provided by the option. This additional check is useful in multi-level PKI where one needs to enforce that the peer certificate is from a specific branch of the tree. -

This option makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. Otherwise, the result of the check is not considered as failure. -

A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option, which is returned if the setup of the SSL/TLS session has failed due to a mismatch with the issuer of peer certificate (CURLOPT_SSL_VERIFYPEER has to be set too for the check to fail). (Added in 7.19.0) +

Issuer certificate. See CURLOPT_ISSUERCERT(3)

CURLOPT_CAPATH -

Pass a char * to a zero terminated string naming a directory holding multiple CA certificates to verify the peer with. If libcurl is built against OpenSSL, the certificate directory must be prepared using the openssl c_rehash utility. This makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. If CURLOPT_SSL_VERIFYPEER is zero, CURLOPT_CAPATH need not even indicate an accessible path. The CURLOPT_CAPATH function apparently does not work in Windows due to some limitation in openssl. This option is OpenSSL-specific and does nothing if libcurl is built to use GnuTLS. NSS-powered libcurl provides the option only for backward compatibility. +

Path to CA cert bundle. See CURLOPT_CAPATH(3)

CURLOPT_CRLFILE -

Pass a char * to a zero terminated string naming a file with the concatenation of CRL (in PEM format) to use in the certificate validation that occurs during the SSL exchange. -

When curl is built to use NSS or GnuTLS, there is no way to influence the use of CRL passed to help in the verification process. When libcurl is built with OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both set, requiring CRL check against all the elements of the certificate chain if a CRL file is passed. -

This option makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. -

A specific error code (CURLE_SSL_CRL_BADFILE) is defined with the option. It is returned when the SSL exchange fails because the CRL file cannot be loaded. A failure in certificate verification due to a revocation information found in the CRL does not trigger this specific error. (Added in 7.19.0) +

Certificate Revocation List. See CURLOPT_CRLFILE(3)

CURLOPT_SSL_VERIFYHOST -

Pass a long as parameter. -

This option determines whether libcurl verifies that the server cert is for the server it is known as. -

When negotiating a SSL connection, the server sends a certificate indicating its identity. -

When CURLOPT_SSL_VERIFYHOST is 2, that certificate must indicate that the server is the server to which you meant to connect, or the connection fails. -

Curl considers the server the intended one when the Common Name field or a Subject Alternate Name field in the certificate matches the host name in the URL to which you told Curl to connect. -

When the value is 1, libcurl will return a failure. It was previously (in 7.28.0 and earlier) a debug option of some sorts, but it is no longer supported due to frequently leading to programmer mistakes. -

When the value is 0, the connection succeeds regardless of the names in the certificate. -

The default value for this option is 2. -

This option controls checking the server's certificate's claimed identity. The server could be lying. To control lying, see CURLOPT_SSL_VERIFYPEER. If libcurl is built against NSS and CURLOPT_SSL_VERIFYPEER is zero, CURLOPT_SSL_VERIFYHOST is ignored. -

+

Verify the host name in the SSL certificate. See CURLOPT_SSL_VERIFYHOST(3)

CURLOPT_CERTINFO -

Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With this enabled, libcurl (if built with OpenSSL) will extract lots of information and data about the certificates in the certificate chain used in the SSL connection. This data is then possible to extract after a transfer using curl_easy_getinfo(3) and its option CURLINFO_CERTINFO. (Added in 7.19.1) +

Extract certificate info. See CURLOPT_CERTINFO(3) +

CURLOPT_PINNEDPUBLICKEY +

Set pinned SSL public key . See CURLOPT_PINNEDPUBLICKEY(3)

CURLOPT_RANDOM_FILE -

Pass a char * to a zero terminated file name. The file will be used to read from to seed the random engine for SSL. The more random the specified file is, the more secure the SSL connection will become. +

Provide source for entropy random data. See CURLOPT_RANDOM_FILE(3)

CURLOPT_EGDSOCKET -

Pass a char * to the zero terminated path name to the Entropy Gathering Daemon socket. It will be used to seed the random engine for SSL. +

Identify EGD socket for entropy. See CURLOPT_EGDSOCKET(3)

CURLOPT_SSL_CIPHER_LIST -

Pass a char *, pointing to a zero terminated string holding the list of ciphers to use for the SSL connection. The list must be syntactically correct, it consists of one or more cipher strings separated by colons. Commas or spaces are also acceptable separators but colons are normally used, !, - and + can be used as operators. -

For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA', ´SHA1+DES´, 'TLSv1' and 'DEFAULT'. The default list is normally set when you compile OpenSSL. -

You'll find more details about cipher lists on this URL: http://www.openssl.org/docs/apps/ciphers.html -

For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5', ´rsa_aes_128_sha´, etc. With NSS you don't add/remove ciphers. If one uses this option then all known ciphers are disabled and only those passed in are enabled. -

You'll find more details about the NSS cipher lists on this URL: http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives -

+

Ciphers to use. See CURLOPT_SSL_CIPHER_LIST(3)

CURLOPT_SSL_SESSIONID_CACHE -

Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set this to 1 to enable it. By default all transfers are done using the cache. While nothing ever should get hurt by attempting to reuse SSL session-IDs, there seem to be broken SSL implementations in the wild that may require you to disable this in order for you to succeed. (Added in 7.16.0) +

Disable SSL session-id cache. See CURLOPT_SSL_SESSIONID_CACHE(3)

CURLOPT_SSL_OPTIONS -

Pass a long with a bitmask to tell libcurl about specific SSL behaviors. -

CURLSSLOPT_ALLOW_BEAST is the only supported bit and by setting this the user will tell libcurl to not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0, the SSL layer libcurl uses may use a work-around for this flaw although it might cause interoperability problems with some (older) SSL implementations. WARNING: avoiding this work-around loosens the security, and by setting this option to 1 you ask for exactly that. (Added in 7.25.0) +

Control SSL behavior. See CURLOPT_SSL_OPTIONS(3)

CURLOPT_KRBLEVEL -

Pass a char * as parameter. Set the kerberos security level for FTP; this also enables kerberos awareness. This is a string, 'clear', 'safe', 'confidential' or 'private'. If the string is set but doesn't match one of these, 'private' will be used. Set the string to NULL to disable kerberos support for FTP. -

(This option was known as CURLOPT_KRB4LEVEL up to 7.16.3) +

Kerberos security level. See CURLOPT_KRBLEVEL(3)

CURLOPT_GSSAPI_DELEGATION -

Set the parameter to CURLGSSAPI_DELEGATION_FLAG to allow unconditional GSSAPI credential delegation. The delegation is disabled by default since 7.21.7. Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG to delegate only if the OK-AS-DELEGATE flag is set in the service ticket in case this feature is supported by the GSSAPI implementation and the definition of GSS_C_DELEG_POLICY_FLAG was available at compile-time. (Added in 7.22.0)

SSH OPTIONS

+

Disable GSS-API delegation. See CURLOPT_GSSAPI_DELEGATION(3)

SSH OPTIONS

CURLOPT_SSH_AUTH_TYPES -

Pass a long set to a bitmask consisting of one or more of CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD and CURLSSH_AUTH_AGENT. Set CURLSSH_AUTH_ANY to let libcurl pick a suitable one. Currently CURLSSH_AUTH_HOST has no effect. (Added in 7.16.1) If CURLSSH_AUTH_AGENT is used, libcurl attempts to connect to ssh-agent or pageant and let the agent attempt the authentication. (Added in 7.28.0) +

SSH authentication types. See CURLOPT_SSH_AUTH_TYPES(3)

CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 -

Pass a char * pointing to a string containing 32 hexadecimal digits. The string should be the 128 bit MD5 checksum of the remote host's public key, and libcurl will reject the connection to the host unless the md5sums match. This option is only for SCP and SFTP transfers. (Added in 7.17.1) +

MD5 of host's public key. See CURLOPT_SSH_HOST_PUBLIC_KEY_MD5(3)

CURLOPT_SSH_PUBLIC_KEYFILE -

Pass a char * pointing to a file name for your public key. If not used, libcurl defaults to $HOME/.ssh/id_dsa.pub if the HOME environment variable is set, and just "id_dsa.pub" in the current directory if HOME is not set. (Added in 7.16.1) If an empty string is passed, libcurl will pass no public key to libssh2 which then tries to compute it from the private key, this is known to work when libssh2 1.4.0+ is linked against OpenSSL. (Added in 7.26.0) +

File name of public key. See CURLOPT_SSH_PUBLIC_KEYFILE(3)

CURLOPT_SSH_PRIVATE_KEYFILE -

Pass a char * pointing to a file name for your private key. If not used, libcurl defaults to $HOME/.ssh/id_dsa if the HOME environment variable is set, and just "id_dsa" in the current directory if HOME is not set. If the file is password-protected, set the password with CURLOPT_KEYPASSWD. (Added in 7.16.1) +

File name of private key. See CURLOPT_SSH_PRIVATE_KEYFILE(3)

CURLOPT_SSH_KNOWNHOSTS -

Pass a pointer to a zero terminated string holding the file name of the known_host file to use. The known_hosts file should use the OpenSSH file format as supported by libssh2. If this file is specified, libcurl will only accept connections with hosts that are known and present in that file, with a matching public key. Use CURLOPT_SSH_KEYFUNCTION to alter the default behavior on host and key (mis)matching. (Added in 7.19.6) +

File name with known hosts. See CURLOPT_SSH_KNOWNHOSTS(3)

CURLOPT_SSH_KEYFUNCTION -

Pass a pointer to a curl_sshkeycallback function. It gets called when the known_host matching has been done, to allow the application to act and decide for libcurl how to proceed. The callback will only be called if CURLOPT_SSH_KNOWNHOSTS is also set. -

The curl_sshkeycallback function gets passed the CURL handle, the key from the known_hosts file, the key from the remote site, info from libcurl on the matching status and a custom pointer (set with CURLOPT_SSH_KEYDATA). It MUST return one of the following return codes to tell libcurl how to act: -

-

CURLKHSTAT_FINE_ADD_TO_FILE -

The host+key is accepted and libcurl will append it to the known_hosts file before continuing with the connection. This will also add the host+key combo to the known_host pool kept in memory if it wasn't already present there. The adding of data to the file is done by completely replacing the file with a new copy, so the permissions of the file must allow this. -

CURLKHSTAT_FINE -

The host+key is accepted libcurl will continue with the connection. This will also add the host+key combo to the known_host pool kept in memory if it wasn't already present there. -

CURLKHSTAT_REJECT -

The host+key is rejected. libcurl will deny the connection to continue and it will be closed. -

CURLKHSTAT_DEFER -

The host+key is rejected, but the SSH connection is asked to be kept alive. This feature could be used when the app wants to somehow return back and act on the host+key situation and then retry without needing the overhead of setting it up from scratch again. -

 (Added in 7.19.6) +

Callback for known hosts handling. See CURLOPT_SSH_KEYFUNCTION(3)

CURLOPT_SSH_KEYDATA -

Pass a void * as parameter. This pointer will be passed along verbatim to the callback set with CURLOPT_SSH_KEYFUNCTION. (Added in 7.19.6)

OTHER OPTIONS

+

Custom pointer to pass to ssh key callback. See CURLOPT_SSH_KEYDATA(3)

OTHER OPTIONS

CURLOPT_PRIVATE -

Pass a void * as parameter, pointing to data that should be associated with this curl handle. The pointer can subsequently be retrieved using curl_easy_getinfo(3) with the CURLINFO_PRIVATE option. libcurl itself does nothing with this data. (Added in 7.10.3) +

Private pointer to store. See CURLOPT_PRIVATE(3)

CURLOPT_SHARE -

Pass a share handle as a parameter. The share handle must have been created by a previous call to curl_share_init(3). Setting this option, will make this curl handle use the data from the shared handle instead of keeping the data to itself. This enables several curl handles to share data. If the curl handles are used simultaneously in multiple threads, you MUST use the locking methods in the share handle. See curl_share_setopt(3) for details. -

If you add a share that is set to share cookies, your easy handle will use that cookie cache and get the cookie engine enabled. If you unshare an object that was using cookies (or change to another object that doesn't share cookies), the easy handle will get its cookie engine disabled. -

Data that the share object is not set to share will be dealt with the usual way, as if no share was used. +

Share object to use. See CURLOPT_SHARE(3)

CURLOPT_NEW_FILE_PERMS -

Pass a long as a parameter, containing the value of the permissions that will be assigned to newly created files on the remote server. The default value is 0644, but any valid value can be used. The only protocols that can use this are sftp://, scp://, and file://. (Added in 7.16.4) +

Mode for creating new remote files. See CURLOPT_NEW_FILE_PERMS(3)

CURLOPT_NEW_DIRECTORY_PERMS -

Pass a long as a parameter, containing the value of the permissions that will be assigned to newly created directories on the remote server. The default value is 0755, but any valid value can be used. The only protocols that can use this are sftp://, scp://, and file://. (Added in 7.16.4)

TELNET OPTIONS

+

Mode for creating new remote directories. See CURLOPT_NEW_DIRECTORY_PERMS(3)

TELNET OPTIONS

CURLOPT_TELNETOPTIONS -

Provide a pointer to a curl_slist with variables to pass to the telnet negotiations. The variables should be in the format <option=value>. libcurl supports the options 'TTYPE', 'XDISPLOC' and 'NEW_ENV'. See the TELNET standard for details.

RETURN VALUE

-

CURLE_OK (zero) means that the option was set properly, non-zero means an error occurred as <curl/curl.h> defines. See the libcurl-errors(3) man page for the full list with descriptions. -

If you try to set an option that libcurl doesn't know about, perhaps because the library is too old to support it or the option was removed in a recent version, this function will return CURLE_FAILED_INIT.

SEE ALSO

-

curl_easy_init (3) curl_easy_cleanup (3) curl_easy_reset (3)

+

TELNET options. See CURLOPT_TELNETOPTIONS(3)

RETURN VALUE

+

CURLE_OK (zero) means that the option was set properly, non-zero means an error occurred as <curl/curl.h> defines. See the libcurl-errors man page for the full list with descriptions. +

If you try to set an option that libcurl doesn't know about, perhaps because the library is too old to support it or the option was removed in a recent version, this function will return CURLE_UNKNOWN_OPTION. If support for the option was disabled at compile-time, it will return CURLE_NOT_BUILT_IN.

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   CURLcode res; +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +   res = curl_easy_perform(curl); +   curl_easy_cleanup(curl); + }} +

+ +

SEE ALSO

+

curl_easy_init, curl_easy_cleanup, curl_easy_reset, curl_multi_setopt,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_setopt.pdf b/docs/libcurl/curl_easy_setopt.pdf index e6d675cecedd20b7551e4636da1f43ceadad000c..4f2c948c00f1a68395e73ad371363cdb3a83d02c 100644 GIT binary patch literal 24241 zcma&NQzy;qs%B_W$S9@OvET* zYvgJsW@h4GY9=56!G zP9J27thg{{ERz63==4SSuJK#&rk&MS$~c$~PP4_F%Z2bX$A>|XH4D~!QQ@(D$H12p zaZSa`sIfG97E^?=;l!ld!Xb4HX#sQcI@C*|uFpuA%nPgj_*;Z4ag#ttz`(a|#Vx^K z+3D?}Tvg4#OhEhLFr;`q3WGueVBxZfQ03vIK1z+d&Hpz0P#R5}#S2ne>*N(O>2);! zwO}#%0efl0;|119DiMi6bIsVWZ*bJD~<2BS6$T!QP<718gO4~;a>rLdN zUFTrbthzRCio8CsO`>tR>I2YXIg|SmT=-z#5}L{Lpl6H@My(izl0p13>l z_xkAWOcTVE4+yln@li_Vgd$+}kjgG4P@SL6QIJ>4G#jbS(4>^ut*kSw<~#_&NNXKA z@it|Z3TnWuVA|Q0(%Tlxo*O~ z;`#;ROJ5e_=@PY{ay58}SW>F0k*}jxxUz>mjpBMm^;Wth5#kH%ZgKRR%+ums7q94DLf>laTzqrJ zVr4w5S|3(3z~+%*5yBtKL1?>{)Js*bXlAm8F9L$B{;@O6l%QbFxqj zNOf$(53$Q>b!%Bc_Z>^Bst3%#$IU(`XkbS^x{!k93DWa&@b(D{qcv%@o~yp5*ZQkm zT6-Suk%Y^L*e0DFu%VFbC2W^W+==#V`&WDq*slV+d3bhhJwdaau%Y`Yu7}aUJ9(Cv zDjB6fHp_qOHWJwC4I6OhM}yp2N`Em&jOOjw$xAJELxro6TezSHC%GGz`YpQs{IL5~ z0%SI>t|{9fs#nj5>WGk;)O66K-t+;k({G8N5V)qU8Z8&h5+*e&PWZIBNxJp}_)o!F zUN$IAFGbK^hq*$Rl)?AN&LW2tcYHUjxu`xXh(%5@Bg8;H83qSNk(P{#Bhv zoo+p=bOu9O?P}uV2o-$;1iETzVSi8;X~UAyVaUcWp-R*sa_a3hLFI)W$Z?3NrSosOKjFN&DcZwpKhe-$Shk zWXoef98DfApaBv#WMRPNUPeKBy+8+1uUoDC3B7H@kEvZ%%QU(w$+zrt1mZ+-RP`uo zoXG@^VS(;+|G@uUE~66oF5r749;3Rq;wx8RVNzvlf7VC+DRG%JGk7ScKpZ>=W49l9 z;ys;bS@p(j1k>c-8XJ;ef68W$J}a)Q1|-^bjia6$_;XSqb5}%cE+AnuMHG03nnlP4 z`Xf>=BNHkOEYjwyUOh~#*#{mr??a4C>4Per!UWx|0_&_)5v<3B^(&R(N82nxS}uV_ z^f97G>kDV}jBFY&C61(}+`Ri7sn*$ZlX6xGb}7z^n)4E)UlU0$Jn~WaqIwc+u7kxW2`Fw8`90z`7zViAJ#oig7I^a1 z2V9=Q5ar>JJzH*qMk_5-l*NpuD38K`FkV(g=h{lo3A$DI8W+5v^hOApQXC$T?+R%- zxz%Hf2eDWl<|_B*=$@96l7M201oX$2jHV;?>IvhivYle3@d#(-OMv*?o_9g{!Z4yH z2?;Qx2IYnHM9!@0ZLEkQg;V>pg{LynzRenkl1ipyG}sz&IzO`&cA zG@o+91)zY9Rfuc41L3&NA)-MvubqE?4eAjmds-|xw7+Zl6jQ~hkkcSCb~nZ2~l zx2$!M-q14*K}}96uOI!P5H9(&Kikz1j518gc$(l2ZS$9`N|6^%x53<<$0K?*NE|H# z1n*mCySjhvY|X@7H{4{Vp(Ib?$HSMgW!k1V=xge0#1D_uBOo%gj}ztI(8(08oLg`Ul5MOGQ(W0BC4lKaWA+c2f`-T;F2I&yP5JIq^7Cz+O9O8igcwy6F`ju5itB@%tiGKls;cwI%|Dq?Sm+;0@FIcVX{Aj0tQck|Y_PC+T(`2BEH`RQR8AX4Dx4mC-b2n> zB-N9HO%;v`8DK1j>t2x#Z(`{OBwETkymb!{@0Rvg@W>GnD6#{Ui!Sr&Od zVEyu`+JytnvgHPe?egIsS2yb?ARtF#IVMFn7(IYbX-p!l~sii!p|?{l)se<-~o_-+R`6 z_(T}iy6?x|OwNs&W_$zuYlMs%&xM9jD9$-wp`SMOIVp{&Lz20eD$|{8NU?YU?T(=k z;?yf-#tmxykNkFUi`SOIEW2yvOjh2zP-li}mh;$7d zB0HR$k`9(Ht|fvBXkxcnt&bcA*1o)t3d;WKJ-JwG^!`%cj*Fr}#Q5b+-3n|m{Hl*; zg6T?HWHaU76UViVB}}uDEnY*lRyWX|79LoLQsxj7-IFdcv*}|r`BOD1P zhHX)?L+)WU;d0p@ln1qY2W2uflQ*iC2H*mMNRP4^5}$p!E0t{(llFWCo5`CPMF7(q*1)>UDu&Ia zqUggDY7bES?7MCLk(=Od^^}=b8fa!Y6pmd5bw+wtS*9<8HKqCQ6VQV2!SiKCIK2DA zR9)}|hBBj6pFPs%l~^=)7^3{H>S2Dt5v;N<-1nB4INwO8GGnrC(hdohjQi2q%6&i6VCf^) z42WK-G=B2%e>psGk~G8tX*J+B52k!m`gWe-gof#j#W@X9N^b+XX&4m9qo%L9Z#ne8 znKAK+?c`RzNzC4=@x`8EQ(c@QNFJU40eB>9q)U;zn7n-|?=1so+$5cPnz3)@^yz8tr+8r5)nwyMyzUS5pqoa~r6 z=D*ZFm0j}r@=Q4jjw3qoqA8zCbhgcjdj2G#G{SVuq4f1bcNazx`|! zjyC1UulFXy@!Vv_C?(H?lQ@so#PHVIkUQ*fmFJT zoK#z%R;PKdED10HRFZw%d(T7NEfb;Nwdzic5M<1R1>XTGZL_WM7Xo8^z%7Uhr5w<1&P z7hKS;71APNINta9V5Rs#HBdF!;=AB_eIV!atYAIlNWMrr$`;CZ$P=$DyHuvJ;5KFr6(`G*u$F86l7kZy~aygs%#o;?XU3`@v)7Ri25y&pgt%!?)#5Uq!uMdyaz(W-X`NSNdS^C1GY zgxdXt_(;CZ_biSaePKHS(0T z4U0q|lAY=t)$7b@>~Nx>na9Q(OIDb{K6}wyqfJ>~Ybh`Gyd>Wk_DYw?H@G@S>f;4d zoC-s;ZDr>aqoc}wZ)YqNU#(w1EdtKRUOTZvvN)?_u4gPVQ8y+@j~@^nV6Ns14^Kvm zO82x>4#skcDu>e3VSAZ?L&_IbRt$Xr!~dj1-F;K>#LlANuP-<1X8OPvTXnPuQj1lk zje1e*GvyOmaNOGmp|POkbgd-I8=GSJfm+L4yIh}>T!jf?v*2cLQn}xS{M4!QGI(-P zy?KOZ%U9WXs@DYn=^EVb5 zM%r{{!wa4Oz=hlBnlJEHoOFBkp!g3JzgLXAGpWrIViy-WqkAkjS# z791ThLpB<0qK9Favl7Odn!n6A)obC3(F(C4L#H7mx06u#GDN5$D~i+4qvkFb`eRG~!s(l0#=(gvzeb|;%mJ&BC zQ8v6qRCg~;A8;{o?R!%NK|e305?; zK#WUSv(?#caa3v5O>DP`nU+*us-kFxAs>T9lz#+i4RPH~G*E@!$l)nsa_8GVf4}*$=uh#b4Z$Ze4=Wc}z4< zPy1@*D+qlWy%~L^34mG0yu>1dc`L`OXIKQQrR4DyuLYvMJiCea2WPcqebG9YMo2bC zeN6P3=&1U;xdJ7ovpO>mCzS{v+w{EFem1tqf})v(Q^#lot3*m+6f8z4;5i>cLC{rTw{iV;3Q(giH8tCoGq)3PBkJg099oE#i;p;G4QXf&rA-{g zm&4M$>-12TGxZM=w@6PO{kav{qAe*_s1ZMsq{#qa@7gW;{Fw~3^81OX)j>UB0Wzk? zoKZVb(YMfKFJN}hBPr1;tF?DO;@>x^0J^DCs6Tu^oJ71oDY6HEtwO}L()L|3^+Yk~ zEN6Vgr(~x*TDG6+^vF(Xj?xQD$%1A5e=FY&RRVd z?ByfO(xEA!HJ<1vP?8LqGEsbk*@OI|B}L@3@w?G9hr{aS_=9(281+I0M2o_zN@>8X zCZ(g4ahYyx1JhRztO(kNPb5$t<;qodt3+EFc~>1pE)=m~+m-hw|D;<<_kP_aZI|SS zDebgU!3(RaV@p@xPo^sC_ww)k@Q}5-5&*PGOJD|w+{qWS1lq|CNQP0)L3Q*Yp2HKQ z?>D$R9j3#-IP(ub{^1Ne8|QyG!}4!sXZfF$z4!SA!~#Mo;r?&}%%@bNy)g=OxSoR589VK5c3qtaJ>LY`W4 zhK&;Zpq5{Z_!SsR_ss%%l|USx55kVSecQd3QgCavdq z3^30WgHDelb49o>V+}t3fK-S@0*tz1n>6*JA}t3iZWcOH+8)v&?hN@1e*2Wj#eCxi zV8c0lj+4Ap!BM6eRqi9Wn=$cE(eJN=CyOR$v$*EsA!CVMI)3GaEAU-$zh%I}rAi}J zA{0$Tb-Zv}cEwH_-!K})QD~G5yV!Iq&D1t+#|$4?3t+zm#(i?>UXwO$Q_}vJOY>?I z+FiV-y0zfI2&y~qmwD5W30KnDSh#Cv0ber&SkTqfey#hy`k;RPnwJrzZ7qdFQgjug zO&TDM+Z;I;812(NB*0kMHULlg{EmWstaIrX-@bN=*6_Ft-d}rYg6N(CVTfIOV$mp7 zKE6M%12H9fCqdsUUD=E=snzn(c3I4KZiG;r%Vii%3KYD^NOnAIiL|PdNdamIhl(Af z|AcwjJZhUHK+smj@O&9?XqNHZ|I+C`)D04!b}A0tF=To?eLU_G%&2(R3+Br9cT?<; zCm=<4RpU@>TgNM8i`BN~a4jpj&C$zuE1*3p$Dr(a{3@p|Go^gy_YI()BuO*me78Lz zsf(fVz6$%;ZtqakcZJ8lY(2TYkhcg3z#Oh86gh?YUO+P)uz6co&BIk z%p0$ZP_GWqc=p;{#YQx$mdr1%1lMG>Z^3T|@~aA}69+Gc%;!ln!L?2Yfc!S)EUWIF z5cqXVTmr#9M7FCO!7fArXQA>dRrMJX75IQaw=uB{BuHt5}Ou)^v}jv4NluT#;c zP7S@Mj*q-QH0ucI#yFYcGSjso^??3}O4?rt2=D4dh}&FN6bQ{l z!r&c79+F5Q^=Vcpx9Bz zKbt-U;R5zE9QCX@7p^S5&ai&~TG}!DdLAmp-x^JHS%DA2lWEW;t@2lhC(u;11v`x8p^;y zrgs*P>0*c*&%=dTbug))bfASokC|l`DbeA%amYvIqKDRw$F$Z~jSqGjwHhzh8sBka ze5uQKP$&p#q1TCmocCKsieOc;r$cn^GYFC#cIV4OQ>yr@t868s(z`<92LLQYZXt6G zRSi8mJ$tYt__n+q0yK!R%kk3OMZ?p>n%ZH~rRb6Xf;4;v&I!YnQUGb}MHa4?fY*`) zhe{ov_^cVE@{`wk&8*|Qa;i`7@_qba)06d=b#1!N@>k61e(*;#UI^%=NNL0T(X(S0 zU4=9$tmHVx1x=TosMh>%j6Sjy zzgr9I|I}Lkrb!{k|Jz!?o?_j`MtA|&AUWH1Er-M{D2p3=;9Iueezic4X55{Nc9cou zLm~@*vBc+Q*dQScdSOW6%fkih>po6zda>&Z=QLR|IFI^J9-5<%TCYIjf<)TC~CIfZ!Io_5GP!@rene2ON zo~`=eIf5E)uS5B%2RlA;NVF|5S6B-?z;?-Ekow59wf0`vXp1mgd)kBL3|6(p7%NaF z2OAuL_&7ri`&ESb^{V*Vx#(bo%MTRhw6K57`%Z-=&ajT(WE!cbTOMN00g9I|W%O#e z-;HvGK_YT}W=z1xFp?_S8}YUX`tQvsa0zY_^*b~!_vN~zNcj0spf<7DMxeAZ(r;G< z0Ba!Bc}s(J*};yrH8pqgE0a`zA3v3u;3`(!OV_*;U{Ik+ywcgc6>iH7EB3GUO7}{G z1m|W}TO=tcP|oz~Qt~K3K{uKAmJ1n%QudHIoPXl|XF5f@?tI7C%}*V_COE(t6<+}K z>0-gD$P`k>dky6LGwW&uj_g1ufxZ}yR-r(yXyaURD;NLX>p3?jcq-he-eWDB z0IBFui7a!!T|rI2(MN?b_`PvcMcWRlqyAr`@=>oMd%EuTFtdADg*ynqvXI zs4CBuiAAECWxZz*Df}HIAkvQdGn84++@q#q6@oRx^RAaOm(ITA@dZXJG$EmW(GK1V*Iw+tseHsHkC$4dL zNDZ1e3dzb#P!*iId2xKmZbJ<)&vWaa>%I)}yj9b^)trTeWo!eYh>pEGg1w8T{L!pw zLN2nuf1Yc;MX*QBJ|R@AHy$yDj@=IEQ{y=y1R9Dl~q6 z2PK~&(2R^3k-Na-;ua8!mcdh_Byyit{Rr;7c&%IXJkW}Ni1Mpx7FlQKG!-@?W{qRd zb#)P^AHnAEUAfP)fZ9q`qDD*>-j=PPG7NZ(z_cn>>`7I~ambG!{W5)B@H8V$w@B?` zjp<^Hqz(phtJKT?fJ($nCeVyX$ve7fFt{CF(rJz41sYXHL-~#ZL^A+2$bP_+EHc!0 z0I6{a9j#Tx!JSprqfeZ+OtEWd7y-SLt9Jtw>Iul3d79l~^3XV%-a$C?`vzVylviIE zMFUU4uP0uB^L6Px{O70(H48oscyTy zJnw0`CN9UN*&gaY;N&{;Nph;&HPt;T{+#Exfs|yCm(bo0f$8iultkJTJ--Nz1)aQRpOtN+00Yp>C4#emrkB#4-cA zSbeBz#9=Bs6>i74m~~9)N`vf>(j*2@BqBx0JjXzC87Z%RHT7>htL{$6J z>X41PLA6B7_(MmN<97^98cWb99`^nZMcn-1A}7%LdV^$HcxVn}14P>}_*Iw7qhQ7d z>;%NJ$jEuVSMMWF%OL8LdO!zB5atN zWS8n3e^CSm6k+Uwd85KpNibWnR19SvJ7peG`H3OHf@{!7d7^n}ae>4}O9?umh3YQ&8M1};;N)VP3q!6V?%hh5InetqMWDMyLBb(+?H!&z3 zpE1jLOz0b-#G%BxR*RXoQ#Nh6T`{ z8ek!oP{2jC+LFXo_2q^?!9PhAPe!K_iL`9a**A>l_`2`0_u%3Gt)Bs-%AaPfT70Ov z){rc=YM89M31MDgrK&YkBC}&xISo;at*E0g8FkQe4sTZ}LiY7L_I5{J@TF68MwzHF z+u;uG>9qsXD_@;>m_UV%YOS37Z0yk*uhQW2&cx}q31uuxo?b4QRP@3z7gkrM6!ey>%a z;|?SBEHMo7x56==cwX|-sebn~ZMUHwhGw;`cLR*?^ja!nT7mB0!8$!1H#@<1j#QoO z^1qpI4uAc4xga1$aPPoM0oF$1XBx>-%Xj5F--~eef`D@9`{RtHPj>05ot0=A~z3AAb z2si5vk)b)t$PA^=FKA@BZeB_hd)iYEjuDmB$cB5KszqPg%0%9AbOVfBW(tpsI#p99 z@?OY&&m2^hV>Jn7HzDtOpk102q~KqbL;>LIdgtrZmJhgQpeW7_x9j*0dw5mIAGqmw zI1YdEzDjD@;;Oz@AAi%_2{HpKRT9gSC|X-OvY4K zQdn^}PE7t&+3nz}U7G+IL8Nm-i~EZiSH+U9^S4qj327M+Q=aIdR!$^+tkxL{i{W0S ztIlk~st&BF0t_h$XKd$avd?p>|93E1R7@_W&^Q}Sja zP3%zgquS$=K3uZ#A@^1?RKbd>-gdK=!IhEE3^G4T<==a9+{SU-|V;K#g$`#mET{^j#FfTuD#ka~>G>EsPS{PAJ;sBrH-q{|i- zP#?@+dg<7s8#!%_9jUW8+M}RnUzJt@pM^ZiDK=L{tXfk~hGmk8ALrCDsg#hv$Sr;^ znvkvN6t(zC%$;#C7-9UgI~2(F$^{B86^AR)q3WSM6o0i~IhrhiQ9op;Vw@=5DY|SG zCw}Jz+Q#B9@A)aXL#mAB#$pqBVKHs~9f)A4-jw zn4yUkd$Y2%(55kZ?ewPyEEPc!o+_)!PLhWd(?|VsZWkq+Hggm05`O)b0yLnZD@f^e zcsakTO29*I=IBYPagdL4n6a25qCg##?1Nx9P1HK?8=2Qf_t=scGejUaUzUxSapesY zTx}ec0MsOPusaxLjgYESVTp97?1PRwWUtl+s$}gb?~Qkd2I@iSm6`KG-qTG_K>{_2 z*HE!0a~s(dob75=V92Z*1jGvL*j9&gT{?V#OH&x3Y}=Vv3a|Ea$60aD2@K;gZaszl=2Dv8lm|$*^|aLp(VUCtO|@q)Ba@yVX?XKiseoZVk^4d` z4Fvj~)f`#@(Xa*M-q3>C1zPUF@+&KxP9BZb*<|GQ6K%mP*-WM^ti^NZZY+ccAJW7d zV`Xm)?()TVjrG*5t9bv%&01zZ}sHT{r=iw|vV-IAhu| zOI3=B4w>O7wvB`dibHOZ%fduC>8~XBsFnzv6Jb=_kz;7azdSgsKBx#cpa8qyXQf7*)?_-!*c|c z_y9$YoE2>NKG-@m&MY^s4~9E%t`gFqWuCii!#@jx;a?`rd-=fQoJ@=Z;~>64-edTi zue$9HuI!w z%Wpi7?a-BRq=Myb)zFbRs#|dXXge*S0{SiULZrZ#puVo4^n=?>20THg!kVJQ_rUw62UuRIpO^Xjia1II@ulDG-1kf4 zE(tr#QWq$KkZX3HOx+y;0Hp6- zod9-lINv-D;Qju=eAAM3}n$(Ym4m*{%hU`9E)iz$8;h5uZ5ZwqvK`EB@V#g zCGyW~@Y%Edo52@%yOclZ#z%oald<68(mh%L?CvLN0Mw25FhP`UnC)sGAUen{js+AI z5OliJ?B2O+r%obkpk6+fIC_<3?z=co(UAb_o$C|?UEgelbvp>JEKvOi-}ed|<6_XD z?#61cSTMr?ypq-c@%#MwuNlj6vk{8}ZxxvBA>$46@6mvrnYkjgwz7|K3L`D2H*-c( zpP)YkX{uQ%m*ovEVXV2|JGMa&tJK3dyk%TFk4`uqo7_x&;_)omM0#>>H&oYz%fN{l zl+V1q$)^e!`3mc(&LZv8)9R{#qb1uKnK84oO0RB#emWZNJ$xVk#tbxRd?Z3>O1KJin- z>ZXX}+T?gJlG*hf2Q;|#zgTdS<;$#&*O%7XiAmki{kU^H`#m?1-2&miHlWTe=W92a zq7$*I2jMbNf_KGr@6=pd zAe~WY_2zAo&4^XGV_5$b;xUXSGcSi`m$1flw$MO2%(z-H{?yPxi9Rb88rNfhZrfEx zu62S1TpKs`2zDYb+mF^;<$x>m3^{}^@?D+^FK;o_Qn=s`frrn|K@_@!rp0BE=}wxU zRJ@x7ztV_R=e1L{K?^U#lVY6E(HF;K4cDw2S0HOi zp|l?7G)5#>f5f)UG~J=`Scwh3*|H&wJZeF%_f7*(_E+V&iKQ=77#me`AlHd_Nv|d} z{lJowG11`Vi6Oq0+Jj1Hz!)89Sx`7yndPAeD~G3;JRk{$o}jX=tD%ped6lmju=WLc z-8J&2VZ*oo4YEz%x%IQ5vACInE;7-5s!Yf-#heV8(FDQ<2L(+h{YzCz zbPHPHG=+31nV`cU?magG#|EkYFBvanRuy}th$>gU3BBvt<%5YwiOO+Lo|`H5q#`fR zz2#y7l36Q1cR1U5>wTpN_O3&_LfH->&!j%OTCBICkM2jg(=r0o6V|l#(dRNh%=DwD z=B}f{B^`x4zMqPp@Vc+Yi$_Rd9IYi6?fZfcfd?A#qM1oh$PId~0f@JGlEQeX6!{aw zGn^!+2E~-H`fHV(^$bZN_{@1^iR*9=<+ahv16i>M)rwnKgLllB-#u;mmqCODs4mF5 zCH5~HXGco8Y9ySMf$uwak5+lB=nHNItc`PPF1|3Xn?iE1ov9#hyye~i_oEYm)3y-h z?^CdKM<}NGeTk!*$o3Jg_qI4>P|+FW^i-u2S5sNWGryqO0KWDx%YR4pe_H`7JJ)}s z`roa9{eNl&#eYY&1e)J!?ON-AZ1c{s%ZpN~RHdp!RG%Hcyku~3vnXjG=osLSsK4ti z2uMgOSq@;tByKIv<%a)dE4r8HpCgt(J6DpJw3z%Sq(KCd1`bo=*$Fni~@(?J%VH*VP z)O<y*|#2Ubv3EC6n6Ke#3(QPPbzI0u?CVCJKh`n z4&iSq?yFnzum#8_sU$JmC@wi?G|IA9G9H8cQnqa)G$>-kPE93c6*f8mJ*XzamYxya z3tk}$M>_pWOnLD7c#j7yRow%-K6RrX65AiviI>em_Fhc3vFPWuq3%F431^KU^E2J zD8%7Z1tA&u1ma8kt25G_1*a&YR)=H;7U2VzSBU9wI}2}!@xTWdFH_2SJ#jH0$N)dd z(fyj2+_*Dq*_6V;ja%qHlDoh7ZlHzMf&Tj{+0w= zS?!*ft2x|em;o2sEFkgc)elZzE7~1~O`|cfcW!SC^j)>hr5BEiZkLCi|9;A}u0`6l zY9#kwDTnv9tBIsbdyPU%PAKg>b#~LEtBKa@45Nqw?C4H-snAHPBb>-(WP>&yAE$!u zX$xLZfbvZ#vs8jM>c66QZW3_YC0yypIsHK=r!K>5VsHmFW^SWnVDXJq>L@SYt_b95 z*$Sw^p-OT?nnL$Sn+b;XED#|b+{W;{r7E`UN9m|pP=2-lPSe^b`op~g^K@N_@Eela zjlI6x^QWKoQ#&nKxY4M+t^!%L%|a5Nq>ocFax=TqhYWgCYKhiGDdBS=3xs%oKbI>0 z-UQ+btKgIRt+h|Rv}uTm`_h@|1_?*~Fb+-eDIg*TaTCp zyF?myUVrcC!nGjyHno}Mm-nQ-Njzq6ai zdh^qCL-=L>q!I3tUsf(F){|yP-71qp7wYMUAcJ8^_PRQ5niD!oFm}2JUB~V`7hX)e z-pKZ~swcZ!&`UlP8j`2uB3+lbAzzqD-v%Vp%6KNI>C&#$VFvfka>oSz-3wd zyQt89N=m!+vd^~zYcHcWx7mPd8rnUlr%XU(w89VXvL6J8rh6&SC&}NmDlQ!zydBQr zu9t}#U%QZCE@*>dgp)fUYDIw{}+{eEp|q%_G|Ib#m}O?I+hzih*aIi${b zD8RF;|A+>-3Ob={?rgU#0w@o$VT&GrJ?a4-cuCSp1_Ym9ew#hno8*`Jip?#ay&%(L zDt$Hk3EzTx_MHfV#T8!QN72D+0RVQ8;Ebdd=jlvnzWCd;n0Ub;oK!xrLy zstWub`Y@O3N1!N%lm#ThO`0SZN|z0S5&wBM6xN;8%)3*oYDM_$1J=Xqntt2yM8CY> zp^&*B4zLXZgsTG4_j;JL={-F^!7gOQ>)zc4^-8i2Ya%Tx3&&Q1V?cubt@T-^-1j4+ zP;AsMa8DJDFegzoCV_C2yv+kw8b<`GUkKt&U;(Bq5S|B2dw;2}8r2(sI>)u-bP*aw zta-_XZPNnGEJ8%l@+SI1f)o)(<#99eqCT0rPIKfF3i(o^49W{Ir*=xEJO@Un<~ez= z#D_&~>|YQJ>!;vg%`D_02hURt7pv#VJAfeWI@9yh?z|}}3N@DYdd1g0X26g#irv$C z@Dv$#(UoqFZ6tYf!9{liB3JpP-Pd52Q%R1;K#G+Je5o4b!*idiLHpe_cHyc#AcRQc zMq?fqzO6q~2H${dnl7~5qfE6FhH0wp(-UxMUm`@9M_&vD;Z3WbLwI<_i?@!^vIeBk z=|MCM_Ka9NcBb{x#D*{1p`8uIU1L-|dGDo%*;JKL-(M$>*BNV!-+arxW-iBqG0W$| zd&90j9QFo(Lp@*bH1gRYpw}urhQZ-VZ5s6qQQJht4%?KL(4eL31>2g-Hqo>UW@lW_ z$OK{3wA58>eDxf6hf%vJo`}gJEGG(Q1SDEfI$me)-za-ZEBIP!_MUwL&LhUiER7(j z-O4dM)UMfzH%$&NYgON5W~@j~W#g$xb3-VOVFwG0ndc{aEC;S^w5IA=ty^U@IM5NZ z+uW+#(fEA*5z5)^BnYoO6bJj1iHC4sV|w-cTBp!*CR3}KC%ot$C4}&pUou1q)~2Jx z27eh#m1tOJ-)eFO!sN9e#MY3B_{mY04nya{d2y~I`zI~N70K5up zka_PKNI=2c6C`NEzdQ!Ki44gZ2_MR`1);ylDHw`)ZD3Ltv6OcBV6EXzxj3sXf-s*1uruToaD>H@N&hF2}>H zt?0y~k%5R`L~fyT5VA~o#Shkch&Fw_8k62t`{~{+To4kk#-NZSua>Ook5HdehD@Vj z2$MYtEKoFEhiF=#h(jOjhDN)wC7nWzw`)m#OU{(9; zA8ycGlMObzxmEm*cd#$s1rHPoW#wR}939ilo+fa$d3sx6Vl@4R>K>@CQcsK>NGQ1n z4P~ydjYbl`=g%o#GPEP*rz9coH$f|Lu*3By#}b+@jkNRs&^Kcmh@A3#kZYrcs!Tv1 zn1T_USu@NVV5IV+`x;a5EoWd{>0~~s<)2)o9~)tOjg^>sC9{R5uJ+*h^AVLI;c_g?2X5dD*T8S%anr+3kt!ByK-~ zacr(WqmcTvkyjoq`YuQ3NrU0bmxmVCIrs5xql~Mb*$DtmGvTJ))*Jmwg~9=~D4vx3 z&DW(>qq<$j_rfTX(>M6riLvgTJrH&~O|-&V_RX6rnk{Yjz))c@u^HLlaPh|lXtA9b zDaEc4+;(-C(w|6T_099fSbLqQFfmPG-$Tc&dHfw*E7V*H7@*mub;| zQ|7;=ft~HY|Kno+cWL1GpGw1Dqpba=1d`vX2HgV+OZ>{#akmvL7eX*q0=Y&(5`;VP z+|q=xY{FDx)FsASu&=8{nn#BGhay%BoU_NtR7M7CA>)rhFsp;ocet0rq~cin$AmEZ zzj}jMkJz$gn`Eso*IoqVx4Y^N@mR^2yW3UU*lrxua=kgpAAi^45J-Yrt$4vI7xf}7 zr|Pp+ny5nDdy!v?DubEkw5P((P{wSY+FyeKoD1}9fd&Dr$}6FDFN^93(;)$m=mFkOK_%iCcMSn~(PzFQ5F=(4&> zb_r;8?7?-G6sfinqf3M@h>ylcx{a3Ebw8&<^$A(4e>Ew>>kJjKhr?e)A3upQ67Nm8 z=~@6WhhDKM`8*`<8&+_es^K+}E%a8ZvnL>~&4$0ffdRwe zKj@CkJK0*PTPL`b5F&a(|ID8VMd?cwP;GZmNYn2fO{&AzXDRVRi7^r=Qi3)SOv_PtqfB#z32!qe|eSO4V`{%HBxcc}ztr zS35RoQ6PrjHAzJb1*W&mloWm~MpK`^=PIg2r*>C>Jg6+7 zrnGYK(i`3$$yG#uJnz`V(64QBE;Uyp4{rHZt72lW*10>d1X6#yl6pIRk|VfPWj9s* z_|PSdSKQ+~ByWa9A(>2}5NgKW%w>o@#wlg@T`m++9Gqe=pOzEQo?VDYGcRmTUywb+ z(0ypN08I1geL4K$KUEScw_Q^tG8$%=rgEkI7JZL)a*_iMefGid(|xm^M&7lyLrAb0 zk9-UnPCogb&4kZC9!U0TLm9OUVp!OQ7>9Cu1F2@>^#Am7^}$UXSKJLBfh&}cgpZUI zu6BrQuyng8>GXjugKaPd1V)(R#CG8ux6Vl0+P4j_MV1~8>2~871l2S-R(}s@% zC4k#WL!pyk0=P6VY17b>P@3@7bSP^K;>el?NI5@u3@=_b!~W@7|E?ExG*7XA2LQ$ITpm zp!f(b%xhV7bz8$)p>SAB^{9ES5mS}H&s1&u`eyf&2e#K<-!Q)FwFxiO^t-U+;ITEw z=dKmcKljfVTGe`$kYwevpH+;%n?R*Ok4MdWZsGidkQbC9`eJsg45w(UX&SG_&sh? z)zNRg^3J^r9Mcc37=G6qE$vH}qSr3Tixr$i&96T=YV`BMJvl4R&e^_aN2ucmId|;7yv@5W zx4qyu<2McL9I$C~{;)_xXJ7zx`k~QBL%#Br!i@PJZObY6$NY{(_e|)&z5T+@OS=}o zVHvUN+jAQy$0{8p!XTtVlJ2OqA_dG2QILmqymP>Mfxc3c?nzoVzdeD$Ni_m@py zyB@dhpS%3GczK@h$2GHm5zG5klPh3&Q ztbW9P_QGbzC8pnp>j#Yay|+F2S;f;g%j(J(j$gl|scGk#v1r+<(T`a+zuAB1sIzN! z-BGi^bn3cg<}-K9{!e>ZTmJDugWp1zwhSJzzvz+c<39PM-`}VI&1|SRw32lFqHyaq z1kJLhx+N-cRbr#Wd8L3XmMTfMmJ}bm%g#D&d_BYY6cvu2VG(e}q=?E|$$N1?mf}hx z=9l7dYE4y4@h_0nS`N;&VYzB4se;_}q*}3niej7+nW2C<=IIR_WW$xgJ!p)xbWOzo z3CvHe!GMQcfbKpqke;{0a47>FMg!@q);_I;&c3yf*Fwl=fe@2Pgw{fy_^A&u|+e=S`6)3Ftq8%p}mhWv}-Z6XTgwejA=2n_c4Zo7DFKmhICP- zwXhpPs8CS!SX%YsEH_&Y#MxSg)I=YH2^)No$MG>Vhr(Ctj%EWNLqpET&~Xi4sW$2% zA46gAG4(9ewgf45SX(nP6Eg6Ksu)rl)0U*VhB~Z@0cc@`lu6xXkvKw|(Qj2)hMQOA zWwFPTuAc;*E>53=p$_a;Lo0B)6(a_x7Mng7L&qKGb29XyG!kSyq$P~{G7#vp;BJ>ro%gbm`V!*+05ZSUnHF+guI5s8Gppv;Z$vqIM>8UOWx$G)Rl~AA; z3P`ACSKw2^VnnN9dIXM;lp~F-KvPXmCehX|m2~!WtNpFZ{jPwi#KRPoh_G;w%tgVGH8Y9hJl5#N?4!6xd8DTd*6Znh>tYr+-|(YsMq`Xh=s#sNE1GHx#CZRVWC}F{$&Qt?e=lNf6L%#A{L_2 z5%6Uw-<{*pxH}q@b7xsV2|D2;~l>yb+Q;sS7H{b?eIFD@uac2DfpyGKYs@Z`0@YDe6v_ zF!d`oHIrm$*aITda1tl^nmv%^biK{iE$1WIPrTO1L0qJFV#2fGf8u>?ZM!(o;Co|>@ z8t5a(on+D+JXvjJ&_Ew-Kk8{#gDiFm2KqRLwXu^I>|gV!#>bw zv;~Hh@i}bd{~{T(JPb)a4ZDy51B|f4FvhVH!O~8rk3@@sCg^F{1;RQ$41-PYBMdO> zX*?3L_*^jh++`)JkPQ1kpFQt4bB7UUm)+n?&`0*UGy4^+4p_lt(0Js? z;&Z3b=Pp6e`y4~c(fbz=C96zbAI>a3he4$0!;o4HG#+dERb!$Yl47t6&T?=S<_pw}MB&e_eIBZpLmE~-0eoI}JW0=KhahfESda3 d!51{wlf8<#D#lcrmU-R*FAh(fIDOs>=Kqi^n@9iv literal 144027 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, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -27,8 +27,11 @@ curl_easy_strerror - return string describing error code const char *curl_easy_strerror(CURLcode errornum); .SH DESCRIPTION -The curl_easy_strerror() function returns a string describing the CURLcode -error code passed in the argument \fIerrornum\fP. +The \fIcurl_easy_strerror(3)\fP function returns a string describing the +CURLcode error code passed in the argument \fIerrornum\fP. + +Typically applications also appreciate \fICURLOPT_ERRORBUFFER(3)\fP for more +specific error descriptions generated at run-time. .SH AVAILABILITY This function was added in libcurl 7.12.0 .SH RETURN VALUE diff --git a/docs/libcurl/curl_easy_strerror.html b/docs/libcurl/curl_easy_strerror.html index d8cb379..e279cb6 100644 --- a/docs/libcurl/curl_easy_strerror.html +++ b/docs/libcurl/curl_easy_strerror.html @@ -49,9 +49,10 @@ p.roffit {

curl_easy_strerror - return string describing error code

SYNOPSIS

#include <curl/curl.h>

const char *curl_easy_strerror(CURLcode errornum);

DESCRIPTION

-

The curl_easy_strerror() function returns a string describing the CURLcode error code passed in the argument errornum.

AVAILABILITY

+

The curl_easy_strerror function returns a string describing the CURLcode error code passed in the argument errornum. +

Typically applications also appreciate CURLOPT_ERRORBUFFER(3) for more specific error descriptions generated at run-time.

AVAILABILITY

This function was added in libcurl 7.12.0

RETURN VALUE

A pointer to a zero terminated string.

SEE ALSO

-

libcurl-errors (3) curl_multi_strerror (3) curl_share_strerror (3)

+

libcurl-errors, curl_multi_strerror, curl_share_strerror,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_strerror.pdf b/docs/libcurl/curl_easy_strerror.pdf index 889e1978486c03ec4a9eb1ab761d485421e38353..5997bebd2eae431a1147cf29d974c7e740fa8077 100644 GIT binary patch delta 1681 zcma))eK6E{9LH_4c7I5BU6MR3*>JV|e*63Fll9QDcCSZ7V_d}ACpx>c#x1HllJJubtU zq~~oBE{&5U+V80FpSjVt_TBNi3@3fL(!Oo?%FQi*lwW*H4IL4u2$)^sg0rg210|02 zj|vsD1Cy55d7-k?sd{)JY5yPuaVRiQCRWjxwYzoHm3ilC0AJ+mRZ&!)wGI+yGmN= zh-g_ydhwItjHbSN-mZ=_Hl1q>EC;3LaTn}8BGJ52`HFypZQcD^t)Tkntm2Z&_6tgu z)n6u>@mHggrpueudVLtLIyXdIW+x~rn2ixkZVk~|1pD^k{TjWae$eHI4CN53s)D;m zim`^CEN-v5vTwFYvaW~O>#kBh@U;TR@3eT*(! zKHcy*I%+h0r#I{T!!Sj?Zlir&!%$#oo;v)4-wO5^cHl&;{0>d$U#4_Ezs7OU$yq;q zttTz(0H!tNt^0QOQ(ckj*H&P$1j9b>1 z_&E-f1m3lki8D>^oSYyVx2XP?{Z-aiILkA08x=L%V`c9NdU?ym?;DDACtI@YTPKlQI7nXXM*w>GX(@lA zh?=Jx?}{Z&aa|P1a4^!MDcTn0`Yc#BeJP0a=uBI@dB#)Zrdo>)JGm*bN&dvzs{Y1| zHPckat)bdIPq?qiV<()eW5S1WjmPccH)lx>mXCGkvpPnV%u4&Zc4P}noD;#T!Hwl4 zR`3faQXU15a$hU0bh0(}6S+fGygAgDII!d^|7%%La87rSuW&BfVnCmW)DCmfP{}XokIJBnr)3O zFc_ry+og1jWq_2QAc&KS2@pId?m&4aZf>8M2RlwA63T^AzA$MQ03o1|cX6UO zp13Hn`7r(z217+bvy~tPgg`pTfN1lPT|m&q4e;2OAYk*7g|2K*G6;QXpnJ`nzJc9* zd_Ij&As31OkN{E8dNW&Jhz=4y_7)^a3BY^-!XR}4gCH{WZx5Us1Bx{#Dj5j*-)|5Z zp)6nsgRzjo$N~ma=T_{?Oc0sAkipPAbN**|h(ccw6r#d3w9VWWLqYGFJ47=4$qYt- zpC3%&kU11KgUzACbP%L65Nd#b0L1a}`d=dwm|NPUWS%^EzMC)^LI5H$Admz64G6n_ AZvX%Q delta 1461 zcmcaCb6IMFdwt0J{MiNqf6v7iUb5p^_VCuRhPA$vGmf|WWL{F;5;WCMly#Po>XN7J ztKP1^e{+Ia=4D^uAcb#t_m;n(_m^Rc!Gd3s_io;@n$@}?M~BP%^}(bx;kNK?ZI4-) zm&AGGt+i`+JfRpOH<4@7)}s*~HEbsrZ{4tYU0keq=I7VDGG8xRS8x7x>f2b$4O;nM zradm2FXZL?+hpyo64v}9*7lR~r+IUxcT7-ZY-Q>AWXi7JkdkwA@`=j+Ifc`I9toHG zzDKUbXA%)X$uuKe(5#|M(}x%*xyC^2z8e8k{{^Cu0i>WGwdHUU%wN zQ82HP=>)k8E06xEZE`c&;XixXiG^!?T%xk&nmmPC4xgAdclGr@3(7pq*00=l@lZwD@`DpRJa0BQ@-Qjyo3ftg>8gebt1q5rJWCFB2*o-q z3GTgk!Mm~l&96y|3rlRI`X`;PO}yAU&tXdJaovDBn<}S$ycp=BDd%DBs{47*^mGel z0ik1@vbQR;H*r^s0sX=mV{t~Qyn* zEz&aY-Y>ex@Gp9L=q;t4bvK@D{r}NmwvctZLZ714`Q_&~{$>&Tc466S_73y*NlFJ8 z&Ge5w_ddjOH!D}Kwg0!Npb^J5!NX@azYEJ+dg`FELy6M}5`zxy+KxW|qdAcQT7GG8%6_$6~=a`3S4{WL-AF&1GzHj4B2e z7RlzOY391d7KTZ>hK8xBx&}a?Yi5~ZY+`0^WSW*@Hu(p;53{Md{^X79%EW2t?UP z$))dHl$uzQnV;v9SdyyYVr67tXl!5sgq9|zU{9zU7^nl4`R1qKQZYG^N2%UO)6On6 zFC{-Ii>sn2HI2(a!O(;Y6tobaU}kD+Y^so^02MPdFf>yDODW{R#EdMAOwh#)EKSWZ z#LO)*#3nQGiq@N(TcE2oG_Wwl5Hkk41kG+kBXa{xF#{tEF+(FPVy0j*0RsbsXADgY z3@7j6m0>iQe4ST5*2vY>)XCJ`#MRB&$jQ>#!pzmk(Ae0~z!)g%V(RQ>XG2g$ESH@f XS8+*VQ3*JJjV#SAxKveL{oS|#;;jna diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3 index 9b03fd0..357ad23 100644 --- a/docs/libcurl/curl_easy_unescape.3 +++ b/docs/libcurl/curl_easy_unescape.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -48,4 +48,4 @@ Added in 7.15.4 and replaces the old \fIcurl_unescape(3)\fP function. .SH RETURN VALUE A pointer to a zero terminated string or NULL if it failed. .SH "SEE ALSO" -.I curl_easy_escape(3), curl_free(3), RFC 2396 +.BR curl_easy_escape "(3), " curl_free "(3)," RFC 2396 diff --git a/docs/libcurl/curl_easy_unescape.html b/docs/libcurl/curl_easy_unescape.html index 5d1f018..a2538ad 100644 --- a/docs/libcurl/curl_easy_unescape.html +++ b/docs/libcurl/curl_easy_unescape.html @@ -51,11 +51,11 @@ p.roffit {

char *curl_easy_unescape( CURL * curl , char * url , int inlength , int * outlength );

DESCRIPTION

This function converts the given URL encoded input string to a "plain string" and returns that in an allocated memory area. All input characters that are URL encoded (%XX where XX is a two-digit hexadecimal number) are converted to their binary versions. -

If the length argument is set to 0 (zero), curl_easy_unescape(3) will use strlen() on the input url string to find out the size. +

If the length argument is set to 0 (zero), curl_easy_unescape will use strlen() on the input url string to find out the size.

If outlength is non-NULL, the function will write the length of the returned string in the integer it points to. This allows an escaped string containing %00 to still get used properly after unescaping. -

You must curl_free(3) the returned string when you're done with it.

AVAILABILITY

-

Added in 7.15.4 and replaces the old curl_unescape(3) function.

RETURN VALUE

+

You must curl_free the returned string when you're done with it.

AVAILABILITY

+

Added in 7.15.4 and replaces the old curl_unescape function.

RETURN VALUE

A pointer to a zero terminated string or NULL if it failed.

SEE ALSO

-

curl_easy_escape(3), curl_free(3), RFC 2396

+

curl_easy_escape, curl_free, RFC 2396

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_easy_unescape.pdf b/docs/libcurl/curl_easy_unescape.pdf index 6c334d18a3c7163dd9f6964ff84fcc6999710fa2..e7880c2c5abe29b58cfec5e790302b677d6e7535 100644 GIT binary patch delta 2081 zcma)(c|6qX9>*KxWOQZ8v1?>7M~2^T#wCA*?UUjC>F7x1fPc=3I#d#i6F<5WzS&(tVAUj%j$#jH|j zEx|`T5@eH_)G1*-C0!f?BVBcNlS8ro2|j7$;P~qpksDd}1iRi$l@ z%Z{Yjm{i=soZZb5v+OXJc9$I!hYKsXAllB>B26$FlsUt6UeM1mK)w)eWwEbr5m!oe zKcYS@scZG$uK$y{_?hMEH>T-0miw&9hVfd@dtVxFZLlMM{;myGapOcqx6A3~A}dFF z7WY9{zh;DZ0%}0d>{5S7=+q=RNb*+aK=sb+gH5@M0@slnAJ`6fhEi_72suXh>^)z3 z{5|bA+DV~V21%?}in{mq(}J_oT>s8cr^(_L`QJW>8%Lw4ua zL|K;fJm~lqX(?ajWjJ}$OpYfnQMEc09RGw`G(lhXF}rwK>_(Wd_!QI9JCpm5S;6{d zm$l)Yr%Ul_+UPFCVn-_7MNi+v1> zZh$B5IM3GfxQd0ZMlC~TRw`x|b!Qut96#o%{EfZYpxaZjC^J=UfRFCd4&!eCqLVW% zqkIMNSb4juveWw&4kKeaN+ZW2OBT%L-iD_6mCB?c_3IqG6mt?WmH{TH#WJyBi&^7r z))i{HiWJ!BH9v{@yPa$A6mN1`?vqu)!rPMtoY47J>0H4m*-1q|^KFSzNV(S~N~-BW zMRwIRo9W%WWHoz|vC~Tb34}4xT*Nkn{5UWDR;*#my5@w(-M2|?=3TdOlS=x+D)ei*QkW+c2I=oi@T)rqvpEZ+n36wV8yAD=Ud zdAvFGiNkSPq~qLl9L5rd4h#lIgtAhV4B53x`ROQ0nv;l{>#aL-iyCe#*bc5-;!K@d zd^Mxzs^_1l}Mu5I$M9jaK=D(%I z0MIvKFrXpC;p{o&VoJh*rdT4GOg1;Cm=ev+NTw7+j2RX(2T6DWiD-Q2{~9iEV`F#- X(><6O9!&R!V+j~MTuX~=M}hwn>0f3y delta 2034 zcmb7=c~p~E8ixsjND?6s5hxH)fk1%reMvs@g^|sKD1$%&17$#E4P{C2gb<<>LREI^ zI0TATRxM(XP25;CB1Yw~2muSS2#8=s)_}1nMTd6&nKN|GIQPAOyyv;kz32Ddev@jG zvj>DxaU%@OdhJp0fYxbrwE`D}`^MYZO~*Mcw6eiaTA!18*-smleMlfpNTCUNk%g5S zx@k)8V=-fQj<4|VAuy3wKEMuI}b#UK`&iur4ZQa!q!A-cIlk^0J zcbqX!snZ;(o|&Q0;roS}D;=Ubf_2F~KcSd#@mL+sS{_W(c6wu()MaLte`4S!Ch{=p;`Xa!%^4)SBBGfaB z=AcKatrRnkZ#B(*!3Q%6vKtBrWut^=(hnxm)}PcTPe|i0n2Z;cyp(pSoL>8Gku3C$ zDzA(V%H38JW!|yZlLFmxA%;CMnuIfZ%p?Jc@reoRGc10;Ejy3nQ=gLEZz1+WrpS&5 zy>SX(yNa07V_jsQdoU8;)s|E|9ca41z5h+1ujRJ57Z-LbniNWy($14*0er25fUQ!k zT6kuOinX4<(1dp)rQoR0aSl{BgSdg+SS zlJVsdW`uEt(^xsZIiHe)n=AElw+Wi+FwXyQd!~Es;aoqLpPXPZEE&#UmBi3nMjxqG zUnLV>TBljKYfjC8+OJvqZ$u?kB-@_sz(zW5ai_(RUvnjKNy+Y$K0|ZDKIaNVHquwT za7jlxBO#OneHp}4m?QHd!1F@6KjyMkJ2PNf{7C1A#x0Lc4(7$iVu%@7-R_D@r<$u5 zUersK{&KT(IdWUPj`lfIH>`J}vt9uq&hz2%{&AaHwOK`>?a~b zXz0#r9;J6ax+=gH*4GHd@(kX((M7hjrMLZrwQ~4wm{@dU*rCdh{nZxgm&I1<*ka%) z;kmGj-B8bHDpAynlLBI^irWTU%u&qf{2gu|%a?_7_a!g~PsqYcTaP_C ztfVI2lJ#aXB~V8UQsjxj9{KJKI-Y$=!EqhhPXB`x@8zxtl*cRR3i z+z{$1vJNQ5=#&|u zM^=PR_Wdsf6$#b1mCYi@sC~3Oi=?}^clJ-uPa+*h4whvHu{>Vg_I==&m{>ZNF%UlP zKe`JyYgJW{Lm&?3@^P)7_^%W-5eOSyX2>bk9PgBK@$-+(>-&laEON# zz3*0N9lcUk>z1xLfr!*yIyw4fu>6I?F|9_*{x*ZbO60iMqbbFa!Zf@S2P@?7pAF|w zs9tAo_PkVqD{6-bz4`Q(jG6Ko?pw8#kE-k?^Kem-s(~_*dc8^2K*bcG5+NXrLa`yi zV5kiUMnu>E8_R}8Wre~J2!#=kqR{K{{edHUPY_4*^trGGtGL ztN@~D9BJ{V{0kHnK@=TAF+T5k32MLj=LG*hB46jC#RvvuiL|A0BSLslaU6OGFT#Ru zPXs^`0B;nP4E-?#9suwgnnzste=|fO8oM{fIjsRWLL`&lzY{Rwm>~aX01`yn#6XBj z{!b4ilgOfF4Ray5`G^9-n{+CLxS0WzO$;VcH!%wICk*}<+w*VPi2$@I3=sqYQM2aW z!>*t!33j1DG*_5Ghd`1GK&I2ljD18R41#1T=(zWP8i$dNj>vdk2$v_|MzD}1JD7qr KGjsJ~ApZ$aNIc*G diff --git a/docs/libcurl/curl_escape.html b/docs/libcurl/curl_escape.html index 6212096..2178839 100644 --- a/docs/libcurl/curl_escape.html +++ b/docs/libcurl/curl_escape.html @@ -50,12 +50,12 @@ p.roffit {

#include <curl/curl.h>

char *curl_escape( char * url , int length );

DESCRIPTION

-

Obsolete function. Use curl_easy_escape(3) instead! +

Obsolete function. Use curl_easy_escape instead!

This function will convert the given input string to an URL encoded string and return that as a new allocated string. All input characters that are not a-z, A-Z or 0-9 will be converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number).

If the 'length' argument is set to 0, curl_escape() will use strlen() on the input 'url' string to find out the size.

You must curl_free() the returned string when you're done with it.

AVAILABILITY

-

Since 7.15.4, curl_easy_escape(3) should be used. This function will be removed in a future release.

RETURN VALUE

+

Since 7.15.4, curl_easy_escape should be used. This function will be removed in a future release.

RETURN VALUE

A pointer to a zero terminated string or NULL if it failed.

SEE ALSO

-

curl_unescape (3) curl_free (3) RFC 2396

+

curl_unescape, curl_free, RFC 2396

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_escape.pdf b/docs/libcurl/curl_escape.pdf index 888e53e1f741fe64ccbc6679f1f6d6e39e870d07..3c9fea2c35ccb20a10a87b5a28d249337d90cdf0 100644 GIT binary patch delta 375 zcmZ1{zfOLGKBthGfuXUvrAeZ0a+*<+uAyOS+GI!0I7YL{3piD=OG-`t$Y~~Qs%v1V zYhV##U}FlV)7ndB}U`T z_j!vLV=bJ`on6eGO^a}09m$PjsO4v delta 375 zcmZ1{zfOLGKBtg@xoMJ#MVh&;v4vrhuAyOS>SRaGI7ZXS3piD=OG-`t$Y~~QtZQHa zL?H&2RwkxaMn>8OMw6|$G_Z=7a#=DOOZ%*`zv9gR(l-7F0)UEPcwU7buFO^nQ4TpaCe2&#zXva{nVE=epZsVGWK R<1#iiGvrcLb@g}S0sywqUV;Ds diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3 index f03fe06..3e48149 100644 --- a/docs/libcurl/curl_formadd.3 +++ b/docs/libcurl/curl_formadd.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -32,7 +32,7 @@ curl_formadd - add a section to a multipart/formdata HTTP POST curl_formadd() is used to append sections when building a multipart/formdata HTTP POST (sometimes referred to as RFC2388-style posts). Append one section at a time until you've added all the sections you want included and then you -pass the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP. +pass the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST(3)\fP. \fIlastitem\fP is set after each \fIcurl_formadd(3)\fP call and on repeated invokes it should be left as set to allow repeated invokes to find the end of the list faster. @@ -45,7 +45,7 @@ the function itself. You must call \fIcurl_formfree(3)\fP on the \fIfirstitem\fP after the form post has been done to free the resources. Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. -You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. +You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual. First, there are some basics you need to understand about multipart/formdata posts. Each part consists of at least a NAME and a CONTENTS part. If the part @@ -86,6 +86,10 @@ you must set its length with \fBCURLFORM_CONTENTSLENGTH\fP. .IP CURLFORM_CONTENTSLENGTH followed by a long giving the length of the contents. Note that for \fICURLFORM_STREAM\fP contents, this option is mandatory. + +If you pass a 0 (zero) for this option, libcurl will instead do a strlen() on +the contents to figure out the size. If you really want to send a zero byte +content then you must make sure strlen() on the data pointer returns zero. .IP CURLFORM_FILECONTENT followed by a filename, causes that file to be read and its contents used as data in this part. This part does \fInot\fP automatically become a file @@ -121,12 +125,13 @@ to the buffer to be uploaded. This buffer must not be freed until after is used in combination with \fICURLFORM_BUFFER\fP. The parameter is a long which gives the length of the buffer. .IP CURLFORM_STREAM -Tells libcurl to use the \fICURLOPT_READFUNCTION\fP callback to get data. The -parameter you pass to \fICURLFORM_STREAM\fP is the pointer passed on to the -read callback's fourth argument. If you want the part to look like a file -upload one, set the \fICURLFORM_FILENAME\fP parameter as well. Note that when -using \fICURLFORM_STREAM\fP, \fICURLFORM_CONTENTSLENGTH\fP must also be set -with the total expected length of the part. (Option added in libcurl 7.18.2) +Tells libcurl to use the \fICURLOPT_READFUNCTION(3)\fP callback to get +data. The parameter you pass to \fICURLFORM_STREAM\fP is the pointer passed on +to the read callback's fourth argument. If you want the part to look like a +file upload one, set the \fICURLFORM_FILENAME\fP parameter as well. Note that +when using \fICURLFORM_STREAM\fP, \fICURLFORM_CONTENTSLENGTH\fP must also be +set with the total expected length of the part. (Option added in libcurl +7.18.2) .IP CURLFORM_ARRAY Another possibility to send options to curl_formadd() is the \fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as @@ -142,7 +147,7 @@ the POST occurs, if you free it before the post completes you may experience problems. When you've passed the HttpPost pointer to \fIcurl_easy_setopt(3)\fP (using -the \fICURLOPT_HTTPPOST\fP option), you must not free the list until after +the \fICURLOPT_HTTPPOST(3)\fP option), you must not free the list until after you've called \fIcurl_easy_cleanup(3)\fP for the curl handle. See example below. diff --git a/docs/libcurl/curl_formadd.html b/docs/libcurl/curl_formadd.html index 8cdfe6d..dbf8a80 100644 --- a/docs/libcurl/curl_formadd.html +++ b/docs/libcurl/curl_formadd.html @@ -50,23 +50,24 @@ p.roffit {

#include <curl/curl.h>

CURLFORMcode curl_formadd(struct curl_httppost ** firstitem, struct curl_httppost ** lastitem, ...);

DESCRIPTION

-

curl_formadd() is used to append sections when building a multipart/formdata HTTP POST (sometimes referred to as RFC 2388-style posts). Append one section at a time until you've added all the sections you want included and then you pass the firstitem pointer as parameter to CURLOPT_HTTPPOST. lastitem is set after each curl_formadd(3) call and on repeated invokes it should be left as set to allow repeated invokes to find the end of the list faster. +

curl_formadd() is used to append sections when building a multipart/formdata HTTP POST (sometimes referred to as RFC 2388-style posts). Append one section at a time until you've added all the sections you want included and then you pass the firstitem pointer as parameter to CURLOPT_HTTPPOST(3). lastitem is set after each curl_formadd call and on repeated invokes it should be left as set to allow repeated invokes to find the end of the list faster.

After the lastitem pointer follow the real arguments. -

The pointers firstitem and lastitem should both be pointing to NULL in the first call to this function. All list-data will be allocated by the function itself. You must call curl_formfree(3) on the firstitem after the form post has been done to free the resources. -

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. +

The pointers firstitem and lastitem should both be pointing to NULL in the first call to this function. All list-data will be allocated by the function itself. You must call curl_formfree on the firstitem after the form post has been done to free the resources. +

Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER(3) as usual.

First, there are some basics you need to understand about multipart/formdata posts. Each part consists of at least a NAME and a CONTENTS part. If the part is made for file upload, there are also a stored CONTENT-TYPE and a FILENAME. Below, we'll discuss what options you use to set these properties in the parts you want to add to your post.

The options listed first are for making normal parts. The options from CURLFORM_FILE through CURLFORM_BUFFERLENGTH are for file upload parts.

OPTIONS

CURLFORM_COPYNAME -

followed by a string which provides the name of this part. libcurl copies the string so your application doesn't need to keep it around after this function call. If the name isn't NUL-terminated, or if you'd like it to contain zero bytes, you must set its length with CURLFORM_NAMELENGTH. The copied data will be freed by curl_formfree(3). +

followed by a string which provides the name of this part. libcurl copies the string so your application doesn't need to keep it around after this function call. If the name isn't NUL-terminated, or if you'd like it to contain zero bytes, you must set its length with CURLFORM_NAMELENGTH. The copied data will be freed by curl_formfree.

CURLFORM_PTRNAME

followed by a string which provides the name of this part. libcurl will use the pointer and refer to the data in your application, so you must make sure it remains until curl no longer needs it. If the name isn't NUL-terminated, or if you'd like it to contain zero bytes, you must set its length with CURLFORM_NAMELENGTH.

CURLFORM_COPYCONTENTS -

followed by a pointer to the contents of this part, the actual data to send away. libcurl copies the provided data, so your application doesn't need to keep it around after this function call. If the data isn't null terminated, or if you'd like it to contain zero bytes, you must set the length of the name with CURLFORM_CONTENTSLENGTH. The copied data will be freed by curl_formfree(3). +

followed by a pointer to the contents of this part, the actual data to send away. libcurl copies the provided data, so your application doesn't need to keep it around after this function call. If the data isn't null terminated, or if you'd like it to contain zero bytes, you must set the length of the name with CURLFORM_CONTENTSLENGTH. The copied data will be freed by curl_formfree.

CURLFORM_PTRCONTENTS

followed by a pointer to the contents of this part, the actual data to send away. libcurl will use the pointer and refer to the data in your application, so you must make sure it remains until curl no longer needs it. If the data isn't NUL-terminated, or if you'd like it to contain zero bytes, you must set its length with CURLFORM_CONTENTSLENGTH.

CURLFORM_CONTENTSLENGTH

followed by a long giving the length of the contents. Note that for CURLFORM_STREAM contents, this option is mandatory. +

If you pass a 0 (zero) for this option, libcurl will instead do a strlen() on the contents to figure out the size. If you really want to send a zero byte content then you must make sure strlen() on the data pointer returns zero.

CURLFORM_FILECONTENT

followed by a filename, causes that file to be read and its contents used as data in this part. This part does not automatically become a file upload part simply because its data was read from a file.

CURLFORM_FILE @@ -78,16 +79,16 @@ p.roffit {

CURLFORM_BUFFER

is used for custom file upload parts without use of CURLFORM_FILE. It tells libcurl that the file contents are already present in a buffer. The parameter is a string which provides the filename field in the content header.

CURLFORM_BUFFERPTR -

is used in combination with CURLFORM_BUFFER. The parameter is a pointer to the buffer to be uploaded. This buffer must not be freed until after curl_easy_cleanup(3) is called. You must also use CURLFORM_BUFFERLENGTH to set the number of bytes in the buffer. +

is used in combination with CURLFORM_BUFFER. The parameter is a pointer to the buffer to be uploaded. This buffer must not be freed until after curl_easy_cleanup is called. You must also use CURLFORM_BUFFERLENGTH to set the number of bytes in the buffer.

CURLFORM_BUFFERLENGTH

is used in combination with CURLFORM_BUFFER. The parameter is a long which gives the length of the buffer.

CURLFORM_STREAM -

Tells libcurl to use the CURLOPT_READFUNCTION callback to get data. The parameter you pass to CURLFORM_STREAM is the pointer passed on to the read callback's fourth argument. If you want the part to look like a file upload one, set the CURLFORM_FILENAME parameter as well. Note that when using CURLFORM_STREAM, CURLFORM_CONTENTSLENGTH must also be set with the total expected length of the part. (Option added in libcurl 7.18.2) +

Tells libcurl to use the CURLOPT_READFUNCTION(3) callback to get data. The parameter you pass to CURLFORM_STREAM is the pointer passed on to the read callback's fourth argument. If you want the part to look like a file upload one, set the CURLFORM_FILENAME parameter as well. Note that when using CURLFORM_STREAM, CURLFORM_CONTENTSLENGTH must also be set with the total expected length of the part. (Option added in libcurl 7.18.2)

CURLFORM_ARRAY

Another possibility to send options to curl_formadd() is the CURLFORM_ARRAY option, that passes a struct curl_forms array pointer as its value. Each curl_forms structure element has a CURLformoption and a char pointer. The final element in the array must be a CURLFORM_END. All available options can be used in an array, except the CURLFORM_ARRAY option itself! The last argument in such an array must always be CURLFORM_END.

CURLFORM_CONTENTHEADER

specifies extra headers for the form POST section. This takes a curl_slist prepared in the usual way using curl_slist_append and appends the list of headers to those libcurl automatically generates. The list must exist while the POST occurs, if you free it before the post completes you may experience problems. -

When you've passed the HttpPost pointer to curl_easy_setopt(3) (using the CURLOPT_HTTPPOST option), you must not free the list until after you've called curl_easy_cleanup(3) for the curl handle. +

When you've passed the HttpPost pointer to curl_easy_setopt (using the CURLOPT_HTTPPOST(3) option), you must not free the list until after you've called curl_easy_cleanup for the curl handle.

See example below.

RETURN VALUE

0 means everything was ok, non-zero means an error occurred corresponding to a CURL_FORMADD_* constant defined in <curl/curl.h>

EXAMPLE

@@ -158,6 +159,6 @@ p.roffit {
   curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
  

SEE ALSO

-

curl_easy_setopt (3) curl_formfree (3)

+

curl_easy_setopt, curl_formfree,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_formadd.pdf b/docs/libcurl/curl_formadd.pdf index 3e7ac977db672725308e3668dd5e5ab7d186623f..50f2a7c52ea0b5d5bd245a371aee8d4b207164b4 100644 GIT binary patch delta 9281 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 u$$|xB1^J|b0zh%m|1V*REiR7j, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -33,8 +33,8 @@ curl_formfree() is used to clean up data previously built/appended with typically means after \fIcurl_easy_perform(3)\fP has been called. The pointer to free is the same pointer you passed to the -\fBCURLOPT_HTTPPOST\fP option, which is the \fIfirstitem\fP pointer from the -\fIcurl_formadd(3)\fP invoke(s). +\fBCURLOPT_HTTPPOST(3)\fP option, which is the \fIfirstitem\fP pointer from +the \fIcurl_formadd(3)\fP invoke(s). \fBform\fP is the pointer as returned from a previous call to \fIcurl_formadd(3)\fP and may be NULL. diff --git a/docs/libcurl/curl_formfree.html b/docs/libcurl/curl_formfree.html index 9ea2c74..620220e 100644 --- a/docs/libcurl/curl_formfree.html +++ b/docs/libcurl/curl_formfree.html @@ -50,10 +50,10 @@ p.roffit {

#include <curl/curl.h>

void curl_formfree(struct curl_httppost * form);

DESCRIPTION

-

curl_formfree() is used to clean up data previously built/appended with curl_formadd(3). This must be called when the data has been used, which typically means after curl_easy_perform(3) has been called. -

The pointer to free is the same pointer you passed to the CURLOPT_HTTPPOST option, which is the firstitem pointer from the curl_formadd(3) invoke(s). -

form is the pointer as returned from a previous call to curl_formadd(3) and may be NULL.

RETURN VALUE

+

curl_formfree() is used to clean up data previously built/appended with curl_formadd. This must be called when the data has been used, which typically means after curl_easy_perform has been called. +

The pointer to free is the same pointer you passed to the CURLOPT_HTTPPOST(3) option, which is the firstitem pointer from the curl_formadd invoke(s). +

form is the pointer as returned from a previous call to curl_formadd and may be NULL.

RETURN VALUE

None

SEE ALSO

-

curl_formadd (3)

+

curl_formadd,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_formfree.pdf b/docs/libcurl/curl_formfree.pdf index 8ad71fecfe3595f98dc598ce4dfd7dfd2598b269..3182daa3b76703ef392ace8bddbbad09de84b5b8 100644 GIT binary patch delta 1689 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 diff --git a/docs/libcurl/curl_formget.html b/docs/libcurl/curl_formget.html index e5b4b29..29c0868 100644 --- a/docs/libcurl/curl_formget.html +++ b/docs/libcurl/curl_formget.html @@ -53,10 +53,10 @@ p.roffit {   curl_formget_callback append );

DESCRIPTION

-

curl_formget() is used to serialize data previously built/appended with curl_formadd(3). Accepts a void pointer as second argument named userp which will be passed as the first argument to the curl_formget_callback function. +

curl_formget() is used to serialize data previously built/appended with curl_formadd. Accepts a void pointer as second argument named userp which will be passed as the first argument to the curl_formget_callback function.

typedef size_t (*curl_formget_callback)(void * userp, const char * buf, size_t len );

The curl_formget_callback will be executed for each part of the HTTP POST chain. The character buffer passed to the callback must not be freed. The callback should return the buffer length passed to it on success. -

If the CURLFORM_STREAM option is used in the formpost, it will prevent curl_formget(3) from working until you've performed the actual HTTP request as only then will libcurl get the actual read callback to use!

RETURN VALUE

+

If the CURLFORM_STREAM option is used in the formpost, it will prevent curl_formget from working until you've performed the actual HTTP request as only then will libcurl get the actual read callback to use!

RETURN VALUE

0 means everything was ok, non-zero means an error occurred

EXAMPLE

 

 size_t print_httppost_callback(void *arg, const char *buf, size_t len) @@ -76,6 +76,6 @@ p.roffit {

AVAILABILITY

This function was added in libcurl 7.15.5

SEE ALSO

-

curl_formadd (3)

+

curl_formadd,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_formget.pdf b/docs/libcurl/curl_formget.pdf index ccf6e8e888220436797d1198f2dbafdc03be2424..6b50dc58871b8d9334c403bd74bd17c318c5016a 100644 GIT binary patch delta 348 zcmdm`v`cBjZZ07+BXiRfW0OSPjvw8>|=;uy^)3-GF9mz0`Z%WWoXs%v1V zYhV##U}VDmrY>%VmS&cYriPAgmM%ulCU!Q2R7{o^lm-BGL0NqO delta 348 zcmdm`v`cBjZZ07M%cPVjv)X8VL;uuXQ3-GF9mz0`Z%WWoXtZQHa zL?H&2RwkxaMrPUuMw5?mYhV>;, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -29,7 +29,7 @@ curl_free - reclaim memory that has been obtained through a libcurl call .ad .SH DESCRIPTION curl_free reclaims memory that has been obtained through a libcurl call. Use -curl_free() instead of free() to avoid anomalies that can result from +\fIcurl_free(3)\fP instead of free() to avoid anomalies that can result from differences in memory management between your application and libcurl. .SH "SEE ALSO" -.I curl_unescape(3) +.BR curl_easy_unescape "(3), " curl_easy_escape "(3) " diff --git a/docs/libcurl/curl_free.html b/docs/libcurl/curl_free.html index 7d75c24..87fd071 100644 --- a/docs/libcurl/curl_free.html +++ b/docs/libcurl/curl_free.html @@ -50,7 +50,7 @@ p.roffit {

#include <curl/curl.h>

void curl_free( char * ptr );

DESCRIPTION

-

curl_free reclaims memory that has been obtained through a libcurl call. Use curl_free() instead of free() to avoid anomalies that can result from differences in memory management between your application and libcurl.

SEE ALSO

-

curl_unescape(3)

+

curl_free reclaims memory that has been obtained through a libcurl call. Use curl_free instead of free() to avoid anomalies that can result from differences in memory management between your application and libcurl.

SEE ALSO

+

curl_easy_unescape, curl_easy_escape,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_free.pdf b/docs/libcurl/curl_free.pdf index 041e7592a9f797963822eddf4bf2e90718b2fbdd..20e226cc521f5fda5a93a7c57baaf318ad7fd8de 100644 GIT binary patch delta 1337 zcmcaCIY(-OdwsBH{uKj}eb2*fI+;0@)@?u1=itHmEZ|D7pTz>P(7Z=8IZqj-EPS>9 zxZj+}Q$-HbgihAg-T!3wpP`2%VfP*T)q5sOGrm4|c*D24iWD1`@29mY=FeivG`}>} z{H~&cMn{X{OoymSl}8;M9`bvm?WJ#hs=Jz1`+W0mhEtCYzGG3W?=?6S@k4x-TnOj! z)Pvi3lg|a>tPa3sp9C=(K&g^I6}&d3xJIOI5)xp|pr4JDLyg-=-+EgrzUl(pph+b&LOn{1ATWs|TB}nVRtL)ykSX`|UQ#YtjM6^(R6i z{XE#OI33niF`T44_38D~t6$eYy;&6h?1i<_zwSlnPAOjhaBZ8-M)@t3>8G8od6auU z1-?F?c5T*z6rrlu;y-hu9G2wwHs>sksxX~ZUgW&Nc?yr~#Lelqw;wOzm~Z{7{NU{S zqJrlHyZJ(DV|48A%!yr|9zOlJ-}~0c(~r~rtmp6kZzL6|GRvdI^UaC6mtR=+PpJw=4wM{MabRK-Esr-7~rhi)YRolD#Ti+RNy?UH;qD)gG0TiQ5B}Or@QZIx8a2{sd*{IB}J);xm-Y2eo_{fnSy}=m^QZ9JeBD(vx=F4p|QE8Nuq9Yno*Lj zpij@^>cc=8K&H{u)@#NkeyLZJJJQn;Co zb0s6tzZo@0y7MZ%*`y(#SAPBj4;H^O^hbDajVvw8yTa^85$S?BN5eHLn8|V zOff@K3^79!a||&9Gc013U@-w?#~T`(m`%3gv57S{vUD`dYFf?~^ tGc|BEb2V_YG&QlaA*dpj%g&CgxFoTtq@pM_jmyZ=$e2r2)z#mP3jnY=;vfJ3 delta 1268 zcmbOuby;$Pd;R3weU}Xc+TMQ_Q7&w37P)@Tl1WkYh3mz<-6jv2as`WoxAS_<$>Uq| z?XBeV3(Oud3f>!2{L}XRpZ`(V;8f#F(|4JfXUrI7q?!*NtT3vm=X^YE+6Tph4FU2h z)yY5FofDh|EKPb8GHQB^<}BmJw{>^sux-X z9>|^X)AnahM9(dm&r2ip4i%YvDsesD{^Xp(>YYEOI6qFSzS1qT#KWlhj{cb^&qe2- zU2&Re!;ZDaedKLu~@Z-bNwtY%U9K`KdgI~XG+@c zz1QNeE-_tnQQ^zPCpS}OopfH*+x$f%tK#x(^V-?s1Q!*^3A=A7ML zul;D9x9oebtIJ*g6mG8ZnD+YW+RNgJHzMx;T>N|T#k2L6zP_iE?Y1h+sJtYtJcP>F>DvTSL!nQQk9`hYE9p`*$-N?9vJe?NXY4_P`9T)(^hn zTW0LjQat^AS?@a6GKX)QrfD5L5#zhdYvB>cX+c|8tf{^BC~nm{wn8h>O08Raf+7^9 zKd5zOD!HBga(}X^PvM@31Ap}5_%}Y!v(C6|8J`~%vOHyS*X19Z@~YB!FU}JVsGqUw zyqvxKbl^f^Z!?~PR&axE-6Y)%;f^I@{_W- z%oGe1K(wiu>E?S(mzh-z%+rih(#*|ujV%n5bPWwtQ*{l1K-bXJEZM-=BFQKv*=X`r zHXmkFb^XbGY|6xG$Y!?_Hr6$;0HP2BODhvoD=bchQn7XbKw$EW}R diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3 index 65eed9c..ff31ac7 100644 --- a/docs/libcurl/curl_getdate.3 +++ b/docs/libcurl/curl_getdate.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -21,22 +21,17 @@ .\" ************************************************************************** .TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual" .SH NAME -curl_getdate - Convert a date string to number of seconds since January 1, -1970 +curl_getdate - Convert a date string to number of seconds .SH SYNOPSIS .B #include .sp .BI "time_t curl_getdate(char *" datestring ", time_t *"now " );" .ad .SH DESCRIPTION -This function returns the number of seconds since January 1st 1970 in the UTC -time zone, for the date and time that the \fIdatestring\fP parameter -specifies. The \fInow\fP parameter is not used, pass a NULL there. - -\fBNOTE:\fP This function was rewritten for the 7.12.2 release and this -documentation covers the functionality of the new one. The new one is not -feature-complete with the old one, but most of the formats supported by the -new one was supported by the old too. +\fIcurl_getdate(3)\fP returns the number of seconds since the Epoch, January +1st 1970 00:00:00 in the UTC time zone, for the date and time that the +\fIdatestring\fP parameter specifies. The \fInow\fP parameter is not used, +pass a NULL there. .SH PARSING DATES AND TIMES A "date" is a string containing several items separated by whitespace. The order of the items is immaterial. A date string may contain many flavors of @@ -107,11 +102,7 @@ number). Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC, January 19, 2038 will work fine. On systems with a 64 bit time_t but with a -crippled mktime(), \fIcurl_getdate\fP will return -1 in this case. -.SH REWRITE -The former version of this function was built with yacc and was not only very -large, it was also never quite understood and it wasn't possible to build with -non-GNU tools since only GNU Bison could make it thread-safe! - -The rewrite was done for 7.12.2. The new one is much smaller and uses simpler -code. +crippled mktime(), \fIcurl_getdate(3)\fP will return -1 in this case. +.SH "SEE ALSO" +.BR curl_easy_escape "(3), " curl_easy_unescape "(3), " +.BR CURLOPT_TIMECONDITION "(3), " CURLOPT_TIMEVALUE "(3) " diff --git a/docs/libcurl/curl_getdate.html b/docs/libcurl/curl_getdate.html index f2ece23..53cd9bb 100644 --- a/docs/libcurl/curl_getdate.html +++ b/docs/libcurl/curl_getdate.html @@ -46,12 +46,11 @@ p.roffit {

NAME

-

curl_getdate - Convert a date string to number of seconds since January 1, 1970

SYNOPSIS

+

curl_getdate - Convert a date string to number of seconds

SYNOPSIS

#include <curl/curl.h>

time_t curl_getdate(char * datestring , time_t *now );

DESCRIPTION

-

This function returns the number of seconds since January 1st 1970 in the UTC time zone, for the date and time that the datestring parameter specifies. The now parameter is not used, pass a NULL there. -

NOTE: This function was rewritten for the 7.12.2 release and this documentation covers the functionality of the new one. The new one is not feature-complete with the old one, but most of the formats supported by the new one was supported by the old too.

PARSING DATES AND TIMES

+

curl_getdate returns the number of seconds since the Epoch, January 1st 1970 00:00:00 in the UTC time zone, for the date and time that the datestring parameter specifies. The now parameter is not used, pass a NULL there.

PARSING DATES AND TIMES

A "date" is a string containing several items separated by whitespace. The order of the items is immaterial. A date string may contain many flavors of items:

calendar date items Can be specified several ways. Month names can only be three-letter english abbreviations, numbers can be zero-prefixed and the year may use 2 or 4 digits. Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6.

time of the day items This string specifies the time on a given day. You must specify it with 6 digits with two colons: HH:MM:SS. To not include the time in a date string, will make the function assume 00:00:00. Example: 18:19:21. @@ -88,8 +87,7 @@ p.roffit {

This parser was written to handle date formats specified in RFC 822 (including the update in RFC 1123) using time zone name or time zone delta and RFC 850 (obsoleted by RFC 1036) and ANSI C's asctime() format. These formats are the only ones RFC 2616 says HTTP applications may use.

RETURN VALUE

This function returns -1 when it fails to parse the date string. Otherwise it returns the number of seconds as described.

If the year is larger than 2037 on systems with 32 bit time_t, this function will return 0x7fffffff (since that is the largest possible signed 32 bit number). -

Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC, January 19, 2038 will work fine. On systems with a 64 bit time_t but with a crippled mktime(), curl_getdate will return -1 in this case.

REWRITE

-

The former version of this function was built with yacc and was not only very large, it was also never quite understood and it wasn't possible to build with non-GNU tools since only GNU Bison could make it thread-safe! -

The rewrite was done for 7.12.2. The new one is much smaller and uses simpler code.

+

Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC, January 19, 2038 will work fine. On systems with a 64 bit time_t but with a crippled mktime(), curl_getdate will return -1 in this case.

SEE ALSO

+

curl_easy_escape, curl_easy_unescape, CURLOPT_TIMECONDITION (3) CURLOPT_TIMEVALUE (3)

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_getdate.pdf b/docs/libcurl/curl_getdate.pdf index c683cc0f9b3c30e36d0c59da5e4b9f8d687752e2..c004c5a132e41d5dd3817bb9662874600f40cd53 100644 GIT binary patch delta 4002 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 Rr-h?IXj%~wWnC58{{YuI`>_B3 delta 4524 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

RuR!6d3ULDBR3j?(>*|28& z9~ovSmL=AT_5}7H(w4M1aZ^?KIOQ$LuzS`hjS*dbFdUyr=$p(IVm$19{d_QJcWMl? zhrOq*3pJbv#Pe4Rfgq&tb(G3D(;1%`IAhqPncFkv1~%G=z*ecp*@OJLt{=Xs%=Rnt z^H=AqKj5h-TS!j&F0QEg7~lW#>K2Lkq0eE?WqDFZ5@c)7sI81ln+D3=for066pFsy zactnWgndjdEcW?T<_sTCO0qpb3)=Sv%H;EuJbBykdW-G)W|He%dfDU=&f05R#Y)Wi z{jMZmd5ctr2%LMD$DCw~>$wB!Q@<;MK`oes zRdTN1n<^dX zWg5KUtKfR1uKUM#Q@KRb&Nlage1qePZ`>7Wgzr~S(&7$XV25Uydqs#g2J00W#K@Q1 zzq$PLP|{Mq;5h)t!djeh*|~!mnDiU5*+u=XLo|1SCO&vO5lCU)Q%IX6H4}P`jdm{) zE@*H3(*3~Q==zQhr>17l4e|nda_cWAp3eiC3Ac=G>JuX?q}x%j0!0Ov(_xeFKwmoC zag+r&&Gz!QIU<9!IO$TMN66c&Sy9VMFHiG3t9${cbnr&pCi;t`=wKtQtO+s3!UJeK zSS1Dvi>*NKaGMdr9wd29evT{8LN}}4t``9joU)nGAh=}Z$Kv&}B5|Owd|kmMqJUUb zrCGp{(kpsUuZ6!8D}|`KA=o=LDaW$loVzq`Q@PZZcNG=fs#a|Jo1BD7Yv^ItA=85? zoXOtXvMn6gYVn+3WX6!JPv@bigEy=8(hKnHz!`7b<6rIG%v!rT*6Pzy&kg0CF7~Cq z!0@--7^Fy|E+SDIXpAG9unV55?=jY5O)s6GGYk^#e23kJ#x99GsA80}6MwlA)x5({ z2)yilToT?<;~ZjX%}{2fQ`t*ano0h2nqK4a3YZxuh#UWcZ9fDsu-&lSA^W~J2n|x9 zPzt=1lFRh7l+>3?jWg`Nbeqr91tLmFkd8nV$sg`Tfng0MKvhQr4$>;`*n2ZdggsPMyAIxaV0NCKoSY5ooLakMj zY#U<)>V}4gPKAZb%3^O6*9MdXH+yo&+mql_76t5c_H`aUIdZ=@ebvp>DWOc`1fGY{`=|=h?<* zxGxGawtmy;Ojb=KNsq1M{Hbtu>6+3f$uh|xQIqL?ht27r4@^vua81-g9z;dGdzU=g zBN;Q3KNaz*jBs0=`7G#=k#Xjl7_0k6MiQh4FZEo@y63ChD5peR21Ot#e||{Oej>)2 z)|GIgdT1VElX9q>2A$T0KHb4?z#VYX6@GC6x zEKo5J@}e4pq@-bz(h!IU2!eND5&B>Cd=@DH1V6)a`=8mXvEKP-;6L4P?Fnls;I^bN zwS>yW_vYv9>7k1D!w9KLLqK3C2zgPYV3Pkjf*=Sac!BA7+W%h!ex2>c#bIdJ#T8)? z_{9hLSMYf7Q2(m~fq!oh+A|DAxr;TKQ)SNz8v z2LICuCJBZ7!9fv!YB12B8VHK~_gwn_ECPWdVfcJ@0fmb@`NJ57{8K}~5Pxt;5FB5` zA!{XtKq^V9TsSGi!IH|VaEO{R0;~*Gf`e5M7x$+sFZ=%zR@CzH)V_XbAHN_Ui~}_s OiiA=N2&n1Zrv5K*7S*2s diff --git a/docs/libcurl/curl_getenv.html b/docs/libcurl/curl_getenv.html index fcab4e0..0cb0c38 100644 --- a/docs/libcurl/curl_getenv.html +++ b/docs/libcurl/curl_getenv.html @@ -52,7 +52,7 @@ p.roffit {

DESCRIPTION

curl_getenv() is a portable wrapper for the getenv() function, meant to emulate its behaviour and provide an identical interface for all operating systems libcurl builds on (including win32).

AVAILABILITY

This function will be removed from the public libcurl API in a near future. It will instead be made "available" by source code access only, and then as curlx_getenv().

RETURN VALUE

-

If successful, curl_getenv() returns a pointer to the value of the specified environment. The memory it refers to is malloc()ed so the application must free() this when the data is no longer needed. When curl_getenv(3) fails to find the specified name, it returns a null pointer.

NOTE

+

If successful, curl_getenv() returns a pointer to the value of the specified environment. The memory it refers to is malloc()ed so the application must free() this when the data is no longer needed. When curl_getenv fails to find the specified name, it returns a null pointer.

NOTE

Under unix operating systems, there isn't any point in returning an allocated memory, although other systems won't work properly if this isn't done. The unix implementation thus has to suffer slightly from the drawbacks of other systems.

SEE ALSO

getenv (3C)

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_getenv.pdf b/docs/libcurl/curl_getenv.pdf index e1f5fb69efdb416469606ed2334e9f5015bcf30f..fe807fa9f7a6ced4280511e1b3e51c4bfed5a244 100644 GIT binary patch delta 348 zcmcbka7SUoT}~l014CnTOOr(1jvw8`%|;~32*`*Epamz0`3pUX_xRM)^z z*T5pgz|zXl+{(mE+rV)03oZ?;;>z5XjK-5=x!rIXc%IuHo0I~NIX2<jv)XDET;}}gR`*Epamz0`3pUX_xSl7S; zh(Zi3txQar4VQuEx$Ut@De#zM6MoMrwYiyRA)}kA zCYQc*QEFmIW`3SaVo9ooi#include <curl/curl.h>

void curl_global_cleanup(void);

DESCRIPTION

-

This function releases resources acquired by curl_global_init(3). -

You should call curl_global_cleanup(3) once for each call you make to curl_global_init(3), after you are done using libcurl. -

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because curl_global_cleanup(3) calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries. -

See the description in libcurl(3) of global environment requirements for details of how to use this function. +

This function releases resources acquired by curl_global_init. +

You should call curl_global_cleanup once for each call you make to curl_global_init, after you are done using libcurl. +

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because curl_global_cleanup calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries. +

See the description in libcurl of global environment requirements for details of how to use this function.

SEE ALSO

-

curl_global_init (3) libcurl (3) +

curl_global_init, libcurl,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_global_cleanup.pdf b/docs/libcurl/curl_global_cleanup.pdf index 9a73cf68ac4c023d2da774d4bef90ee0206bdeb5..2fcac63ae5b88e12c2bb298a6e08d4e918c04864 100644 GIT binary patch delta 351 zcmbOtH$`s4R1P6CgT!QmwB$tHjvw8@IxQj-sIxGG;?!ZV++G1T|>jv)X9q6Qj-sIxGleVhVQDBwi6&R1tLp19h0j{34CXj9kKu zMw?xEix{0uUCfP)T%3)}jV;^^&0Ji~jZGXKjh&5LT%9aT-HaXWYzV2C{F6@_0N+Dc AIRF3v diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3 index 8e1cc18..77172be 100644 --- a/docs/libcurl/curl_global_init.3 +++ b/docs/libcurl/curl_global_init.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -46,11 +46,11 @@ libcurl. \fBThis function is not thread safe.\fP You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because -\fIcurl_global_init()\fP calls functions of other libraries that are similarly -thread unsafe, it could conflict with any other thread that uses these other -libraries. +\fIcurl_global_init(3)\fP calls functions of other libraries that are +similarly thread unsafe, it could conflict with any other thread that uses +these other libraries. -See the description in \fBlibcurl\fP(3) of global environment requirements for +See the description in \fBlibcurl(3)\fP of global environment requirements for details of how to use this function. .SH FLAGS @@ -74,7 +74,8 @@ the functionality of the \fBCURL_GLOBAL_ALL\fP mask. .TP .B CURL_GLOBAL_ACK_EINTR When this flag is set, curl will acknowledge EINTR condition when connecting -or when waiting for data. Otherwise, curl waits until full timeout elapses. +or when waiting for data. Otherwise, curl waits until full timeout +elapses. (Added in 7.30.0) .SH RETURN VALUE If this function returns non-zero, something went wrong and you cannot use the other curl functions. diff --git a/docs/libcurl/curl_global_init.html b/docs/libcurl/curl_global_init.html index 26a1200..1552321 100644 --- a/docs/libcurl/curl_global_init.html +++ b/docs/libcurl/curl_global_init.html @@ -53,8 +53,8 @@ p.roffit {

This function sets up the program environment that libcurl needs. Think of it as an extension of the library loader.

This function must be called at least once within a program (a program is all the code that shares a memory space) before the program calls any other function in libcurl. The environment it sets up is constant for the life of the program and is the same for every program, so multiple calls have the same effect as one call.

The flags option is a bit pattern that tells libcurl exactly what features to init, as described below. Set the desired bits by ORing the values together. In normal operation, you must specify CURL_GLOBAL_ALL. Don't use any other value unless you are familiar with it and mean to control internal operations of libcurl. -

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because curl_global_init() calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries. -

See the description in libcurl(3) of global environment requirements for details of how to use this function. +

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because curl_global_init calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries. +

See the description in libcurl of global environment requirements for details of how to use this function.

FLAGS

CURL_GLOBAL_ALL Initialize everything possible. This sets all known bits except CURL_GLOBAL_ACK_EINTR. @@ -62,8 +62,8 @@ p.roffit {

CURL_GLOBAL_WIN32 Initialize the Win32 socket libraries.

CURL_GLOBAL_NOTHING Initialise nothing extra. This sets no bit.

CURL_GLOBAL_DEFAULT A sensible default. It will init both SSL and Win32. Right now, this equals the functionality of the CURL_GLOBAL_ALL mask. -

CURL_GLOBAL_ACK_EINTR When this flag is set, curl will acknowledge EINTR condition when connecting or when waiting for data. Otherwise, curl waits until full timeout elapses.

RETURN VALUE

+

CURL_GLOBAL_ACK_EINTR When this flag is set, curl will acknowledge EINTR condition when connecting or when waiting for data. Otherwise, curl waits until full timeout elapses. (Added in 7.30.0)

RETURN VALUE

If this function returns non-zero, something went wrong and you cannot use the other curl functions.

SEE ALSO

-

curl_global_init_mem (3) curl_global_cleanup (3) curl_easy_init (3) libcurl (3)

+

curl_global_init_mem, curl_global_cleanup, curl_easy_init, libcurl,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_global_init.pdf b/docs/libcurl/curl_global_init.pdf index 989774a8b2abbe05a919c56137d53e071730e9d2..f10df0d1c7654abb83554dc046eb3e55becb4757 100644 GIT binary patch delta 2837 zcmb7=c|6oxAIHa*j4ewcWUNCPezO~E#+V|qg=`gOG`5+nHK|5~D6&M>iR&UEHDsA+ z5pA;XOP8_~lWUnWmekX|&p*%Wy3gym&-v$kU+?oi=X}2387LQ;dP?V^^XIA()NzA2 zcqtKql`UVAs#-OhHsg&en35maiV7rlyu6qnwb*z%Es?|s+~Sh_!VWz>FZNL?pZf~> z(`?8$uX^Xof~>(Ep?G4#7dr?8nr99jBkef zrOPgCmqTlT`QF8QE;O3llS(=4knhe-8~ao`C8_C>jdfjBO*Y7<_UOwBNVywnjm{$);e zW5*@&ruJ9>#GmwLhG-0qJ!7vY`wI-ly2h=n)X-D6PwKNNUlPivPe~ogs0z^S^HZ-8 zcPlzlGOinJId{Hj&*K~tVHdjmqLWtur5^w@@|g8WPJt^inK*Ek%WG9vYwn*j!7vXd)%S zXJSU8OGWH+Kfh!&7gAxpJI6o8+M#v9;7&Oue@ky_zsUo2lNx8%-SW7*o_)PSmJb}r z3{MToPhG;9voMd&h!>yu`kzlvQDjqB(rTP2vXaoquso8HR}W3u5m6OUYh+na=F3eMI>!_q7mCZquf)wB+=s@-mCA+bx5pW+Mbs<)VPdOZIVEbE1)N0+G#(8S}Q+tF2dE7AN#+zfrK5hXf<+t@h3KnRLZE z(5cHZ5#d{UT_JY@mnHS>y>b!i%0o~leo=5ob#gv2rnvSQW_7WEzUfJpB zoMotJFFYpwr2S&L7OVSP@rYD$tt;d(N~n~zKXlZs|G33r>)fZ*(U+n=n6sA|7(B;) zh{r66{KlN=-`jSKXZy+BnhL0R47`nwzTSO=?X+`ptC6C+UeP%^Q#a&72U#^QsxH$% zUHPT?vSIqkT=bi@wL7dG9*B~1AVv`jzHROrB|4U}Z1TKzFGT~t3>~?eXX+v1s)P)n zavq=IM`;+ADhe2di{T0L!BdRDUw~-|X<>KE0&;`Zmw*KM;%*T8wR7TQwO0Em7GdH2 z3Ulc01X~avbgtLbWDk4Pt#id&I+t+jk)BTOz25t3EjZp*A$*D0#?s4l;}oPGoJzQ` zFY@hH(;3CU%OJsbHJW9sLrK<7v@s-m(WcN(7fRSEtBVfLDa;}BU19{X?jQq7Mel~@ z56#6JZbb33OQ=Jcl;*n2DSkmsO3VWIrqy}`Dw{m)fC)v3!IA~F^~3A=yS)ya64%`MyLt`Xuvb`^B*Y&GJP&CK)*x5pl+;#DB= zA;K{g&=U!J*fOXKV@^vr(T+zLmxTGm^Q#S<+R`r81LcBbVvJbR)+S?X;KTWgQCa!XxzgOo zzT`a8tcc@_=Cwdk-`WFe9o$cNX;7OY zXW{%gtlq@b(I$RY#49z;COL`rT43hR(d1FH#pgJe>mRomUHy>z3S&al1@ijLg&4se z$F-B!My~6ySL5IjJ2u~8U&h*LpixHnXUIN#xeW^S)Gc_L2+U0%KWCWfosu!>m9Ka< z$)8r+j!FDY*8SOJml#wez++eAx&b@q-+5Bmv@d33;x9bbf(334W{3qTQ9)hV33)6iJXmqw{6MZxIXlhQy*J+it zb!-WwE4_hCC545DlD&h$KP#F~02l)SAb;!#1c0hp-03T*fdRaI0Y6`Fn6Dqg2L^|e z{b0b)1tXEX$rx`8%7=vZ&4?7Y5x_w8GxWvP|JemG2~!y~41mJ`gJS^B5RNrOVRZp` zhL?o)-|}n;93L{HSAzJ@o;Q{}r1ejN{~wWSmL$vhh!`EPzQxahh5OT}1n+RNHo*`9 zz|jC4FaU6H?4M0Q0RZ|_v!#*#n~^agrS`KOerdoIVF3AKoB)Ih0smP5D3k&4SB5}g zaN8IXz-63~)?yfJKSJY>+jJa!yJvt#ZS%13?F@tb8;1Ee!~REh1QxfgA0z<4|N03M zKw~p(WQ@JckysoCNkkHGa7z>cWlprjBXD>OU;*Ia<`_82)cAiIUSLyGa9Fr^X!yBM RvL6`rGb>nA)6$Lz{ui;x%cTGS delta 2794 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 diff --git a/docs/libcurl/curl_global_init_mem.html b/docs/libcurl/curl_global_init_mem.html index eed8fad..883277c 100644 --- a/docs/libcurl/curl_global_init_mem.html +++ b/docs/libcurl/curl_global_init_mem.html @@ -56,8 +56,8 @@ p.roffit { curl_calloc_callback c );

DESCRIPTION

-

This function works exactly as curl_global_init(3) with one addition: it allows the application to set callbacks to replace the otherwise used internal memory functions. -

This man page only adds documentation for the callbacks, see the curl_global_init(3) man page for all the rest. When you use this function, all callback arguments must be set to valid function pointers. +

This function works exactly as curl_global_init with one addition: it allows the application to set callbacks to replace the otherwise used internal memory functions. +

This man page only adds documentation for the callbacks, see the curl_global_init man page for all the rest. When you use this function, all callback arguments must be set to valid function pointers.

The prototypes for the given callbacks should match these:

void *malloc_callback(size_t size);

To replace malloc() @@ -70,7 +70,7 @@ p.roffit {

void *calloc_callback(size_t nmemb, size_t size);

To replace calloc()

CAUTION

Manipulating these gives considerable powers to the application to severely screw things up for libcurl. Take care!

SEE ALSO

-

curl_global_init (3) curl_global_cleanup (3) +

curl_global_init, curl_global_cleanup,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_global_init_mem.pdf b/docs/libcurl/curl_global_init_mem.pdf index a9ea24b5542d0ef3fe55886eb6bde017b32d5cdf..fb9b1643b2fcb6899915afbbda0db33453c2ad8e 100644 GIT binary patch delta 369 zcmew?|5<)R38#>mVM>Z|a&n?>a+*<+uAyOS+9V#S$qP7Ln9bDnCkJvW<4|G7WhQK@ zYhb8rU=dM$@Bo>ua U6s4wd8Jig!aH*=g`nz!f0AL|t6#xJL delta 369 zcmew?|5<)R38#>OrID#Yvbnjgv4vrhuAyOS>Lebi$qP7Lm`&C7CkJvW<4|G7WhQK_ zYhVFHAqJLKCZ<+KrrHKZlk2%Ou!`^EvSc)x{DsR6hk0q-_E=;lZ|640BD{%bH=~=W zCYQc*QEFmIW`3SaVo9ooi`r diff --git a/docs/libcurl/curl_mprintf.pdf b/docs/libcurl/curl_mprintf.pdf index 35713e0f83b40f57f1068ca219291a11d5b3a9fa..37c754ab31e1756947e18969669ac9bdb66e58d6 100644 GIT binary patch delta 350 zcmZ3Yw?uD)qkxc^L1MB&T5_Upa+*<+uAyOS+T^oBQj>E9T$s(&^(V^-DC1JXENCWd zs%v1VYhV##U}g2ORQj>E9T$oMO^(V^-DC1JXENCWd ztZQHaL?H&2RwkxaM#kC(Mw5L6HL!}e3tBQ7O+F~-hRZ->A$x36Ekfp4gg2iR+Rf-@ zs>!AAT$Gwvl9`|9l30?e;bLWEU}$V$0fd$&reFuD8yKhqmHFnU;8HR9oQM*m(dLgL w*BG4)U5%U!3=Ex}oGeWYEZtlUO, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -29,17 +29,22 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle); .ad .SH DESCRIPTION Adds a standard easy handle to the multi stack. This function call will make -this \fImulti_handle\fP control the specified \fIeasy_handle\fP. Furthermore, -libcurl now initiates the connection associated with the specified -\fIeasy_handle\fP. +this \fImulti_handle\fP control the specified \fIeasy_handle\fP. -When an easy handle has been added to a multi stack, you can not and you must -not use \fIcurl_easy_perform(3)\fP on that handle! +While an easy handle is added to a multi stack, you can not and you must not +use \fIcurl_easy_perform(3)\fP on that handle. After having removed the easy +handle from the multi stack again, it is perfectly fine to use it with the +easy interface again. -If the easy handle is not set to use a shared (CURLOPT_SHARE) or global DNS -cache (CURLOPT_DNS_USE_GLOBAL_CACHE), it will be made to use the DNS cache -that is shared between all easy handles within the multi handle when -\fIcurl_multi_add_handle(3)\fP is called. +If the easy handle is not set to use a shared (\fICURLOPT_SHARE(3)\fP) or +global DNS cache (\fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP), it will be made to +use the DNS cache that is shared between all easy handles within the multi +handle when \fIcurl_multi_add_handle(3)\fP is called. + +When an easy interface is added to a multi handle, it will use a shared +connection cache owned by the multi handle. Removing and adding new easy +handles will not affect the pool of connections or the ability to do +connection re-use. If you have CURLMOPT_TIMERFUNCTION set in the multi handle (and you really should if you're working event-based with \fIcurl_multi_socket_action(3)\fP @@ -47,10 +52,12 @@ and friends), that callback will be called from within this function to ask for an updated timer so that your main event loop will get the activity on this handle to get started. -The easy handle will remain added until you remove it again with -\fIcurl_multi_remove_handle(3)\fP. You should remove the easy handle from the -multi stack before you terminate first the easy handle and then the multi -handle: +The easy handle will remain added to the multi handle until you remove it +again with \fIcurl_multi_remove_handle(3)\fP - even when a transfer with that +specific easy handle is completed. + +You should remove the easy handle from the multi stack before you terminate +first the easy handle and then the multi handle: 1 - \fIcurl_multi_remove_handle(3)\fP @@ -60,4 +67,5 @@ handle: .SH RETURN VALUE CURLMcode type, general libcurl multi interface error code. .SH "SEE ALSO" -.BR curl_multi_cleanup "(3)," curl_multi_init "(3)" +.BR curl_multi_cleanup "(3)," curl_multi_init "(3), " +.BR curl_multi_setopt "(3), " curl_multi_socket_action "(3) " diff --git a/docs/libcurl/curl_multi_add_handle.html b/docs/libcurl/curl_multi_add_handle.html index 7652494..a0f2ae2 100644 --- a/docs/libcurl/curl_multi_add_handle.html +++ b/docs/libcurl/curl_multi_add_handle.html @@ -50,15 +50,17 @@ p.roffit {

#include <curl/curl.h>

CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);

DESCRIPTION

-

Adds a standard easy handle to the multi stack. This function call will make this multi_handle control the specified easy_handle. Furthermore, libcurl now initiates the connection associated with the specified easy_handle. -

When an easy handle has been added to a multi stack, you can not and you must not use curl_easy_perform(3) on that handle! -

If the easy handle is not set to use a shared (CURLOPT_SHARE) or global DNS cache (CURLOPT_DNS_USE_GLOBAL_CACHE), it will be made to use the DNS cache that is shared between all easy handles within the multi handle when curl_multi_add_handle(3) is called. -

If you have CURLMOPT_TIMERFUNCTION set in the multi handle (and you really should if you're working event-based with curl_multi_socket_action(3) and friends), that callback will be called from within this function to ask for an updated timer so that your main event loop will get the activity on this handle to get started. -

The easy handle will remain added until you remove it again with curl_multi_remove_handle(3). You should remove the easy handle from the multi stack before you terminate first the easy handle and then the multi handle: -

1 - curl_multi_remove_handle(3) -

2 - curl_easy_cleanup(3) -

3 - curl_multi_cleanup(3)

RETURN VALUE

+

Adds a standard easy handle to the multi stack. This function call will make this multi_handle control the specified easy_handle. +

While an easy handle is added to a multi stack, you can not and you must not use curl_easy_perform on that handle. After having removed the easy handle from the multi stack again, it is perfectly fine to use it with the easy interface again. +

If the easy handle is not set to use a shared (CURLOPT_SHARE(3)) or global DNS cache (CURLOPT_DNS_USE_GLOBAL_CACHE(3)), it will be made to use the DNS cache that is shared between all easy handles within the multi handle when curl_multi_add_handle is called. +

When an easy interface is added to a multi handle, it will use a shared connection cache owned by the multi handle. Removing and adding new easy handles will not affect the pool of connections or the ability to do connection re-use. +

If you have CURLMOPT_TIMERFUNCTION set in the multi handle (and you really should if you're working event-based with curl_multi_socket_action and friends), that callback will be called from within this function to ask for an updated timer so that your main event loop will get the activity on this handle to get started. +

The easy handle will remain added to the multi handle until you remove it again with curl_multi_remove_handle - even when a transfer with that specific easy handle is completed. +

You should remove the easy handle from the multi stack before you terminate first the easy handle and then the multi handle: +

1 - curl_multi_remove_handle +

2 - curl_easy_cleanup +

3 - curl_multi_cleanup

RETURN VALUE

CURLMcode type, general libcurl multi interface error code.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3)

+

curl_multi_cleanup, curl_multi_init, curl_multi_setopt, curl_multi_socket_action,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_add_handle.pdf b/docs/libcurl/curl_multi_add_handle.pdf index 46a1d1701cf04d9723f9ae36410f245d082580ad..c5fa51ba49807c43f8661e533fd4f9f4d8652d27 100644 GIT binary patch delta 2623 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 UghmLsJQPeP!zeu7b|(k*JA0(AEdT%j diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3 index 0b580fe..0a2378d 100644 --- a/docs/libcurl/curl_multi_assign.3 +++ b/docs/libcurl/curl_multi_assign.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -21,16 +21,16 @@ .\" ************************************************************************** .TH curl_multi_assign 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual" .SH NAME -curl_multi_assign \- set data to association with an internal socket +curl_multi_assign \- set data to associate with an internal socket .SH SYNOPSIS #include CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd, void *sockptr); .SH DESCRIPTION -This function assigns an association in the multi handle between the given -socket and a private pointer of the application. This is (only) useful for -\fIcurl_multi_socket(3)\fP uses. +This function creates an association in the multi handle between the given +socket and a private pointer of the application. This is designed for +\fIcurl_multi_socket_action(3)\fP uses. When set, the \fIsockptr\fP pointer will be passed to all future socket callbacks for the specific \fIsockfd\fP socket. @@ -51,13 +51,13 @@ The standard CURLMcode for multi interface error codes. .SH "TYPICAL USAGE" In a typical application you allocate a struct or at least use some kind of semi-dynamic data for each socket that we must wait for action on when using -the \fIcurl_multi_socket(3)\fP approach. +the \fIcurl_multi_socket_action(3)\fP approach. When our socket-callback gets called by libcurl and we get to know about yet another socket to wait for, we can use \fIcurl_multi_assign(3)\fP to point out the particular data so that when we get updates about this same socket again, we don't have to find the struct associated with this socket by ourselves. .SH AVAILABILITY -This function was added in libcurl 7.15.5, although not deemed stable yet. +This function was added in libcurl 7.15.5. .SH "SEE ALSO" -.BR curl_multi_setopt "(3), " curl_multi_socket "(3) " +.BR curl_multi_setopt "(3), " curl_multi_socket_action "(3) " diff --git a/docs/libcurl/curl_multi_assign.html b/docs/libcurl/curl_multi_assign.html index fc46807..64a7da4 100644 --- a/docs/libcurl/curl_multi_assign.html +++ b/docs/libcurl/curl_multi_assign.html @@ -46,18 +46,18 @@ p.roffit {

NAME

-

curl_multi_assign - set data to association with an internal socket

SYNOPSIS

+

curl_multi_assign - set data to associate with an internal socket

SYNOPSIS

#include <curl/curl.h>

CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,   void *sockptr);

DESCRIPTION

-

This function assigns an association in the multi handle between the given socket and a private pointer of the application. This is (only) useful for curl_multi_socket(3) uses. +

This function creates an association in the multi handle between the given socket and a private pointer of the application. This is designed for curl_multi_socket_action uses.

When set, the sockptr pointer will be passed to all future socket callbacks for the specific sockfd socket.

If the given sockfd isn't already in use by libcurl, this function will return an error.

libcurl only keeps one single pointer associated with a socket, so calling this function several times for the same socket will make the last set pointer get used.

The idea here being that this association (socket to private pointer) is something that just about every application that uses this API will need and then libcurl can just as well do it since it already has an internal hash table lookup for this.

RETURN VALUE

The standard CURLMcode for multi interface error codes.

TYPICAL USAGE

-

In a typical application you allocate a struct or at least use some kind of semi-dynamic data for each socket that we must wait for action on when using the curl_multi_socket(3) approach. -

When our socket-callback gets called by libcurl and we get to know about yet another socket to wait for, we can use curl_multi_assign(3) to point out the particular data so that when we get updates about this same socket again, we don't have to find the struct associated with this socket by ourselves.

AVAILABILITY

-

This function was added in libcurl 7.15.5, although not deemed stable yet.

SEE ALSO

-

curl_multi_setopt (3) curl_multi_socket (3)

+

In a typical application you allocate a struct or at least use some kind of semi-dynamic data for each socket that we must wait for action on when using the curl_multi_socket_action approach. +

When our socket-callback gets called by libcurl and we get to know about yet another socket to wait for, we can use curl_multi_assign to point out the particular data so that when we get updates about this same socket again, we don't have to find the struct associated with this socket by ourselves.

AVAILABILITY

+

This function was added in libcurl 7.15.5.

SEE ALSO

+

curl_multi_setopt, curl_multi_socket_action,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_assign.pdf b/docs/libcurl/curl_multi_assign.pdf index a1b05a48f7c2cb5ee973af070de5d2e807107d64..4ec8b3e9524c8111dfa7fde7f816167ad9428f6a 100644 GIT binary patch delta 2455 zcmb7=c|6qn8pn?rq$ezQw=I+LfIcCe0o6$MpTE^XQ(`u%N!Q2|)Hr{U7 zdoOY)#Bsv$ywm&xA@Yq6ga0>wYYZmJu*pTr& zof@N;Z~VP|p8Tf#(;LRh!b)C0k4BhCL>8Yfqu;02H>J3zH%^htxqzIW^o#*}^7w8g zvySE@-J2|1D9*Z4-`_1VlL>C{PY@M8RTaE{d9bK`WdI(C$B-BuMPN=ED%)URj3a@E z71Wg!A;T0N^?+*IH5)iRV9AkKTjStazQiCmke?QrmTOuu!Q#rl6x6@@w%hx%@%s9G z&!qH1c$(-fYaE~bnQzTJVPXdo*WFDN5y+EJi<4VECxzjX3E9g96|sl z8)T+*==M@UwGJ=GsHg(RDVwUWr@nc$Rz}e#wWqCm#VRH{dW>$HOe^cYNK`|EVlaEevWTcnRoG5&I4OG9a zerJE-5p}3Tpi<2_??{8u30(A8X@%fgls;M4^fKMj=1#XJBa%(c|6N<-Y610vEFX{L z)5od|=v37_G9ktigTSnXL{uboE4?Y#oi1|(&hyRFy`vnQ&llG|S$Ft=f)1&Ds} zTd}-atT5sNzA|F^6O;EO*S^`Py~qzG?MJctbkdI)0phS7duPp()5lq8{dVmn{xo^_ z(h*r+d^k8#AgX7!aj>$C_ak^JGx2@a)wy*(I&33N-l-|4MAakGHq%Z@eWvpl*wAoB z@U9gmlewwUcJ6U; z)+-R*dWq4@&DllWqK6s-(?l8Wig2wW%KST8XJIc*fnn~|X2^rK%|n2|vX>j=Iw|i( zB1etlxvAP&Oj)NAOI%d97@U4NM)l$r{bNj%FGJ^Oeoc|%rf|Q2t@VttJda;NyiZ!D ztJW|{-=xUoy_c^M9!Wg$k&G2?->+NY?0RfGO5c;74h)ruN&i|$=gq!>OfL^ni0yey zOemIrF??R)r3$+d{7YZ6Xk0?kvU|$Kc#)m6bp_zrcPiXVO0@xmDFi7~kCjx$9Z+!E zaYDYzI){RFyufS7-c&s6Y#&@|h8w9`l1-g$l+ACs?vhWhIeF^j9QnDKPObtnA3yh{ z?V=<}Iq#-T*L3WP9^B9ZqUh<($AuM&R>&=mN}Zu&$*JW^W@9=}Ku&{MAeIVLnz;f+ z&aM`Or$~rP8#5q*L_TPGpHyE(-K%Xg3Bu9^-WbVaqyWdF*AMD)0g>p=+-SW9pNTch z^M};Rj>4y8g1iO!Ay*q~`^&s_wO*S4)(dUoYo+_Li%%>+#CiNisNCo(QK-`$VQ+fg zH8@U1w6ZIU&7?hSsc$(a%+&U;nNoJTm-4X<$LObRu1L7m=y}Zdy*4@sj=Wyp_*sDrTLNDTn00chF)7%eDT3kj$J zP)amN*UUsἙpHi-ybmbDe;UzYPDM7XXey9byMP z5P!`*Ih8asuEEDg#w^PL$p!-TSx5?Ov_&6q`$eaJo~M%L71Ng+#?kTpA5 z5+kzCFG9AGttpITzwYn;bDy8zeQxKRKhEv3tXD!%vIBxBEgwNZFGDvz$vQ z&fE0;i5Gi}S067p7P+!l6gq~uI8xqc*%3w!N*!MpmPluD&3AQ<$XeQ$NqPE;maGKJ z5!+7(YP@F_W)&_`R5#SzN>x2<9fv2IJSC@uX%)RAM52t;HW@oc?hR~20>xex=tUKWDXXeCoS z3GI>=UgjN2H{syWz$}BFZ=7RKbMNk0^k($GQ<(G-4Rfu$I-t|sH*Ly733yzMQ@Qmt zSDtNB`=)T24uhlITl>S;23Gn~dR(!$0#@|Bi^#9kCKvb%<|3%L7DSrT(oes&z!vyQrdG}HT4=M|qea9jQJ z83o z_7D1MDkx%EvVP;Kw^kP<%CO;rgCOV2c}y#t!Ez((lYi!Gm2Sm3C)$65T}pMHyfB}w znR{YGan^ySr}%hp!x_1oT=j4ei37{hw>HwnY20f!dV-OzqsOx==688z=uw%C2J%*m z(f0C)gChY6&BsBnN^5-6d8qR}CVmQ;cI#bN8z|TNuiKw4GJl$yD}LGIr|;a>(+&-$ zgKfNFI_ClJ(if*@`j-o0`A+WViHzmFTIR@I9Uvy_0{6V4k|knkDB*0Q^QzS0Nt#9u zigRFeaJhW^O4YNd*bO<(8w?G51I+=^Us_WQA&aOXJ03QmaGt})mo{PAw&8Xl*KerJ zSlx%x7Btf$6MF2}v>#J>26BI1pD#D{wsJ!zf1Xo)`;_b@;%9NG8zYaOpCV~kJa7_I znS9F+s11eZ1?Hu+&#qhI>MTshYP3pf9<($)=g(DH1q*D9Q_9;R!Air_yeJi^vBZM!eypyzR4_@zz z1rPT;9IO?8Q+_zfI2BY2w;|r1}csN2iDu8Z%;D`Cghh z$6CwW$`UoG&iegnZSX?-`iE74-d^RN*&_S>1sDk^eQEI=KBpA&PGzwugV*(inv*Dh zx=FQ6D~%E7KWIi}ix)3%)U?jZk@@5pfho8ga_W*#_C#adjan?{)2M7KmWZmj#f8ap zj$Cilc}K-E8(4#bzYaVWJD*t?6Uv~F3ECT2?wxEuF1CEZH6J+YM^ylG^U~5P=~sda za?s?ufgnL?9dquW>5aRg>)oy|#X-?GW7x4rh~KZU25U)E9H6uZHpJCZost8jZZv)gJ)Hkx^69P54Rx>@UQ;Kf& z<=WSW_5m*$;@xLG`IHes{nqCa_1_Iqi;YF^C~1{^*(XR?OI^sXtg+m#sIe^6GG1?= ziWR2{8LEz*(U-ejlXY^5{$2-kq|J#5&Sorh_|)S0Q5WJr;;mh5wkZQ?o58FNWMgDjA_=-oUve_e}yG2_?^PyF4$WotZnAbsRXu&T~(MPw&8S6v*LsGzG3Kw)qwdUs_P??N2+ZCvNHsX^i~!aahJj&ro6?0MbTB9+R9E-x uSva5vN9w>Z&@&jct|s>X8n$3fO|Tak=SlYUB$B`g7y=50K=h3D!T$pBZaxJ7 diff --git a/docs/libcurl/curl_multi_cleanup.html b/docs/libcurl/curl_multi_cleanup.html index f6b9a1c..b0a52bf 100644 --- a/docs/libcurl/curl_multi_cleanup.html +++ b/docs/libcurl/curl_multi_cleanup.html @@ -50,11 +50,11 @@ p.roffit {

#include <curl/curl.h>

CURLMcode curl_multi_cleanup( CURLM *multi_handle );

DESCRIPTION

-

Cleans up and removes a whole multi stack. It does not free or touch any individual easy handles in any way - they still need to be closed individually, using the usual curl_easy_cleanup(3) way. The order of cleaning up should be: -

1 - curl_multi_remove_handle(3) before any easy handles are cleaned up -

2 - curl_easy_cleanup(3) can now be called independently since the easy handle is no longer connected to the multi handle -

3 - curl_multi_cleanup(3) should be called when all easy handles are removed

RETURN VALUE

+

Cleans up and removes a whole multi stack. It does not free or touch any individual easy handles in any way - they still need to be closed individually, using the usual curl_easy_cleanup way. The order of cleaning up should be: +

1 - curl_multi_remove_handle before any easy handles are cleaned up +

2 - curl_easy_cleanup can now be called independently since the easy handle is no longer connected to the multi handle +

3 - curl_multi_cleanup should be called when all easy handles are removed

RETURN VALUE

CURLMcode type, general libcurl multi interface error code. On success, CURLM_OK is returned.

SEE ALSO

-

curl_multi_init (3) curl_easy_cleanup (3) curl_easy_init (3)

+

curl_multi_init, curl_easy_cleanup, curl_easy_init,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_cleanup.pdf b/docs/libcurl/curl_multi_cleanup.pdf index 0dc13c21296a8c9d97cce0b842d62603f323cf59..6db40f0e48cd696254deb6b2b569bc8c495fc927 100644 GIT binary patch delta 331 zcmaDN`$Tp_C5MoiL1MB&T5_Upa+*<+uAyOS+GIsesmV(@To}zJpW{-+t{_0zRM)^z z*T5pgz|zXl+{(mU+rV&g3#SHF@%@~ZjK-6Ha=KwNERZV_o3J9M@Z|GcD%ho@Hp_D_ zWCS|!Adjelsez$^g@L7^IoJ{E1_tVyT>8HGDK3d6sTwX;Mh1qcDkih>Dlr;w*5r+6 ubTl(@vT!ssa&~huF)=o9axySAaj~#4HMejyadtH}u(NR?pkne#K4}13lU1bv delta 331 zcmaDN`$Tp_C5MoKd75!bnz^~Iv4vrhuAyOS>SRSusmV(@To_F!pW{-+t{_0zSl7S; zh(Zi3txQaIMetnq2z6`6(`mC8-)NRz?Pfs46D2@hUMIZPw(CXLPhQ rHgmBwGj_6cGc|KIH!yT`F)?#-GI4S?F>^Dwbh5K?A)sRNNj_-+XWder diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3 index 3dbdc45..908ef55 100644 --- a/docs/libcurl/curl_multi_fdset.3 +++ b/docs/libcurl/curl_multi_fdset.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -37,23 +37,35 @@ This function extracts file descriptor information from a given multi_handle. libcurl returns its fd_set sets. The application can use these to select() on, but be sure to FD_ZERO them before calling this function as \fIcurl_multi_fdset(3)\fP only adds its own descriptors, it doesn't zero or -otherwise remove any others. The \fIcurl_multi_perform(3)\fP function should be -called as soon as one of them is ready to be read from or written to. +otherwise remove any others. The \fIcurl_multi_perform(3)\fP function should +be called as soon as one of them is ready to be read from or written to. + +If the \fIread_fd_set\fP argument is not a null pointer, it points to an +object of type fd_set that on returns specifies the file descriptors to be +checked for being ready to read. + +If the \fIwrite_fd_set\fP argument is not a null pointer, it points to an +object of type fd_set that on return specifies the file descriptors to be +checked for being ready to write. + +If the \fIexc_fd_set\fP argument is not a null pointer, it points to an object +of type fd_set that on return specifies the file descriptors to be checked for +error conditions pending. If no file descriptors are set by libcurl, \fImax_fd\fP will contain -1 when -this function returns. Otherwise it will contain the higher descriptor number +this function returns. Otherwise it will contain the highest descriptor number libcurl set. When libcurl returns -1 in \fImax_fd\fP, it is because libcurl currently does something that isn't possible for your application to monitor with a socket and unfortunately you can then not know exactly when the current -action is completed using select(). When max_fd returns with -1, you need to -wait a while and then proceed and call \fIcurl_multi_perform\fP anyway. How -long to wait? I would suggest 100 milliseconds at least, but you may want to -test it out in your own particular conditions to find a suitable value. +action is completed using select(). You then need to wait a while before you +proceed and call \fIcurl_multi_perform(3)\fP anyway. How long to wait? We +suggest 100 milliseconds at least, but you may want to test it out in your own +particular conditions to find a suitable value. -When doing select(), you should use \fBcurl_multi_timeout\fP to figure out how -long to wait for action. Call \fIcurl_multi_perform\fP even if no activity has -been seen on the fd_sets after the timeout expires as otherwise internal -retries and timeouts may not work as you'd think and want. +When doing select(), you should use \fIcurl_multi_timeout(3)\fP to figure out +how long to wait for action. Call \fIcurl_multi_perform(3)\fP even if no +activity has been seen on the fd_sets after the timeout expires as otherwise +internal retries and timeouts may not work as you'd think and want. If one of the sockets used by libcurl happens to be larger than what can be set in an fd_set, which on POSIX systems means that the file descriptor is @@ -67,4 +79,5 @@ CURLMcode type, general libcurl multi interface error code. See \fIlibcurl-errors(3)\fP .SH "SEE ALSO" .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " -.BR curl_multi_timeout "(3), " curl_multi_perform "(3) " +.BR curl_multi_wait "(3), " +.BR curl_multi_timeout "(3), " curl_multi_perform "(3), " select "(2) " diff --git a/docs/libcurl/curl_multi_fdset.html b/docs/libcurl/curl_multi_fdset.html index 2f0e169..64678bd 100644 --- a/docs/libcurl/curl_multi_fdset.html +++ b/docs/libcurl/curl_multi_fdset.html @@ -56,11 +56,14 @@ p.roffit {   int *max_fd);

DESCRIPTION

-

This function extracts file descriptor information from a given multi_handle. libcurl returns its fd_set sets. The application can use these to select() on, but be sure to FD_ZERO them before calling this function as curl_multi_fdset(3) only adds its own descriptors, it doesn't zero or otherwise remove any others. The curl_multi_perform(3) function should be called as soon as one of them is ready to be read from or written to. -

If no file descriptors are set by libcurl, max_fd will contain -1 when this function returns. Otherwise it will contain the higher descriptor number libcurl set. When libcurl returns -1 in max_fd, it is because libcurl currently does something that isn't possible for your application to monitor with a socket and unfortunately you can then not know exactly when the current action is completed using select(). When max_fd returns with -1, you need to wait a while and then proceed and call curl_multi_perform anyway. How long to wait? I would suggest 100 milliseconds at least, but you may want to test it out in your own particular conditions to find a suitable value. -

When doing select(), you should use curl_multi_timeout to figure out how long to wait for action. Call curl_multi_perform even if no activity has been seen on the fd_sets after the timeout expires as otherwise internal retries and timeouts may not work as you'd think and want. +

This function extracts file descriptor information from a given multi_handle. libcurl returns its fd_set sets. The application can use these to select() on, but be sure to FD_ZERO them before calling this function as curl_multi_fdset only adds its own descriptors, it doesn't zero or otherwise remove any others. The curl_multi_perform function should be called as soon as one of them is ready to be read from or written to. +

If the read_fd_set argument is not a null pointer, it points to an object of type fd_set that on returns specifies the file descriptors to be checked for being ready to read. +

If the write_fd_set argument is not a null pointer, it points to an object of type fd_set that on return specifies the file descriptors to be checked for being ready to write. +

If the exc_fd_set argument is not a null pointer, it points to an object of type fd_set that on return specifies the file descriptors to be checked for error conditions pending. +

If no file descriptors are set by libcurl, max_fd will contain -1 when this function returns. Otherwise it will contain the highest descriptor number libcurl set. When libcurl returns -1 in max_fd, it is because libcurl currently does something that isn't possible for your application to monitor with a socket and unfortunately you can then not know exactly when the current action is completed using select(). You then need to wait a while before you proceed and call curl_multi_perform anyway. How long to wait? We suggest 100 milliseconds at least, but you may want to test it out in your own particular conditions to find a suitable value. +

When doing select(), you should use curl_multi_timeout to figure out how long to wait for action. Call curl_multi_perform even if no activity has been seen on the fd_sets after the timeout expires as otherwise internal retries and timeouts may not work as you'd think and want.

If one of the sockets used by libcurl happens to be larger than what can be set in an fd_set, which on POSIX systems means that the file descriptor is larger than FD_SETSIZE, then libcurl will try to not set it. Setting a too large file descriptor in an fd_set implies an out of bounds write which can cause crashes, or worse. The effect of NOT storing it will possibly save you from the crash, but will make your program NOT wait for sockets it should wait for...

RETURN VALUE

-

CURLMcode type, general libcurl multi interface error code. See libcurl-errors(3)

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_timeout (3) curl_multi_perform (3)

+

CURLMcode type, general libcurl multi interface error code. See libcurl-errors

SEE ALSO

+

curl_multi_cleanup, curl_multi_init, curl_multi_wait, curl_multi_timeout, curl_multi_perform, select (2)

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_fdset.pdf b/docs/libcurl/curl_multi_fdset.pdf index c9e63f34fa2e1bed3d86d156921f4976be00b73a..9333266f171459c2e51545363719eeb721e1a2aa 100644 GIT binary patch delta 3385 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 delta 3053 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 the multi handle if there are any messages/informationals from the individual transfers. Messages may include informationals such as an error code from the transfer or just the fact that a transfer is completed. More details on these should be written down as well.

Repeated calls to this function will return a new struct each time, until a NULL is returned as a signal that there is no more to get at this point. The integer pointed to with msgs_in_queue will contain the number of remaining messages after this function was called.

When you fetch a message using this function, it is removed from the internal queue so calling this function again will not return the same message again. It will instead return new messages at each new invoke until the queue is emptied. -

WARNING: The data the returned pointer points to will not survive calling curl_multi_cleanup(3), curl_multi_remove_handle(3) or curl_easy_cleanup(3). -

The 'CURLMsg' struct is very simple and only contains very basic information. If more involved information is wanted, the particular "easy handle" in present in that struct and can thus be used in subsequent regular curl_easy_getinfo(3) calls (or similar): +

WARNING: The data the returned pointer points to will not survive calling curl_multi_cleanup, curl_multi_remove_handle or curl_easy_cleanup. +

The 'CURLMsg' struct is very simple and only contains very basic information. If more involved information is wanted, the particular "easy handle" in present in that struct and can thus be used in subsequent regular curl_easy_getinfo calls (or similar):

 

 struct CURLMsg {   CURLMSG msg; /* what this message means */ @@ -69,6 +69,6 @@ p.roffit {

When msg is CURLMSG_DONE, the message identifies a transfer that is done, and then result contains the return code for the easy handle that just completed.

At this point, there are no other msg types defined.

RETURN VALUE

A pointer to a filled-in struct, or NULL if it failed or ran out of structs. It also writes the number of messages left in the queue (after this read) in the integer the second argument points to.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_perform (3)

+

curl_multi_cleanup, curl_multi_init, curl_multi_perform,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_info_read.pdf b/docs/libcurl/curl_multi_info_read.pdf index 1156c7c288278a9129c63735ebbe96d583b04ac2..569c045dc65789d76cb28a2f41cb61f9ab9a6271 100644 GIT binary patch delta 373 zcmdn2wpne%79JrpgT!QmwB$tHjvw8;+qQj;I>xGrbA@ql`;Q8LyeJ zsjh*cu7O2}fu)t9xs{2zwt?Z~{k$4j#eeZyG8#`d;d8@f;4(gYY*OF(%&`b>cHrO5 z=w_zLrSDvnnpl#VpXZWTlB(fiWn^GzYG7z!VPI)!4t9{bfq^U^|F~(Y0xLTMwn>v}AIT<*)xw=^znL3&qySW(~TUwZzIJw%{5L6M%WoO4#T#{H+ VQc;we#${q+X2hkc>gw;t1pqH6V*UUC delta 373 zcmdn2wpne%79Jr3^EBg>G;?!ZV++G1T|>jv)X5I~Qj;I>xGrbA@ql`;Q8LyeJ zv95sy5QP|6TA7$y85wIE7){>KtASPg7q2Cw(PR@oH(UlTleVhVPUx`BZ@P?>Lj3N96s9R-ybjW(wU z7BR*;I$Ky68dN2|xf(i~IGa1!*$`9_%VlTBRa}x-R8mot Sn#N^fVrImps_N?R#svVMNMBL_ diff --git a/docs/libcurl/curl_multi_init.html b/docs/libcurl/curl_multi_init.html index f1c7086..9fe752d 100644 --- a/docs/libcurl/curl_multi_init.html +++ b/docs/libcurl/curl_multi_init.html @@ -50,9 +50,9 @@ p.roffit {

#include <curl/curl.h>

CURLM *curl_multi_init( );

DESCRIPTION

-

This function returns a CURLM handle to be used as input to all the other multi-functions, sometimes referred to as a multi handle in some places in the documentation. This init call MUST have a corresponding call to curl_multi_cleanup(3) when the operation is complete.

RETURN VALUE

+

This function returns a CURLM handle to be used as input to all the other multi-functions, sometimes referred to as a multi handle in some places in the documentation. This init call MUST have a corresponding call to curl_multi_cleanup when the operation is complete.

RETURN VALUE

If this function returns NULL, something went wrong and you cannot use the other curl functions.

SEE ALSO

-

curl_multi_cleanup (3) curl_global_init (3) curl_easy_init (3) +

curl_multi_cleanup, curl_global_init, curl_easy_init,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_init.pdf b/docs/libcurl/curl_multi_init.pdf index 780c16c832cdb39876538b02d9fc30dd2431b34f..68ed8731b16958658b2955869b2f521f31fdbb6d 100644 GIT binary patch delta 372 zcmcaFbzf@37d9a?gT!QmwB$tHjvw8;&eQj-hHz{082$;>Hq)$ delta 372 zcmcaFbzf@37d9aS^EBg>G;?!ZV++G1T|>jv)X5E;Qj-dW z;~8U2U0t1AEL|)O9F5!zTr8a3T+B>dObs2)&D>0#EsX7KED5QI<+8KmDlSPZDyb++ SP2)1Mv^3ySRdw}u;{pHxHDD|N diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3 index 304197b..e0e5b02 100644 --- a/docs/libcurl/curl_multi_perform.3 +++ b/docs/libcurl/curl_multi_perform.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -34,7 +34,7 @@ in an non-blocking fashion. When an application has found out there's data available for the multi_handle or a timeout has elapsed, the application should call this function to read/write whatever there is to read or write right now etc. -curl_multi_perform() returns as soon as the reads/writes are done. This +\fIcurl_multi_perform(3)\fP returns as soon as the reads/writes are done. This function does not require that there actually is any data available for reading or that data can be written, it can be called just in case. It will write the number of handles that still transfer data in the second argument's @@ -53,7 +53,7 @@ there is no longer any transfers in progress. CURLMcode type, general libcurl multi interface error code. Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this -basically means that you should call \fIcurl_multi_perform\fP again, before +basically means that you should call \fIcurl_multi_perform(3)\fP again, before you select() on more actions. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied". Do note that @@ -74,5 +74,6 @@ period, then it'll wait for action on the file descriptors using \fIcurl_multi_perform(3)\fP gets called. .SH "SEE ALSO" .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " +.BR curl_multi_wait "(3), " .BR curl_multi_fdset "(3), " curl_multi_info_read "(3), " .BR libcurl-errors "(3)" diff --git a/docs/libcurl/curl_multi_perform.html b/docs/libcurl/curl_multi_perform.html index 832d928..27c3cbb 100644 --- a/docs/libcurl/curl_multi_perform.html +++ b/docs/libcurl/curl_multi_perform.html @@ -51,13 +51,13 @@ p.roffit {

CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);

DESCRIPTION

This function handles transfers on all the added handles that need attention in an non-blocking fashion. -

When an application has found out there's data available for the multi_handle or a timeout has elapsed, the application should call this function to read/write whatever there is to read or write right now etc. curl_multi_perform() returns as soon as the reads/writes are done. This function does not require that there actually is any data available for reading or that data can be written, it can be called just in case. It will write the number of handles that still transfer data in the second argument's integer-pointer. -

If the amount of running_handles is changed from the previous call (or is less than the amount of easy handles you've added to the multi handle), you know that there is one or more transfers less "running". You can then call curl_multi_info_read(3) to get information about each individual completed transfer, and that returned info includes CURLcode and more. If an added handle fails very quickly, it may never be counted as a running_handle. +

When an application has found out there's data available for the multi_handle or a timeout has elapsed, the application should call this function to read/write whatever there is to read or write right now etc. curl_multi_perform returns as soon as the reads/writes are done. This function does not require that there actually is any data available for reading or that data can be written, it can be called just in case. It will write the number of handles that still transfer data in the second argument's integer-pointer. +

If the amount of running_handles is changed from the previous call (or is less than the amount of easy handles you've added to the multi handle), you know that there is one or more transfers less "running". You can then call curl_multi_info_read to get information about each individual completed transfer, and that returned info includes CURLcode and more. If an added handle fails very quickly, it may never be counted as a running_handle.

When running_handles is set to zero (0) on the return of this function, there is no longer any transfers in progress.

RETURN VALUE

CURLMcode type, general libcurl multi interface error code. -

Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_perform again, before you select() on more actions. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied". Do note that curl_multi_perform(3) will return CURLM_CALL_MULTI_PERFORM only when it wants to be called again immediately. When things are fine and there is nothing immediate it wants done, it'll return CURLM_OK and you need to wait for "action" and then call this function again. -

This function only returns errors etc regarding the whole multi stack. Problems still might have occurred on individual transfers even when this function returns CURLM_OK. Use curl_multi_info_read(3) to figure out how individual transfers did.

TYPICAL USAGE

-

Most applications will use curl_multi_fdset(3) to get the multi_handle's file descriptors, and curl_multi_timeout(3) to get a suitable timeout period, then it'll wait for action on the file descriptors using select(3). As soon as one or more file descriptor is ready, curl_multi_perform(3) gets called.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_fdset (3) curl_multi_info_read (3) libcurl-errors (3)

+

Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_perform again, before you select() on more actions. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied". Do note that curl_multi_perform will return CURLM_CALL_MULTI_PERFORM only when it wants to be called again immediately. When things are fine and there is nothing immediate it wants done, it'll return CURLM_OK and you need to wait for "action" and then call this function again. +

This function only returns errors etc regarding the whole multi stack. Problems still might have occurred on individual transfers even when this function returns CURLM_OK. Use curl_multi_info_read to figure out how individual transfers did.

TYPICAL USAGE

+

Most applications will use curl_multi_fdset to get the multi_handle's file descriptors, and curl_multi_timeout to get a suitable timeout period, then it'll wait for action on the file descriptors using select(3). As soon as one or more file descriptor is ready, curl_multi_perform gets called.

SEE ALSO

+

curl_multi_cleanup, curl_multi_init, curl_multi_wait, curl_multi_fdset, curl_multi_info_read, libcurl-errors,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_perform.pdf b/docs/libcurl/curl_multi_perform.pdf index 6257e39ebba81adb289e2c771822b89ff83785d8..eeb7ea3d28b55d97cac97b8911857f391e1cee3e 100644 GIT binary patch delta 3569 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 Jnub~o{{m67MTYEc=xvqgEqaMAYJ@~d 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 diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3 index ad6d2ba..1c2165b 100644 --- a/docs/libcurl/curl_multi_remove_handle.3 +++ b/docs/libcurl/curl_multi_remove_handle.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -28,16 +28,17 @@ curl_multi_remove_handle - remove an easy handle from a multi session CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle); .ad .SH DESCRIPTION -Removes a given easy_handle from the multi_handle. This will make the -specified easy handle be removed from this multi handle's control. +Removes a given \fIeasy_handle\fI from the \fImulti_handle\fI. This will make +the specified easy handle be removed from this multi handle's control. When the easy handle has been removed from a multi stack, it is again -perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle. +perfectly legal to invoke \fIcurl_easy_perform(3)\fP on this easy handle. -Removing an easy handle while being used, will effectively halt the transfer -in progress involving that easy handle. All other easy handles and transfers -will remain unaffected. +Removing an easy handle while being used is perfectly legal and will +effectively halt the transfer in progress involving that easy handle. All +other easy handles and transfers will remain unaffected. .SH RETURN VALUE CURLMcode type, general libcurl multi interface error code. .SH "SEE ALSO" -.BR curl_multi_cleanup "(3)," curl_multi_init "(3)" +.BR curl_multi_cleanup "(3)," curl_multi_init "(3), " +.BR curl_multi_add_handle "(3) " diff --git a/docs/libcurl/curl_multi_remove_handle.html b/docs/libcurl/curl_multi_remove_handle.html index fb4c499..aff0d60 100644 --- a/docs/libcurl/curl_multi_remove_handle.html +++ b/docs/libcurl/curl_multi_remove_handle.html @@ -50,10 +50,10 @@ p.roffit {

#include <curl/curl.h>

CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);

DESCRIPTION

-

Removes a given easy_handle from the multi_handle. This will make the specified easy handle be removed from this multi handle's control. -

When the easy handle has been removed from a multi stack, it is again perfectly legal to invoke curl_easy_perform() on this easy handle. -

Removing an easy handle while being used, will effectively halt the transfer in progress involving that easy handle. All other easy handles and transfers will remain unaffected.

RETURN VALUE

+

Removes a given easy_handle from the multi_handle. This will make the specified easy handle be removed from this multi handle's control. +

When the easy handle has been removed from a multi stack, it is again perfectly legal to invoke curl_easy_perform on this easy handle. +

Removing an easy handle while being used is perfectly legal and will effectively halt the transfer in progress involving that easy handle. All other easy handles and transfers will remain unaffected.

RETURN VALUE

CURLMcode type, general libcurl multi interface error code.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3)

+

curl_multi_cleanup, curl_multi_init, curl_multi_add_handle,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_remove_handle.pdf b/docs/libcurl/curl_multi_remove_handle.pdf index 6d84a5b97d5032b0dcc25b4cab9b9d72c771055b..8aeff5f7d2914d299cad9828756b41ca82053f1d 100644 GIT binary patch delta 1878 zcma)&doXGkcE+O`@>VeunzDx2iKA#Y zDF&5FX|`y@G?pP5$+jg*9fMRtYW{l>G9zTo!48~8=FCAq5I?I+Pwbls~eg=M6X z&eKLB<4jBA`L?AlwdYT)-0nO!i5f|t5d=}+`erzZE?hP0F_2x3?4~2JNUwa&99h=L zNLyv2qrUWtF!oWos!Y_lnk_y_KXcevLUo5%$?`@VEt}k@GsT+=J)(3pxIrgmk+Bnl z@9JaxYq}}R`sc3CozGgMtnInkY_{(DSV@sQN#fW$C^=Q; zr_ix#llkX~s_{~_TROKA7*4;378(3xWp`5VScYuAY;;fRa{WDJmT-D;HluqRTgXV7G-?w5_Bk-W zwm&Iczb)&Ls$DCFHyF;U4~g}WB8yQeTXi}WvpuzZqXOEqRax8>XTNUZ6fq~ z%dWn>D(B5GS0=}DogYU=scD?sb)ewP+*Gbh9>pt~SFNB>=9F53_7IyCq(vO3x?ALP z$JC{v*nC_l3#G7oJV|d^d=L*6AZHVw9zhUM=zSCYI|=Zh@X}I^0Y+4LSJR|${kGnD zVPH{D8oML<*PG4C+MBW1Woq52o5(ppBYVc<=rG;BWieWs9JG;snN~KZRwaqr= z`3QK6Aptw&e$cL>l-J5*x!xKj6%RbnHrS{XfPDw8B?$&%qGJP{=#EkMjqGQOdP_40 zB0hP>^>#@T$omHL-w5lhtv^$bbKLG0btlW%Ic>Vyt-|cXu7KWDwIJD|mT63RryQZy zl(^s7U@c`BmANYW7#FF3&35P0A9$vWm*aW&`Bq8I*RfD$OAOATlK2bfYEfrRaxJ>5 zD^sd|eAqN~|2*m32L4dN$+Mxec@GA3<$6Mty`CZ5<^GRubxRF>?LylF?#|0H!NUo5 zJ=UE=ycAOq=tswk>#ZK6Nm4nZ>&fV4oT#}FU^Nm z0a+i$&UK|+!l-XpbPF4c>g$sPq*FMglY0|+nyC|Y#iIjb=%w}YSKH~!iyv5{+wPu~ zjJM~>njBh&2CF?G`jJ^#oQnUB4MMg!^>mK7J6_&ZS*>@$H$$_e4a4&n5N6+}?}bw|AsYa+0f;*Q z5*Z|raYSnX{?>Ng0hV*Dk2fQp?Xj)XP*`+0yN%MkIk0kBxY3I^h^ zxNkiWL%{LHDrRg9v~mVP#1%e~xY8qnq!k{Xu#!Qfl?;#h%1r+q9wgvbh9^M)pQq{& z;_N~r;$3hc2@knooN)k^=1L=Ah!{K;Lx5-mH;Tjm8X*V@1(A>#7N3|J&tM|35Qcy- KGo$&sA^rj~>GIqF delta 1804 zcmeB?Un)1jtNyW>K<)K#o(t_$#SIU4yL4s*D%|~**d4QN+oeSXT@Kopw@F2w@+xZj zbGWXg{mNapiS36Pawim98>jbu;nhfVIJ^9>FWN*<__+HjtWk5!J{)G4^RT7L=l%KH$6ES**VI4z zz;s5j=1RxT&9nbj^iA+=t(9f?w=1GHs_vgq?Y`ZA{d-Pdwk&jP+IKZ~?;Mu6inwCY z_f}bE9?n8VCuiTb+|F1S^pe|W@dFd*YsOhNXse4l$c2L!zpnV}#io^^Z;B*RnM+DJds^tYO}w5uQE+y1U`yBUe2JZfEDJ+!h19<* z&675D+uX11(jxwR#u62s3BoZeIY+h+ldj5o$e$ttz735Rb&Az5*r|Ha-y5{bhc|Yw`CmC(`*ljRx=?3?f z`xgbIv!o~Oci_Ld?2||Pi%f~fPbXb0^DL;D<8gAiQfB!D28~mPn{Q`)-Vm{@#`9;y z@~%BIe`N5TePVUHtmLnnpP0aOhl<{iWk2~I)fk<>UYli^Rllxp>b)2f>jiIHB093g zwrt(8?BUCjCyXC&?%wq-O)WYsTJLJ=obc$_Cds78H(pnw{@m|$aORw{_}9_Vx4(CFXByn$xHh?5M*r;PDk+~wpME?J=oMRe;ELV%JsZ~Udd=WDPq<#C z*y5q%^CxE&G>X1VdT=at6MIe0=VueUci-a_F;?$B@l)3RKhrMh#rCOrDa9p4sfoE< zKvsTI7MGcVfdYs&G%z#U{E6ihleVhZ+xx`BZ@P?>Lj3N96sXYnclJ+qfr-`?2LKmin%1`2r!TwsQQ zv5`53n4z(;A-Xz4LvzE)+I*_@hNhTuCZ?ts>dg%-F~rPFOfbYu&4FnG)lG&bmY8Cu zMqn`&WXBttTVguK!o+;?XFi))GXqy=7fUx67h@A+S2Ht5Lo;JnQ)5e0OBWXdU>Y*8 ivmvM=mdnnLtGFbwsHCDOHI2*I#K?q8Rn^tsjSB#Dl*(`b diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3 index 99984cf..4cd4075 100644 --- a/docs/libcurl/curl_multi_setopt.3 +++ b/docs/libcurl/curl_multi_setopt.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -19,7 +19,7 @@ .\" * KIND, either express or implied. .\" * .\" ************************************************************************** -.TH curl_multi_setopt 3 "10 Oct 2006" "libcurl 7.16.0" "libcurl Manual" +.TH curl_multi_setopt 3 "4 Nov 2014" "libcurl 7.39.0" "libcurl Manual" .SH NAME curl_multi_setopt \- set options for a curl multi handle .SH SYNOPSIS @@ -27,180 +27,40 @@ curl_multi_setopt \- set options for a curl multi handle CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param); .SH DESCRIPTION -curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By -using the appropriate options to \fIcurl_multi_setopt(3)\fP, you can change -libcurl's behaviour when using that multi handle. All options are set with -the \fIoption\fP followed by the parameter \fIparam\fP. That parameter can be -a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject pointer\fP or a -\fBcurl_off_t\fP type, depending on what the specific option expects. Read -this manual carefully as bad input values may cause libcurl to behave badly! -You can only set one option in each function call. +\fIcurl_multi_setopt(3)\fP is used to tell a libcurl multi handle how to +behave. By using the appropriate options to \fIcurl_multi_setopt(3)\fP, you +can change libcurl's behaviour when using that multi handle. All options are +set with the \fIoption\fP followed by the parameter \fIparam\fP. That +parameter can be a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject +pointer\fP or a \fBcurl_off_t\fP type, depending on what the specific option +expects. Read this manual carefully as bad input values may cause libcurl to +behave badly! You can only set one option in each function call. .SH OPTIONS .IP CURLMOPT_SOCKETFUNCTION -Pass a pointer to a function matching the \fBcurl_socket_callback\fP -prototype. The \fIcurl_multi_socket_action(3)\fP function informs the -application about updates in the socket (file descriptor) status by doing -none, one, or multiple calls to the curl_socket_callback given in the -\fBparam\fP argument. They update the status with changes since the previous -time a \fIcurl_multi_socket(3)\fP function was called. If the given callback -pointer is NULL, no callback will be called. Set the callback's \fBuserp\fP -argument with \fICURLMOPT_SOCKETDATA\fP. See \fIcurl_multi_socket(3)\fP for -more callback details. +See \fICURLMOPT_SOCKETFUNCTION(3)\fP .IP CURLMOPT_SOCKETDATA -Pass a pointer to whatever you want passed to the \fBcurl_socket_callback\fP's -fourth argument, the userp pointer. This is not used by libcurl but only -passed-thru as-is. Set the callback pointer with -\fICURLMOPT_SOCKETFUNCTION\fP. +See \fICURLMOPT_SOCKETDATA(3)\fP .IP CURLMOPT_PIPELINING -Pass a long set to 1 to enable or 0 to disable. Enabling pipelining on a multi -handle will make it attempt to perform HTTP Pipelining as far as possible for -transfers using this handle. This means that if you add a second request that -can use an already existing connection, the second request will be \&"piped" -on the same connection rather than being executed in parallel. (Added in -7.16.0) +See \fICURLMOPT_PIPELINING(3)\fP .IP CURLMOPT_TIMERFUNCTION -Pass a pointer to a function matching the \fBcurl_multi_timer_callback\fP -prototype: int curl_multi_timer_callback(CURLM *multi /* multi handle */, -long timeout_ms /* timeout in milliseconds */, void *userp /* TIMERDATA */). -This function will then be called when the timeout value -changes. The timeout value is at what latest time the application should call -one of the \&"performing" functions of the multi interface -(\fIcurl_multi_socket_action(3)\fP and \fIcurl_multi_perform(3)\fP) - to allow -libcurl to keep timeouts and retries etc to work. A timeout value of -1 means -that there is no timeout at all, and 0 means that the timeout is already -reached. Libcurl attempts to limit calling this only when the fixed future -timeout time actually changes. See also \fICURLMOPT_TIMERDATA\fP. The callback -should return 0 on success, and -1 on error. This -callback can be used instead of, or in addition to, -\fIcurl_multi_timeout(3)\fP. (Added in 7.16.0) +See \fICURLMOPT_TIMERFUNCTION(3)\fP .IP CURLMOPT_TIMERDATA -Pass a pointer to whatever you want passed to the -\fBcurl_multi_timer_callback\fP's third argument, the userp pointer. This is -not used by libcurl but only passed-thru as-is. Set the callback pointer with -\fICURLMOPT_TIMERFUNCTION\fP. (Added in 7.16.0) -.IP CURLMOPT_MAXCONNECTS -Pass a long. The set number will be used as the maximum amount of -simultaneously open connections that libcurl may cache. Default is 10, and -libcurl will enlarge the size for each added easy handle to make it fit 4 -times the number of added easy handles. - -By setting this option, you can prevent the cache size from growing beyond the -limit set by you. - -When the cache is full, curl closes the oldest one in the cache to prevent the -number of open connections from increasing. - -This option is for the multi handle's use only, when using the easy interface -you should instead use the \fICURLOPT_MAXCONNECTS\fP option. - -(Added in 7.16.3) +See \fICURLMOPT_TIMERDATA(3)\fP .IP CURLMOPT_MAX_HOST_CONNECTIONS -Pass a long. The set number will be used as the maximum amount of -simultaneously open connections to a single host. For each new session to -a host, libcurl will open a new connection up to the limit set by -CURLMOPT_MAX_HOST_CONNECTIONS. When the limit is reached, the sessions will -be pending until there are available connections. If CURLMOPT_PIPELINING is -1, libcurl will try to pipeline if the host is capable of it. - -The default value is 0, which means that there is no limit. -However, for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING -is 1 will not be treated as unlimited. Instead it will open only 1 connection -and try to pipeline on it. - -(Added in 7.30.0) +See \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP .IP CURLMOPT_MAX_PIPELINE_LENGTH -Pass a long. The set number will be used as the maximum amount of requests -in a pipelined connection. When this limit is reached, libcurl will use another -connection to the same host (see CURLMOPT_MAX_HOST_CONNECTIONS), or queue the -requests until one of the pipelines to the host is ready to accept a request. -Thus, the total number of requests in-flight is CURLMOPT_MAX_HOST_CONNECTIONS * -CURLMOPT_MAX_PIPELINE_LENGTH. -The default value is 5. - -(Added in 7.30.0) +See \fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP .IP CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE -Pass a long. If a pipelined connection is currently processing a request -with a Content-Length larger than CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, that -connection will not be considered for additional requests, even if it is -shorter than CURLMOPT_MAX_PIPELINE_LENGTH. -The default value is 0, which means that the penalization is inactive. - -(Added in 7.30.0) +See \fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP .IP CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE -Pass a long. If a pipelined connection is currently processing a -chunked (Transfer-encoding: chunked) request with a current chunk length -larger than CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, that connection will not be -considered for additional requests, even if it is shorter than -CURLMOPT_MAX_PIPELINE_LENGTH. -The default value is 0, which means that the penalization is inactive. - -(Added in 7.30.0) +See \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP .IP CURLMOPT_PIPELINING_SITE_BL -Pass an array of char *, ending with NULL. This is a list of sites that are -blacklisted from pipelining, i.e sites that are known to not support HTTP -pipelining. The array is copied by libcurl. - -The default value is NULL, which means that there is no blacklist. - -Pass a NULL pointer to clear the blacklist. - -Example: - -.nf - site_blacklist[] = - { - "www.haxx.se", - "www.example.com:1234", - NULL - }; - - curl_multi_setopt(m, CURLMOPT_PIPELINE_SITE_BL, site_blacklist); -.fi - -(Added in 7.30.0) +See \fICURLMOPT_PIPELINING_SITE_BL(3)\fP .IP CURLMOPT_PIPELINING_SERVER_BL -Pass an array of char *, ending with NULL. This is a list of server types -prefixes (in the Server: HTTP header) that are blacklisted from pipelining, -i.e server types that are known to not support HTTP pipelining. The array is -copied by libcurl. - -Note that the comparison matches if the Server: header begins with the string -in the blacklist, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can -both be blacklisted by having "Ninja" in the backlist. - -The default value is NULL, which means that there is no blacklist. - -Pass a NULL pointer to clear the blacklist. - -Example: - -.nf - server_blacklist[] = - { - "Microsoft-IIS/6.0", - "nginx/0.8.54", - NULL - }; - - curl_multi_setopt(m, CURLMOPT_PIPELINE_SERVER_BL, server_blacklist); -.fi - -(Added in 7.30.0) +See \fICURLMOPT_PIPELINING_SERVER_BL(3)\fP .IP CURLMOPT_MAX_TOTAL_CONNECTIONS -Pass a long. The set number will be used as the maximum amount of -simultaneously open connections in total. For each new session, libcurl -will open a new connection up to the limit set by -CURLMOPT_MAX_TOTAL_CONNECTIONS. When the limit is reached, the sessions will -be pending until there are available connections. If CURLMOPT_PIPELINING is -1, libcurl will try to pipeline if the host is capable of it. - -The default value is 0, which means that there is no limit. -However, for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING -is 1 will not be treated as unlimited. Instead it will open only 1 connection -and try to pipeline on it. - -(Added in 7.30.0) +See \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP .SH RETURNS The standard CURLMcode for multi interface error codes. Note that it returns a CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl diff --git a/docs/libcurl/curl_multi_setopt.html b/docs/libcurl/curl_multi_setopt.html index b95192b..55d4208 100644 --- a/docs/libcurl/curl_multi_setopt.html +++ b/docs/libcurl/curl_multi_setopt.html @@ -49,79 +49,35 @@ p.roffit {

curl_multi_setopt - set options for a curl multi handle

SYNOPSIS

#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);

DESCRIPTION

-

curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By using the appropriate options to curl_multi_setopt(3), you can change libcurl's behaviour when using that multi handle. All options are set with the option followed by the parameter param. That parameter can be a long, a function pointer, an object pointer or a curl_off_t type, depending on what the specific option expects. Read this manual carefully as bad input values may cause libcurl to behave badly! You can only set one option in each function call. +

curl_multi_setopt is used to tell a libcurl multi handle how to behave. By using the appropriate options to curl_multi_setopt, you can change libcurl's behaviour when using that multi handle. All options are set with the option followed by the parameter param. That parameter can be a long, a function pointer, an object pointer or a curl_off_t type, depending on what the specific option expects. Read this manual carefully as bad input values may cause libcurl to behave badly! You can only set one option in each function call.

OPTIONS

CURLMOPT_SOCKETFUNCTION -

Pass a pointer to a function matching the curl_socket_callback prototype. The curl_multi_socket_action(3) function informs the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the curl_socket_callback given in the param argument. They update the status with changes since the previous time a curl_multi_socket(3) function was called. If the given callback pointer is NULL, no callback will be called. Set the callback's userp argument with CURLMOPT_SOCKETDATA. See curl_multi_socket(3) for more callback details. +

See CURLMOPT_SOCKETFUNCTION(3)

CURLMOPT_SOCKETDATA -

Pass a pointer to whatever you want passed to the curl_socket_callback's fourth argument, the userp pointer. This is not used by libcurl but only passed-thru as-is. Set the callback pointer with CURLMOPT_SOCKETFUNCTION. +

See CURLMOPT_SOCKETDATA(3)

CURLMOPT_PIPELINING -

Pass a long set to 1 to enable or 0 to disable. Enabling pipelining on a multi handle will make it attempt to perform HTTP Pipelining as far as possible for transfers using this handle. This means that if you add a second request that can use an already existing connection, the second request will be "piped" on the same connection rather than being executed in parallel. (Added in 7.16.0) +

See CURLMOPT_PIPELINING(3)

CURLMOPT_TIMERFUNCTION -

Pass a pointer to a function matching the curl_multi_timer_callback prototype: int curl_multi_timer_callback(CURLM *multi /* multi handle */, long timeout_ms /* timeout in milliseconds */, void *userp /* TIMERDATA */). This function will then be called when the timeout value changes. The timeout value is at what latest time the application should call one of the "performing" functions of the multi interface (curl_multi_socket_action(3) and curl_multi_perform(3)) - to allow libcurl to keep timeouts and retries etc to work. A timeout value of -1 means that there is no timeout at all, and 0 means that the timeout is already reached. Libcurl attempts to limit calling this only when the fixed future timeout time actually changes. See also CURLMOPT_TIMERDATA. The callback should return 0 on success, and -1 on error. This callback can be used instead of, or in addition to, curl_multi_timeout(3). (Added in 7.16.0) +

See CURLMOPT_TIMERFUNCTION(3)

CURLMOPT_TIMERDATA -

Pass a pointer to whatever you want passed to the curl_multi_timer_callback's third argument, the userp pointer. This is not used by libcurl but only passed-thru as-is. Set the callback pointer with CURLMOPT_TIMERFUNCTION. (Added in 7.16.0) -

CURLMOPT_MAXCONNECTS -

Pass a long. The set number will be used as the maximum amount of simultaneously open connections that libcurl may cache. Default is 10, and libcurl will enlarge the size for each added easy handle to make it fit 4 times the number of added easy handles. -

By setting this option, you can prevent the cache size from growing beyond the limit set by you. -

When the cache is full, curl closes the oldest one in the cache to prevent the number of open connections from increasing. -

This option is for the multi handle's use only, when using the easy interface you should instead use the CURLOPT_MAXCONNECTS option. -

(Added in 7.16.3) +

See CURLMOPT_TIMERDATA(3)

CURLMOPT_MAX_HOST_CONNECTIONS -

Pass a long. The set number will be used as the maximum amount of simultaneously open connections to a single host. For each new session to a host, libcurl will open a new connection up to the limit set by CURLMOPT_MAX_HOST_CONNECTIONS. When the limit is reached, the sessions will be pending until there are available connections. If CURLMOPT_PIPELINING is 1, libcurl will try to pipeline if the host is capable of it. -

The default value is 0, which means that there is no limit. However, for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING is 1 will not be treated as unlimited. Instead it will open only 1 connection and try to pipeline on it. -

(Added in 7.30.0) +

See CURLMOPT_MAX_HOST_CONNECTIONS(3)

CURLMOPT_MAX_PIPELINE_LENGTH -

Pass a long. The set number will be used as the maximum amount of requests in a pipelined connection. When this limit is reached, libcurl will use another connection to the same host (see CURLMOPT_MAX_HOST_CONNECTIONS), or queue the requests until one of the pipelines to the host is ready to accept a request. Thus, the total number of requests in-flight is CURLMOPT_MAX_HOST_CONNECTIONS * CURLMOPT_MAX_PIPELINE_LENGTH. The default value is 5. -

(Added in 7.30.0) +

See CURLMOPT_MAX_PIPELINE_LENGTH(3)

CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE -

Pass a long. If a pipelined connection is currently processing a request with a Content-Length larger than CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, that connection will not be considered for additional requests, even if it is shorter than CURLMOPT_MAX_PIPELINE_LENGTH. The default value is 0, which means that the penalization is inactive. -

(Added in 7.30.0) +

See CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)

CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE -

Pass a long. If a pipelined connection is currently processing a chunked (Transfer-encoding: chunked) request with a current chunk length larger than CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, that connection will not be considered for additional requests, even if it is shorter than CURLMOPT_MAX_PIPELINE_LENGTH. The default value is 0, which means that the penalization is inactive. -

(Added in 7.30.0) +

See CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)

CURLMOPT_PIPELINING_SITE_BL -

Pass an array of char *, ending with NULL. This is a list of sites that are blacklisted from pipelining, i.e sites that are known to not support HTTP pipelining. The array is copied by libcurl. -

The default value is NULL, which means that there is no blacklist. -

Pass a NULL pointer to clear the blacklist. -

Example: -

-

  site_blacklist[] = -   { -   "www.haxx.se", -   "www.example.com:1234", -   NULL -   }; -

  curl_multi_setopt(m, CURLMOPT_PIPELINE_SITE_BL, site_blacklist); -

- -

-

(Added in 7.30.0) +

See CURLMOPT_PIPELINING_SITE_BL(3)

CURLMOPT_PIPELINING_SERVER_BL -

Pass an array of char *, ending with NULL. This is a list of server types prefixes (in the Server: HTTP header) that are blacklisted from pipelining, i.e server types that are known to not support HTTP pipelining. The array is copied by libcurl. -

Note that the comparison matches if the Server: header begins with the string in the blacklist, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can both be blacklisted by having "Ninja" in the backlist. -

The default value is NULL, which means that there is no blacklist. -

Pass a NULL pointer to clear the blacklist. -

Example: -

-

  server_blacklist[] = -   { -   "Microsoft-IIS/6.0", -   "nginx/0.8.54", -   NULL -   }; -

  curl_multi_setopt(m, CURLMOPT_PIPELINE_SERVER_BL, server_blacklist); -

- -

-

(Added in 7.30.0) +

See CURLMOPT_PIPELINING_SERVER_BL(3)

CURLMOPT_MAX_TOTAL_CONNECTIONS -

Pass a long. The set number will be used as the maximum amount of simultaneously open connections in total. For each new session, libcurl will open a new connection up to the limit set by CURLMOPT_MAX_TOTAL_CONNECTIONS. When the limit is reached, the sessions will be pending until there are available connections. If CURLMOPT_PIPELINING is 1, libcurl will try to pipeline if the host is capable of it. -

The default value is 0, which means that there is no limit. However, for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING is 1 will not be treated as unlimited. Instead it will open only 1 connection and try to pipeline on it. -

(Added in 7.30.0)

RETURNS

+

See CURLMOPT_MAX_TOTAL_CONNECTIONS(3)

RETURNS

The standard CURLMcode for multi interface error codes. Note that it returns a CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl doesn't know of.

AVAILABILITY

This function was added in libcurl 7.15.4.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_socket (3) curl_multi_info_read (3)

+

curl_multi_cleanup, curl_multi_init, curl_multi_socket, curl_multi_info_read,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_setopt.pdf b/docs/libcurl/curl_multi_setopt.pdf index 37e327955344f4cf8642f97109e2d8ca2ade524b..3f45250baa3faa5559cf0033428dc5ad3b52bbd0 100644 GIT binary patch delta 2680 zcmb7CdpMNq7SDYQjeE##(2QGSzHjbhPvjn@LXpc0tVkDhuV@9`L-2kX8RoRG0oCZfSpDT&qcvY?gK zdQ$g*s?2pgSJXcDh}So2M(4x%v|9r$eQ~uJH9RQ3`ctZ9dT;N9+x3>PB>BinA<&l! zS{_8~v=D@>FoPRsLGu=_Q> zOc*7)&9e2;Yy|DKgUl=zK6rFAY4@%AkoT7@vK7?^uYL-DQZAyP2dAFBO~{z^c9%qu z6;phg+v@s-dK)}Cu6$OOcRZ8Q-#S7~UV}P*$|XG)Ae9R0cLiHG#$~t|f|`XFnh%Gu z?xa%9D*cKhFWr{lTSnE1KD5j#7xXHGMy5UYCNw-gJ7qtOLJ%I3Nj^*yq{ zyYy4nk%>P1 z3c40CxvSgbalI#*&}Hc5v{aN{nv90rh^tJd)m(-^{+7vUzTa$V8T{=`3;TSJ#xoJ{ zt`#@2Z6(K5dj52Hd)x;>`)_OaxT;8=9;<O8pELCe~t9&HB8CS6ofD5c}l|i zK?J?|eRNGGpf$SK0iH*F2w=(xoosw3)v#$d0hbNyxSB6EqHxqhnRMMTwiH5xFJGtsN$B0o#gbD5WB2XoNj7h9 zb^&v*@=bR*3wu=+=-zSuBLVsCIq*4Tm6n~R;!(PcXO_SH z?Xh*mJBfnw-3Ws+tr?ZXrZ-`|8=v1*vP5TPNdPRXpbd)M8%{M&D04JRebakz&qp%URS)IHjjE*A`qf?FG_4@JGPXa>XtT2KH|^*4NCwEB@po8Mvz?sM zUh{x`33{T|{W+e1FH-cyc1kI3?(^!{lzYacIY5FODyohtk#p%-<#l!7twy}hBP$V*c?=8C^Y4uu;}%2a=!Wwy?c z20QX#W5iJ{#QfAAdUjb#Rc2#j^_NgUS31XSSCj8uN21Q?CfW3~sGhp12^x>4Fgg@* z<#2bP|M8)w`V5)J`0+osVD4mnZhl*L!$5b517;a(^^q&NtLpEVzg=M+g3&?jd%(D1 z$>*NCJXR4w#dcyINTuQ{UW-=tHrddzXLIt z2!36;l}6uMc4- zTwC5PHOLoE95di0Be1l{%5wg)Qg&rZ% za5@re&yD8rkRYUL_>&|^fVLQ>L1jjD>L6as_rQ8a2k>GeSlDgi1B3?jb)aL$x=@v| z2Bf`GQTW7|DY1qG1_t7pOa_J-gbTocAS(z1hz&yl0{}9GNFrynb?XX1?hk;eazmW7=r zWfD##GdR{>ymwv*m*c?Tu}mGTZ~#aIK!5^JLGsrjOaQ<{OmpJ~{x=5HU}nU{n^{}` z^?5N-tROgm1c~tF)&A3vBq9+{LGBY>3eFg#H#nq~WU12`Oo_&o;v4JIB10QmozOca;;wjhxtR`Rkf zKf;S*goLr8;4~T%>lqTq5^o5J_26>Ff?k#{66?YV;v#X&J{;@ffb^pQ_D%qmY){4$ zoSZ1O0ATM(wFhuiDoAv+B~olij@JK!B4*Ix*4FU7JVq4n>%R~{0v?V+Ic{-+{|Vzo BN6-KO delta 9014 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 A`Tzg` diff --git a/docs/libcurl/curl_multi_socket.html b/docs/libcurl/curl_multi_socket.html index 2e92236..3cc80c7 100644 --- a/docs/libcurl/curl_multi_socket.html +++ b/docs/libcurl/curl_multi_socket.html @@ -56,12 +56,12 @@ p.roffit {

DESCRIPTION

-

These functions are deprecated. Do not use! See curl_multi_socket_action(3) instead! -

At return, the integer running_handles points to will contain the number of still running easy handles within the multi handle. When this number reaches zero, all transfers are complete/done. Note that when you call curl_multi_socket_action(3) on a specific socket and the counter decreases by one, it DOES NOT necessarily mean that this exact socket/transfer is the one that completed. Use curl_multi_info_read(3) to figure out which easy handle that completed. -

The curl_multi_socket_action(3) functions inform the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket callback function set with the CURLMOPT_SOCKETFUNCTION option to curl_multi_setopt(3). They update the status with changes since the previous time the callback was called. -

Get the timeout time by setting the CURLMOPT_TIMERFUNCTION option with curl_multi_setopt(3). Your application will then get called with information on how long to wait for socket actions at most before doing the timeout action: call the curl_multi_socket_action(3) function with the sockfd argument set to CURL_SOCKET_TIMEOUT. You can also use the curl_multi_timeout(3) function to poll the value at any given time, but for an event-based system using the callback is far better than relying on polling the timeout value. -

Usage of curl_multi_socket(3) is deprecated, whereas the function is equivalent to curl_multi_socket_action(3) with ev_bitmask set to 0. -

Force libcurl to (re-)check all its internal sockets and transfers instead of just a single one by calling curl_multi_socket_all(3). Note that there should not be any reason to use this function!

CALLBACK DETAILS

+

These functions are deprecated. Do not use! See curl_multi_socket_action instead! +

At return, the integer running_handles points to will contain the number of still running easy handles within the multi handle. When this number reaches zero, all transfers are complete/done. Note that when you call curl_multi_socket_action on a specific socket and the counter decreases by one, it DOES NOT necessarily mean that this exact socket/transfer is the one that completed. Use curl_multi_info_read to figure out which easy handle that completed. +

The curl_multi_socket_action functions inform the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket callback function set with the CURLMOPT_SOCKETFUNCTION option to curl_multi_setopt. They update the status with changes since the previous time the callback was called. +

Get the timeout time by setting the CURLMOPT_TIMERFUNCTION option with curl_multi_setopt. Your application will then get called with information on how long to wait for socket actions at most before doing the timeout action: call the curl_multi_socket_action function with the sockfd argument set to CURL_SOCKET_TIMEOUT. You can also use the curl_multi_timeout function to poll the value at any given time, but for an event-based system using the callback is far better than relying on polling the timeout value. +

Usage of curl_multi_socket is deprecated, whereas the function is equivalent to curl_multi_socket_action with ev_bitmask set to 0. +

Force libcurl to (re-)check all its internal sockets and transfers instead of just a single one by calling curl_multi_socket_all. Note that there should not be any reason to use this function!

CALLBACK DETAILS

The socket callback function uses a prototype like this

 

  int curl_socket_callback(CURL *easy, /* easy handle */ @@ -87,10 +87,10 @@ p.roffit {

CURL_POLL_REMOVE (4)

unregister

-

The socketp argument is a private pointer you have previously set with curl_multi_assign(3) to be associated with the s socket. If no pointer has been set, socketp will be NULL. This argument is of course a service to applications that want to keep certain data or structs that are strictly associated to the given socket. -

The userp argument is a private pointer you have previously set with curl_multi_setopt(3) and the CURLMOPT_SOCKETDATA option.

RETURN VALUE

+

The socketp argument is a private pointer you have previously set with curl_multi_assign to be associated with the s socket. If no pointer has been set, socketp will be NULL. This argument is of course a service to applications that want to keep certain data or structs that are strictly associated to the given socket. +

The userp argument is a private pointer you have previously set with curl_multi_setopt and the CURLMOPT_SOCKETDATA option.

RETURN VALUE

CURLMcode type, general libcurl multi interface error code. -

Legacy: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_socket(3) again, before you wait for more actions on libcurl's sockets. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied". +

Legacy: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_socket again, before you wait for more actions on libcurl's sockets. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied".

In modern libcurls, CURLM_CALL_MULTI_PERFORM or CURLM_CALL_MULTI_SOKCET should not be returned and no application needs to care about them.

NOTE that the return code is for the whole multi stack. Problems still might have occurred on individual transfers even when one of these functions return OK.

TYPICAL USAGE

1. Create a multi handle @@ -99,10 +99,10 @@ p.roffit {

4. Add easy handles with curl_multi_add_handle()

5. Provide some means to manage the sockets libcurl is using, so you can check them for activity. This can be done through your application code, or by way of an external library such as libevent or glib.

6. Wait for activity on any of libcurl's sockets, use the timeout value your callback has been told -

7, When activity is detected, call curl_multi_socket_action() for the socket(s) that got action. If no activity is detected and the timeout expires, call curl_multi_socket_action(3) with CURL_SOCKET_TIMEOUT +

7, When activity is detected, call curl_multi_socket_action() for the socket(s) that got action. If no activity is detected and the timeout expires, call curl_multi_socket_action with CURL_SOCKET_TIMEOUT

8. Go back to step 6.

AVAILABILITY

This function was added in libcurl 7.15.4, and is deemed stable since 7.16.0. -

curl_multi_socket(3) is deprecated, use curl_multi_socket_action(3) instead!

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_fdset (3) curl_multi_info_read (3) the hiperfifo.c example

+

curl_multi_socket is deprecated, use curl_multi_socket_action instead!

SEE ALSO

+

curl_multi_cleanup, curl_multi_init, curl_multi_fdset, curl_multi_info_read, the hiperfifo.c example

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_socket.pdf b/docs/libcurl/curl_multi_socket.pdf index 277295d18f0a2de6d17826866f10ba6999120443..a40cb23e48713c1b2752e6e209d2d22999b1dedf 100644 GIT binary patch delta 352 zcmdnxxyy4yysVI!k-2G#u}PwCa+*<+uAyOS+T=pnI7YL{7i3kjOG-^vlrs}H)ip5G zHLwUVu(UEXw=y-*HZYu=C8vQ^e5srzqw(bXa&EW`43xLWE+ss9tGo(!DXGn@3JV$C z%rv?5or_WvOEUBGToOxCHC(KW3=B;T3=J#{EDg=U4pTQUPzNgW%}>FlV)7eBB}U`T y{7QaIPDbX=hDL_27A~e{j+TzbPR>RKt_B8fMuwKImM$i4Zgw_=R7{?)A`Jj8ky~;A delta 352 zcmdnxxyy4yysVIcrID#Yvbnjgv4vrhuAyOS>f}P%I7ZXS7i3kjOG-^vlrs}H)-|vI zq7Va1D-%;IBU5byqsduv8d$}b%2_fRO};PZhReV}d3)?q!jrekt6-Os+RUo3kkQRl zlS|*ZC^fMpGe6HIu_RT)#mdOQ(AdBN2rW%a!46Y5Fi;07^UY7erDF0MMI}a~&HPG! vOit!5P8QB)7KRq)uIA=0W`-_?ZidFL&SqvVmL_hFu10n?gj7tPuObZqoV8g0 diff --git a/docs/libcurl/curl_multi_socket_action.html b/docs/libcurl/curl_multi_socket_action.html index 626f6f1..319754b 100644 --- a/docs/libcurl/curl_multi_socket_action.html +++ b/docs/libcurl/curl_multi_socket_action.html @@ -55,10 +55,10 @@ p.roffit {

DESCRIPTION

-

When the application has detected action on a socket handled by libcurl, it should call curl_multi_socket_action(3) with the sockfd argument set to the socket with the action. When the events on a socket are known, they can be passed as an events bitmask ev_bitmask by first setting ev_bitmask to 0, and then adding using bitwise OR (|) any combination of events to be chosen from CURL_CSELECT_IN, CURL_CSELECT_OUT or CURL_CSELECT_ERR. When the events on a socket are unknown, pass 0 instead, and libcurl will test the descriptor internally. It is also permissible to pass CURL_SOCKET_TIMEOUT to the sockfd parameter in order to initiate the whole process or when a timeout occurs. -

At return, the integer running_handles points to will contain the number of running easy handles within the multi handle. When this number reaches zero, all transfers are complete/done. When you call curl_multi_socket_action(3) on a specific socket and the counter decreases by one, it DOES NOT necessarily mean that this exact socket/transfer is the one that completed. Use curl_multi_info_read(3) to figure out which easy handle that completed. -

The curl_multi_socket_action(3) functions inform the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket callback function set with the CURLMOPT_SOCKETFUNCTION option to curl_multi_setopt(3). They update the status with changes since the previous time the callback was called. -

Get the timeout time by setting the CURLMOPT_TIMERFUNCTION option with curl_multi_setopt(3). Your application will then get called with information on how long to wait for socket actions at most before doing the timeout action: call the curl_multi_socket_action(3) function with the sockfd argument set to CURL_SOCKET_TIMEOUT. You can also use the curl_multi_timeout(3) function to poll the value at any given time, but for an event-based system using the callback is far better than relying on polling the timeout value.

CALLBACK DETAILS

+

When the application has detected action on a socket handled by libcurl, it should call curl_multi_socket_action with the sockfd argument set to the socket with the action. When the events on a socket are known, they can be passed as an events bitmask ev_bitmask by first setting ev_bitmask to 0, and then adding using bitwise OR (|) any combination of events to be chosen from CURL_CSELECT_IN, CURL_CSELECT_OUT or CURL_CSELECT_ERR. When the events on a socket are unknown, pass 0 instead, and libcurl will test the descriptor internally. It is also permissible to pass CURL_SOCKET_TIMEOUT to the sockfd parameter in order to initiate the whole process or when a timeout occurs. +

At return, the integer running_handles points to will contain the number of running easy handles within the multi handle. When this number reaches zero, all transfers are complete/done. When you call curl_multi_socket_action on a specific socket and the counter decreases by one, it DOES NOT necessarily mean that this exact socket/transfer is the one that completed. Use curl_multi_info_read to figure out which easy handle that completed. +

The curl_multi_socket_action functions inform the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket callback function set with the CURLMOPT_SOCKETFUNCTION option to curl_multi_setopt. They update the status with changes since the previous time the callback was called. +

Get the timeout time by setting the CURLMOPT_TIMERFUNCTION option with curl_multi_setopt. Your application will then get called with information on how long to wait for socket actions at most before doing the timeout action: call the curl_multi_socket_action function with the sockfd argument set to CURL_SOCKET_TIMEOUT. You can also use the curl_multi_timeout function to poll the value at any given time, but for an event-based system using the callback is far better than relying on polling the timeout value.

CALLBACK DETAILS

The socket callback function uses a prototype like this

 

  int curl_socket_callback(CURL *easy, /* easy handle */ @@ -68,7 +68,7 @@ p.roffit {   void *socketp); /* private socket pointer,   NULL if not   previously assigned with -   curl_multi_assign(3) */ +   curl_multi_assign */

The callback MUST return 0. @@ -87,10 +87,10 @@ p.roffit {

CURL_POLL_REMOVE (4)

unregister

-

The socketp argument is a private pointer you have previously set with curl_multi_assign(3) to be associated with the s socket. If no pointer has been set, socketp will be NULL. This argument is of course a service to applications that want to keep certain data or structs that are strictly associated to the given socket. -

The userp argument is a private pointer you have previously set with curl_multi_setopt(3) and the CURLMOPT_SOCKETDATA option.

RETURN VALUE

+

The socketp argument is a private pointer you have previously set with curl_multi_assign to be associated with the s socket. If no pointer has been set, socketp will be NULL. This argument is of course a service to applications that want to keep certain data or structs that are strictly associated to the given socket. +

The userp argument is a private pointer you have previously set with curl_multi_setopt and the CURLMOPT_SOCKETDATA option.

RETURN VALUE

CURLMcode type, general libcurl multi interface error code. -

Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_socket_action(3) again before you wait for more actions on libcurl's sockets. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied". +

Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this basically means that you should call curl_multi_socket_action again before you wait for more actions on libcurl's sockets. You don't have to do it immediately, but the return code means that libcurl may have more data available to return or that there may be more data to send off before it is "satisfied".

The return code from this function is for the whole multi stack. Problems still might have occurred on individual transfers even when one of these functions return OK.

TYPICAL USAGE

1. Create a multi handle

2. Set the socket callback with CURLMOPT_SOCKETFUNCTION @@ -99,8 +99,8 @@ p.roffit {

5. Provide some means to manage the sockets libcurl is using, so you can check them for activity. This can be done through your application code, or by way of an external library such as libevent or glib.

6. Call curl_multi_socket_action(..., CURL_SOCKET_TIMEOUT, 0, ...) to kickstart everything. To get one or more callbacks called.

7. Wait for activity on any of libcurl's sockets, use the timeout value your callback has been told. -

8, When activity is detected, call curl_multi_socket_action() for the socket(s) that got action. If no activity is detected and the timeout expires, call curl_multi_socket_action(3) with CURL_SOCKET_TIMEOUT.

AVAILABILITY

+

8, When activity is detected, call curl_multi_socket_action() for the socket(s) that got action. If no activity is detected and the timeout expires, call curl_multi_socket_action with CURL_SOCKET_TIMEOUT.

AVAILABILITY

This function was added in libcurl 7.15.4, and is deemed stable since 7.16.0.

SEE ALSO

-

curl_multi_cleanup (3) curl_multi_init (3) curl_multi_fdset (3) curl_multi_info_read (3) the hiperfifo.c example

+

curl_multi_cleanup, curl_multi_init, curl_multi_fdset, curl_multi_info_read, the hiperfifo.c example

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_socket_action.pdf b/docs/libcurl/curl_multi_socket_action.pdf index 6a8187b76e323931a723ec965e3a138e2ebc94a5..a4922383190567cb34e4acf3f1981a1718b64c9e 100644 GIT binary patch delta 348 zcmZ4Hz07-qx15lfk-2G#u}PwCa+*<+uAyOS+T>WdI7YL{3lvnbOG-`Vl{XVM)ip5G zHLwUVu(UEXw=y-*HZYtVCa-~2e4@N1qw(a^@@}{cv{kUjCe^24j!igLPHOW%-uBPUW#)f82PHqOymd-9l1_qX{P6n11hITfDR7~zxl?DJpBU

f~6tI7ZXS3lvnbOG-`Vl{XVM)-|vI zq7Va1D-%;IBQtFSqsd|N8d$|A%3CrTO+GE}hRZ-(1$%5#eG2B-gk$BTHh)xD$mnLO z$))dHl$uzQnV;v9SdyyYVr67tXl!5sgq9|zU`MGN7^nl4`R1qKQZf04k`klQ=HE(w vOisoYjxJ6Hu9gNC&aRe5Zl-SLPDVyf=5B@-#)jqwmZo+#gj7uKR+R<-UbThe curl_multi_strerror() function returns a string describing the CURLMcode error code passed in the argument errornum.

AVAILABILITY

This function was added in libcurl 7.12.0

RETURN VALUE

A pointer to a zero terminated string.

SEE ALSO

-

libcurl-errors (3) curl_easy_strerror (3) curl_share_strerror (3)

+

libcurl-errors, curl_easy_strerror, curl_share_strerror,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_strerror.pdf b/docs/libcurl/curl_multi_strerror.pdf index 3d848cf5134a530495ad819bacbccb72fd0b0718..a9c4d891099f79c79e0da4a85e8dd1bcc2cef9b0 100644 GIT binary patch delta 364 zcmaDU^-^lXKQjvw8@T~!jtE6vQO4xcVRS}oX@U`PtgH( zGhtI*14CT{ix2}#D?@WD6H9Fa!^xZ+8d$|$I4l{BC)aVf;WP9Dhdp*_bL_&xo9A+_ zV01Injv)X9#V!jtE6vQO4xcVRT0oX@U`PtgH( zGht(00}CJuF|f2UF|{%>)iyAi%*mmFRosQclF?{#9fun}LqBlXW0y9^E-buxF6RnH zH&ab6ednUo#FEVXJeS0hR1Fs^BLhQY0}CLuG%*D`Ox?gh9jMGVKLwYH$=%#aj7FQ+ xamO(_nVCBpn!1{r8d*4+nz@*nIJ;RGxi}je7?`-3SQwkT*x3+LG1-q-8UW-QS}Xtn diff --git a/docs/libcurl/curl_multi_timeout.html b/docs/libcurl/curl_multi_timeout.html index 676d776..952a6ff 100644 --- a/docs/libcurl/curl_multi_timeout.html +++ b/docs/libcurl/curl_multi_timeout.html @@ -50,15 +50,15 @@ p.roffit {

#include <curl/curl.h>

CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);

DESCRIPTION

-

An application using the libcurl multi interface should call curl_multi_timeout(3) to figure out how long it should wait for socket actions - at most - before proceeding. -

Proceeding means either doing the socket-style timeout action: call the curl_multi_socket_action(3) function with the sockfd argument set to CURL_SOCKET_TIMEOUT, or call curl_multi_perform(3) if you're using the simpler and older multi interface approach. +

An application using the libcurl multi interface should call curl_multi_timeout to figure out how long it should wait for socket actions - at most - before proceeding. +

Proceeding means either doing the socket-style timeout action: call the curl_multi_socket_action function with the sockfd argument set to CURL_SOCKET_TIMEOUT, or call curl_multi_perform if you're using the simpler and older multi interface approach.

The timeout value returned in the long timeout points to, is in number of milliseconds at this very moment. If 0, it means you should proceed immediately without waiting for anything. If it returns -1, there's no timeout at all set. -

An application that uses the multi_socket API SHOULD NOT use this function, but SHOULD instead use curl_multi_setopt(3) and its CURLMOPT_TIMERFUNCTION option for proper and desired behavior. +

An application that uses the multi_socket API SHOULD NOT use this function, but SHOULD instead use curl_multi_setopt and its CURLMOPT_TIMERFUNCTION option for proper and desired behavior.

Note: if libcurl returns a -1 timeout here, it just means that libcurl currently has no stored timeout value. You must not wait too long (more than a few seconds perhaps) before you call curl_multi_perform() again.

RETURN VALUE

The standard CURLMcode for multi interface error codes.

TYPICAL USAGE

-

Call curl_multi_timeout(3), then wait for action on the sockets. You figure out which sockets to wait for by calling curl_multi_fdset(3) or by a previous call to curl_multi_socket(3).

AVAILABILITY

+

Call curl_multi_timeout, then wait for action on the sockets. You figure out which sockets to wait for by calling curl_multi_fdset or by a previous call to curl_multi_socket.

AVAILABILITY

This function was added in libcurl 7.15.4.

SEE ALSO

-

curl_multi_fdset (3) curl_multi_info_read (3) curl_multi_socket (3) curl_multi_setopt (3) +

curl_multi_fdset, curl_multi_info_read, curl_multi_socket, curl_multi_setopt,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_timeout.pdf b/docs/libcurl/curl_multi_timeout.pdf index 9a542c1eacc68834421b41bd3e9d9a3b5d18603c..b5d55016412a2ef052cf1867e8915ba716d73ac4 100644 GIT binary patch delta 351 zcmbQDGDT&>RBjjvw8@HmQj-sIyD*wfe#NVbOF=k~nXsv@ zfuXK}MTmi=m7%$nse!hE;p7E88d$||^H?$(PZs5M!)0JQuRV4t;mNOgRj^2HR^;2w zsA8tcrSDvnnpl#VpXZWTlB(fiWn^GzYG7z!VPI)!4tCTe0TEeL5p@Ftb(qHdB8|z6 zyuysen_UHp7@dqQO^q$x%#GX(+$=2JT+A&@ot%u#Ees7UTwL6o4PEVQ2&tI-Q&1WJ Dz8G04 delta 351 zcmbQDGDT&>RBj;y%cPVjv)X9o`Qj-sIyD*wge#NVbOF=k~nXs|0 zfdvqS7+6}Fm|7W`Y8x0$UcjS)Rs1%OC8N<~QC>G(2DbCsW0w-1{F+wleVhVQDBmogwR1tLp19h0j{34CXjJ(2( zMw?v)iWr?7O^uvf%^gh~ogK|hEKQ6YjVz3uOdVaF%*`AP%?ym~YzV2C{8LaG0Ni0& A1ONa4 diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3 index 21ade93..a76fba3 100644 --- a/docs/libcurl/curl_multi_wait.3 +++ b/docs/libcurl/curl_multi_wait.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -33,9 +33,9 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, int *numfds); .ad .SH DESCRIPTION -This function polls on all file descriptors used by the curl easy handles -contained in the given multi handle set. It will block until activity is -detected on at least one of the handles or \fItimeout_ms\fP has passed. +\fIcurl_multi_wait(3)\fP polls all file descriptors used by the curl easy +handles contained in the given multi handle set. It will block until activity +is detected on at least one of the handles or \fItimeout_ms\fP has passed. Alternatively, if the multi handle has a pending internal timeout that has a shorter expiry time than \fItimeout_ms\fP, that shorter time will be used instead to make sure timeout accuracy is reasonably kept. @@ -43,7 +43,7 @@ instead to make sure timeout accuracy is reasonably kept. The calling application may pass additional curl_waitfd structures which are similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call. -On completion, if \fInumfds\fP is supplied, it will be populated with the +On completion, if \fInumfds\fP is non-NULL, it will be populated with the total number of file descriptors on which interesting events occured. This number can include both libcurl internal descriptors as well as descriptors provided in \fIextra_fds\fP. diff --git a/docs/libcurl/curl_multi_wait.html b/docs/libcurl/curl_multi_wait.html index 7d43abd..fa10dee 100644 --- a/docs/libcurl/curl_multi_wait.html +++ b/docs/libcurl/curl_multi_wait.html @@ -56,9 +56,9 @@ p.roffit {   int *numfds);

DESCRIPTION

-

This function polls on all file descriptors used by the curl easy handles contained in the given multi handle set. It will block until activity is detected on at least one of the handles or timeout_ms has passed. Alternatively, if the multi handle has a pending internal timeout that has a shorter expiry time than timeout_ms, that shorter time will be used instead to make sure timeout accuracy is reasonably kept. +

curl_multi_wait polls all file descriptors used by the curl easy handles contained in the given multi handle set. It will block until activity is detected on at least one of the handles or timeout_ms has passed. Alternatively, if the multi handle has a pending internal timeout that has a shorter expiry time than timeout_ms, that shorter time will be used instead to make sure timeout accuracy is reasonably kept.

The calling application may pass additional curl_waitfd structures which are similar to poll(2)'s pollfd structure to be waited on in the same call. -

On completion, if numfds is supplied, it will be populated with the total number of file descriptors on which interesting events occured. This number can include both libcurl internal descriptors as well as descriptors provided in extra_fds. +

On completion, if numfds is non-NULL, it will be populated with the total number of file descriptors on which interesting events occured. This number can include both libcurl internal descriptors as well as descriptors provided in extra_fds.

If no extra file descriptors are provided and libcurl has no file descriptor to offer to wait for, this function will return immediately.

This function is encouraged to be used instead of select(3) when using the multi interface to allow applications to easier circumvent the common problem with 1024 maximum file descriptors.

curl_waitfd

@@ -76,8 +76,8 @@ p.roffit {
 

Bit flag to curl_waitfd.events indicating the socket should poll on high priority read events such as out of band data.

CURL_WAIT_POLLOUT

Bit flag to curl_waitfd.events indicating the socket should poll on write events such as the socket being clear to write without blocking.

RETURN VALUE

-

CURLMcode type, general libcurl multi interface error code. See libcurl-errors(3)

AVAILABILITY

+

CURLMcode type, general libcurl multi interface error code. See libcurl-errors

AVAILABILITY

This function was added in libcurl 7.28.0.

SEE ALSO

-

curl_multi_fdset (3) curl_multi_perform (3)

+

curl_multi_fdset, curl_multi_perform,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_multi_wait.pdf b/docs/libcurl/curl_multi_wait.pdf index cb23594c1964da2fd0a9bbb8e12a22ff93880e2d..1c65e52afdcc5a776c7557e8a189b0839eff76f3 100644 GIT binary patch delta 2832 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 NAOH*uY@BTY{{RorznTC5 diff --git a/docs/libcurl/curl_share_cleanup.html b/docs/libcurl/curl_share_cleanup.html index 3e1e637..55d7174 100644 --- a/docs/libcurl/curl_share_cleanup.html +++ b/docs/libcurl/curl_share_cleanup.html @@ -53,6 +53,6 @@ p.roffit {

This function deletes a shared object. The share handle cannot be used anymore when this function has been called.

RETURN VALUE

CURLSHE_OK (zero) means that the option was set properly, non-zero means an error occurred as <curl/curl.h> defines. See the libcurl-errors.3 man page for the full list with descriptions. If an error occurs, then the share object will not be deleted.

SEE ALSO

-

curl_share_init (3) curl_share_setopt (3)

+

curl_share_init, curl_share_setopt,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_share_cleanup.pdf b/docs/libcurl/curl_share_cleanup.pdf index 3b1f5c948fe0b177fb06536b2dd03836cde7b3ad..8aa84336f563dab39298ad28d34fba8170cb5636 100644 GIT binary patch delta 375 zcmZ1{vrcBidUhc*LlcukGm}K!jvw8;nA;~32*D{!b{mz0`Z$YCaIs%v1V zYhV##U}xRBExyOi)`RxTCnQc{~kxfU|I znQ3zAI~S!UmSpDVxg?gPYPeV#85o)x7#dg@SQ?sx9j0zzpbk{#o1cP9#bg^EB}U`T z@jOM0vBu8kPHs*HW)_wfW-d-f7G};a&ThuW78WjM&L$SF26i?CRm5`H*>M$@Bo>ua U6s4wd85^3LbE&Gj`nz!f03lUi&Hw-a delta 375 zcmZ1{vrcBidUhcL3yWlP(=>BkV++G1T|>jv)X4|g;}}gRD{!b{mz0`Z$YCaItZQHa zL?H&2RwkxaMkd+@Mw54OXkZop%3;Z9G+Ce14VQrnIqk7a2~TF_Qo$}IwK, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -33,9 +33,9 @@ share-functions, sometimes referred to as a share handle in some places in the documentation. This init call MUST have a corresponding call to \fIcurl_share_cleanup\fP when all operations using the share are complete. -This \fIshare handle\fP is what you pass to curl using the \fICURLOPT_SHARE\fP -option with \fIcurl_easy_setopt(3)\fP, to make that specific curl handle use -the data in this share. +This \fIshare handle\fP is what you pass to curl using the +\fICURLOPT_SHARE(3)\fP option with \fIcurl_easy_setopt(3)\fP, to make that +specific curl handle use the data in this share. .SH RETURN VALUE If this function returns NULL, something went wrong (out of memory, etc.) and therefore the share object was not created. diff --git a/docs/libcurl/curl_share_init.html b/docs/libcurl/curl_share_init.html index ebf555b..aa7f54c 100644 --- a/docs/libcurl/curl_share_init.html +++ b/docs/libcurl/curl_share_init.html @@ -51,9 +51,9 @@ p.roffit {

CURLSH *curl_share_init( );

DESCRIPTION

This function returns a CURLSH handle to be used as input to all the other share-functions, sometimes referred to as a share handle in some places in the documentation. This init call MUST have a corresponding call to curl_share_cleanup when all operations using the share are complete. -

This share handle is what you pass to curl using the CURLOPT_SHARE option with curl_easy_setopt(3), to make that specific curl handle use the data in this share.

RETURN VALUE

+

This share handle is what you pass to curl using the CURLOPT_SHARE(3) option with curl_easy_setopt, to make that specific curl handle use the data in this share.

RETURN VALUE

If this function returns NULL, something went wrong (out of memory, etc.) and therefore the share object was not created.

SEE ALSO

-

curl_share_cleanup (3) curl_share_setopt (3) +

curl_share_cleanup, curl_share_setopt,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_share_init.pdf b/docs/libcurl/curl_share_init.pdf index 0427da6793fafc6af97fdfaefb321af707ec1a87..026cc7170b6ef470ff72a0136e7f1d420171329c 100644 GIT binary patch delta 1675 zcma)(dpOi-6vrEvhF|2CC1rM8av%MEbEk~km{3ua`>4ST3R8@AnKbQCwzLeREg?jr zVscrch($%NVX$FkqO6QmN-9?Uw`=!V=a2V%pY#1Z=e*~Ar!|)~d2XD?Nv679n~u3k zW}X%mRQcrEpR-Dx^6>V4^QVi>a(9ZDmuAv3ggW26etSe`mKo+VkPhZf_QqX@zYw9h z7u)h)kDrLVG?E}TwrCJQ2p&Ug)O<#By;7pRthQ=1JWoO&Zmx~&5lN85mM5cxO z?^99Y@>5cd$oy#0o$3mQ&-CUCuH(HjJ0Eo5ai2}6euNKPb2=g~JJ>J3sp}BSt2&j^ zjqqce=svM2S@Ibk5rnxll_mSaCzp5=Q}shZ3q#10*yTrJwFpkuC%wdlrg(OpZ>M|C zSW`xCfb{A)|@;vKz)l=i*B%;!EY^C3i*{ zC^>qKxiBMx({Y^RH+)|rz{fM8L^1!s7IIRB;giYSx8~3~DU&E~K_6H{75Lpt(X-0A z-JourKstLVB-_eikhbg(WNNqxO??zq&ty{p-GiD*Cqx->&h`#AQ}=(}{mcDIUSy9^ zdysxvmqYh@jhK_#+LhG-9xW_EkLY1(LL5z3|GZ&8MC8n{!mgo`Yb%T04C)%O8kOjb z`<2A4A8Lio%JgA2uz7*R!a5h1STJG^3L?!Da5wixT% zuOc?Sntm)PzU1&MLgPy0?j^)&7jo{%7vCp~CdD@HM*Snf7WDKR$>tqPd%Z8zIyDp? zt;^|icnUANiG#&h{_LTcid1Jb#^23qnVyhXy2JsW0KDsMEEvl;P)M_4^-akWVK0fNVU?Pr~Nj-;|$sc++++(?3LNK)W#iC5_s{7Gc+lI zE4NE>lG%Co)H^yQb_AA1i1kj7?Ne?_z|SzbY_75L?T88I)*}4*)WZhe7ZiR7{ORiR zJ9v(?llmt_NPS)mvP00L17T5rZ>VOEj!3ala{!1gW+aNGaSnSReX@^8RiKs!1 z5bNmMq(}R$`oQo`i?QPm=0ewXDFk11{@`d!244gfAOjhfqm-Vr6uYa%V*F*bv2=i~ z@FMrsK!#^VOXuvuM}BLE%=BEMz`L|5#S+A5`shp<>0 z9!o>{Gtho02%E`gaaXv2%15JZ!747p#BQBml^P11plL)_R2C_(8u|4pL1Y*b_$ELM8pEf_ ztEie`{^>vvhJRLGkDn;7VhLd(!YUt6fL7PQmGAuf1PF)W!#1kGa9>YDB5{>Zz^$H5 z1o`_nT2LuO0vfV2vxe{lEShX%XAP3^STqrjvjZvCpc$I9^M45{Kq3JVELu1#I-Je` PFc=~p*tX5inF9O;>wKUj delta 1668 zcmew_`&xEFSiN?T_@s=$1HQaDVttcu6*VepGPy2O&Mp1;DoFYNh5mOFcHJl}<370U z!09>0>F0X(H+gI9_$664`OvQ&&pup=(AyIcubX9-_`{Ryhv^|^Cw-Ud)%%?rjUQZ6 zc5(`dxKhmdSU`3yyYmE`6JLZh`EPvJ8)w##?`O?%I9-PLAJkwkqZs zf1ShBDz^uJ*zERa#eR=p-FEfoYUVnBd3bQ&y>-)P`+rD$WU}~>+|-8SH~rnZ{wIFC zom9Mc-_HKLcVYR)_JRvrJhP1YFRf{;4Ohzzn;Nis+v?M7m*pas6z)7Nx<%AR`-PN< zQl5e~f9&e(k8Ik_LIWO#-_?HFvvHPo#ww?+kqf1KotgD@r&k0?JcxQ5x_0W-!unZ( zF9Z#=&*oY@DO_Z-=-|yz&+rwSdQBM^58u6_ebFax`)rQ)i#ac-n_O`F;55HLt4e)` zip+-p7h8Qzw3Ef32}-s#$7-oum04Bv{6+0?;ii^D_1V+c)Vx%@y()ahuI3|l%8v3c z&U`lRU%Z#~sFvDJr+)c1p}tnZo&c?<2Oi9*Uv(@%Y3pqFwG^Kp~Bhg)Ag5HRo6+cNFRl+&#CuXek9SQxR4_uae2%g-+V`D;;g z>oc3HuM_6fSD(4{Ws}&XmN|VtXJxI}QCXW6(mnmx%1>%~(~o?=qbT_M)QMNdF;m1J zGZ||>+V6W?=&^Czt=>ahCl?6qRe!o-#kED2D^z})zbutl(-(Vnwsqd)doNbZS!q;h zpSR<>b?U2c?A3caw!IepW4L%;zumHLH9KQtB;H*4d7~j_mP+2YdfO|zpT*}+KfSOr zICiCSnT*V9u6X&kT-N(D^@G0lr<^ZL;`={F25P7}T1f8F^lw|%p>%v@!UL^2 zifNDD?^CQ&_;UN^jCh@deRt~b)aIX=zum5E>XeYW{apID8mQCx7HnB~G~&r=75| zu7L#*g&0^`nV4D`nP?jrP44E@z$$)>(~{9>5|!AA z3=FH1%=|o;#FA7E7b_zJLt_IAAha|w1^YnVz(5_S%r`#;mx{@}yh@BllMQ$c7>y?< z@(PO?8YzIn(?B6lfeXwqFf=kZp1g@yW%4>+Q9A=mV+?s?OLGh{GgCthF;k1ljC{g@ zh87qyCdOFA%rM2wjWKOEx0syDXB+G4=wxW&>gwcV=3;5$X5?sQXkuV&>1tqRWaR8< lVqj@!Lr_I5mz^C~aYn7XWE;l&Amz diff --git a/docs/libcurl/curl_share_setopt.html b/docs/libcurl/curl_share_setopt.html index 14b3677..9b36241 100644 --- a/docs/libcurl/curl_share_setopt.html +++ b/docs/libcurl/curl_share_setopt.html @@ -78,6 +78,6 @@ p.roffit {

CURLSHOPT_USERDATA

The parameter allows you to specify a pointer to data that will be passed to the lock_function and unlock_function each time it is called.

RETURN VALUE

CURLSHE_OK (zero) means that the option was set properly, non-zero means an error occurred as <curl/curl.h> defines. See the libcurl-errors.3 man page for the full list with descriptions.

SEE ALSO

-

curl_share_cleanup (3) curl_share_init (3)

+

curl_share_cleanup, curl_share_init,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_share_setopt.pdf b/docs/libcurl/curl_share_setopt.pdf index 0c4f4323ea1f4e6bb093ef6cc6c0213ddc383a45..dfa711b3b8259d9f5273a9516e6da4292e8930fb 100644 GIT binary patch delta 387 zcmcbpeNlVEJ3b*ZLlcukGm}K!jvw8@5o!jpRi*(Xc!yD*wfj^|g!r)UGe znXsv@fuXK}MTmi=m7%$niG{X-;pCtE8d$|m1S}biC+7*c;WPAsfIW6;bL_&xn|lRU zFuIv(a_Ku4r6!hS=I6O2mZWO9SQ!}@ni?1ySQuCunu8stZeXAeROXwXf=k8ZYGEZt zaxVgGIyO=n;xVjpd8MqnS*$`9_%VlTBRa}x- WR8motn#N^nU~I&ts_N?R#svV^8Dt9p delta 387 zcmcbpeNlVEJ3b);3yWlP(=>BkV++G1T|>jv)X9c|!jpRi*(Xc!yD*wgj^|g!r)UGe znXs|0fdvqS7+6}Fm|7W`Xd4(!{>iU_Roq0tlF?{#o`4%ZLmvp(W0y9^E-bvcS8xTR zo2e$3zH?D(Vo7Fxo=aj$s)mb|k%6JHfdvp+nwWwerfy)M4piowpMp!pThe curl_share_strerror() function returns a string describing the CURLSHcode error code passed in the argument errornum.

AVAILABILITY

This function was added in libcurl 7.12.0

RETURN VALUE

A pointer to a zero terminated string.

SEE ALSO

-

libcurl-errors (3) curl_multi_strerror (3) curl_easy_strerror (3)

+

libcurl-errors, curl_multi_strerror, curl_easy_strerror,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_share_strerror.pdf b/docs/libcurl/curl_share_strerror.pdf index d301a6e8a552fa2e84db993774cec745a6e69d7b..99d3c2e44fae36fae50e7d33734970662242728b 100644 GIT binary patch delta 347 zcmaDM^+IaHUp65#!;}=`jvw8{MJag1h@^Vn6fOG-`N&u%7cs%v1V zYhV##U}Lvt5HQ%5&LM@LIXO9NLYQ#%_1Dkl5z$^ZcF>{?m? delta 347 zcmaDM^+IaHUp65FOCwW*WOH*}V++G1T|>jv)XDtpag3&u^Vn6fOG-`N&u%7ctZQHa zL?H&2RwkxaMyA>ZMw2->G_Z<0b67GOO|Io|!)4%m4ts1;4xHxLg!$Q}HZSH}$mnLO z$))dHl$uzQnV;v9SdyyYVr67tXl!5sgq9|zU`MGN7^nl4`R1qKQZc!UTZz$V^IGmW tMn?lvLlbj1Qws}26DJd6R|87}Qx_9Q7dHz_Cm_es)Xs*0ipf5_G61ETRIUI3 diff --git a/docs/libcurl/curl_slist_append.html b/docs/libcurl/curl_slist_append.html index 0b77859..4134777 100644 --- a/docs/libcurl/curl_slist_append.html +++ b/docs/libcurl/curl_slist_append.html @@ -51,7 +51,7 @@ p.roffit {

struct curl_slist *curl_slist_append(struct curl_slist * list, const char * string );

DESCRIPTION

curl_slist_append() appends a specified string to a linked list of strings. The existing list should be passed as the first argument while the new list is returned from this function. The specified string has been appended when this function returns. curl_slist_append() copies the string. -

The list should be freed again (after usage) with curl_slist_free_all(3).

RETURN VALUE

+

The list should be freed again (after usage) with curl_slist_free_all.

RETURN VALUE

A null pointer is returned if anything went wrong, otherwise the new list pointer is returned.

EXAMPLE

 

 CURL handle; @@ -63,6 +63,6 @@ p.roffit {

SEE ALSO

-

curl_slist_free_all (3)

+

curl_slist_free_all,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_slist_append.pdf b/docs/libcurl/curl_slist_append.pdf index 3025e43..740f9a2 100644 --- a/docs/libcurl/curl_slist_append.pdf +++ b/docs/libcurl/curl_slist_append.pdf @@ -72,12 +72,12 @@ endobj - -2013-08-08T09:45:22+02:00 -2013-08-08T09:45:22+02:00 -groff version 1.22.2 - -Untitled + +2015-01-08T09:17:46+01:00 +2015-01-08T09:17:46+01:00 +groff version 1.22.3 + +Untitled @@ -86,10 +86,10 @@ endobj endstream endobj 2 0 obj -<>endobj +<>endobj xref 0 15 0000000000 65535 f @@ -109,7 +109,7 @@ xref 0000001787 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R -/ID [<901B37E731777385534E234E0A30AECE><901B37E731777385534E234E0A30AECE>] +/ID [] >> startxref 3364 diff --git a/docs/libcurl/curl_slist_free_all.html b/docs/libcurl/curl_slist_free_all.html index 0bd7418..f2f4084 100644 --- a/docs/libcurl/curl_slist_free_all.html +++ b/docs/libcurl/curl_slist_free_all.html @@ -52,7 +52,7 @@ p.roffit {

DESCRIPTION

curl_slist_free_all() removes all traces of a previously built curl_slist linked list.

RETURN VALUE

Nothing.

SEE ALSO

-

curl_slist_append (3) +

curl_slist_append,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_slist_free_all.pdf b/docs/libcurl/curl_slist_free_all.pdf index f233108..f7cf88b 100644 --- a/docs/libcurl/curl_slist_free_all.pdf +++ b/docs/libcurl/curl_slist_free_all.pdf @@ -62,12 +62,12 @@ endobj - -2013-08-08T09:45:22+02:00 -2013-08-08T09:45:22+02:00 -groff version 1.22.2 - -Untitled + +2015-01-08T09:17:46+01:00 +2015-01-08T09:17:46+01:00 +groff version 1.22.3 + +Untitled @@ -76,10 +76,10 @@ endobj endstream endobj 2 0 obj -<>endobj +<>endobj xref 0 14 0000000000 65535 f @@ -98,7 +98,7 @@ xref 0000001254 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R -/ID [(\n>Bte\216\016U%\t=b.w\370\357)(\n>Bte\216\016U%\t=b.w\370\357)] +/ID [] >> startxref 2831 diff --git a/docs/libcurl/curl_strequal.pdf b/docs/libcurl/curl_strequal.pdf index e9ed9eb02fca66c2e7e0748f5744470b6b277ee1..9618b8e409e8a59fe5098380168318390e08c2ea 100644 GIT binary patch delta 352 zcmdm@utj0RR!$)^gT!QmwB$tHjvw8@S@?#;mO=QDp;g8JM!#i zR58=!(swROO)SaG&vQvEN!4(%GBPkUH83==Ft9WG;?!ZV++G1T|>jv)X9!KQj;HYx-gnf=HgMsrJ$V4OxRf0 zzygRu3@oioOs$NJwGE6WAK=o!D*l_xlF?|gDYqLg1DA8#W0w-1%*~^MMQXDn&u&H) zQ%x>?=c3falFa-(m&B4(4HqjT14Cm23m~*KF@-ovflovhRY={yKpmztzer=UBDXN3 z(dJaXB1R_*Geb9114|2I7ZY<6S4#soLnBK=Q$r&sQ%g%@XD25+8$v23OA1H>0Adwa AF8}}l diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3 index 2a24866..8d16852 100644 --- a/docs/libcurl/curl_unescape.3 +++ b/docs/libcurl/curl_unescape.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -38,11 +38,11 @@ converted to their plain text versions. If the 'length' argument is set to 0, curl_unescape() will use strlen() on the input 'url' string to find out the size. -You must curl_free() the returned string when you're done with it. +You must \fIcurl_free(3)\fP the returned string when you're done with it. .SH AVAILABILITY Since 7.15.4, \fIcurl_easy_unescape(3)\fP should be used. This function will be removed in a future release. .SH RETURN VALUE A pointer to a zero terminated string or NULL if it failed. .SH "SEE ALSO" -.I curl_easy_escape(3), curl_easy_unescape(3), curl_free(3), RFC 2396 +.br curl_easy_escape "(3)," curl_easy_unescape "(3)," curl_free "(3)," RFC 2396 diff --git a/docs/libcurl/curl_unescape.html b/docs/libcurl/curl_unescape.html index b8e434c..e8180b2 100644 --- a/docs/libcurl/curl_unescape.html +++ b/docs/libcurl/curl_unescape.html @@ -50,12 +50,12 @@ p.roffit {

#include <curl/curl.h>

char *curl_unescape( char * url , int length );

DESCRIPTION

-

Obsolete function. Use curl_easy_unescape(3) instead! +

Obsolete function. Use curl_easy_unescape instead!

This function will convert the given URL encoded input string to a "plain string" and return that as a new allocated string. All input characters that are URL encoded (%XX where XX is a two-digit hexadecimal number) will be converted to their plain text versions.

If the 'length' argument is set to 0, curl_unescape() will use strlen() on the input 'url' string to find out the size. -

You must curl_free() the returned string when you're done with it.

AVAILABILITY

-

Since 7.15.4, curl_easy_unescape(3) should be used. This function will be removed in a future release.

RETURN VALUE

+

You must curl_free the returned string when you're done with it.

AVAILABILITY

+

Since 7.15.4, curl_easy_unescape should be used. This function will be removed in a future release.

RETURN VALUE

A pointer to a zero terminated string or NULL if it failed.

SEE ALSO

-

curl_easy_escape(3), curl_easy_unescape(3), curl_free(3), RFC 2396

+

curl_easy_escape, curl_easy_unescape, curl_free, RFC 2396

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_unescape.pdf b/docs/libcurl/curl_unescape.pdf index cbadf5e96e8fb4561f0a5222ad14936ffd2f9a46..d3f74c13ca6f2f99187615c73043ec7eb41751de 100644 GIT binary patch delta 1878 zcma))dpOg39LIC%#7|@jAvR@An0~+Qx7k*$VOz>Aw?~9*nox7wbel}Ehe*^;I^-;k zm`frQ$E9MNB6HG(k|eFm=_sK+icUwJf6h71c}|~yzMtpyef{zNe4fuypVji5aybU(dR*l#}Z{o-W{)w~{d2Pq23MZGj_ zjdF>~9EowTU7}K^wk1s*Xq#GHcX3+lt<(A^6{1*&$T#3PY5!ry?1Hw@)BvM%_Ni;d z7ZCjnl|PnYvZ?p!?P?468-1AiC=X$yv-WvOoY_rE*OLj^hh5W2xbvy_IVoC_@RPu*j^O9|m})Q|%v*kiho2SbV@l;E7H%f~gT5U^J>8P(0IVekWWnIEfln=NHx4B%e<80Iy^$Av zn6!O~vio6gw&LyN`fhb4g||7>C!=;;{mj7qn~mSO z(v?^6-yILq)En^-Sf1jbrOy`iAf7Lhzh{+?Z#szRzeMP0a}JaoNj?ob=e~%iS1h;+ zDwxeu<4W(>s}HaAyK5-JE<#JgPr{`xN?x#InTd{{ z9-{exLh5_jH3oH3dzrLc=jd&^AssC_;qKEwjf>n=ZfsuC!>#1|Bbl$6 z>@1c#K2`Rv>ZNJNDeJEL3`>6IUWjVC@z6)jwTlkFo<{p2d>{U(3>~glv)&PyaV#;v zc&6@%vxWz4#jkv?Bw<$dyE|dUW}#6m_t|Ua6{5;)Pbuv~pI@SZv1rPRJ&;EWGK$Y! zD1U)bPJmzt&F6ob)C zPQOg~^)rsvP;3HP6%jj-qRM5l=ViY1sgFS^P5js1GT@xhuO-)Ytg7seVMwECtP)ww z4B4F^`j}{%a@R&yelX&lgdRkRK2n;L7A*ur=~`m*OWOn@W8M{ zX^=_<<)MXBpN>ub96ggqq?Om1hMXmpS+5@19=3`&Fj$zKgfmcB_Unb6plYMdTT= zucec1ZEVsxq`zzNMG-|YWbybyO@7*$d*+F7o>0Vnh6}s==vMu^I}rj-_$`T`O4o7F z^ni_*$kb%k9{4TDYlROv2YW-OVbJb$&YK*)>UJV5g`MSrZMquFzR1@phc}*W-_zKN z?7!Z5GoyWdViVz^&}~~-uYC8TOS*~?qRmr{*e!V~cGJ*VWXa;5_M6D*SslXq>@H69 zP7@wKp2Ok-b8QSe3Lv6D)Rz~62(@oCS7=%hK?v_ahFRFKa2y*8L7Z?bI9FH#hs4H# zFpGr?XN&E%-PDNU9XjZ>-=bqs`?-6fd6fO!Sh1Rpg?LQca47)`LRgUG3z8|20|h49 zf{@q{u>M!R6(FnO#Tfwe+rmu&o4!q)%l}PctxTs(jY(VstaYAS9X~QAn$F^LtmzaS z2oXRCB!Ohe;p+$(5X8)B?lC+6%MhQ|T{$<*PrBd+5{UY;Sr8SC0=_mN9#5RdAQ%Vz z(}QqCF-8v~gy;VdV8T4xflQvy@bElFB+gyK-xEOu(tJjQ{$wlv5*;Fu=7%BU#c%aC z1e0Jq33haLA~?ZLbTW~Icf^sLKnDhii6@ho1V`%n|22XEDiz@IS@Hb+@tkk~Pk>+m Kjb?Z zVUj#X)-6P-v?(g%vPwck7ZTQ`t9I(owfn4d&hwo2`JLZ$&ilUS+v?+nscgOqw^4hK zv>@S3Ndoez6V6;{q^;;E!D@ANyudk4t9^a_$cnY&tg2?>GKbNLN7>ZKQA;~HoNDnx z)xdqV z>+E|?Gi~scL6X2%|664jH#;*ubrPeR&10oUUpd+=Y)a?loA0dV@_ll;z|pfmJJbK# z;xmUgoR}D}4r-0(?hZTA|H;;sp2*0`PejmW3YQ}iC$CO0cQ4smq~Y7uR3?ggm!IMy6|Qt zFICI(deEz$H`CAk=J>W*&j-|Y$I{xrx||QHI8!ch-Fc~QO}Y7qZbQ4#X^IIs;C}6w z=%S`g$?dql5Or}$X+XorNBabdMpN=S+=U%`n$f4zJgS^qjg=3xAoh_mr3&QK^5Fv) zEu!2;F!au<@7fLaRguG*>1hgF2i&p~|)K-N5Vm926Q)7XB zxN3Gom5!9fQYb3$j!P}+Xil%_5Wb$RTYhNd&r4kfw~P6syUMoJ7dg8he)-nk;@d^y zbZ>FjWasEaVCA-(tPWMRe#(}V+0;VQ>ayQ*Z$+;dyK{y8QEI-=<)F8l+F*#0ez~5j zaciNtil!O+aLnQvLf>r%aKVdZDe0wqR*w^gly2RHp*c!;^k-eJjqaR@p-+T;lGWR~ zQvI7xW2bq1QXWH{KHuIss&H$&o5M^5!gjxq(i4Ol8ET&i_!5?6K7S-9q>BA}oWA_k zOsS}7ELHtIb)aiu?|ffxub4zW>uKJvhtju_r(GY0YiO5SG!Avn8r8`=X2#ewa=G9s zw-f6>_&`UYL6A$>>*zQ++&Gi`!Z|l4Kl@Bg%`~5#pGaIi=cq;DRZzrlnhz<8XDo>oXli zggX8y-ZDOBxtCy%ilor5PkblQWbfzX#QNzF!GlEqaMZQ%wDF@Z58A@-jrE_)RI)q8 zCXeBVKkRQXb2l>!zZ!+u0cAQ=x)KtDVP zayWQEHt?K4kU}95KnV8t6=4zEq8d)*rYJeP7^g<22mJDFNHx$5xVvs)q03<@-B1RyK3{a*v z@Zu8~h8Nkgj21C6QFIiAwjs;D_#f}V)WwWMSj;F?kraiNBZ@{)Hr@b}#GulMbOxEo ygkUNiCIBQNfl7zy@FoV42HS4, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -30,6 +30,8 @@ curl_version - returns the libcurl version string .SH DESCRIPTION Returns a human readable string with the version number of libcurl and some of its important components (like OpenSSL version). + +We recommend using \fIcurl_version_info(3)\fP instead! .SH RETURN VALUE A pointer to a zero terminated string. The string resides in a statically allocated buffer and must not be freed by the caller. diff --git a/docs/libcurl/curl_version.html b/docs/libcurl/curl_version.html index aca7ecc..ab308d0 100644 --- a/docs/libcurl/curl_version.html +++ b/docs/libcurl/curl_version.html @@ -50,8 +50,9 @@ p.roffit {

#include <curl/curl.h>

char *curl_version( );

DESCRIPTION

-

Returns a human readable string with the version number of libcurl and some of its important components (like OpenSSL version).

RETURN VALUE

+

Returns a human readable string with the version number of libcurl and some of its important components (like OpenSSL version). +

We recommend using curl_version_info instead!

RETURN VALUE

A pointer to a zero terminated string. The string resides in a statically allocated buffer and must not be freed by the caller.

SEE ALSO

-

curl_version_info (3)

+

curl_version_info,

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_version.pdf b/docs/libcurl/curl_version.pdf index d54b3d7bf86c81dbf168540aa13fb2ea57357875..81f0d9c45d7f2cc43981314a480888979e2500e0 100644 GIT binary patch delta 1656 zcmaDaxk!3~dwt05yvq&(wco>e9vxlz&Cm|u4ih8M1D%OwJv@($GDn(iot?cM(5XT@e3EcVhFeh!D z@MditfAfjfj%t->6Q)d?TUuK9H+|BdO?Mi8NKAO6^DOw$?g@9I>%+ILn7wC`^zGX| z3r=j;s(G}7QFV&jw@R(uTNoxkPXBcDQ>I6g-RX~EQ|~W4k{V&+>?30+D5nw8_ulZ( z!H-URGYvyGhO};MV7X&_@?3gW?VDq+9VSfeJ71ZjqcG#Dx?6RX>&rIZt|XYVC@Jx9mU7I8`re z5~_J6>Ymwz>Dxo^F5A?)=1{n1%I%D&?MIjcrFWmG&yKsG~Ei=NF_ z^!Byg)A&Ah?=02nt66Ji8=P0SN%>Y%XLsYhpTAsU{`TeDjH4&Ge=N{WwG|K5 zix%0k_JUl!Yb;~k)SW)j8;$=dOpuY=8`Q0KpED#fspj&s+<8k~KQdITHrkuHTC2)L zZKHk0&9_&h>U}bNGHsYTOd4#%!sWDfFJq0|x9gGIB-@V4`CBd%ak>BS%Zyux zceu33Ro+|L=yWTe|D5|qr$@b;CtSP97~>UL-<9y{!k>%Un~(fb>bh>f&tz&-YFp83MUMT>5VLc_j*lMw4eT_c0nz)?~3121$U_ z+1Tg@nRA(gluedr72^srG~hBc0CT%oWE8+zB_q(k54c1PObrYTEDS6S&B0DqH!x7w z%N)6NbWy%j~NXbPP(J3i_UT zY5599AU2o2r;9?gjgy(9o0+4Dxr>{Hsez@drK7XCqoa|Li<7H?Gf=?M4pW5|x{_Ef aJ3Fr8lEk7Ca7Y^)n3{8`s=E5SaRC5vQ(0{Q delta 1475 zcmZ1^{a$i{d;OH?{MiN~$M63XalgeK(v@B8K3gqSnt$%4CEO*KuK0*DF5l3Yd2r1u zyT3WfPP@uxP1tec`KRyi=Nx8EaA7#@ZU6b0#eKGd>(UbMdf1y+_+IGW)5yQlfa9rC zm4TZ)QzNhAlLZD%TMWsAsOZ=Cd zUX`nDo>wlqJD9yFean6w`4I6jXknnN0~5bs{B(b|!cYO;PTsTg$}Y(D$ry(@)ZaG? zSr@veebvr<>v@KJmD+KVse8hw&S&ypP?i?^HzdYo^9e6&4UWYHuV$aU!?f`URh5f0ivNPtJS%rD}KEda=S7k)KCm)~!o^sm-!(S~|IK7?KP=et|%NO9kKHCrbN?dyc6Ae1hR==fHjhK+ zUHvND5j|Ub`Q9@x9tgC)Ye};>u~p!qz~cfj0S!j>iLuj`NLKN!dAebF!3z!D5MCL> zw0-aYnHv6953QRyt8AM31edaeeQuwAY8)}t2|xKPez8HnlHJ;ixkve?t)0BZ>LiPG z!Nn`p&;DEvR8VSqBjaBbP#yf8m1F*v3B9%}OG>`$Jx}_1VrI1V>rX;CJtr-uC~a9^ ze#L8!RQ!>z>|X^k0#ox+ic5-86LYzMto)=bE;9uK1u$(nIhnbV&j82`;?j4^&nr9iFNSitDGwt zfgY^q7Bw(7umD0!6H~C0)eQ{PHM#VC^HW?BOHwsltc(l{QB_Pn!mT7?q-kddjlGJZ z)HE&w1w-S>zqn;>4NVn5p=qFyr@#ef7#NwGn4pUpSegPO9aWuyx#i>#9<_RNb70J( zN*Mwjh#_WVieZ(Zp(Um|LnC0yKr_$K6jRI?qHZ!TuLPsTuKsRZ0Ga{~ AApigX diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3 index ccb2028..1b8f9c1 100644 --- a/docs/libcurl/curl_version_info.3 +++ b/docs/libcurl/curl_version_info.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -20,7 +20,7 @@ .\" * .\" ************************************************************************** .\" -.TH curl_version_info 3 "10 June 2009" "libcurl 7.19.6" "libcurl Manual" +.TH curl_version_info 3 "2 Nov 2014" "libcurl 7.40.0" "libcurl Manual" .SH NAME curl_version_info - returns run-time libcurl version info .SH SYNOPSIS @@ -29,12 +29,13 @@ curl_version_info - returns run-time libcurl version info .BI "curl_version_info_data *curl_version_info( CURLversion "type ");" .ad .SH DESCRIPTION -Returns a pointer to a filled in struct with information about various -run-time features in libcurl. \fItype\fP should be set to the version of this -functionality by the time you write your program. This way, libcurl will -always return a proper struct that your program understands, while programs in -the future might get a different struct. CURLVERSION_NOW will be the most -recent one for the library you have installed: +Returns a pointer to a filled in static struct with information about various +features in the running version of libcurl. \fItype\fP should be set to the +version of this functionality by the time you write your program. This way, +libcurl will always return a proper struct that your program understands, +while programs in the future might get a different +struct. \fBCURLVERSION_NOW\fP will be the most recent one for the library you +have installed: data = curl_version_info(CURLVERSION_NOW); @@ -65,7 +66,8 @@ typedef struct { /* when 'age' is 2 or higher, the member below also exists: */ const char *libidn; /* human readable string */ - /* when 'age' is 3 or higher, the members below also exist: */ + /* when 'age' is 3 or higher (7.16.1 or later), the members below also + exist */ int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */ const char *libssh_version; /* human readable string */ @@ -94,7 +96,10 @@ bits are: .IP CURL_VERSION_IPV6 supports IPv6 .IP CURL_VERSION_KERBEROS4 -supports kerberos4 (when using FTP) +supports Kerberos V4 (when using FTP) +.IP CURL_VERSION_KERBEROS5 +supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy +(Added in 7.40.0) .IP CURL_VERSION_SSL supports SSL (HTTPS/FTPS) (Added in 7.10) .IP CURL_VERSION_LIBZ @@ -122,9 +127,14 @@ libcurl was built with support for IDNA, domain names with international letters. (Added in 7.12.0) .IP CURL_VERSION_SSPI libcurl was built with support for SSPI. This is only available on Windows and -makes libcurl use Windows-provided functions for NTLM authentication. It also -allows libcurl to use the current user and the current user's password without -the app having to pass them on. (Added in 7.13.2) +makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and +Digest authentication. It also allows libcurl to use the current user +credentials without the app having to pass them on. (Added in 7.13.2) +.IP CURL_VERSION_GSSAPI +libcurl was built with support for GSS-API. This makes libcurl use provided +functions for Kerberos and SPNEGO authentication. It also allows libcurl +to use the current user credentials without the app having to pass them on. +(Added in 7.38.0) .IP CURL_VERSION_CONV libcurl was built with support for character conversions, as provided by the CURLOPT_CONV_* callbacks. (Added in 7.15.4) @@ -133,12 +143,17 @@ libcurl was built with support for TLS-SRP. (Added in 7.21.4) .IP CURL_VERSION_NTLM_WB libcurl was built with support for NTLM delegation to a winbind helper. (Added in 7.22.0) +.IP CURL_VERSION_HTTP2 +libcurl was built with support for HTTP2. +(Added in 7.33.0) +.IP CURL_VERSION_UNIX_SOCKETS +libcurl was built with support for Unix domain sockets. +(Added in 7.40.0) .RE \fIssl_version\fP is an ASCII string for the OpenSSL version used. If libcurl has no SSL support, this is NULL. -\fIssl_version_num\fP is the numerical OpenSSL version value as defined by the -OpenSSL project. If libcurl has no SSL support, this is 0. +\fIssl_version_num\fP is always 0. \fIlibz_version\fP is an ASCII string (there is no numerical version). If libcurl has no libz support, this is NULL. diff --git a/docs/libcurl/curl_version_info.html b/docs/libcurl/curl_version_info.html index 6da3aaa..793fc2a 100644 --- a/docs/libcurl/curl_version_info.html +++ b/docs/libcurl/curl_version_info.html @@ -50,7 +50,7 @@ p.roffit {

#include <curl/curl.h>

curl_version_info_data *curl_version_info( CURLversion type );

DESCRIPTION

-

Returns a pointer to a filled in struct with information about various run-time features in libcurl. type should be set to the version of this functionality by the time you write your program. This way, libcurl will always return a proper struct that your program understands, while programs in the future might get a different struct. CURLVERSION_NOW will be the most recent one for the library you have installed: +

Returns a pointer to a filled in static struct with information about various features in the running version of libcurl. type should be set to the version of this functionality by the time you write your program. This way, libcurl will always return a proper struct that your program understands, while programs in the future might get a different struct. CURLVERSION_NOW will be the most recent one for the library you have installed:

  data = curl_version_info(CURLVERSION_NOW);

Applications should use this information to judge if things are possible to do or not, instead of using compile-time checks, as dynamic/DLL libraries can be changed independent of applications.

The curl_version_info_data struct looks like this @@ -71,7 +71,8 @@ p.roffit {   int ares_num; /* number */

  /* when 'age' is 2 or higher, the member below also exists: */   const char *libidn; /* human readable string */ -

  /* when 'age' is 3 or higher, the members below also exist: */ +

  /* when 'age' is 3 or higher (7.16.1 or later), the members below also +   exist */   int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */

  const char *libssh_version; /* human readable string */

} curl_version_info_data; @@ -87,7 +88,9 @@ p.roffit {

CURL_VERSION_IPV6

supports IPv6

CURL_VERSION_KERBEROS4 -

supports kerberos4 (when using FTP) +

supports Kerberos V4 (when using FTP) +

CURL_VERSION_KERBEROS5 +

supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy (Added in 7.40.0)

CURL_VERSION_SSL

supports SSL (HTTPS/FTPS) (Added in 7.10)

CURL_VERSION_LIBZ @@ -109,19 +112,25 @@ p.roffit {

CURL_VERSION_IDN

libcurl was built with support for IDNA, domain names with international letters. (Added in 7.12.0)

CURL_VERSION_SSPI -

libcurl was built with support for SSPI. This is only available on Windows and makes libcurl use Windows-provided functions for NTLM authentication. It also allows libcurl to use the current user and the current user's password without the app having to pass them on. (Added in 7.13.2) +

libcurl was built with support for SSPI. This is only available on Windows and makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and Digest authentication. It also allows libcurl to use the current user credentials without the app having to pass them on. (Added in 7.13.2) +

CURL_VERSION_GSSAPI +

libcurl was built with support for GSS-API. This makes libcurl use provided functions for Kerberos and SPNEGO authentication. It also allows libcurl to use the current user credentials without the app having to pass them on. (Added in 7.38.0)

CURL_VERSION_CONV

libcurl was built with support for character conversions, as provided by the CURLOPT_CONV_* callbacks. (Added in 7.15.4)

CURL_VERSION_TLSAUTH_SRP

libcurl was built with support for TLS-SRP. (Added in 7.21.4)

CURL_VERSION_NTLM_WB

libcurl was built with support for NTLM delegation to a winbind helper. (Added in 7.22.0) +

CURL_VERSION_HTTP2 +

libcurl was built with support for HTTP2. (Added in 7.33.0) +

CURL_VERSION_UNIX_SOCKETS +

libcurl was built with support for Unix domain sockets. (Added in 7.40.0)

ssl_version is an ASCII string for the OpenSSL version used. If libcurl has no SSL support, this is NULL. -

ssl_version_num is the numerical OpenSSL version value as defined by the OpenSSL project. If libcurl has no SSL support, this is 0. +

ssl_version_num is always 0.

libz_version is an ASCII string (there is no numerical version). If libcurl has no libz support, this is NULL.

protocols is a pointer to an array of char * pointers, containing the names protocols that libcurl supports (using lowercase letters). The protocol names are the same as would be used in URLs. The array is terminated by a NULL entry.

RETURN VALUE

A pointer to a curl_version_info_data struct.

SEE ALSO

-

curl_version(3) +

curl_version

This HTML page was made with roffit. diff --git a/docs/libcurl/curl_version_info.pdf b/docs/libcurl/curl_version_info.pdf index 3ca916bfb6244e0c6836616f60abf376b31182c2..2f9b24fe0a44f75077a2cd482007aee1829d7d11 100644 GIT binary patch delta 6172 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 delta 5822 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 diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3 index 698a4ce..f8506a2 100644 --- a/docs/libcurl/libcurl-easy.3 +++ b/docs/libcurl/libcurl-easy.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -19,7 +19,7 @@ .\" * KIND, either express or implied. .\" * .\" ************************************************************************** -.TH libcurl 3 "12 Aug 2003" "libcurl 7.10.7" "libcurl easy interface" +.TH libcurl 3 "19 Sep 2014" "libcurl" "libcurl easy interface" .SH NAME libcurl-easy \- easy interface overview .SH DESCRIPTION @@ -33,6 +33,17 @@ without a specified URL as you may have figured out yourself). You might want to set some callbacks as well that will be called from the library when data is available etc. \fIcurl_easy_setopt(3)\fP is used for all this. +\fICURLOPT_URL(3)\fP is only option you really must set, as otherwise there +can be no transfer. Another commonly used option is \fICURLOPT_VERBOSE(3)\fP +that will help you see what libcurl is doing under the hood, very useful when +debugging for example. The \fIcurl_easy_setopt(3)\fP man page has a full index +of the over 200 available options. + +If you at any point would like to blank all previously set options for a +single easy handle, you can call \fIcurl_easy_reset(3)\fP and you can also +make a clone of an easy handle (with all its set options) using +\fIcurl_easy_duphandle(3)\fP. + When all is setup, you tell libcurl to perform the transfer using \fIcurl_easy_perform(3)\fP. It will then do the entire operation and won't return until it is done (successfully or not). @@ -42,4 +53,6 @@ transfer, or if you're done, cleanup the session by calling \fIcurl_easy_cleanup(3)\fP. If you want persistent connections, you don't cleanup immediately, but instead run ahead and perform other transfers using the same easy handle. - +.SH "SEE ALSO" +.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_setopt "(3), " +.BR libcurl-errors "(3), " libcurl-multi "(3), " libcurl "(3) " diff --git a/docs/libcurl/libcurl-easy.html b/docs/libcurl/libcurl-easy.html index e10411f..fb1de25 100644 --- a/docs/libcurl/libcurl-easy.html +++ b/docs/libcurl/libcurl-easy.html @@ -47,10 +47,12 @@ p.roffit {

NAME

libcurl-easy - easy interface overview

DESCRIPTION

-

When using libcurl's "easy" interface you init your session and get a handle (often referred to as an "easy handle"), which you use as input to the easy interface functions you use. Use curl_easy_init(3) to get the handle. -

You continue by setting all the options you want in the upcoming transfer, the most important among them is the URL itself (you can't transfer anything without a specified URL as you may have figured out yourself). You might want to set some callbacks as well that will be called from the library when data is available etc. curl_easy_setopt(3) is used for all this. -

When all is setup, you tell libcurl to perform the transfer using curl_easy_perform(3). It will then do the entire operation and won't return until it is done (successfully or not). -

After the transfer has been made, you can set new options and make another transfer, or if you're done, cleanup the session by calling curl_easy_cleanup(3). If you want persistent connections, you don't cleanup immediately, but instead run ahead and perform other transfers using the same easy handle. -

+

When using libcurl's "easy" interface you init your session and get a handle (often referred to as an "easy handle"), which you use as input to the easy interface functions you use. Use curl_easy_init to get the handle. +

You continue by setting all the options you want in the upcoming transfer, the most important among them is the URL itself (you can't transfer anything without a specified URL as you may have figured out yourself). You might want to set some callbacks as well that will be called from the library when data is available etc. curl_easy_setopt is used for all this. +

CURLOPT_URL(3) is only option you really must set, as otherwise there can be no transfer. Another commonly used option is CURLOPT_VERBOSE(3) that will help you see what libcurl is doing under the hood, very useful when debugging for example. The curl_easy_setopt man page has a full index of the over 200 available options. +

If you at any point would like to blank all previously set options for a single easy handle, you can call curl_easy_reset and you can also make a clone of an easy handle (with all its set options) using curl_easy_duphandle. +

When all is setup, you tell libcurl to perform the transfer using curl_easy_perform. It will then do the entire operation and won't return until it is done (successfully or not). +

After the transfer has been made, you can set new options and make another transfer, or if you're done, cleanup the session by calling curl_easy_cleanup. If you want persistent connections, you don't cleanup immediately, but instead run ahead and perform other transfers using the same easy handle.

SEE ALSO

+

curl_easy_init, curl_easy_cleanup, curl_easy_setopt, libcurl-errors, libcurl-multi, libcurl,

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl-easy.pdf b/docs/libcurl/libcurl-easy.pdf index 01bf41d152b2cfb8baefd1ed20b09a4bcf0d9942..1539974df085d0d94a47c82efdf98676b1339f71 100644 GIT binary patch delta 2827 zcma)(c|6qlAIBr1ahn;}md1TG%y(v(8RG~M%F;%xHPv9I9OD>r6viznw`{JkgB-cn zkz7;Qk*mb8tYs9bLC6SU+x>5U?c?$5^UwSJc)nks$LIO^d=eDuRZ}f!Sx!^bDGSN) zMaOg7Jy)`@NwU*q`TQ#RCvWb8ldLpVD6KF_NL_DScMs@5p|k#=rEHNmGBe%2U#z&> z#CB_Gw5)AgOQ`jV!d?I^c=O$f2T1O#8dGlL&UKZ6?18<>F-|UARQ*P+VHF1-O-d)} zv#lE_?UISJn#8F^2Rm9;N?To}eDqu5;52P~>Y$n~94a+8wk*Fj!c<%xuJVpA#*akF zs21BzfQ4eVtFN5>B`^p~)$rR8P4>X{UN`NaxNC-{*V|;Kr_Htn2V&^~igSrUEP;cL zlEr{?esED#lLU2rWk#SL@Yzp+w~x7a-PfFVZrdN`UVfcwNgFV%g{rI+)bs>)F8tsD zozhu}S@HU@iX>@}+pH5K?!g$9nW4MLq7I(4?{Y_XSDROjBZ8MOjE_e1cVBgFZq!|y zn8+T?II|3IhxnTa1ZkOjqz-lO4+^Kwn$lNrM|R2gb2HVfiV0jlR$fj3o_z&3l90S< z{%1Dj={k9sR&YD&4d+&hL$`c17tz&FjfD^#Ig=yxPx^4&cx{vwG|g0=jZ-zpmAW`7 z`O1%DINMGu$qVCkI=`Ks%&%#JHCs-?bhiW`=t0WL@`vK z3lk4|z?{8$+m}5fOjB(gv2LCJ5UCh1t@^Vi_;n&ptT(QUQuxr|l(t*bUM(oXgXQa( zUWqMOFFgLLyCoN_Y*I8)1}h%5G?@}6p`f5Auhkj4pYJ0M#%s<@=ewDi}Eqd0r-YL}fx7vC> z>RhC+m%53JCp0fX$$ZB}v@b}xlw0QNxG(DYa<8@L(a`Xf52VEBmW90ZPO~Yz9fz}p z`|)xts3VqQZLJgru->5*Y4 zA0!_}-Vw0&B(5JtMvGSYzUO`GFy_{=`|^U_a2)YWvb1&BjmFDQ%gtEh{NWERvV*Te zTT$9o^%#2vOe+SIKvWx7;-IYd+O@Q@hCiV^o)q;6`bCH3BK*sS$E7l!v`~ujheX zU&Cc|?@6;q&XG#cH9H+aCAa6zzki}#6ZcQPw+EGLIWM@hw&Co4HFVNUjG3FK zQwl9^*lvT_#WV5MhYhUxyn3{T&ZV2HUtN1F7U9J@pGPc6>n0-hV=t0m!f6FDzdlhS zbao}R!AsebwR?tncyF{Xxu=Vp0STu{<2W?XBmn5GkRcSHhg`mZhN zmgq&7mL1*LJyNOPA`NL_NIvht+DPa0bxc~zTP@{mMm&bs>_{Ddmqfci(vluekmJ?A zE-y^oIHX`QhL&nDpW3f%G7%L+--f%IE|v^k^E1)8#Exv88OYXgchJ)QrIosf-I`}Q zhnGa6*H~&wwaV+m#}W~BfcXVo$? zrH`)Q*@!>xECGQZ>!^)uG+a2ou(KlR`9o(Pum9L~#QEdTih5}t3crf8m8V56q_6|p zrdjqJf9mEL0RK3Hr{SRF5IUcAFDYL3F<)v8Iqk#UfXSO`XA>9FMi`Y05qH@sW%@5# zgK8zCvwj5*$_%9?yg5FH2iiP@_l}H}sKWT1fGt6j(IiB=iJxc=V)O^1UQ9Z-7KrMu8T(r_QWuWw2{<352^en{(&r_9wrP^IhuJ?k4sAV z)u-#^OLQEe&YQ9ID1VZfHQ~ewSDNIVz_iqgKW|AA(U87;ck0r(e=(f+)bfDSKXm9`Er%=;b(w?im%s0KFgHWa` zv9qn6v}!aRo@aZ>=e=X)n-W-QQBtq_#=^_^t`KD9kPxrSa+&4YE0KeHIQ)vsk6@S2 ziRFSDHtz(sdTP`N&AqpZ9UuY}*5ys?M=uH6t%H(Drl;XWv(TkWk{j49aWfmcR5ZSgh8Ce^(@=ZW~$9ABr+WFWx+{gGLB4kMUdS{*o>2)b3A$(1Ys4OZ;7kHLMYxo0s0{nzl;MR`Hc4< zC|DPc0N@C$Jp!i>VD!;gEd-DO7E=FD{=E>62bFP4$l}}N)`iY|TkwnjHw7C?h0A%q z+}BPNiqJ&>2rL2zVE$27Lm<>NKsq+Q?x%@?B=yt!NCfcjL`IgV;urZAQSDPmG=PEq z{gw!r4-E8AgFvGYUoj*~7yG|CB!I(asER4mkO1cEAsUPPY6AxK{OyytpNG$NR3>J&dSP?TI=$WIj2whWMGjl9X*BomGpiKcR5_8&2*Te#0 j3ZRS({%?W+GBN@M1QMx%Ayg6>ghuNDAQcsJTMN)%6SLuQ delta 2124 zcmb7=dpOi-8^>SKo5rCqvMlQ~&W7J_4rYEBr(tRp(nh&Z7>CU`j!{zUR}|aq5Hr^K z5FH$HXc_SrQ+2@PfL=e>K?P}DE6&9svc?P2c516k8<~r@`R9}5?#?L=POY25IcwPC?ELNT^ zZ~E50I=EUkb3&iWU(q)mzBx3i3ab{r^L}{`9_GWYC)#;O7U#|NGdT`Oxu0>dUO(^m^ZUJOV7AY_1etsD#HGe-{eTA*qVMRN`3Q>PQne zNO^8e@4;H^8T-0hqC@s6lJq^qv6o`|jchGQMLr8@zrHi?#E?o7JgRZ&A+1fn_NV7b z`F}N6;pbORb!x9-t1Pa5KMIovh3Mo}|Ip1h^BKa^(1ddRZC}TeDY}B>ZoFQ926xf= z{Wrtw^OuY7$90-Y$J-1F&vB96-*hF~d*LX3($g_P1`=N6C{FcyTxN$t_=Mc#EH2q< z?1#cD`NfU2g_j=`*b?P~3}x|RpIc#Vs4U$c8}PgRV+zdYqSF{ZK1{eTAU}-xh3#>7 z)@2{bStW7EFxgh(u667+M{;aMO{AI9T9nB8FnfM_Nl+(njA#o$XwrG<_aWO!mmsum zL?x@Jl%^Xm>^y(vLvZ%xKt?}Wo zSmLn$<55wU=n7%M*CpR2a7yMvzjt_XHu_E0a;$WtN_eLDu`7}gx96&Nz_|Y}$eSD+ zI6*U7sbp18#X%xB9<>x%RhT%X^E30eM|m61*{$i;Ip$>$yme(pTkeHM^Jz;JLu9+C zR!vxRp<ced*hKv zJZ*oKfxIISQ&DMKNqv^mdS#v()AW9DjU& zMI|lHRJ+v68b?8XQVB zo2rQ=)rEv61{kJyqfis=b^=z!L!Lx2LxV-%c$G88W`@4#A*9fc=k(NvpL_1+Ay)3( za~1A2DqB%fA265E5Bjtfk~?wlgs%K*%~t6()|$fM+MjYJQX~s~I&!zwUtcCO)f8ne zSq6Vy#R{sGgxmrnaeiib$_d^O^;B=K<$`A&(Ko8`(>=A3H<7*hs}+*d1rdG)bfmm54(Q@)hVr!{0>qBmQO+$E09&-s4?$QTA_j-` z;fzQg6UFNobCM-BzswLUWg&+}1H_$o5`au`cvB3{0Kjk>rF8$6Z%9ER7!FpN@@4IF zr4MU=N$~$8a<%h;5)les4`EEE`*}0Yg@)LAGyHUIO)&t71&BKr!r}iKLI(hJc4Q8r zzW+_Zv69i)8HXxkWCaqiIJG|)3aEvsA^s`=tO;fp15F6{&vhUk#B=&&P%wytc7GBe z=yL-Gz+*pWAVehYW*A@>BjWys5&mRa|B)U8Vt0kX>@10sDQoVDr4Rrc$PNqI*+F5M44pFaXiAP^B+T6Rtp#2?Q*cgO$$ diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3 index 7b68237..07091b5 100644 --- a/docs/libcurl/libcurl-errors.3 +++ b/docs/libcurl/libcurl-errors.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -28,11 +28,11 @@ This man page includes most, if not all, available error codes in libcurl. Why they occur and possibly what you can do to fix the problem are also included. .SH "CURLcode" Almost all "easy" interface functions return a CURLcode error code. No matter -what, using the \fIcurl_easy_setopt(3)\fP option \fICURLOPT_ERRORBUFFER\fP is -a good idea as it will give you a human readable error string that may offer -more details about the cause of the error than just the error code. -\fIcurl_easy_strerror(3)\fP can be called to get an error string from a -given CURLcode number. +what, using the \fIcurl_easy_setopt(3)\fP option \fICURLOPT_ERRORBUFFER(3)\fP +is a good idea as it will give you a human readable error string that may +offer more details about the cause of the error than just the error code. +\fIcurl_easy_strerror(3)\fP can be called to get an error string from a given +CURLcode number. CURLcode is one of the following: .IP "CURLE_OK (0)" @@ -74,7 +74,7 @@ After having sent the FTP password to the server, libcurl expects a proper reply. This error code indicates that an unexpected code was returned. .IP "CURLE_FTP_ACCEPT_TIMEOUT (12)" During an active FTP session while waiting for the server to connect, the -\fICURLOPT_ACCEPTTIMOUT_MS\fP (or the internal default) timeout expired. +\fICURLOPT_ACCEPTTIMOUT_MS(3)\fP (or the internal default) timeout expired. .IP "CURLE_FTP_WEIRD_PASV_REPLY (13)" libcurl failed to get a sensible result back from the server as a response to either a PASV or a EPSV command. The server is flawed. @@ -83,6 +83,9 @@ FTP servers return a 227-line as a response to a PASV command. If libcurl fails to parse that line, this return code is passed back. .IP "CURLE_FTP_CANT_GET_HOST (15)" An internal failure to lookup the host used for the new connection. +.IP "CURLE_HTTP2 (16)" +A problem was detected in the HTTP2 framing layer. This is somewhat generic +and can be one out of several problems, see the error buffer for details. .IP "CURLE_FTP_COULDNT_SET_TYPE (17)" Received an error when trying to set the transfer mode to binary or ASCII. .IP "CURLE_PARTIAL_FILE (18)" @@ -97,8 +100,8 @@ When sending custom "QUOTE" commands to the remote server, one of the commands returned an error code that was 400 or higher (for FTP) or otherwise indicated unsuccessful completion of the command. .IP "CURLE_HTTP_RETURNED_ERROR (22)" -This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server -returns an error code that is >= 400. +This is returned if \fICURLOPT_FAILONERROR(3)\fP is set TRUE and the HTTP +server returns an error code that is >= 400. .IP "CURLE_WRITE_ERROR (23)" An error occurred when writing received data to a local file, or an error was returned to libcurl from a write callback. @@ -116,7 +119,8 @@ Operation timeout. The specified time-out period was reached according to the conditions. .IP "CURLE_FTP_PORT_FAILED (30)" The FTP PORT command returned error. This mostly happens when you haven't -specified a good enough address for libcurl to use. See \fICURLOPT_FTPPORT\fP. +specified a good enough address for libcurl to use. See +\fICURLOPT_FTPPORT(3)\fP. .IP "CURLE_FTP_COULDNT_USE_REST (31)" The FTP REST command returned error. This should never happen if the server is sane. @@ -148,10 +152,10 @@ Internal error. A function was called with a bad parameter. .IP "CURLE_INTERFACE_FAILED (45)" Interface error. A specified outgoing interface could not be used. Set which interface to use for outgoing connections' source IP address with -CURLOPT_INTERFACE. +\fICURLOPT_INTERFACE(3)\fP. .IP "CURLE_TOO_MANY_REDIRECTS (47)" Too many redirects. When following redirects, libcurl hit the maximum amount. -Set your limit with CURLOPT_MAXREDIRS. +Set your limit with \fICURLOPT_MAXREDIRS(3)\fP. .IP "CURLE_UNKNOWN_OPTION (48)" An option passed to libcurl is not recognized/known. Refer to the appropriate documentation. This is most likely a problem in the program that uses @@ -229,7 +233,7 @@ Failed to load CRL file (Added in 7.19.0) Issuer check failed (Added in 7.19.0) .IP "CURLE_FTP_PRET_FAILED (84)" The FTP server does not understand the PRET command at all or does not support -the given argument. Be careful when using \fICURLOPT_CUSTOMREQUEST\fP, a +the given argument. Be careful when using \fICURLOPT_CUSTOMREQUEST(3)\fP, a custom LIST command will be sent with PRET CMD before PASV as well. (Added in 7.20.0) .IP "CURLE_RTSP_CSEQ_ERROR (85)" @@ -273,6 +277,9 @@ The passed-in socket is not a valid one that libcurl already knows about. .IP "CURLM_UNKNOWN_OPTION (6)" curl_multi_setopt() with unsupported option (Added in 7.15.4) +.IP "CURLM_ADDED_ALREADY (7)" +An easy handle already added to a multi handle was attempted to get added a +second time. (Added in 7.32.1) .SH "CURLSHcode" The "share" interface will return a CURLSHcode to indicate when an error has occurred. Also consider \fIcurl_share_strerror(3)\fP. @@ -290,3 +297,7 @@ Not enough memory was available. .IP "CURLSHE_NOT_BUILT_IN (5)" The requested sharing could not be done because the library you use don't have that particular feature enabled. (Added in 7.23.0) +.SH "SEE ALSO" +.BR curl_easy_strerror "(3), " curl_multi_strerror "(3), " +.BR curl_share_strerror "(3), " CURLOPT_ERRORBUFFER "(3), " +.BR CURLOPT_VERBOSE "(3), " CURLOPT_DEBUGFUNCTION "(3) " diff --git a/docs/libcurl/libcurl-errors.html b/docs/libcurl/libcurl-errors.html index 194b150..8c9f47b 100644 --- a/docs/libcurl/libcurl-errors.html +++ b/docs/libcurl/libcurl-errors.html @@ -48,7 +48,7 @@ p.roffit {

NAME

libcurl-errors - error codes in libcurl

DESCRIPTION

This man page includes most, if not all, available error codes in libcurl. Why they occur and possibly what you can do to fix the problem are also included.

CURLcode

-

Almost all "easy" interface functions return a CURLcode error code. No matter what, using the curl_easy_setopt(3) option CURLOPT_ERRORBUFFER is a good idea as it will give you a human readable error string that may offer more details about the cause of the error than just the error code. curl_easy_strerror(3) can be called to get an error string from a given CURLcode number. +

Almost all "easy" interface functions return a CURLcode error code. No matter what, using the curl_easy_setopt option CURLOPT_ERRORBUFFER(3) is a good idea as it will give you a human readable error string that may offer more details about the cause of the error than just the error code. curl_easy_strerror can be called to get an error string from a given CURLcode number.

CURLcode is one of the following:

CURLE_OK (0)

All fine. Proceed as usual. @@ -75,13 +75,15 @@ p.roffit {

CURLE_FTP_WEIRD_PASS_REPLY (11)

After having sent the FTP password to the server, libcurl expects a proper reply. This error code indicates that an unexpected code was returned.

CURLE_FTP_ACCEPT_TIMEOUT (12) -

During an active FTP session while waiting for the server to connect, the CURLOPT_ACCEPTTIMOUT_MS (or the internal default) timeout expired. +

During an active FTP session while waiting for the server to connect, the CURLOPT_ACCEPTTIMOUT_MS(3) (or the internal default) timeout expired.

CURLE_FTP_WEIRD_PASV_REPLY (13)

libcurl failed to get a sensible result back from the server as a response to either a PASV or a EPSV command. The server is flawed.

CURLE_FTP_WEIRD_227_FORMAT (14)

FTP servers return a 227-line as a response to a PASV command. If libcurl fails to parse that line, this return code is passed back.

CURLE_FTP_CANT_GET_HOST (15)

An internal failure to lookup the host used for the new connection. +

CURLE_HTTP2 (16) +

A problem was detected in the HTTP2 framing layer. This is somewhat generic and can be one out of several problems, see the error buffer for details.

CURLE_FTP_COULDNT_SET_TYPE (17)

Received an error when trying to set the transfer mode to binary or ASCII.

CURLE_PARTIAL_FILE (18) @@ -91,7 +93,7 @@ p.roffit {

CURLE_QUOTE_ERROR (21)

When sending custom "QUOTE" commands to the remote server, one of the commands returned an error code that was 400 or higher (for FTP) or otherwise indicated unsuccessful completion of the command.

CURLE_HTTP_RETURNED_ERROR (22) -

This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. +

This is returned if CURLOPT_FAILONERROR(3) is set TRUE and the HTTP server returns an error code that is >= 400.

CURLE_WRITE_ERROR (23)

An error occurred when writing received data to a local file, or an error was returned to libcurl from a write callback.

CURLE_UPLOAD_FAILED (25) @@ -103,7 +105,7 @@ p.roffit {

CURLE_OPERATION_TIMEDOUT (28)

Operation timeout. The specified time-out period was reached according to the conditions.

CURLE_FTP_PORT_FAILED (30) -

The FTP PORT command returned error. This mostly happens when you haven't specified a good enough address for libcurl to use. See CURLOPT_FTPPORT. +

The FTP PORT command returned error. This mostly happens when you haven't specified a good enough address for libcurl to use. See CURLOPT_FTPPORT(3).

CURLE_FTP_COULDNT_USE_REST (31)

The FTP REST command returned error. This should never happen if the server is sane.

CURLE_RANGE_ERROR (33) @@ -127,9 +129,9 @@ p.roffit {

CURLE_BAD_FUNCTION_ARGUMENT (43)

Internal error. A function was called with a bad parameter.

CURLE_INTERFACE_FAILED (45) -

Interface error. A specified outgoing interface could not be used. Set which interface to use for outgoing connections' source IP address with CURLOPT_INTERFACE. +

Interface error. A specified outgoing interface could not be used. Set which interface to use for outgoing connections' source IP address with CURLOPT_INTERFACE(3).

CURLE_TOO_MANY_REDIRECTS (47) -

Too many redirects. When following redirects, libcurl hit the maximum amount. Set your limit with CURLOPT_MAXREDIRS. +

Too many redirects. When following redirects, libcurl hit the maximum amount. Set your limit with CURLOPT_MAXREDIRS(3).

CURLE_UNKNOWN_OPTION (48)

An option passed to libcurl is not recognized/known. Refer to the appropriate documentation. This is most likely a problem in the program that uses libcurl. The error buffer might contain more specific information about which exact option it concerns.

CURLE_TELNET_OPTION_SYNTAX (49) @@ -193,13 +195,13 @@ p.roffit {

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. This return code is only returned from curl_easy_recv(3) and curl_easy_send(3) (Added in 7.18.2) +

Socket is not ready for send/recv wait till it's ready and try again. This return code is only returned from curl_easy_recv and curl_easy_send (Added in 7.18.2)

CURLE_SSL_CRL_BADFILE (82)

Failed to load CRL file (Added in 7.19.0)

CURLE_SSL_ISSUER_ERROR (83)

Issuer check failed (Added in 7.19.0)

CURLE_FTP_PRET_FAILED (84) -

The FTP server does not understand the PRET command at all or does not support the given argument. Be careful when using CURLOPT_CUSTOMREQUEST, a custom LIST command will be sent with PRET CMD before PASV as well. (Added in 7.20.0) +

The FTP server does not understand the PRET command at all or does not support the given argument. Be careful when using CURLOPT_CUSTOMREQUEST(3), a custom LIST command will be sent with PRET CMD before PASV as well. (Added in 7.20.0)

CURLE_RTSP_CSEQ_ERROR (85)

Mismatch of RTSP CSeq numbers.

CURLE_RTSP_SESSION_ERROR (86) @@ -212,9 +214,9 @@ p.roffit {

(For internal use only, will never be returned by libcurl) No connection available, the session will be queued. (added in 7.30.0)

CURLE_OBSOLETE*

These error codes will never be returned. They were used in an old libcurl version and are currently unused.

CURLMcode

-

This is the generic return code used by functions in the libcurl multi interface. Also consider curl_multi_strerror(3). +

This is the generic return code used by functions in the libcurl multi interface. Also consider curl_multi_strerror.

CURLM_CALL_MULTI_PERFORM (-1) -

This is not really an error. It means you should call curl_multi_perform(3) again without doing select() or similar in between. Before version 7.20.0 this could be returned by curl_multi_perform(3), but in later versions this return code is never used. +

This is not really an error. It means you should call curl_multi_perform again without doing select() or similar in between. Before version 7.20.0 this could be returned by curl_multi_perform, but in later versions this return code is never used.

CURLM_OK (0)

Things are fine.

CURLM_BAD_HANDLE (1) @@ -228,8 +230,10 @@ p.roffit {

CURLM_BAD_SOCKET (5)

The passed-in socket is not a valid one that libcurl already knows about. (Added in 7.15.4)

CURLM_UNKNOWN_OPTION (6) -

curl_multi_setopt() with unsupported option (Added in 7.15.4)

CURLSHcode

-

The "share" interface will return a CURLSHcode to indicate when an error has occurred. Also consider curl_share_strerror(3). +

curl_multi_setopt() with unsupported option (Added in 7.15.4) +

CURLM_ADDED_ALREADY (7) +

An easy handle already added to a multi handle was attempted to get added a second time. (Added in 7.32.1)

CURLSHcode

+

The "share" interface will return a CURLSHcode to indicate when an error has occurred. Also consider curl_share_strerror.

CURLSHE_OK (0)

All fine. Proceed as usual.

CURLSHE_BAD_OPTION (1) @@ -241,6 +245,7 @@ p.roffit {

CURLSHE_NOMEM (4)

Not enough memory was available. (Added in 7.12.0)

CURLSHE_NOT_BUILT_IN (5) -

The requested sharing could not be done because the library you use don't have that particular feature enabled. (Added in 7.23.0)

+

The requested sharing could not be done because the library you use don't have that particular feature enabled. (Added in 7.23.0)

SEE ALSO

+

curl_easy_strerror, curl_multi_strerror, curl_share_strerror, CURLOPT_ERRORBUFFER (3) CURLOPT_VERBOSE (3) CURLOPT_DEBUGFUNCTION (3)

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl-errors.pdf b/docs/libcurl/libcurl-errors.pdf index 42c116227a2734627ca81f665b6e9da35c4aa286..351c1b8cd3fa570db922c1b587c498acd298e8a8 100644 GIT binary patch delta 13909 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 DO&9zz delta 13372 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 GM*1I&Rbu`C diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3 index 2af0299..770d4a5 100644 --- a/docs/libcurl/libcurl-multi.3 +++ b/docs/libcurl/libcurl-multi.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -20,7 +20,7 @@ .\" * .\" ************************************************************************** .\" -.TH libcurl-multi 3 "3 Feb 2007" "libcurl 7.16.0" "libcurl multi interface" +.TH libcurl-multi 3 "19 Sep 2014" "libcurl" "libcurl multi interface" .SH NAME libcurl-multi \- how to use the multi interface .SH DESCRIPTION @@ -43,18 +43,28 @@ complicated for the application. 3. Enable the application to wait for action on its own file descriptors and curl's file descriptors simultaneous easily. + +4. Enable event-based handling and scaling transfers up to and beyond +thousands of parallel connections. .SH "ONE MULTI HANDLE MANY EASY HANDLES" To use the multi interface, you must first create a 'multi handle' with \fIcurl_multi_init(3)\fP. This handle is then used as input to all further curl_multi_* functions. -Each single transfer is built up with an easy handle. You must create them, -and setup the appropriate options for each easy handle, as outlined in the -\fIlibcurl(3)\fP man page, using \fIcurl_easy_setopt(3)\fP. +With a multi handle and the multi interface you can do any amount of +simultaneous transfers in parallel. Each single transfer is built up around an +easy handle. You must create the easy handles you need, and setup the +appropriate options for each easy handle, as outlined in the \fIlibcurl(3)\fP +man page, using \fIcurl_easy_setopt(3)\fP. + +There are two flavours of the multi interface, the select() oriented one and +the event based one we called multi_socket. You will benefit from reading +through the description of both versions to full understand how they work and +differentiate. We start out with the select() oriented version. -When the easy handle is setup for a transfer, then instead of using -\fIcurl_easy_perform(3)\fP (as when using the easy interface for transfers), -you should instead add the easy handle to the multi handle using +When an easy handle is setup for a transfer, then instead of using +\fIcurl_easy_perform(3)\fP like when using the easy interface for transfers, +you should add the easy handle to the multi handle with \fIcurl_multi_add_handle(3)\fP. The multi handle is sometimes referred to as a \'multi stack\' because of the fact that it may hold a large amount of easy handles. @@ -71,7 +81,8 @@ application drive. You drive the transfers by invoking anything available to transfer. It'll use the callbacks and everything else you have setup in the individual easy handles. It'll transfer data on all current transfers in the multi stack that are ready to transfer anything. It -may be all, it may be none. +may be all, it may be none. When there's nothing more to do for now, it +returns back to the calling application. Your application can acquire knowledge from libcurl when it would like to get invoked to transfer data, so that you don't have to busy-loop and call that @@ -80,7 +91,9 @@ interface using which you can extract fd_sets from libcurl to use in select() or poll() calls in order to get to know when the transfers in the multi stack might need attention. This also makes it very easy for your program to wait for input on your own private file descriptors at the same time or perhaps -timeout every now and then, should you want that. +timeout every now and then, should you want that. \fIcurl_multi_timeout(3)\fP +also helps you with providing a suitable timeout period for your select() +call. \fIcurl_multi_perform(3)\fP stores the number of still running transfers in one of its input arguments, and by reading that you can figure out when all @@ -121,21 +134,39 @@ using large numbers of simultaneous connections. When using this API, you add easy handles to the multi handle just as with the normal multi interface. Then you also set two callbacks with the CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to -\fIcurl_multi_setopt(3)\fP. - -The API is then designed to inform your application about which sockets -libcurl is currently using and for what activities (read and/or write) on -those sockets your application is expected to wait for. - -Your application must then make sure to receive all sockets informed about in -the CURLMOPT_SOCKETFUNCTION callback and make sure it reacts on the given -activity on them. When a socket has the given activity, you call +\fIcurl_multi_setopt(3)\fP. They are two callback functions that libcurl will +call with information about what sockets to wait for, and for what activity, +and what the curret timeout time is - if that expires libcurl should be +notified. + +The multi_socket API is designed to inform your application about which +sockets libcurl is currently using and for what activities (read and/or write) +on those sockets your application is expected to wait for. + +Your application must make sure to receive all sockets informed about in the +CURLMOPT_SOCKETFUNCTION callback and make sure it reacts on the given activity +on them. When a socket has the given activity, you call \fIcurl_multi_socket_action(3)\fP specifying which socket and action there are. The CURLMOPT_TIMERFUNCTION callback is called to set a timeout. When that timeout expires, your application should call the \fIcurl_multi_socket_action(3)\fP function saying it was due to a timeout. + +This API is typically used with an event-driven underlying functionality (like +libevent, libev, kqueue, epoll or similar) which which the application +"subscribes" on socket changes. This allows applications and libcurl to much +better scale upward and beyond thousands of simultaneous transfers without +losing performance. + +When you've added your initial set of handles, you call +\fIcurl_multi_socket_action(3)\fP with CURL_SOCKET_TIMEOUT set in the sockfd +argument, and you'll get callbacks call that sets you up and you then continue +to call \fIcurl_multi_socket_action(3)\fP accordingly when you get activity on +the sockets you've been asked to wait on, or if the timeout timer expires. + +You can poll \fIcurl_multi_info_read(3)\fP to see if any transfer has +completed, as it then has a message saying so. .SH "BLOCKING" A few areas in the code are still using blocking code, even when used from the multi interface. While we certainly want and intend for these to get fixed in @@ -149,3 +180,5 @@ the future, you should be aware of the following current restrictions: - file:// transfers - TELNET transfers .fi +.SH "SEE ALSO" +.BR libcurl-errors "(3), " libcurl-easy "(3), " libcurl "(3) " diff --git a/docs/libcurl/libcurl-multi.html b/docs/libcurl/libcurl-multi.html index c430616..a16f3e6 100644 --- a/docs/libcurl/libcurl-multi.html +++ b/docs/libcurl/libcurl-multi.html @@ -47,29 +47,34 @@ p.roffit {

NAME

libcurl-multi - how to use the multi interface

DESCRIPTION

-

This is an overview on how to use the libcurl multi interface in your C programs. There are specific man pages for each function mentioned in here. There's also the libcurl-tutorial(3) man page for a complete tutorial to programming with libcurl and the libcurl-easy(3) man page for an overview of the libcurl easy interface. +

This is an overview on how to use the libcurl multi interface in your C programs. There are specific man pages for each function mentioned in here. There's also the libcurl-tutorial man page for a complete tutorial to programming with libcurl and the libcurl-easy man page for an overview of the libcurl easy interface.

All functions in the multi interface are prefixed with curl_multi.

OBJECTIVES

The multi interface offers several abilities that the easy interface doesn't. They are mainly:

1. Enable a "pull" interface. The application that uses libcurl decides where and when to ask libcurl to get/send data.

2. Enable multiple simultaneous transfers in the same thread without making it complicated for the application. -

3. Enable the application to wait for action on its own file descriptors and curl's file descriptors simultaneous easily.

ONE MULTI HANDLE MANY EASY HANDLES

-

To use the multi interface, you must first create a 'multi handle' with curl_multi_init(3). This handle is then used as input to all further curl_multi_* functions. -

Each single transfer is built up with an easy handle. You must create them, and setup the appropriate options for each easy handle, as outlined in the libcurl(3) man page, using curl_easy_setopt(3). -

When the easy handle is setup for a transfer, then instead of using curl_easy_perform(3) (as when using the easy interface for transfers), you should instead add the easy handle to the multi handle using curl_multi_add_handle(3). The multi handle is sometimes referred to as a ´multi stack´ because of the fact that it may hold a large amount of easy handles. -

Should you change your mind, the easy handle is again removed from the multi stack using curl_multi_remove_handle(3). Once removed from the multi handle, you can again use other easy interface functions like curl_easy_perform(3) on the handle or whatever you think is necessary. -

Adding the easy handle to the multi handle does not start the transfer. Remember that one of the main ideas with this interface is to let your application drive. You drive the transfers by invoking curl_multi_perform(3). libcurl will then transfer data if there is anything available to transfer. It'll use the callbacks and everything else you have setup in the individual easy handles. It'll transfer data on all current transfers in the multi stack that are ready to transfer anything. It may be all, it may be none. -

Your application can acquire knowledge from libcurl when it would like to get invoked to transfer data, so that you don't have to busy-loop and call that curl_multi_perform(3) like crazy. curl_multi_fdset(3) offers an interface using which you can extract fd_sets from libcurl to use in select() or poll() calls in order to get to know when the transfers in the multi stack might need attention. This also makes it very easy for your program to wait for input on your own private file descriptors at the same time or perhaps timeout every now and then, should you want that. -

curl_multi_perform(3) stores the number of still running transfers in one of its input arguments, and by reading that you can figure out when all the transfers in the multi handles are done. 'done' does not mean successful. One or more of the transfers may have failed. Tracking when this number changes, you know when one or more transfers are done. -

To get information about completed transfers, to figure out success or not and similar, curl_multi_info_read(3) should be called. It can return a message about a current or previous transfer. Repeated invokes of the function get more messages until the message queue is empty. The information you receive there includes an easy handle pointer which you may use to identify which easy handle the information regards. -

When a single transfer is completed, the easy handle is still left added to the multi stack. You need to first remove the easy handle with curl_multi_remove_handle(3) and then close it with curl_easy_cleanup(3), or possibly set new options to it and add it again with curl_multi_add_handle(3) to start another transfer. -

When all transfers in the multi stack are done, cleanup the multi handle with curl_multi_cleanup(3). Be careful and please note that you MUST invoke separate curl_easy_cleanup(3) calls on every single easy handle to clean them up properly. +

3. Enable the application to wait for action on its own file descriptors and curl's file descriptors simultaneous easily. +

4. Enable event-based handling and scaling transfers up to and beyond thousands of parallel connections.

ONE MULTI HANDLE MANY EASY HANDLES

+

To use the multi interface, you must first create a 'multi handle' with curl_multi_init. This handle is then used as input to all further curl_multi_* functions. +

With a multi handle and the multi interface you can do any amount of simultaneous transfers in parallel. Each single transfer is built up around an easy handle. You must create the easy handles you need, and setup the appropriate options for each easy handle, as outlined in the libcurl man page, using curl_easy_setopt. +

There are two flavours of the multi interface, the select() oriented one and the event based one we called multi_socket. You will benefit from reading through the description of both versions to full understand how they work and differentiate. We start out with the select() oriented version. +

When an easy handle is setup for a transfer, then instead of using curl_easy_perform like when using the easy interface for transfers, you should add the easy handle to the multi handle with curl_multi_add_handle. The multi handle is sometimes referred to as a ´multi stack´ because of the fact that it may hold a large amount of easy handles. +

Should you change your mind, the easy handle is again removed from the multi stack using curl_multi_remove_handle. Once removed from the multi handle, you can again use other easy interface functions like curl_easy_perform on the handle or whatever you think is necessary. +

Adding the easy handle to the multi handle does not start the transfer. Remember that one of the main ideas with this interface is to let your application drive. You drive the transfers by invoking curl_multi_perform. libcurl will then transfer data if there is anything available to transfer. It'll use the callbacks and everything else you have setup in the individual easy handles. It'll transfer data on all current transfers in the multi stack that are ready to transfer anything. It may be all, it may be none. When there's nothing more to do for now, it returns back to the calling application. +

Your application can acquire knowledge from libcurl when it would like to get invoked to transfer data, so that you don't have to busy-loop and call that curl_multi_perform like crazy. curl_multi_fdset offers an interface using which you can extract fd_sets from libcurl to use in select() or poll() calls in order to get to know when the transfers in the multi stack might need attention. This also makes it very easy for your program to wait for input on your own private file descriptors at the same time or perhaps timeout every now and then, should you want that. curl_multi_timeout also helps you with providing a suitable timeout period for your select() call. +

curl_multi_perform stores the number of still running transfers in one of its input arguments, and by reading that you can figure out when all the transfers in the multi handles are done. 'done' does not mean successful. One or more of the transfers may have failed. Tracking when this number changes, you know when one or more transfers are done. +

To get information about completed transfers, to figure out success or not and similar, curl_multi_info_read should be called. It can return a message about a current or previous transfer. Repeated invokes of the function get more messages until the message queue is empty. The information you receive there includes an easy handle pointer which you may use to identify which easy handle the information regards. +

When a single transfer is completed, the easy handle is still left added to the multi stack. You need to first remove the easy handle with curl_multi_remove_handle and then close it with curl_easy_cleanup, or possibly set new options to it and add it again with curl_multi_add_handle to start another transfer. +

When all transfers in the multi stack are done, cleanup the multi handle with curl_multi_cleanup. Be careful and please note that you MUST invoke separate curl_easy_cleanup calls on every single easy handle to clean them up properly.

If you want to re-use an easy handle that was added to the multi handle for transfer, you must first remove it from the multi stack and then re-add it again (possibly after having altered some options at your own choice).

MULTI_SOCKET

-

curl_multi_socket_action(3) function offers a way for applications to not only avoid being forced to use select(), but it also offers a much more high-performance API that will make a significant difference for applications using large numbers of simultaneous connections. -

curl_multi_socket_action(3) is then used instead of curl_multi_perform(3). -

When using this API, you add easy handles to the multi handle just as with the normal multi interface. Then you also set two callbacks with the CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to curl_multi_setopt(3). -

The API is then designed to inform your application about which sockets libcurl is currently using and for what activities (read and/or write) on those sockets your application is expected to wait for. -

Your application must then make sure to receive all sockets informed about in the CURLMOPT_SOCKETFUNCTION callback and make sure it reacts on the given activity on them. When a socket has the given activity, you call curl_multi_socket_action(3) specifying which socket and action there are. -

The CURLMOPT_TIMERFUNCTION callback is called to set a timeout. When that timeout expires, your application should call the curl_multi_socket_action(3) function saying it was due to a timeout.

BLOCKING

+

curl_multi_socket_action function offers a way for applications to not only avoid being forced to use select(), but it also offers a much more high-performance API that will make a significant difference for applications using large numbers of simultaneous connections. +

curl_multi_socket_action is then used instead of curl_multi_perform. +

When using this API, you add easy handles to the multi handle just as with the normal multi interface. Then you also set two callbacks with the CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to curl_multi_setopt. They are two callback functions that libcurl will call with information about what sockets to wait for, and for what activity, and what the curret timeout time is - if that expires libcurl should be notified. +

The multi_socket API is designed to inform your application about which sockets libcurl is currently using and for what activities (read and/or write) on those sockets your application is expected to wait for. +

Your application must make sure to receive all sockets informed about in the CURLMOPT_SOCKETFUNCTION callback and make sure it reacts on the given activity on them. When a socket has the given activity, you call curl_multi_socket_action specifying which socket and action there are. +

The CURLMOPT_TIMERFUNCTION callback is called to set a timeout. When that timeout expires, your application should call the curl_multi_socket_action function saying it was due to a timeout. +

This API is typically used with an event-driven underlying functionality (like libevent, libev, kqueue, epoll or similar) which which the application "subscribes" on socket changes. This allows applications and libcurl to much better scale upward and beyond thousands of simultaneous transfers without losing performance. +

When you've added your initial set of handles, you call curl_multi_socket_action with CURL_SOCKET_TIMEOUT set in the sockfd argument, and you'll get callbacks call that sets you up and you then continue to call curl_multi_socket_action accordingly when you get activity on the sockets you've been asked to wait on, or if the timeout timer expires. +

You can poll curl_multi_info_read to see if any transfer has completed, as it then has a message saying so.

BLOCKING

A few areas in the code are still using blocking code, even when used from the multi interface. While we certainly want and intend for these to get fixed in the future, you should be aware of the following current restrictions:

 

 - Name resolves unless the c-ares or threaded-resolver backends are used @@ -80,6 +85,7 @@ p.roffit {  - TELNET transfers

-

+

SEE ALSO

+

libcurl-errors, libcurl-easy, libcurl,

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl-multi.pdf b/docs/libcurl/libcurl-multi.pdf index 1ae95279682f6c7539ac7eb953f6ac9e05b2fe73..ac6bb1f0618310f2e8b1165bcb97224a6cd0dfd2 100644 GIT binary patch delta 9366 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 >3V1_7%7YCXpG!~n1!FAkfIq&rC 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 b|14e)PcwJV|Cml-Fc=2KWn+_5m&g5Y&a@q9 delta 7162 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 K$*HKRg#SN4Gw@~r diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3 index 1e6c139..b46eeda 100644 --- a/docs/libcurl/libcurl-share.3 +++ b/docs/libcurl/libcurl-share.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -51,14 +51,16 @@ using this multi-threaded. You set lock and unlock functions with \fIcurl_share_setopt(3)\fP too. Then, you make an easy handle to use this share, you set the -\fICURLOPT_SHARE\fP option with \fIcurl_easy_setopt(3)\fP, and pass in share -handle. You can make any number of easy handles share the same share handle. +\fICURLOPT_SHARE(3)\fP option with \fIcurl_easy_setopt(3)\fP, and pass in +share handle. You can make any number of easy handles share the same share +handle. To make an easy handle stop using that particular share, you set -\fICURLOPT_SHARE\fP to NULL for that easy handle. To make a handle stop +\fICURLOPT_SHARE(3)\fP to NULL for that easy handle. To make a handle stop sharing a particular data, you can \fICURLSHOPT_UNSHARE\fP it. When you're done using the share, make sure that no easy handle is still using it, and call \fIcurl_share_cleanup(3)\fP on the handle. .SH "SEE ALSO" .BR curl_share_init "(3), " curl_share_setopt "(3), " curl_share_cleanup "(3)" +.BR libcurl-errors "(3), " libcurl-easy "(3), " libcurl-multi "(3) " diff --git a/docs/libcurl/libcurl-share.html b/docs/libcurl/libcurl-share.html index 196853e..6aa66c8 100644 --- a/docs/libcurl/libcurl-share.html +++ b/docs/libcurl/libcurl-share.html @@ -52,12 +52,12 @@ p.roffit {

OBJECTIVES

The share interface was added to enable sharing of data between curl "handles".

ONE SET OF DATA - MANY TRANSFERS

You can have multiple easy handles share data between them. Have them update and use the same cookie database, DNS cache, TLS session cache! This way, each single transfer will take advantage from data updates made by the other transfer(s). The sharing interface, however, does not share active or persistent connections between different easy handles.

SHARE OBJECT

-

You create a shared object with curl_share_init(3). It returns a handle for a newly created one. -

You tell the shared object what data you want it to share by using curl_share_setopt(3). -

Since you can use this share from multiple threads, and libcurl has no internal thread synchronization, you must provide mutex callbacks if you're using this multi-threaded. You set lock and unlock functions with curl_share_setopt(3) too. -

Then, you make an easy handle to use this share, you set the CURLOPT_SHARE option with curl_easy_setopt(3), and pass in share handle. You can make any number of easy handles share the same share handle. -

To make an easy handle stop using that particular share, you set CURLOPT_SHARE to NULL for that easy handle. To make a handle stop sharing a particular data, you can CURLSHOPT_UNSHARE it. -

When you're done using the share, make sure that no easy handle is still using it, and call curl_share_cleanup(3) on the handle.

SEE ALSO

-

curl_share_init (3) curl_share_setopt (3) curl_share_cleanup (3)

+

You create a shared object with curl_share_init. It returns a handle for a newly created one. +

You tell the shared object what data you want it to share by using curl_share_setopt. +

Since you can use this share from multiple threads, and libcurl has no internal thread synchronization, you must provide mutex callbacks if you're using this multi-threaded. You set lock and unlock functions with curl_share_setopt too. +

Then, you make an easy handle to use this share, you set the CURLOPT_SHARE(3) option with curl_easy_setopt, and pass in share handle. You can make any number of easy handles share the same share handle. +

To make an easy handle stop using that particular share, you set CURLOPT_SHARE(3) to NULL for that easy handle. To make a handle stop sharing a particular data, you can CURLSHOPT_UNSHARE it. +

When you're done using the share, make sure that no easy handle is still using it, and call curl_share_cleanup on the handle.

SEE ALSO

+

curl_share_init, curl_share_setopt, curl_share_cleanup, libcurl-errors, libcurl-easy, libcurl-multi,

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl-share.pdf b/docs/libcurl/libcurl-share.pdf index 0b8ebb97843c7f5dc1c81ec48cede1889a5f1735..f7bde5414fb66a8181f0afeca300e5ba476b73f3 100644 GIT binary patch delta 2887 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 cs>uX&1pD;;i2wiq delta 2863 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, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -20,7 +20,7 @@ .\" * .\" ************************************************************************** .\" -.TH libcurl-tutorial 3 "4 Mar 2009" "libcurl" "libcurl programming" +.TH libcurl-tutorial 3 "19 Sep 2014" "libcurl" "libcurl programming" .SH NAME libcurl-tutorial \- libcurl programming tutorial .SH "Objective" @@ -40,7 +40,7 @@ refer to their respective man pages. .SH "Building" There are many different ways to build C programs. This chapter will assume a -UNIX-style build process. If you use a different build system, you can still +Unix style build process. If you use a different build system, you can still read this to get general information that may apply to your environment as well. .IP "Compiling the Program" @@ -137,15 +137,17 @@ rather than at build-time (if possible of course). By calling struct, your program can figure out exactly what the currently running libcurl supports. -.SH "Handle the Easy libcurl" +.SH "Two Interfaces" libcurl first introduced the so called easy interface. All operations in the -easy interface are prefixed with 'curl_easy'. - -Recent libcurl versions also offer the multi interface. More about that -interface, what it is targeted for and how to use it is detailed in a separate -chapter further down. You still need to understand the easy interface first, -so please continue reading for better understanding. - +easy interface are prefixed with 'curl_easy'. The easy interface lets you do +single transfers with a synchronous and blocking function call. + +libcurl also offers another interface that allows multiple simultaneous +transfers in a single thread, the so called multi interface. More about that +interface is detailed in a separate chapter further down. You still need to +understand the easy interface first, so please continue reading for better +understanding. +.SH "Handle the Easy libcurl" To use the easy interface, you must first create yourself an easy handle. You need one handle for each easy session you want to perform. Basically, you should use one handle for every thread you plan to use for transferring. You @@ -162,16 +164,21 @@ transfer or series of transfers. You set properties and options for this handle using \fIcurl_easy_setopt(3)\fP. They control how the subsequent transfer or transfers will be made. Options remain set in the handle until set again to -something different. Alas, multiple requests using the same handle will use -the same options. +something different. They are sticky. Multiple requests using the same handle +will use the same options. + +If you at any point would like to blank all previously set options for a +single easy handle, you can call \fIcurl_easy_reset(3)\fP and you can also +make a clone of an easy handle (with all its set options) using +\fIcurl_easy_duphandle(3)\fP. Many of the options you set in libcurl are "strings", pointers to data terminated with a zero byte. When you set strings with -\fIcurl_easy_setopt(3)\fP, libcurl makes its own copy so that they don't -need to be kept around in your application after being set[4]. +\fIcurl_easy_setopt(3)\fP, libcurl makes its own copy so that they don't need +to be kept around in your application after being set[4]. -One of the most basic properties to set in the handle is the URL. You set -your preferred URL to transfer with CURLOPT_URL in a manner similar to: +One of the most basic properties to set in the handle is the URL. You set your +preferred URL to transfer with \fICURLOPT_URL(3)\fP in a manner similar to: .nf curl_easy_setopt(handle, CURLOPT_URL, "http://domain.com/"); @@ -197,27 +204,27 @@ by setting another property: Using that property, you can easily pass local data between your application and the function that gets invoked by libcurl. libcurl itself won't touch the -data you pass with \fICURLOPT_WRITEDATA\fP. +data you pass with \fICURLOPT_WRITEDATA(3)\fP. -libcurl offers its own default internal callback that will take care of the data -if you don't set the callback with \fICURLOPT_WRITEFUNCTION\fP. It will then -simply output the received data to stdout. You can have the default callback -write the data to a different file handle by passing a 'FILE *' to a file -opened for writing with the \fICURLOPT_WRITEDATA\fP option. +libcurl offers its own default internal callback that will take care of the +data if you don't set the callback with \fICURLOPT_WRITEFUNCTION(3)\fP. It +will then simply output the received data to stdout. You can have the default +callback write the data to a different file handle by passing a 'FILE *' to a +file opened for writing with the \fICURLOPT_WRITEDATA(3)\fP option. Now, we need to take a step back and have a deep breath. Here's one of those rare platform-dependent nitpicks. Did you spot it? On some platforms[2], libcurl won't be able to operate on files opened by the program. Thus, if you use the default callback and pass in an open file with -\fICURLOPT_WRITEDATA\fP, it will crash. You should therefore avoid this to +\fICURLOPT_WRITEDATA(3)\fP, it will crash. You should therefore avoid this to make your program run fine virtually everywhere. -(\fICURLOPT_WRITEDATA\fP was formerly known as \fICURLOPT_FILE\fP. Both names -still work and do the same thing). +(\fICURLOPT_WRITEDATA(3)\fP was formerly known as \fICURLOPT_FILE\fP. Both +names still work and do the same thing). If you're using libcurl as a win32 DLL, you MUST use the -\fICURLOPT_WRITEFUNCTION\fP if you set \fICURLOPT_WRITEDATA\fP - or you will -experience crashes. +\fICURLOPT_WRITEFUNCTION(3)\fP if you set \fICURLOPT_WRITEDATA(3)\fP - or you +will experience crashes. There are of course many more options you can set, and we'll get back to a few of them later. Let's instead continue to the actual transfer: @@ -234,8 +241,8 @@ passed to it, libcurl will abort the operation and return with an error code. When the transfer is complete, the function returns a return code that informs you if it succeeded in its mission or not. If a return code isn't enough for -you, you can use the CURLOPT_ERRORBUFFER to point libcurl to a buffer of yours -where it'll store a human readable error message as well. +you, you can use the \fICURLOPT_ERRORBUFFER(3)\fP to point libcurl to a buffer +of yours where it'll store a human readable error message as well. If you then want to transfer another file, the handle is ready to be used again. Mind you, it is even preferred that you re-use an existing handle if @@ -257,7 +264,7 @@ than one thread at any given time. libcurl is completely thread safe, except for two issues: signals and SSL/TLS handlers. Signals are used for timing out name resolves (during DNS lookup) - -when built without c-ares support and not on Windows. +when built without using either the c-ares or threaded resolver backends. If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are then of course using the underlying SSL library multi-threaded and those libs @@ -271,7 +278,7 @@ OpenSSL GnuTLS - http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html + http://gnutls.org/manual/html_node/Thread-safety.html NSS @@ -293,14 +300,14 @@ Secure Transport The engine is fully thread-safe, and no additional steps are required. -When using multiple threads you should set the CURLOPT_NOSIGNAL option to 1 -for all handles. Everything will or might work fine except that timeouts are -not honored during the DNS lookup - which you can work around by building -libcurl with c-ares support. c-ares is a library that provides asynchronous -name resolves. On some platforms, libcurl simply will not function properly -multi-threaded unless this option is set. +When using multiple threads you should set the \fICURLOPT_NOSIGNAL(3)\fP +option to 1 for all handles. Everything will or might work fine except that +timeouts are not honored during the DNS lookup - which you can work around by +building libcurl with c-ares support. c-ares is a library that provides +asynchronous name resolves. On some platforms, libcurl simply will not +function properly multi-threaded unless this option is set. -Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe. +Also, note that \fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP is not thread-safe. .SH "When It Doesn't Work" There will always be times when the transfer fails for some reason. You might @@ -308,23 +315,23 @@ have set the wrong libcurl option or misunderstood what the libcurl option actually does, or the remote server might return non-standard replies that confuse the library which then confuses your program. -There's one golden rule when these things occur: set the CURLOPT_VERBOSE -option to 1. It'll cause the library to spew out the entire protocol -details it sends, some internal info and some received protocol data as well -(especially when using FTP). If you're using HTTP, adding the headers in the -received output to study is also a clever way to get a better understanding -why the server behaves the way it does. Include headers in the normal body -output with CURLOPT_HEADER set 1. +There's one golden rule when these things occur: set the +\fICURLOPT_VERBOSE(3)\fP option to 1. It'll cause the library to spew out the +entire protocol details it sends, some internal info and some received +protocol data as well (especially when using FTP). If you're using HTTP, +adding the headers in the received output to study is also a clever way to get +a better understanding why the server behaves the way it does. Include headers +in the normal body output with \fICURLOPT_HEADER(3)\fP set 1. -Of course, there are bugs left. We need to know about them to be able -to fix them, so we're quite dependent on your bug reports! When you do report -suspected bugs in libcurl, please include as many details as you possibly can: a -protocol dump that CURLOPT_VERBOSE produces, library version, as much as -possible of your code that uses libcurl, operating system name and version, -compiler name and version etc. +Of course, there are bugs left. We need to know about them to be able to fix +them, so we're quite dependent on your bug reports! When you do report +suspected bugs in libcurl, please include as many details as you possibly can: +a protocol dump that \fICURLOPT_VERBOSE(3)\fP produces, library version, as +much as possible of your code that uses libcurl, operating system name and +version, compiler name and version etc. -If CURLOPT_VERBOSE is not enough, you increase the level of debug data your -application receive by using the CURLOPT_DEBUGFUNCTION. +If \fICURLOPT_VERBOSE(3)\fP is not enough, you increase the level of debug +data your application receive by using the \fICURLOPT_DEBUGFUNCTION(3)\fP. Getting some in-depth knowledge about the protocols involved is never wrong, and if you're trying to do funny things, you might very well understand @@ -363,7 +370,7 @@ Tell libcurl that we want to upload: A few protocols won't behave properly when uploads are done without any prior knowledge of the expected file size. So, set the upload file size using the -CURLOPT_INFILESIZE_LARGE for all known file sizes like this[1]: +\fICURLOPT_INFILESIZE_LARGE(3)\fP for all known file sizes like this[1]: .nf /* in this example, file_size must be an curl_off_t variable */ @@ -393,26 +400,26 @@ them URL encoded, as %XX where XX is a two-digit hexadecimal number. libcurl also provides options to set various passwords. The user name and password as shown embedded in the URL can instead get set with the -CURLOPT_USERPWD option. The argument passed to libcurl should be a char * to -a string in the format "user:password". In a manner like this: +\fICURLOPT_USERPWD(3)\fP option. The argument passed to libcurl should be a +char * to a string in the format "user:password". In a manner like this: curl_easy_setopt(easyhandle, CURLOPT_USERPWD, "myname:thesecret"); Another case where name and password might be needed at times, is for those users who need to authenticate themselves to a proxy they use. libcurl offers -another option for this, the CURLOPT_PROXYUSERPWD. It is used quite similar -to the CURLOPT_USERPWD option like this: +another option for this, the \fICURLOPT_PROXYUSERPWD(3)\fP. It is used quite +similar to the \fICURLOPT_USERPWD(3)\fP option like this: curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "myname:thesecret"); -There's a long time UNIX "standard" way of storing ftp user names and +There's a long time Unix "standard" way of storing FTP user names and passwords, namely in the $HOME/.netrc file. The file should be made private so that only the user may read it (see also the "Security Considerations" chapter), as it might contain the password in plain text. libcurl has the ability to use this file to figure out what set of user name and password to use for a particular host. As an extension to the normal functionality, libcurl also supports this file for non-FTP protocols such as HTTP. To make -curl use this file, use the CURLOPT_NETRC option: +curl use this file, use the \fICURLOPT_NETRC(3)\fP option: curl_easy_setopt(easyhandle, CURLOPT_NETRC, 1L); @@ -442,13 +449,13 @@ authentication method is called 'Basic', which is sending the name and password in clear-text in the HTTP request, base64-encoded. This is insecure. At the time of this writing, libcurl can be built to use: Basic, Digest, NTLM, -Negotiate, GSS-Negotiate and SPNEGO. You can tell libcurl which one to use -with CURLOPT_HTTPAUTH as in: +Negotiate (SPNEGO). You can tell libcurl which one to use +with \fICURLOPT_HTTPAUTH(3)\fP as in: curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); And when you send authentication to a proxy, you can also set authentication -type the same way but instead with CURLOPT_PROXYAUTH: +type the same way but instead with \fICURLOPT_PROXYAUTH(3)\fP: curl_easy_setopt(easyhandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM); @@ -484,8 +491,8 @@ libcurl to post it all to the remote site: .fi Simple enough, huh? Since you set the POST options with the -CURLOPT_POSTFIELDS, this automatically switches the handle to use POST in the -upcoming request. +\fICURLOPT_POSTFIELDS(3)\fP, this automatically switches the handle to use +POST in the upcoming request. Ok, so what if you want to post binary data that also requires you to set the Content-Type: header of the post? Well, binary posts prevent libcurl from @@ -576,14 +583,14 @@ post handle: Since all options on an easyhandle are "sticky", they remain the same until changed even if you do call \fIcurl_easy_perform(3)\fP, you may need to tell -curl to go back to a plain GET request if you intend to do one as your -next request. You force an easyhandle to go back to GET by using the -CURLOPT_HTTPGET option: +curl to go back to a plain GET request if you intend to do one as your next +request. You force an easyhandle to go back to GET by using the +\fICURLOPT_HTTPGET(3)\fP option: curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, 1L); -Just setting CURLOPT_POSTFIELDS to "" or NULL will *not* stop libcurl from -doing a POST. It will just make it POST without any data to send! +Just setting \fICURLOPT_POSTFIELDS(3)\fP to "" or NULL will *not* stop libcurl +from doing a POST. It will just make it POST without any data to send! .SH "Showing Progress" @@ -591,16 +598,16 @@ For historical and traditional reasons, libcurl has a built-in progress meter that can be switched on and then makes it present a progress meter in your terminal. -Switch on the progress meter by, oddly enough, setting CURLOPT_NOPROGRESS to -zero. This option is set to 1 by default. +Switch on the progress meter by, oddly enough, setting +\fICURLOPT_NOPROGRESS(3)\fP to zero. This option is set to 1 by default. For most applications however, the built-in progress meter is useless and what instead is interesting is the ability to specify a progress callback. The function pointer you pass to libcurl will then be called on irregular intervals with information about the current transfer. -Set the progress callback by using CURLOPT_PROGRESSFUNCTION. And pass a -pointer to a function that matches this prototype: +Set the progress callback by using \fICURLOPT_PROGRESSFUNCTION(3)\fP. And pass +a pointer to a function that matches this prototype: .nf int progress_callback(void *clientp, @@ -612,7 +619,7 @@ pointer to a function that matches this prototype: If any of the input arguments is unknown, a 0 will be passed. The first argument, the 'clientp' is the pointer you pass to libcurl with -CURLOPT_PROGRESSDATA. libcurl won't touch it. +\fICURLOPT_PROGRESSDATA(3)\fP. libcurl won't touch it. .SH "libcurl with C++" @@ -671,11 +678,12 @@ pass that information similar to this: curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "user:password"); -If you want to, you can specify the host name only in the CURLOPT_PROXY -option, and set the port number separately with CURLOPT_PROXYPORT. +If you want to, you can specify the host name only in the +\fICURLOPT_PROXY(3)\fP option, and set the port number separately with +\fICURLOPT_PROXYPORT(3)\fP. -Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE (if not, it will -default to assume a HTTP proxy): +Tell libcurl what kind of proxy it is with \fICURLOPT_PROXYTYPE(3)\fP (if not, +it will default to assume a HTTP proxy): curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); @@ -704,7 +712,8 @@ variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all hosts. To explicitly disable libcurl's checking for and using the proxy environment -variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY. +variables, set the proxy name to "" - an empty string - with +\fICURLOPT_PROXY(3)\fP. .IP "SSL and Proxies" SSL is for secure point-to-point connections. This involves strong encryption @@ -800,21 +809,21 @@ may also be added in the future. Each easy handle will attempt to keep the last few connections alive for a while in case they are to be used again. You can set the size of this "cache" -with the CURLOPT_MAXCONNECTS option. Default is 5. There is very seldom any -point in changing this value, and if you think of changing this it is often -just a matter of thinking again. +with the \fICURLOPT_MAXCONNECTS(3)\fP option. Default is 5. There is very +seldom any point in changing this value, and if you think of changing this it +is often just a matter of thinking again. To force your upcoming request to not use an already existing connection (it will even close one first if there happens to be one alive to the same host -you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT -to 1. In a similar spirit, you can also forbid the upcoming request to be -"lying" around and possibly get re-used after the request by setting -CURLOPT_FORBID_REUSE to 1. +you're about to operate on), you can do that by setting +\fICURLOPT_FRESH_CONNECT(3)\fP to 1. In a similar spirit, you can also forbid +the upcoming request to be "lying" around and possibly get re-used after the +request by setting \fICURLOPT_FORBID_REUSE(3)\fP to 1. .SH "HTTP Headers Used by libcurl" When you use libcurl to do HTTP requests, it'll pass along a series of headers automatically. It might be good for you to know and understand these. You -can replace or remove them by using the CURLOPT_HTTPHEADER option. +can replace or remove them by using the \fICURLOPT_HTTPHEADER(3)\fP option. .IP "Host" This header is required by HTTP 1.1 and even many 1.0 servers and should be @@ -843,8 +852,8 @@ libcurl is your friend here too. .IP CUSTOMREQUEST If just changing the actual HTTP request keyword is what you want, like when -GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST is there -for you. It is very simple to use: +GET, HEAD or POST is not good enough for you, \fICURLOPT_CUSTOMREQUEST(3)\fP +is there for you. It is very simple to use: curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST"); @@ -939,28 +948,29 @@ A little example that deletes a given file before an operation: If you would instead want this operation (or chain of operations) to happen _after_ the data transfer took place the option to \fIcurl_easy_setopt(3)\fP -would instead be called CURLOPT_POSTQUOTE and used the exact same way. +would instead be called \fICURLOPT_POSTQUOTE(3)\fP and used the exact same +way. The custom FTP command will be issued to the server in the same order they are added to the list, and if a command gets an error code returned back from the server, no more commands will be issued and libcurl will bail out with an -error code (CURLE_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE to send -commands before a transfer, no transfer will actually take place when a quote -command has failed. +error code (CURLE_QUOTE_ERROR). Note that if you use \fICURLOPT_QUOTE(3)\fP to +send commands before a transfer, no transfer will actually take place when a +quote command has failed. -If you set the CURLOPT_HEADER to 1, you will tell libcurl to get +If you set the \fICURLOPT_HEADER(3)\fP to 1, you will tell libcurl to get information about the target file and output "headers" about it. The headers will be in "HTTP-style", looking like they do in HTTP. The option to enable headers or to run custom FTP commands may be useful to -combine with CURLOPT_NOBODY. If this option is set, no actual file content -transfer will be performed. +combine with \fICURLOPT_NOBODY(3)\fP. If this option is set, no actual file +content transfer will be performed. .IP "FTP Custom CUSTOMREQUEST" -If you do want to list the contents of a FTP directory using your own defined FTP -command, CURLOPT_CUSTOMREQUEST will do just that. "NLST" is the default one -for listing directories but you're free to pass in your idea of a good -alternative. +If you do want to list the contents of a FTP directory using your own defined +FTP command, \fICURLOPT_CUSTOMREQUEST(3)\fP will do just that. "NLST" is the +default one for listing directories but you're free to pass in your idea of a +good alternative. .SH "Cookies Without Chocolate Chips" In the HTTP sense, a cookie is a name with an associated value. A server sends @@ -975,8 +985,8 @@ update them. Server use cookies to "track" users and to keep "sessions". Cookies are sent from server to clients with the header Set-Cookie: and they're sent from clients to servers with the Cookie: header. -To just send whatever cookie you want to a server, you can use CURLOPT_COOKIE -to set a cookie string like this: +To just send whatever cookie you want to a server, you can use +\fICURLOPT_COOKIE(3)\fP to set a cookie string like this: curl_easy_setopt(easyhandle, CURLOPT_COOKIE, "name1=var1; name2=var2;"); @@ -987,29 +997,30 @@ are then used accordingly on later requests. One way to do this, is to save all headers you receive in a plain file and when you make a request, you tell libcurl to read the previous headers to figure out which cookies to use. Set the header file to read cookies from with -CURLOPT_COOKIEFILE. - -The CURLOPT_COOKIEFILE option also automatically enables the cookie parser in -libcurl. Until the cookie parser is enabled, libcurl will not parse or -understand incoming cookies and they will just be ignored. However, when the -parser is enabled the cookies will be understood and the cookies will be kept -in memory and used properly in subsequent requests when the same handle is -used. Many times this is enough, and you may not have to save the cookies to -disk at all. Note that the file you specify to CURLOPT_COOKIEFILE doesn't have -to exist to enable the parser, so a common way to just enable the parser and -not read any cookies is to use the name of a file you know doesn't exist. +\fICURLOPT_COOKIEFILE(3)\fP. + +The \fICURLOPT_COOKIEFILE(3)\fP option also automatically enables the cookie +parser in libcurl. Until the cookie parser is enabled, libcurl will not parse +or understand incoming cookies and they will just be ignored. However, when +the parser is enabled the cookies will be understood and the cookies will be +kept in memory and used properly in subsequent requests when the same handle +is used. Many times this is enough, and you may not have to save the cookies +to disk at all. Note that the file you specify to \ICURLOPT_COOKIEFILE(3)\fP +doesn't have to exist to enable the parser, so a common way to just enable the +parser and not read any cookies is to use the name of a file you know doesn't +exist. If you would rather use existing cookies that you've previously received with your Netscape or Mozilla browsers, you can make libcurl use that cookie file -as input. The CURLOPT_COOKIEFILE is used for that too, as libcurl will -automatically find out what kind of file it is and act accordingly. +as input. The \fICURLOPT_COOKIEFILE(3)\fP is used for that too, as libcurl +will automatically find out what kind of file it is and act accordingly. Perhaps the most advanced cookie operation libcurl offers, is saving the entire internal cookie state back into a Netscape/Mozilla formatted cookie file. We call that the cookie-jar. When you set a file name with -CURLOPT_COOKIEJAR, that file name will be created and all received cookies -will be stored in it when \fIcurl_easy_cleanup(3)\fP is called. This enables -cookies to get passed on properly between multiple handles without any +\fICURLOPT_COOKIEJAR(3)\fP, that file name will be created and all received +cookies will be stored in it when \fIcurl_easy_cleanup(3)\fP is called. This +enables cookies to get passed on properly between multiple handles without any information getting lost. .SH "FTP Peculiarities We Need" @@ -1028,36 +1039,36 @@ work it tries PASV instead. (EPSV is an extension to the original FTP spec and does not exist nor work on all FTP servers.) You can prevent libcurl from first trying the EPSV command by setting -CURLOPT_FTP_USE_EPSV to zero. +\fICURLOPT_FTP_USE_EPSV(3)\fP to zero. In some cases, you will prefer to have the server connect back to you for the second connection. This might be when the server is perhaps behind a firewall or something and only allows connections on a single port. libcurl then informs the remote server which IP address and port number to connect to. -This is made with the CURLOPT_FTPPORT option. If you set it to "-", libcurl -will use your system's "default IP address". If you want to use a particular -IP, you can set the full IP address, a host name to resolve to an IP address -or even a local network interface name that libcurl will get the IP address -from. +This is made with the \fICURLOPT_FTPPORT(3)\fP option. If you set it to "-", +libcurl will use your system's "default IP address". If you want to use a +particular IP, you can set the full IP address, a host name to resolve to an +IP address or even a local network interface name that libcurl will get the IP +address from. When doing the "PORT" approach, libcurl will attempt to use the EPRT and the LPRT before trying PORT, as they work with more protocols. You can disable -this behavior by setting CURLOPT_FTP_USE_EPRT to zero. +this behavior by setting \fICURLOPT_FTP_USE_EPRT(3)\fP to zero. .SH "Headers Equal Fun" Some protocols provide "headers", meta-data separated from the normal -data. These headers are by default not included in the normal data stream, -but you can make them appear in the data stream by setting CURLOPT_HEADER to -1. +data. These headers are by default not included in the normal data stream, but +you can make them appear in the data stream by setting \fICURLOPT_HEADER(3)\fP +to 1. What might be even more useful, is libcurl's ability to separate the headers from the data and thus make the callbacks differ. You can for example set a different pointer to pass to the ordinary write callback by setting -CURLOPT_WRITEHEADER. +\fICURLOPT_HEADERDATA(3)\fP. -Or, you can set an entirely separate function to receive the headers, by -using CURLOPT_HEADERFUNCTION. +Or, you can set an entirely separate function to receive the headers, by using +\fICURLOPT_HEADERFUNCTION(3)\fP. The headers are passed to the callback function one by one, and you can depend on that fact. It makes it easier for you to add custom header parsers @@ -1118,18 +1129,18 @@ analyzer tool and eavesdrop on your passwords. Don't let the fact that HTTP Basic uses base64 encoded passwords fool you. They may not look readable at a first glance, but they very easily "deciphered" by anyone within seconds. -To avoid this problem, use HTTP authentication methods or other protocols that -don't let snoopers see your password: HTTP with Digest, NTLM or GSS -authentication, HTTPS, FTPS, SCP, SFTP and FTP-Kerberos are a few examples. +To avoid this problem, use an authentication mechanism or other protocol that +doesn't let snoopers see your password: Digest, CRAM-MD5, Kerberos, SPNEGO or +NTLM authentication, HTTPS, FTPS, SCP and SFTP are a few examples. .IP "Redirects" -The CURLOPT_FOLLOWLOCATION option automatically follows HTTP redirects sent -by a remote server. These redirects can refer to any kind of URL, not just -HTTP. A redirect to a file: URL would cause the libcurl to read (or write) -arbitrary files from the local filesystem. If the application returns -the data back to the user (as would happen in some kinds of CGI scripts), -an attacker could leverage this to read otherwise forbidden data (e.g. -file://localhost/etc/passwd). +The \fICURLOPT_FOLLOWLOCATION(3)\fP option automatically follows HTTP +redirects sent by a remote server. These redirects can refer to any kind of +URL, not just HTTP. A redirect to a file: URL would cause the libcurl to read +(or write) arbitrary files from the local filesystem. If the application +returns the data back to the user (as would happen in some kinds of CGI +scripts), an attacker could leverage this to read otherwise forbidden data +(e.g. file://localhost/etc/passwd). If authentication credentials are stored in the ~/.netrc file, or Kerberos is in use, any other URL type (not just file:) that requires @@ -1142,19 +1153,20 @@ the user running the libcurl application, SCP: or SFTP: URLs could access password or private-key protected resources, e.g. sftp://user@some-internal-server/etc/passwd -The CURLOPT_REDIR_PROTOCOLS and CURLOPT_NETRC options can be used to -mitigate against this kind of attack. +The \fICURLOPT_REDIR_PROTOCOLS(3)\fP and \fICURLOPT_NETRC(3)\fP options can be +used to mitigate against this kind of attack. A redirect can also specify a location available only on the machine running libcurl, including servers hidden behind a firewall from the attacker. e.g. http://127.0.0.1/ or http://intranet/delete-stuff.cgi?delete=all or tftp://bootp-server/pc-config-data -Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION and -handling redirects itself, sanitizing URLs as necessary. Alternately, an -app could leave CURLOPT_FOLLOWLOCATION enabled but set CURLOPT_REDIR_PROTOCOLS -and install a CURLOPT_OPENSOCKETFUNCTION callback function in which addresses -are sanitized before use. +Apps can mitigate against this by disabling \fICURLOPT_FOLLOWLOCATION(3)\fP +and handling redirects itself, sanitizing URLs as necessary. Alternately, an +app could leave \fICURLOPT_FOLLOWLOCATION(3)\fP enabled but set +\fICURLOPT_REDIR_PROTOCOLS(3)\fP and install a +\fICURLOPT_OPENSOCKETFUNCTION(3)\fP callback function in which addresses are +sanitized before use. .IP "Private Resources" A user who can control the DNS server of a domain being passed in within a URL @@ -1162,21 +1174,21 @@ can change the address of the host to a local, private address which a server-side libcurl-using application could then use. e.g. the innocuous URL http://fuzzybunnies.example.com/ could actually resolve to the IP address of a server behind a firewall, such as 127.0.0.1 or 10.1.2.3. Apps can mitigate -against this by setting a CURLOPT_OPENSOCKETFUNCTION and checking the address -before a connection. - -All the malicious scenarios regarding redirected URLs apply just as well -to non-redirected URLs, if the user is allowed to specify an arbitrary URL -that could point to a private resource. For example, a web app providing -a translation service might happily translate file://localhost/etc/passwd -and display the result. Apps can mitigate against this with the -CURLOPT_PROTOCOLS option as well as by similar mitigation techniques for -redirections. - -A malicious FTP server could in response to the PASV command return an -IP address and port number for a server local to the app running libcurl -but behind a firewall. Apps can mitigate against this by using the -CURLOPT_FTP_SKIP_PASV_IP option or CURLOPT_FTPPORT. +against this by setting a \fICURLOPT_OPENSOCKETFUNCTION(3)\fP and checking the +address before a connection. + +All the malicious scenarios regarding redirected URLs apply just as well to +non-redirected URLs, if the user is allowed to specify an arbitrary URL that +could point to a private resource. For example, a web app providing a +translation service might happily translate file://localhost/etc/passwd and +display the result. Apps can mitigate against this with the +\fICURLOPT_PROTOCOLS(3)\fP option as well as by similar mitigation techniques +for redirections. + +A malicious FTP server could in response to the PASV command return an IP +address and port number for a server local to the app running libcurl but +behind a firewall. Apps can mitigate against this by using the +\fICURLOPT_FTP_SKIP_PASV_IP(3)\fP option or \fICURLOPT_FTPPORT(3)\fP. .IP "IPv6 Addresses" libcurl will normally handle IPv6 addresses transparently and just as easily @@ -1193,25 +1205,25 @@ can be used to limit resolved addresses to IPv4 only and bypass these issues. .IP Uploads When uploading, a redirect can cause a local (or remote) file to be -overwritten. Apps must not allow any unsanitized URL to be passed in -for uploads. Also, CURLOPT_FOLLOWLOCATION should not be used on uploads. +overwritten. Apps must not allow any unsanitized URL to be passed in for +uploads. Also, \fICURLOPT_FOLLOWLOCATION(3)\fP should not be used on uploads. Instead, the app should handle redirects itself, sanitizing each URL first. .IP Authentication -Use of CURLOPT_UNRESTRICTED_AUTH could cause authentication information to -be sent to an unknown second server. Apps can mitigate against this -by disabling CURLOPT_FOLLOWLOCATION and handling redirects itself, -sanitizing where necessary. +Use of \fICURLOPT_UNRESTRICTED_AUTH(3)\fP could cause authentication +information to be sent to an unknown second server. Apps can mitigate against +this by disabling \fICURLOPT_FOLLOWLOCATION(3)\fP and handling redirects +itself, sanitizing where necessary. -Use of the CURLAUTH_ANY option to CURLOPT_HTTPAUTH could result in user -name and password being sent in clear text to an HTTP server. Instead, -use CURLAUTH_ANYSAFE which ensures that the password is encrypted over -the network, or else fail the request. +Use of the CURLAUTH_ANY option to \fICURLOPT_HTTPAUTH(3)\fP could result in +user name and password being sent in clear text to an HTTP server. Instead, +use CURLAUTH_ANYSAFE which ensures that the password is encrypted over the +network, or else fail the request. -Use of the CURLUSESSL_TRY option to CURLOPT_USE_SSL could result in user -name and password being sent in clear text to an FTP server. Instead, -use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or -else fail the request. +Use of the CURLUSESSL_TRY option to \fICURLOPT_USE_SSL(3)\fP could result in +user name and password being sent in clear text to an FTP server. Instead, +use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or else +fail the request. .IP Cookies If cookies are enabled and cached, then a user could craft a URL which @@ -1227,34 +1239,35 @@ scp://user:pass@host/a;date >/tmp/test; Apps must not allow unsanitized SCP: URLs to be passed in for downloads. .IP "Denial of Service" -A malicious server could cause libcurl to effectively hang by sending -a trickle of data through, or even no data at all but just keeping the TCP +A malicious server could cause libcurl to effectively hang by sending a +trickle of data through, or even no data at all but just keeping the TCP connection open. This could result in a denial-of-service attack. The -CURLOPT_TIMEOUT and/or CURLOPT_LOW_SPEED_LIMIT options can be used to -mitigate against this. - -A malicious server could cause libcurl to effectively hang by starting to -send data, then severing the connection without cleanly closing the -TCP connection. The app could install a CURLOPT_SOCKOPTFUNCTION callback -function and set the TCP SO_KEEPALIVE option to mitigate against this. -Setting one of the timeout options would also work against this attack. - -A malicious server could cause libcurl to download an infinite amount of -data, potentially causing all of memory or disk to be filled. Setting -the CURLOPT_MAXFILESIZE_LARGE option is not sufficient to guard against this. -Instead, the app should monitor the amount of data received within the +\fICURLOPT_TIMEOUT(3)\fP and/or \fICURLOPT_LOW_SPEED_LIMIT(3)\fP options can +be used to mitigate against this. + +A malicious server could cause libcurl to effectively hang by starting to send +data, then severing the connection without cleanly closing the TCP connection. +The app could install a \fICURLOPT_SOCKOPTFUNCTION(3)\fP callback function and +set the TCP SO_KEEPALIVE option to mitigate against this. Setting one of the +timeout options would also work against this attack. + +A malicious server could cause libcurl to download an infinite amount of data, +potentially causing all of memory or disk to be filled. Setting the +\fICURLOPT_MAXFILESIZE_LARGE(3)\fP option is not sufficient to guard against +this. Instead, the app should monitor the amount of data received within the write or progress callback and abort once the limit is reached. A malicious HTTP server could cause an infinite redirection loop, causing a -denial-of-service. This can be mitigated by using the CURLOPT_MAXREDIRS -option. +denial-of-service. This can be mitigated by using the +\fICURLOPT_MAXREDIRS(3)\fP option. .IP "Arbitrary Headers" User-supplied data must be sanitized when used in options like -CURLOPT_USERAGENT, CURLOPT_HTTPHEADER, CURLOPT_POSTFIELDS and others that -are used to generate structured data. Characters like embedded carriage -returns or ampersands could allow the user to create additional headers or -fields that could cause malicious transactions. +\fICURLOPT_USERAGENT(3)\fP, \fICURLOPT_HTTPHEADER(3)\fP, +\fICURLOPT_POSTFIELDS(3)\fP and others that are used to generate structured +data. Characters like embedded carriage returns or ampersands could allow the +user to create additional headers or fields that could cause malicious +transactions. .IP "Server-supplied Names" A server can supply data which the application may, in some cases, use as @@ -1266,9 +1279,9 @@ names to avoid the possibility of a malicious server supplying one like "/etc/passwd", "\\autoexec.bat", "prn:" or even ".bashrc". .IP "Server Certificates" -A secure application should never use the CURLOPT_SSL_VERIFYPEER option to -disable certificate validation. There are numerous attacks that are enabled -by apps that fail to properly validate server TLS/SSL certificates, +A secure application should never use the \fICURLOPT_SSL_VERIFYPEER(3)\fP +option to disable certificate validation. There are numerous attacks that are +enabled by apps that fail to properly validate server TLS/SSL certificates, thus enabling a malicious server to spoof a legitimate one. HTTPS without validated certificates is potentially as insecure as a plain HTTP connection. @@ -1289,39 +1302,44 @@ To avoid this problem, you must of course use your common sense. Often, you can just edit out the sensitive data or just search/replace your true information with faked data. -.SH "Multiple Transfers Using the multi Interface" - +.SH "The multi Interface" The easy interface as described in detail in this document is a synchronous interface that transfers one file at a time and doesn't return until it is done. The multi interface, on the other hand, allows your program to transfer -multiple files in both directions at the same time, without forcing you -to use multiple threads. The name might make it seem that the multi -interface is for multi-threaded programs, but the truth is almost the -reverse. The multi interface can allow a single-threaded application -to perform the same kinds of multiple, simultaneous transfers that -multi-threaded programs can perform. It allows many of the benefits -of multi-threaded transfers without the complexity of managing and -synchronizing many threads. +multiple files in both directions at the same time, without forcing you to use +multiple threads. The name might make it seem that the multi interface is for +multi-threaded programs, but the truth is almost the reverse. The multi +interface allows a single-threaded application to perform the same kinds of +multiple, simultaneous transfers that multi-threaded programs can perform. It +allows many of the benefits of multi-threaded transfers without the complexity +of managing and synchronizing many threads. + +To complicate matters somewhat more, there are even two versions of the multi +interface. The event based one, also called multi_socket and the "normal one" +designed for using with select(). See the libcurl-multi.3 man page for details +on the multi_socket event based API, this description here is for the select() +oriented one. To use this interface, you are better off if you first understand the basics of how to use the easy interface. The multi interface is simply a way to make multiple transfers at the same time by adding up multiple easy handles into a "multi stack". -You create the easy handles you want and you set all the options just like you -have been told above, and then you create a multi handle with -\fIcurl_multi_init(3)\fP and add all those easy handles to that multi handle -with \fIcurl_multi_add_handle(3)\fP. +You create the easy handles you want, one for each concurrent transfer, and +you set all the options just like you learned above, and then you create a +multi handle with \fIcurl_multi_init(3)\fP and add all those easy handles to +that multi handle with \fIcurl_multi_add_handle(3)\fP. When you've added the handles you have for the moment (you can still add new ones at any time), you start the transfers by calling \fIcurl_multi_perform(3)\fP. -\fIcurl_multi_perform(3)\fP is asynchronous. It will only execute as little as -possible and then return back control to your program. It is designed to never -block. +\fIcurl_multi_perform(3)\fP is asynchronous. It will only perform what can be +done now and then return back control to your program. It is designed to never +block. You need to keep calling the function until all transfers are +completed. The best usage of this interface is when you do a select() on all possible file descriptors or sockets to know when to call libcurl again. This also @@ -1334,11 +1352,12 @@ When you then call select(), it'll return when one of the file handles signal action and you then call \fIcurl_multi_perform(3)\fP to allow libcurl to do what it wants to do. Take note that libcurl does also feature some time-out code so we advise you to never use very long timeouts on select() before you -call \fIcurl_multi_perform(3)\fP, which thus should be called unconditionally -every now and then even if none of its file descriptors have signaled -ready. Another precaution you should use: always call -\fIcurl_multi_fdset(3)\fP immediately before the select() call since the -current set of file descriptors may change when calling a curl function. +call \fIcurl_multi_perform(3)\fP again. \fIcurl_multi_timeout(3)\fP is +provided to help you get a suitable timeout period. + +Another precaution you should use: always call \fIcurl_multi_fdset(3)\fP +immediately before the select() call since the current set of file descriptors +may change in any curl function invoke. If you want to stop the transfer of one of the easy handles in the stack, you can use \fIcurl_multi_remove_handle(3)\fP to remove individual easy @@ -1383,9 +1402,11 @@ This happens on Windows machines when libcurl is built and used as a DLL. However, you can still do this on Windows if you link with a static library. .IP "[3]" -The curl-config tool is generated at build-time (on UNIX-like systems) and +The curl-config tool is generated at build-time (on Unix-like systems) and should be installed with the 'make install' or similar instruction that installs the library, header files, man pages etc. .IP "[4]" This behavior was different in versions before 7.17.0, where strings had to remain valid past the end of the \fIcurl_easy_setopt(3)\fP call. +.SH "SEE ALSO" +.BR libcurl-errors "(3), " libcurl-multi "(3), " libcurl-easy "(3) " diff --git a/docs/libcurl/libcurl-tutorial.html b/docs/libcurl/libcurl-tutorial.html index 56a0205..43bfc24 100644 --- a/docs/libcurl/libcurl-tutorial.html +++ b/docs/libcurl/libcurl-tutorial.html @@ -51,7 +51,7 @@ p.roffit {

This document will refer to 'the user' as the person writing the source code that uses libcurl. That would probably be you or someone in your position. What will be generally referred to as 'the program' will be the collected source code that you write that is using libcurl for transfers. The program is outside libcurl and libcurl is outside of the program.

To get more details on all options and functions described herein, please refer to their respective man pages.

Building

-

There are many different ways to build C programs. This chapter will assume a UNIX-style build process. If you use a different build system, you can still read this to get general information that may apply to your environment as well. +

There are many different ways to build C programs. This chapter will assume a Unix style build process. If you use a different build system, you can still read this to get general information that may apply to your environment as well.

Compiling the Program

Your compiler needs to know where the libcurl headers are located. Therefore you must set your compiler's include path to point to the directory where you installed them. The 'curl-config'[3] tool can be used to get this information:

$ curl-config --cflags @@ -80,21 +80,22 @@ p.roffit {

CURL_GLOBAL_SSL

which only does anything on libcurls compiled and built SSL-enabled. On these systems, this will make libcurl initialize the SSL library properly for this application. This only needs to be done once for each application so if your program or another library already does this, this bit should not be needed.

-

libcurl has a default protection mechanism that detects if curl_global_init(3) hasn't been called by the time curl_easy_perform(3) is called and if that is the case, libcurl runs the function itself with a guessed bit pattern. Please note that depending solely on this is not considered nice nor very good. -

When the program no longer uses libcurl, it should call curl_global_cleanup(3), which is the opposite of the init call. It will then do the reversed operations to cleanup the resources the curl_global_init(3) call initialized. -

Repeated calls to curl_global_init(3) and curl_global_cleanup(3) should be avoided. They should only be called once each. +

libcurl has a default protection mechanism that detects if curl_global_init hasn't been called by the time curl_easy_perform is called and if that is the case, libcurl runs the function itself with a guessed bit pattern. Please note that depending solely on this is not considered nice nor very good. +

When the program no longer uses libcurl, it should call curl_global_cleanup, which is the opposite of the init call. It will then do the reversed operations to cleanup the resources the curl_global_init call initialized. +

Repeated calls to curl_global_init and curl_global_cleanup should be avoided. They should only be called once each.

Features libcurl Provides

-

It is considered best-practice to determine libcurl features at run-time rather than at build-time (if possible of course). By calling curl_version_info(3) and checking out the details of the returned struct, your program can figure out exactly what the currently running libcurl supports. -

Handle the Easy libcurl

-

libcurl first introduced the so called easy interface. All operations in the easy interface are prefixed with 'curl_easy'. -

Recent libcurl versions also offer the multi interface. More about that interface, what it is targeted for and how to use it is detailed in a separate chapter further down. You still need to understand the easy interface first, so please continue reading for better understanding. +

It is considered best-practice to determine libcurl features at run-time rather than at build-time (if possible of course). By calling curl_version_info and checking out the details of the returned struct, your program can figure out exactly what the currently running libcurl supports. +

Two Interfaces

+

libcurl first introduced the so called easy interface. All operations in the easy interface are prefixed with 'curl_easy'. The easy interface lets you do single transfers with a synchronous and blocking function call. +

libcurl also offers another interface that allows multiple simultaneous transfers in a single thread, the so called multi interface. More about that interface is detailed in a separate chapter further down. You still need to understand the easy interface first, so please continue reading for better understanding.

Handle the Easy libcurl

To use the easy interface, you must first create yourself an easy handle. You need one handle for each easy session you want to perform. Basically, you should use one handle for every thread you plan to use for transferring. You must never share the same handle in multiple threads.

Get an easy handle with

 easyhandle = curl_easy_init();

It returns an easy handle. Using that you proceed to the next step: setting up your preferred actions. A handle is just a logic entity for the upcoming transfer or series of transfers. -

You set properties and options for this handle using curl_easy_setopt(3). They control how the subsequent transfer or transfers will be made. Options remain set in the handle until set again to something different. Alas, multiple requests using the same handle will use the same options. -

Many of the options you set in libcurl are "strings", pointers to data terminated with a zero byte. When you set strings with curl_easy_setopt(3), libcurl makes its own copy so that they don't need to be kept around in your application after being set[4]. -

One of the most basic properties to set in the handle is the URL. You set your preferred URL to transfer with CURLOPT_URL in a manner similar to: +

You set properties and options for this handle using curl_easy_setopt. They control how the subsequent transfer or transfers will be made. Options remain set in the handle until set again to something different. They are sticky. Multiple requests using the same handle will use the same options. +

If you at any point would like to blank all previously set options for a single easy handle, you can call curl_easy_reset and you can also make a clone of an easy handle (with all its set options) using curl_easy_duphandle. +

Many of the options you set in libcurl are "strings", pointers to data terminated with a zero byte. When you set strings with curl_easy_setopt, libcurl makes its own copy so that they don't need to be kept around in your application after being set[4]. +

One of the most basic properties to set in the handle is the URL. You set your preferred URL to transfer with CURLOPT_URL(3) in a manner similar to:

 

 curl_easy_setopt(handle, CURLOPT_URL, "http://domain.com/");

@@ -106,25 +107,25 @@ p.roffit {

 curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);

You can control what data your callback function gets in the fourth argument by setting another property:

 curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct); -

Using that property, you can easily pass local data between your application and the function that gets invoked by libcurl. libcurl itself won't touch the data you pass with CURLOPT_WRITEDATA. -

libcurl offers its own default internal callback that will take care of the data if you don't set the callback with CURLOPT_WRITEFUNCTION. It will then simply output the received data to stdout. You can have the default callback write the data to a different file handle by passing a 'FILE *' to a file opened for writing with the CURLOPT_WRITEDATA option. -

Now, we need to take a step back and have a deep breath. Here's one of those rare platform-dependent nitpicks. Did you spot it? On some platforms[2], libcurl won't be able to operate on files opened by the program. Thus, if you use the default callback and pass in an open file with CURLOPT_WRITEDATA, it will crash. You should therefore avoid this to make your program run fine virtually everywhere. -

(CURLOPT_WRITEDATA was formerly known as CURLOPT_FILE. Both names still work and do the same thing). -

If you're using libcurl as a win32 DLL, you MUST use the CURLOPT_WRITEFUNCTION if you set CURLOPT_WRITEDATA - or you will experience crashes. +

Using that property, you can easily pass local data between your application and the function that gets invoked by libcurl. libcurl itself won't touch the data you pass with CURLOPT_WRITEDATA(3). +

libcurl offers its own default internal callback that will take care of the data if you don't set the callback with CURLOPT_WRITEFUNCTION(3). It will then simply output the received data to stdout. You can have the default callback write the data to a different file handle by passing a 'FILE *' to a file opened for writing with the CURLOPT_WRITEDATA(3) option. +

Now, we need to take a step back and have a deep breath. Here's one of those rare platform-dependent nitpicks. Did you spot it? On some platforms[2], libcurl won't be able to operate on files opened by the program. Thus, if you use the default callback and pass in an open file with CURLOPT_WRITEDATA(3), it will crash. You should therefore avoid this to make your program run fine virtually everywhere. +

(CURLOPT_WRITEDATA(3) was formerly known as CURLOPT_FILE. Both names still work and do the same thing). +

If you're using libcurl as a win32 DLL, you MUST use the CURLOPT_WRITEFUNCTION(3) if you set CURLOPT_WRITEDATA(3) - or you will experience crashes.

There are of course many more options you can set, and we'll get back to a few of them later. Let's instead continue to the actual transfer:

 success = curl_easy_perform(easyhandle); -

curl_easy_perform(3) will connect to the remote site, do the necessary commands and receive the transfer. Whenever it receives data, it calls the callback function we previously set. The function may get one byte at a time, or it may get many kilobytes at once. libcurl delivers as much as possible as often as possible. Your callback function should return the number of bytes it "took care of". If that is not the exact same amount of bytes that was passed to it, libcurl will abort the operation and return with an error code. -

When the transfer is complete, the function returns a return code that informs you if it succeeded in its mission or not. If a return code isn't enough for you, you can use the CURLOPT_ERRORBUFFER to point libcurl to a buffer of yours where it'll store a human readable error message as well. +

curl_easy_perform will connect to the remote site, do the necessary commands and receive the transfer. Whenever it receives data, it calls the callback function we previously set. The function may get one byte at a time, or it may get many kilobytes at once. libcurl delivers as much as possible as often as possible. Your callback function should return the number of bytes it "took care of". If that is not the exact same amount of bytes that was passed to it, libcurl will abort the operation and return with an error code. +

When the transfer is complete, the function returns a return code that informs you if it succeeded in its mission or not. If a return code isn't enough for you, you can use the CURLOPT_ERRORBUFFER(3) to point libcurl to a buffer of yours where it'll store a human readable error message as well.

If you then want to transfer another file, the handle is ready to be used again. Mind you, it is even preferred that you re-use an existing handle if you intend to make another transfer. libcurl will then attempt to re-use the previous connection.

For some protocols, downloading a file can involve a complicated process of logging in, setting the transfer mode, changing the current directory and finally transferring the file data. libcurl takes care of all that complication for you. Given simply the URL to a file, libcurl will take care of all the details needed to get the file moved from one machine to another.

Multi-threading Issues

The first basic rule is that you must never simultaneously share a libcurl handle (be it easy or multi or whatever) between multiple threads. Only use one handle in one thread at any time. You can pass the handles around among threads, but you must never use a single handle from more than one thread at any given time. -

libcurl is completely thread safe, except for two issues: signals and SSL/TLS handlers. Signals are used for timing out name resolves (during DNS lookup) - when built without c-ares support and not on Windows. +

libcurl is completely thread safe, except for two issues: signals and SSL/TLS handlers. Signals are used for timing out name resolves (during DNS lookup) - when built without using either the c-ares or threaded resolver backends.

If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are then of course using the underlying SSL library multi-threaded and those libs might have their own requirements on this issue. Basically, you need to provide one or two functions to allow it to function properly. For all details, see this:

OpenSSL -

 http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION +

 http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION

GnuTLS -

 http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html +

 http://gnutls.org/manual/html_node/Thread-safety.html

NSS

 is claimed to be thread-safe already without anything required.

PolarSSL @@ -135,13 +136,13 @@ p.roffit {

 Required actions unknown.

Secure Transport

 The engine is fully thread-safe, and no additional steps are required. -

When using multiple threads you should set the CURLOPT_NOSIGNAL option to 1 for all handles. Everything will or might work fine except that timeouts are not honored during the DNS lookup - which you can work around by building libcurl with c-ares support. c-ares is a library that provides asynchronous name resolves. On some platforms, libcurl simply will not function properly multi-threaded unless this option is set. -

Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe. +

When using multiple threads you should set the CURLOPT_NOSIGNAL(3) option to 1 for all handles. Everything will or might work fine except that timeouts are not honored during the DNS lookup - which you can work around by building libcurl with c-ares support. c-ares is a library that provides asynchronous name resolves. On some platforms, libcurl simply will not function properly multi-threaded unless this option is set. +

Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE(3) is not thread-safe.

When It Doesn't Work

There will always be times when the transfer fails for some reason. You might have set the wrong libcurl option or misunderstood what the libcurl option actually does, or the remote server might return non-standard replies that confuse the library which then confuses your program. -

There's one golden rule when these things occur: set the CURLOPT_VERBOSE option to 1. It'll cause the library to spew out the entire protocol details it sends, some internal info and some received protocol data as well (especially when using FTP). If you're using HTTP, adding the headers in the received output to study is also a clever way to get a better understanding why the server behaves the way it does. Include headers in the normal body output with CURLOPT_HEADER set 1. -

Of course, there are bugs left. We need to know about them to be able to fix them, so we're quite dependent on your bug reports! When you do report suspected bugs in libcurl, please include as many details as you possibly can: a protocol dump that CURLOPT_VERBOSE produces, library version, as much as possible of your code that uses libcurl, operating system name and version, compiler name and version etc. -

If CURLOPT_VERBOSE is not enough, you increase the level of debug data your application receive by using the CURLOPT_DEBUGFUNCTION. +

There's one golden rule when these things occur: set the CURLOPT_VERBOSE(3) option to 1. It'll cause the library to spew out the entire protocol details it sends, some internal info and some received protocol data as well (especially when using FTP). If you're using HTTP, adding the headers in the received output to study is also a clever way to get a better understanding why the server behaves the way it does. Include headers in the normal body output with CURLOPT_HEADER(3) set 1. +

Of course, there are bugs left. We need to know about them to be able to fix them, so we're quite dependent on your bug reports! When you do report suspected bugs in libcurl, please include as many details as you possibly can: a protocol dump that CURLOPT_VERBOSE(3) produces, library version, as much as possible of your code that uses libcurl, operating system name and version, compiler name and version etc. +

If CURLOPT_VERBOSE(3) is not enough, you increase the level of debug data your application receive by using the CURLOPT_DEBUGFUNCTION(3).

Getting some in-depth knowledge about the protocols involved is never wrong, and if you're trying to do funny things, you might very well understand libcurl and how to use it better if you study the appropriate RFC documents at least briefly.

Upload Data to a Remote Site

libcurl tries to keep a protocol independent approach to most transfers, thus uploading to a remote FTP site is very similar to uploading data to a HTTP server with a PUT request. @@ -153,24 +154,24 @@ p.roffit {

 curl_easy_setopt(easyhandle, CURLOPT_READDATA, &filedata);

Tell libcurl that we want to upload:

 curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L); -

A few protocols won't behave properly when uploads are done without any prior knowledge of the expected file size. So, set the upload file size using the CURLOPT_INFILESIZE_LARGE for all known file sizes like this[1]: +

A few protocols won't behave properly when uploads are done without any prior knowledge of the expected file size. So, set the upload file size using the CURLOPT_INFILESIZE_LARGE(3) for all known file sizes like this[1]:

 

 /* in this example, file_size must be an curl_off_t variable */  curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE_LARGE, file_size);

-

When you call curl_easy_perform(3) this time, it'll perform all the necessary operations and when it has invoked the upload it'll call your supplied callback to get the data to upload. The program should return as much data as possible in every invoke, as that is likely to make the upload perform as fast as possible. The callback should return the number of bytes it wrote in the buffer. Returning 0 will signal the end of the upload. +

When you call curl_easy_perform this time, it'll perform all the necessary operations and when it has invoked the upload it'll call your supplied callback to get the data to upload. The program should return as much data as possible in every invoke, as that is likely to make the upload perform as fast as possible. The callback should return the number of bytes it wrote in the buffer. Returning 0 will signal the end of the upload.

Passwords

Many protocols use or even require that user name and password are provided to be able to download or upload the data of your choice. libcurl offers several ways to specify them.

Most protocols support that you specify the name and password in the URL itself. libcurl will detect this and use them accordingly. This is written like this:

 protocol://user:password@example.com/path/

If you need any odd letters in your user name or password, you should enter them URL encoded, as %XX where XX is a two-digit hexadecimal number. -

libcurl also provides options to set various passwords. The user name and password as shown embedded in the URL can instead get set with the CURLOPT_USERPWD option. The argument passed to libcurl should be a char * to a string in the format "user:password". In a manner like this: +

libcurl also provides options to set various passwords. The user name and password as shown embedded in the URL can instead get set with the CURLOPT_USERPWD(3) option. The argument passed to libcurl should be a char * to a string in the format "user:password". In a manner like this:

 curl_easy_setopt(easyhandle, CURLOPT_USERPWD, "myname:thesecret"); -

Another case where name and password might be needed at times, is for those users who need to authenticate themselves to a proxy they use. libcurl offers another option for this, the CURLOPT_PROXYUSERPWD. It is used quite similar to the CURLOPT_USERPWD option like this: +

Another case where name and password might be needed at times, is for those users who need to authenticate themselves to a proxy they use. libcurl offers another option for this, the CURLOPT_PROXYUSERPWD(3). It is used quite similar to the CURLOPT_USERPWD(3) option like this:

 curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "myname:thesecret"); -

There's a long time UNIX "standard" way of storing ftp user names and passwords, namely in the $HOME/.netrc file. The file should be made private so that only the user may read it (see also the "Security Considerations" chapter), as it might contain the password in plain text. libcurl has the ability to use this file to figure out what set of user name and password to use for a particular host. As an extension to the normal functionality, libcurl also supports this file for non-FTP protocols such as HTTP. To make curl use this file, use the CURLOPT_NETRC option: +

There's a long time Unix "standard" way of storing FTP user names and passwords, namely in the $HOME/.netrc file. The file should be made private so that only the user may read it (see also the "Security Considerations" chapter), as it might contain the password in plain text. libcurl has the ability to use this file to figure out what set of user name and password to use for a particular host. As an extension to the normal functionality, libcurl also supports this file for non-FTP protocols such as HTTP. To make curl use this file, use the CURLOPT_NETRC(3) option:

 curl_easy_setopt(easyhandle, CURLOPT_NETRC, 1L);

And a very basic example of how such a .netrc file may look like:

@@ -185,9 +186,9 @@ p.roffit {
 

 curl_easy_setopt(easyhandle, CURLOPT_KEYPASSWD, "keypassword");

HTTP Authentication

The previous chapter showed how to set user name and password for getting URLs that require authentication. When using the HTTP protocol, there are many different ways a client can provide those credentials to the server and you can control which way libcurl will (attempt to) use them. The default HTTP authentication method is called 'Basic', which is sending the name and password in clear-text in the HTTP request, base64-encoded. This is insecure. -

At the time of this writing, libcurl can be built to use: Basic, Digest, NTLM, Negotiate, GSS-Negotiate and SPNEGO. You can tell libcurl which one to use with CURLOPT_HTTPAUTH as in: +

At the time of this writing, libcurl can be built to use: Basic, Digest, NTLM, Negotiate (SPNEGO). You can tell libcurl which one to use with CURLOPT_HTTPAUTH(3) as in:

 curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); -

And when you send authentication to a proxy, you can also set authentication type the same way but instead with CURLOPT_PROXYAUTH: +

And when you send authentication to a proxy, you can also set authentication type the same way but instead with CURLOPT_PROXYAUTH(3):

 curl_easy_setopt(easyhandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);

Both these options allow you to set multiple types (by ORing them together), to make libcurl pick the most secure one out of the types the server/proxy claims to support. This method does however add a round-trip since libcurl must first ask the server what it supports:

 curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH,  CURLAUTH_DIGEST|CURLAUTH_BASIC); @@ -204,7 +205,7 @@ p.roffit {

-

Simple enough, huh? Since you set the POST options with the CURLOPT_POSTFIELDS, this automatically switches the handle to use POST in the upcoming request. +

Simple enough, huh? Since you set the POST options with the CURLOPT_POSTFIELDS(3), this automatically switches the handle to use POST in the upcoming request.

Ok, so what if you want to post binary data that also requires you to set the Content-Type: header of the post? Well, binary posts prevent libcurl from being able to do strlen() on the data to figure out the size, so therefore we must tell libcurl the size of the post data. Setting headers in libcurl requests are done in a generic way, by building a list of our own headers and then passing that list to libcurl.

 

 struct curl_slist *headers=NULL; @@ -220,7 +221,7 @@ p.roffit {

-

While the simple examples above cover the majority of all cases where HTTP POST operations are required, they don't do multi-part formposts. Multi-part formposts were introduced as a better way to post (possibly large) binary data and were first documented in the RFC 1867 (updated in RFC2388). They're called multi-part because they're built by a chain of parts, each part being a single unit of data. Each part has its own name and contents. You can in fact create and post a multi-part formpost with the regular libcurl POST support described above, but that would require that you build a formpost yourself and provide to libcurl. To make that easier, libcurl provides curl_formadd(3). Using this function, you add parts to the form. When you're done adding parts, you post the whole form. +

While the simple examples above cover the majority of all cases where HTTP POST operations are required, they don't do multi-part formposts. Multi-part formposts were introduced as a better way to post (possibly large) binary data and were first documented in the RFC 1867 (updated in RFC2388). They're called multi-part because they're built by a chain of parts, each part being a single unit of data. Each part has its own name and contents. You can in fact create and post a multi-part formpost with the regular libcurl POST support described above, but that would require that you build a formpost yourself and provide to libcurl. To make that easier, libcurl provides curl_formadd. Using this function, you add parts to the form. When you're done adding parts, you post the whole form.

The following example sets two simple text parts with plain textual contents, and then a file with binary contents and uploads the whole thing.

 

 struct curl_httppost *post=NULL; @@ -257,15 +258,15 @@ p.roffit {

-

Since all options on an easyhandle are "sticky", they remain the same until changed even if you do call curl_easy_perform(3), you may need to tell curl to go back to a plain GET request if you intend to do one as your next request. You force an easyhandle to go back to GET by using the CURLOPT_HTTPGET option: +

Since all options on an easyhandle are "sticky", they remain the same until changed even if you do call curl_easy_perform, you may need to tell curl to go back to a plain GET request if you intend to do one as your next request. You force an easyhandle to go back to GET by using the CURLOPT_HTTPGET(3) option:

 curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, 1L); -

Just setting CURLOPT_POSTFIELDS to "" or NULL will *not* stop libcurl from doing a POST. It will just make it POST without any data to send! +

Just setting CURLOPT_POSTFIELDS(3) to "" or NULL will *not* stop libcurl from doing a POST. It will just make it POST without any data to send!

Showing Progress

For historical and traditional reasons, libcurl has a built-in progress meter that can be switched on and then makes it present a progress meter in your terminal. -

Switch on the progress meter by, oddly enough, setting CURLOPT_NOPROGRESS to zero. This option is set to 1 by default. +

Switch on the progress meter by, oddly enough, setting CURLOPT_NOPROGRESS(3) to zero. This option is set to 1 by default.

For most applications however, the built-in progress meter is useless and what instead is interesting is the ability to specify a progress callback. The function pointer you pass to libcurl will then be called on irregular intervals with information about the current transfer. -

Set the progress callback by using CURLOPT_PROGRESSFUNCTION. And pass a pointer to a function that matches this prototype: +

Set the progress callback by using CURLOPT_PROGRESSFUNCTION(3). And pass a pointer to a function that matches this prototype:

 

 int progress_callback(void *clientp,   double dltotal, @@ -275,7 +276,7 @@ p.roffit {

-

If any of the input arguments is unknown, a 0 will be passed. The first argument, the 'clientp' is the pointer you pass to libcurl with CURLOPT_PROGRESSDATA. libcurl won't touch it. +

If any of the input arguments is unknown, a 0 will be passed. The first argument, the 'clientp' is the pointer you pass to libcurl with CURLOPT_PROGRESSDATA(3). libcurl won't touch it.

libcurl with C++

There's basically only one thing to keep in mind when using C++ instead of C when interfacing libcurl: @@ -306,8 +307,8 @@ p.roffit {

 curl_easy_setopt(easyhandle, CURLOPT_PROXY, "proxy-host.com:8080");

Some proxies require user authentication before allowing a request, and you pass that information similar to this:

 curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "user:password"); -

If you want to, you can specify the host name only in the CURLOPT_PROXY option, and set the port number separately with CURLOPT_PROXYPORT. -

Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE (if not, it will default to assume a HTTP proxy): +

If you want to, you can specify the host name only in the CURLOPT_PROXY(3) option, and set the port number separately with CURLOPT_PROXYPORT(3). +

Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE(3) (if not, it will default to assume a HTTP proxy):

 curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);

Environment Variables @@ -315,7 +316,7 @@ p.roffit {

libcurl automatically checks and uses a set of environment variables to know what proxies to use for certain protocols. The names of the variables are following an ancient de facto standard and are built up as "[protocol]_proxy" (note the lower casing). Which makes the variable 'http_proxy' checked for a name of a proxy to use when the input URL is HTTP. Following the same rule, the variable named 'ftp_proxy' is checked for FTP URLs. Again, the proxies are always HTTP proxies, the different names of the variables simply allows different HTTP proxies to be used.

The proxy environment variable contents should be in the format "[protocol://][user:password@]machine[:port]". Where the protocol:// part is simply ignored if present (so http://proxy and bluerk://proxy will do the same) and the optional port number specifies on which port the proxy operates on the host. If not specified, the internal default port number will be used and that is most likely *not* the one you would like it to be.

There are two special environment variables. 'all_proxy' is what sets proxy for any URL in case the protocol specific variable wasn't set, and 'no_proxy' defines a list of hosts that should not use a proxy even though a variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all hosts. -

To explicitly disable libcurl's checking for and using the proxy environment variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY. +

To explicitly disable libcurl's checking for and using the proxy environment variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY(3).

SSL and Proxies

SSL is for secure point-to-point connections. This involves strong encryption and similar things, which effectively makes it impossible for a proxy to operate as a "man in between" which the proxy's task is, as previously discussed. Instead, the only way to have SSL work over a HTTP proxy is to ask the proxy to tunnel trough everything without being able to check or fiddle with the traffic. @@ -342,15 +343,15 @@ p.roffit {

Persistence Is The Way to Happiness

Re-cycling the same easy handle several times when doing multiple requests is the way to go. -

After each single curl_easy_perform(3) operation, libcurl will keep the connection alive and open. A subsequent request using the same easy handle to the same host might just be able to use the already open connection! This reduces network impact a lot. +

After each single curl_easy_perform operation, libcurl will keep the connection alive and open. A subsequent request using the same easy handle to the same host might just be able to use the already open connection! This reduces network impact a lot.

Even if the connection is dropped, all connections involving SSL to the same host again, will benefit from libcurl's session ID cache that drastically reduces re-connection time.

FTP connections that are kept alive save a lot of time, as the command- response round-trips are skipped, and also you don't risk getting blocked without permission to login again like on many FTP servers only allowing N persons to be logged in at the same time.

libcurl caches DNS name resolving results, to make lookups of a previously looked up name a lot faster.

Other interesting details that improve performance for subsequent requests may also be added in the future. -

Each easy handle will attempt to keep the last few connections alive for a while in case they are to be used again. You can set the size of this "cache" with the CURLOPT_MAXCONNECTS option. Default is 5. There is very seldom any point in changing this value, and if you think of changing this it is often just a matter of thinking again. -

To force your upcoming request to not use an already existing connection (it will even close one first if there happens to be one alive to the same host you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT to 1. In a similar spirit, you can also forbid the upcoming request to be "lying" around and possibly get re-used after the request by setting CURLOPT_FORBID_REUSE to 1. +

Each easy handle will attempt to keep the last few connections alive for a while in case they are to be used again. You can set the size of this "cache" with the CURLOPT_MAXCONNECTS(3) option. Default is 5. There is very seldom any point in changing this value, and if you think of changing this it is often just a matter of thinking again. +

To force your upcoming request to not use an already existing connection (it will even close one first if there happens to be one alive to the same host you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT(3) to 1. In a similar spirit, you can also forbid the upcoming request to be "lying" around and possibly get re-used after the request by setting CURLOPT_FORBID_REUSE(3) to 1.

HTTP Headers Used by libcurl

-

When you use libcurl to do HTTP requests, it'll pass along a series of headers automatically. It might be good for you to know and understand these. You can replace or remove them by using the CURLOPT_HTTPHEADER option. +

When you use libcurl to do HTTP requests, it'll pass along a series of headers automatically. It might be good for you to know and understand these. You can replace or remove them by using the CURLOPT_HTTPHEADER(3) option.

Host

This header is required by HTTP 1.1 and even many 1.0 servers and should be the name of the server we want to talk to. This includes the port number if anything but default. @@ -366,7 +367,7 @@ p.roffit {

libcurl is your friend here too.

CUSTOMREQUEST -

If just changing the actual HTTP request keyword is what you want, like when GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST is there for you. It is very simple to use: +

If just changing the actual HTTP request keyword is what you want, like when GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST(3) is there for you. It is very simple to use:

 curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST");

When using the custom request, you change the request keyword of the actual request you are performing. Thus, by default you make a GET request but you can also make a POST operation (as described before) and then replace the POST keyword if you want to. You're the boss.

@@ -419,36 +420,36 @@ p.roffit {

-

If you would instead want this operation (or chain of operations) to happen _after_ the data transfer took place the option to curl_easy_setopt(3) would instead be called CURLOPT_POSTQUOTE and used the exact same way. -

The custom FTP command will be issued to the server in the same order they are added to the list, and if a command gets an error code returned back from the server, no more commands will be issued and libcurl will bail out with an error code (CURLE_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE to send commands before a transfer, no transfer will actually take place when a quote command has failed. -

If you set the CURLOPT_HEADER to 1, you will tell libcurl to get information about the target file and output "headers" about it. The headers will be in "HTTP-style", looking like they do in HTTP. -

The option to enable headers or to run custom FTP commands may be useful to combine with CURLOPT_NOBODY. If this option is set, no actual file content transfer will be performed. +

If you would instead want this operation (or chain of operations) to happen _after_ the data transfer took place the option to curl_easy_setopt would instead be called CURLOPT_POSTQUOTE(3) and used the exact same way. +

The custom FTP command will be issued to the server in the same order they are added to the list, and if a command gets an error code returned back from the server, no more commands will be issued and libcurl will bail out with an error code (CURLE_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE(3) to send commands before a transfer, no transfer will actually take place when a quote command has failed. +

If you set the CURLOPT_HEADER(3) to 1, you will tell libcurl to get information about the target file and output "headers" about it. The headers will be in "HTTP-style", looking like they do in HTTP. +

The option to enable headers or to run custom FTP commands may be useful to combine with CURLOPT_NOBODY(3). If this option is set, no actual file content transfer will be performed.

FTP Custom CUSTOMREQUEST -

If you do want to list the contents of a FTP directory using your own defined FTP command, CURLOPT_CUSTOMREQUEST will do just that. "NLST" is the default one for listing directories but you're free to pass in your idea of a good alternative. +

If you do want to list the contents of a FTP directory using your own defined FTP command, CURLOPT_CUSTOMREQUEST(3) will do just that. "NLST" is the default one for listing directories but you're free to pass in your idea of a good alternative.

Cookies Without Chocolate Chips

In the HTTP sense, a cookie is a name with an associated value. A server sends the name and value to the client, and expects it to get sent back on every subsequent request to the server that matches the particular conditions set. The conditions include that the domain name and path match and that the cookie hasn't become too old.

In real-world cases, servers send new cookies to replace existing ones to update them. Server use cookies to "track" users and to keep "sessions".

Cookies are sent from server to clients with the header Set-Cookie: and they're sent from clients to servers with the Cookie: header. -

To just send whatever cookie you want to a server, you can use CURLOPT_COOKIE to set a cookie string like this: +

To just send whatever cookie you want to a server, you can use CURLOPT_COOKIE(3) to set a cookie string like this:

 curl_easy_setopt(easyhandle, CURLOPT_COOKIE, "name1=var1; name2=var2;");

In many cases, that is not enough. You might want to dynamically save whatever cookies the remote server passes to you, and make sure those cookies are then used accordingly on later requests. -

One way to do this, is to save all headers you receive in a plain file and when you make a request, you tell libcurl to read the previous headers to figure out which cookies to use. Set the header file to read cookies from with CURLOPT_COOKIEFILE. -

The CURLOPT_COOKIEFILE option also automatically enables the cookie parser in libcurl. Until the cookie parser is enabled, libcurl will not parse or understand incoming cookies and they will just be ignored. However, when the parser is enabled the cookies will be understood and the cookies will be kept in memory and used properly in subsequent requests when the same handle is used. Many times this is enough, and you may not have to save the cookies to disk at all. Note that the file you specify to CURLOPT_COOKIEFILE doesn't have to exist to enable the parser, so a common way to just enable the parser and not read any cookies is to use the name of a file you know doesn't exist. -

If you would rather use existing cookies that you've previously received with your Netscape or Mozilla browsers, you can make libcurl use that cookie file as input. The CURLOPT_COOKIEFILE is used for that too, as libcurl will automatically find out what kind of file it is and act accordingly. -

Perhaps the most advanced cookie operation libcurl offers, is saving the entire internal cookie state back into a Netscape/Mozilla formatted cookie file. We call that the cookie-jar. When you set a file name with CURLOPT_COOKIEJAR, that file name will be created and all received cookies will be stored in it when curl_easy_cleanup(3) is called. This enables cookies to get passed on properly between multiple handles without any information getting lost. +

One way to do this, is to save all headers you receive in a plain file and when you make a request, you tell libcurl to read the previous headers to figure out which cookies to use. Set the header file to read cookies from with CURLOPT_COOKIEFILE(3). +

The CURLOPT_COOKIEFILE(3) option also automatically enables the cookie parser in libcurl. Until the cookie parser is enabled, libcurl will not parse or understand incoming cookies and they will just be ignored. However, when the parser is enabled the cookies will be understood and the cookies will be kept in memory and used properly in subsequent requests when the same handle is used. Many times this is enough, and you may not have to save the cookies to disk at all. Note that the file you specify to ICURLOPT_COOKIEFILE(3) doesn't have to exist to enable the parser, so a common way to just enable the parser and not read any cookies is to use the name of a file you know doesn't exist. +

If you would rather use existing cookies that you've previously received with your Netscape or Mozilla browsers, you can make libcurl use that cookie file as input. The CURLOPT_COOKIEFILE(3) is used for that too, as libcurl will automatically find out what kind of file it is and act accordingly. +

Perhaps the most advanced cookie operation libcurl offers, is saving the entire internal cookie state back into a Netscape/Mozilla formatted cookie file. We call that the cookie-jar. When you set a file name with CURLOPT_COOKIEJAR(3), that file name will be created and all received cookies will be stored in it when curl_easy_cleanup is called. This enables cookies to get passed on properly between multiple handles without any information getting lost.

FTP Peculiarities We Need

FTP transfers use a second TCP/IP connection for the data transfer. This is usually a fact you can forget and ignore but at times this fact will come back to haunt you. libcurl offers several different ways to customize how the second connection is being made.

libcurl can either connect to the server a second time or tell the server to connect back to it. The first option is the default and it is also what works best for all the people behind firewalls, NATs or IP-masquerading setups. libcurl then tells the server to open up a new port and wait for a second connection. This is by default attempted with EPSV first, and if that doesn't work it tries PASV instead. (EPSV is an extension to the original FTP spec and does not exist nor work on all FTP servers.) -

You can prevent libcurl from first trying the EPSV command by setting CURLOPT_FTP_USE_EPSV to zero. -

In some cases, you will prefer to have the server connect back to you for the second connection. This might be when the server is perhaps behind a firewall or something and only allows connections on a single port. libcurl then informs the remote server which IP address and port number to connect to. This is made with the CURLOPT_FTPPORT option. If you set it to "-", libcurl will use your system's "default IP address". If you want to use a particular IP, you can set the full IP address, a host name to resolve to an IP address or even a local network interface name that libcurl will get the IP address from. -

When doing the "PORT" approach, libcurl will attempt to use the EPRT and the LPRT before trying PORT, as they work with more protocols. You can disable this behavior by setting CURLOPT_FTP_USE_EPRT to zero. +

You can prevent libcurl from first trying the EPSV command by setting CURLOPT_FTP_USE_EPSV(3) to zero. +

In some cases, you will prefer to have the server connect back to you for the second connection. This might be when the server is perhaps behind a firewall or something and only allows connections on a single port. libcurl then informs the remote server which IP address and port number to connect to. This is made with the CURLOPT_FTPPORT(3) option. If you set it to "-", libcurl will use your system's "default IP address". If you want to use a particular IP, you can set the full IP address, a host name to resolve to an IP address or even a local network interface name that libcurl will get the IP address from. +

When doing the "PORT" approach, libcurl will attempt to use the EPRT and the LPRT before trying PORT, as they work with more protocols. You can disable this behavior by setting CURLOPT_FTP_USE_EPRT(3) to zero.

Headers Equal Fun

-

Some protocols provide "headers", meta-data separated from the normal data. These headers are by default not included in the normal data stream, but you can make them appear in the data stream by setting CURLOPT_HEADER to 1. -

What might be even more useful, is libcurl's ability to separate the headers from the data and thus make the callbacks differ. You can for example set a different pointer to pass to the ordinary write callback by setting CURLOPT_WRITEHEADER. -

Or, you can set an entirely separate function to receive the headers, by using CURLOPT_HEADERFUNCTION. +

Some protocols provide "headers", meta-data separated from the normal data. These headers are by default not included in the normal data stream, but you can make them appear in the data stream by setting CURLOPT_HEADER(3) to 1. +

What might be even more useful, is libcurl's ability to separate the headers from the data and thus make the callbacks differ. You can for example set a different pointer to pass to the ordinary write callback by setting CURLOPT_HEADERDATA(3). +

Or, you can set an entirely separate function to receive the headers, by using CURLOPT_HEADERFUNCTION(3).

The headers are passed to the callback function one by one, and you can depend on that fact. It makes it easier for you to add custom header parsers etc.

"Headers" for FTP transfers equal all the FTP server responses. They aren't actually true headers, but in this case we pretend they are! ;-)

Post Transfer Information

@@ -469,31 +470,31 @@ p.roffit {

Clear Text Passwords

Many of the protocols libcurl supports send name and password unencrypted as clear text (HTTP Basic authentication, FTP, TELNET etc). It is very easy for anyone on your network or a network nearby yours to just fire up a network analyzer tool and eavesdrop on your passwords. Don't let the fact that HTTP Basic uses base64 encoded passwords fool you. They may not look readable at a first glance, but they very easily "deciphered" by anyone within seconds. -

To avoid this problem, use HTTP authentication methods or other protocols that don't let snoopers see your password: HTTP with Digest, NTLM or GSS authentication, HTTPS, FTPS, SCP, SFTP and FTP-Kerberos are a few examples. +

To avoid this problem, use an authentication mechanism or other protocol that doesn't let snoopers see your password: Digest, CRAM-MD5, Kerberos, SPNEGO or NTLM authentication, HTTPS, FTPS, SCP and SFTP are a few examples.

Redirects -

The CURLOPT_FOLLOWLOCATION option automatically follows HTTP redirects sent by a remote server. These redirects can refer to any kind of URL, not just HTTP. A redirect to a file: URL would cause the libcurl to read (or write) arbitrary files from the local filesystem. If the application returns the data back to the user (as would happen in some kinds of CGI scripts), an attacker could leverage this to read otherwise forbidden data (e.g. file://localhost/etc/passwd). +

The CURLOPT_FOLLOWLOCATION(3) option automatically follows HTTP redirects sent by a remote server. These redirects can refer to any kind of URL, not just HTTP. A redirect to a file: URL would cause the libcurl to read (or write) arbitrary files from the local filesystem. If the application returns the data back to the user (as would happen in some kinds of CGI scripts), an attacker could leverage this to read otherwise forbidden data (e.g. file://localhost/etc/passwd).

If authentication credentials are stored in the ~/.netrc file, or Kerberos is in use, any other URL type (not just file:) that requires authentication is also at risk. A redirect such as ftp://some-internal-server/private-file would then return data even when the server is password protected.

In the same way, if an unencrypted SSH private key has been configured for the user running the libcurl application, SCP: or SFTP: URLs could access password or private-key protected resources, e.g. sftp://user@some-internal-server/etc/passwd -

The CURLOPT_REDIR_PROTOCOLS and CURLOPT_NETRC options can be used to mitigate against this kind of attack. +

The CURLOPT_REDIR_PROTOCOLS(3) and CURLOPT_NETRC(3) options can be used to mitigate against this kind of attack.

A redirect can also specify a location available only on the machine running libcurl, including servers hidden behind a firewall from the attacker. e.g. http://127.0.0.1/ or http://intranet/delete-stuff.cgi?delete=all or tftp://bootp-server/pc-config-data -

Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION and handling redirects itself, sanitizing URLs as necessary. Alternately, an app could leave CURLOPT_FOLLOWLOCATION enabled but set CURLOPT_REDIR_PROTOCOLS and install a CURLOPT_OPENSOCKETFUNCTION callback function in which addresses are sanitized before use. +

Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION(3) and handling redirects itself, sanitizing URLs as necessary. Alternately, an app could leave CURLOPT_FOLLOWLOCATION(3) enabled but set CURLOPT_REDIR_PROTOCOLS(3) and install a CURLOPT_OPENSOCKETFUNCTION(3) callback function in which addresses are sanitized before use.

Private Resources -

A user who can control the DNS server of a domain being passed in within a URL can change the address of the host to a local, private address which a server-side libcurl-using application could then use. e.g. the innocuous URL http://fuzzybunnies.example.com/ could actually resolve to the IP address of a server behind a firewall, such as 127.0.0.1 or 10.1.2.3. Apps can mitigate against this by setting a CURLOPT_OPENSOCKETFUNCTION and checking the address before a connection. -

All the malicious scenarios regarding redirected URLs apply just as well to non-redirected URLs, if the user is allowed to specify an arbitrary URL that could point to a private resource. For example, a web app providing a translation service might happily translate file://localhost/etc/passwd and display the result. Apps can mitigate against this with the CURLOPT_PROTOCOLS option as well as by similar mitigation techniques for redirections. -

A malicious FTP server could in response to the PASV command return an IP address and port number for a server local to the app running libcurl but behind a firewall. Apps can mitigate against this by using the CURLOPT_FTP_SKIP_PASV_IP option or CURLOPT_FTPPORT. +

A user who can control the DNS server of a domain being passed in within a URL can change the address of the host to a local, private address which a server-side libcurl-using application could then use. e.g. the innocuous URL http://fuzzybunnies.example.com/ could actually resolve to the IP address of a server behind a firewall, such as 127.0.0.1 or 10.1.2.3. Apps can mitigate against this by setting a CURLOPT_OPENSOCKETFUNCTION(3) and checking the address before a connection. +

All the malicious scenarios regarding redirected URLs apply just as well to non-redirected URLs, if the user is allowed to specify an arbitrary URL that could point to a private resource. For example, a web app providing a translation service might happily translate file://localhost/etc/passwd and display the result. Apps can mitigate against this with the CURLOPT_PROTOCOLS(3) option as well as by similar mitigation techniques for redirections. +

A malicious FTP server could in response to the PASV command return an IP address and port number for a server local to the app running libcurl but behind a firewall. Apps can mitigate against this by using the CURLOPT_FTP_SKIP_PASV_IP(3) option or CURLOPT_FTPPORT(3).

IPv6 Addresses

libcurl will normally handle IPv6 addresses transparently and just as easily as IPv4 addresses. That means that a sanitizing function that filters out addressses like 127.0.0.1 isn't sufficient--the equivalent IPv6 addresses ::1, ::, 0:00::0:1, ::127.0.0.1 and ::ffff:7f00:1 supplied somehow by an attacker would all bypass a naive filter and could allow access to undesired local resources. IPv6 also has special address blocks like link-local and site-local that generally shouldn't be accessed by a server-side libcurl-using application. A poorly-configured firewall installed in a data center, organization or server may also be configured to limit IPv4 connections but leave IPv6 connections wide open. In some cases, the CURL_IPRESOLVE_V4 option can be used to limit resolved addresses to IPv4 only and bypass these issues.

Uploads -

When uploading, a redirect can cause a local (or remote) file to be overwritten. Apps must not allow any unsanitized URL to be passed in for uploads. Also, CURLOPT_FOLLOWLOCATION should not be used on uploads. Instead, the app should handle redirects itself, sanitizing each URL first. +

When uploading, a redirect can cause a local (or remote) file to be overwritten. Apps must not allow any unsanitized URL to be passed in for uploads. Also, CURLOPT_FOLLOWLOCATION(3) should not be used on uploads. Instead, the app should handle redirects itself, sanitizing each URL first.

Authentication -

Use of CURLOPT_UNRESTRICTED_AUTH could cause authentication information to be sent to an unknown second server. Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION and handling redirects itself, sanitizing where necessary. -

Use of the CURLAUTH_ANY option to CURLOPT_HTTPAUTH could result in user name and password being sent in clear text to an HTTP server. Instead, use CURLAUTH_ANYSAFE which ensures that the password is encrypted over the network, or else fail the request. -

Use of the CURLUSESSL_TRY option to CURLOPT_USE_SSL could result in user name and password being sent in clear text to an FTP server. Instead, use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or else fail the request. +

Use of CURLOPT_UNRESTRICTED_AUTH(3) could cause authentication information to be sent to an unknown second server. Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION(3) and handling redirects itself, sanitizing where necessary. +

Use of the CURLAUTH_ANY option to CURLOPT_HTTPAUTH(3) could result in user name and password being sent in clear text to an HTTP server. Instead, use CURLAUTH_ANYSAFE which ensures that the password is encrypted over the network, or else fail the request. +

Use of the CURLUSESSL_TRY option to CURLOPT_USE_SSL(3) could result in user name and password being sent in clear text to an FTP server. Instead, use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or else fail the request.

Cookies

If cookies are enabled and cached, then a user could craft a URL which performs some malicious action to a site whose authentication is already stored in a cookie. e.g. http://mail.example.com/delete-stuff.cgi?delete=all Apps can mitigate against this by disabling cookies or clearing them between requests. @@ -502,44 +503,45 @@ p.roffit {

SCP URLs can contain raw commands within the scp: URL, which is a side effect of how the SCP protocol is designed. e.g. scp://user:pass@host/a;date >/tmp/test; Apps must not allow unsanitized SCP: URLs to be passed in for downloads.

Denial of Service -

A malicious server could cause libcurl to effectively hang by sending a trickle of data through, or even no data at all but just keeping the TCP connection open. This could result in a denial-of-service attack. The CURLOPT_TIMEOUT and/or CURLOPT_LOW_SPEED_LIMIT options can be used to mitigate against this. -

A malicious server could cause libcurl to effectively hang by starting to send data, then severing the connection without cleanly closing the TCP connection. The app could install a CURLOPT_SOCKOPTFUNCTION callback function and set the TCP SO_KEEPALIVE option to mitigate against this. Setting one of the timeout options would also work against this attack. -

A malicious server could cause libcurl to download an infinite amount of data, potentially causing all of memory or disk to be filled. Setting the CURLOPT_MAXFILESIZE_LARGE option is not sufficient to guard against this. Instead, the app should monitor the amount of data received within the write or progress callback and abort once the limit is reached. -

A malicious HTTP server could cause an infinite redirection loop, causing a denial-of-service. This can be mitigated by using the CURLOPT_MAXREDIRS option. +

A malicious server could cause libcurl to effectively hang by sending a trickle of data through, or even no data at all but just keeping the TCP connection open. This could result in a denial-of-service attack. The CURLOPT_TIMEOUT(3) and/or CURLOPT_LOW_SPEED_LIMIT(3) options can be used to mitigate against this. +

A malicious server could cause libcurl to effectively hang by starting to send data, then severing the connection without cleanly closing the TCP connection. The app could install a CURLOPT_SOCKOPTFUNCTION(3) callback function and set the TCP SO_KEEPALIVE option to mitigate against this. Setting one of the timeout options would also work against this attack. +

A malicious server could cause libcurl to download an infinite amount of data, potentially causing all of memory or disk to be filled. Setting the CURLOPT_MAXFILESIZE_LARGE(3) option is not sufficient to guard against this. Instead, the app should monitor the amount of data received within the write or progress callback and abort once the limit is reached. +

A malicious HTTP server could cause an infinite redirection loop, causing a denial-of-service. This can be mitigated by using the CURLOPT_MAXREDIRS(3) option.

Arbitrary Headers -

User-supplied data must be sanitized when used in options like CURLOPT_USERAGENT, CURLOPT_HTTPHEADER, CURLOPT_POSTFIELDS and others that are used to generate structured data. Characters like embedded carriage returns or ampersands could allow the user to create additional headers or fields that could cause malicious transactions. +

User-supplied data must be sanitized when used in options like CURLOPT_USERAGENT(3), CURLOPT_HTTPHEADER(3), CURLOPT_POSTFIELDS(3) and others that are used to generate structured data. Characters like embedded carriage returns or ampersands could allow the user to create additional headers or fields that could cause malicious transactions.

Server-supplied Names

A server can supply data which the application may, in some cases, use as a file name. The curl command-line tool does this with --remote-header-name, using the Content-disposition: header to generate a file name. An application could also use CURLINFO_EFFECTIVE_URL to generate a file name from a server-supplied redirect URL. Special care must be taken to sanitize such names to avoid the possibility of a malicious server supplying one like "/etc/passwd", "\autoexec.bat", "prn:" or even ".bashrc".

Server Certificates -

A secure application should never use the CURLOPT_SSL_VERIFYPEER option to disable certificate validation. There are numerous attacks that are enabled by apps that fail to properly validate server TLS/SSL certificates, thus enabling a malicious server to spoof a legitimate one. HTTPS without validated certificates is potentially as insecure as a plain HTTP connection. +

A secure application should never use the CURLOPT_SSL_VERIFYPEER(3) option to disable certificate validation. There are numerous attacks that are enabled by apps that fail to properly validate server TLS/SSL certificates, thus enabling a malicious server to spoof a legitimate one. HTTPS without validated certificates is potentially as insecure as a plain HTTP connection.

Showing What You Do

On a related issue, be aware that even in situations like when you have problems with libcurl and ask someone for help, everything you reveal in order to get best possible help might also impose certain security related risks. Host names, user names, paths, operating system specifics, etc. (not to mention passwords of course) may in fact be used by intruders to gain additional information of a potential target.

Be sure to limit access to application logs if they could hold private or security-related data. Besides the obvious candidates like user names and passwords, things like URLs, cookies or even file names could also hold sensitive data.

To avoid this problem, you must of course use your common sense. Often, you can just edit out the sensitive data or just search/replace your true information with faked data. -

Multiple Transfers Using the multi Interface

-

+

The multi Interface

The easy interface as described in detail in this document is a synchronous interface that transfers one file at a time and doesn't return until it is done. -

The multi interface, on the other hand, allows your program to transfer multiple files in both directions at the same time, without forcing you to use multiple threads. The name might make it seem that the multi interface is for multi-threaded programs, but the truth is almost the reverse. The multi interface can allow a single-threaded application to perform the same kinds of multiple, simultaneous transfers that multi-threaded programs can perform. It allows many of the benefits of multi-threaded transfers without the complexity of managing and synchronizing many threads. +

The multi interface, on the other hand, allows your program to transfer multiple files in both directions at the same time, without forcing you to use multiple threads. The name might make it seem that the multi interface is for multi-threaded programs, but the truth is almost the reverse. The multi interface allows a single-threaded application to perform the same kinds of multiple, simultaneous transfers that multi-threaded programs can perform. It allows many of the benefits of multi-threaded transfers without the complexity of managing and synchronizing many threads. +

To complicate matters somewhat more, there are even two versions of the multi interface. The event based one, also called multi_socket and the "normal one" designed for using with select(). See the libcurl-multi.3 man page for details on the multi_socket event based API, this description here is for the select() oriented one.

To use this interface, you are better off if you first understand the basics of how to use the easy interface. The multi interface is simply a way to make multiple transfers at the same time by adding up multiple easy handles into a "multi stack". -

You create the easy handles you want and you set all the options just like you have been told above, and then you create a multi handle with curl_multi_init(3) and add all those easy handles to that multi handle with curl_multi_add_handle(3). -

When you've added the handles you have for the moment (you can still add new ones at any time), you start the transfers by calling curl_multi_perform(3). -

curl_multi_perform(3) is asynchronous. It will only execute as little as possible and then return back control to your program. It is designed to never block. -

The best usage of this interface is when you do a select() on all possible file descriptors or sockets to know when to call libcurl again. This also makes it easy for you to wait and respond to actions on your own application's sockets/handles. You figure out what to select() for by using curl_multi_fdset(3), that fills in a set of fd_set variables for you with the particular file descriptors libcurl uses for the moment. -

When you then call select(), it'll return when one of the file handles signal action and you then call curl_multi_perform(3) to allow libcurl to do what it wants to do. Take note that libcurl does also feature some time-out code so we advise you to never use very long timeouts on select() before you call curl_multi_perform(3), which thus should be called unconditionally every now and then even if none of its file descriptors have signaled ready. Another precaution you should use: always call curl_multi_fdset(3) immediately before the select() call since the current set of file descriptors may change when calling a curl function. -

If you want to stop the transfer of one of the easy handles in the stack, you can use curl_multi_remove_handle(3) to remove individual easy handles. Remember that easy handles should be curl_easy_cleanup(3)ed. -

When a transfer within the multi stack has finished, the counter of running transfers (as filled in by curl_multi_perform(3)) will decrease. When the number reaches zero, all transfers are done. -

curl_multi_info_read(3) can be used to get information about completed transfers. It then returns the CURLcode for each easy transfer, to allow you to figure out success on each individual transfer. +

You create the easy handles you want, one for each concurrent transfer, and you set all the options just like you learned above, and then you create a multi handle with curl_multi_init and add all those easy handles to that multi handle with curl_multi_add_handle. +

When you've added the handles you have for the moment (you can still add new ones at any time), you start the transfers by calling curl_multi_perform. +

curl_multi_perform is asynchronous. It will only perform what can be done now and then return back control to your program. It is designed to never block. You need to keep calling the function until all transfers are completed. +

The best usage of this interface is when you do a select() on all possible file descriptors or sockets to know when to call libcurl again. This also makes it easy for you to wait and respond to actions on your own application's sockets/handles. You figure out what to select() for by using curl_multi_fdset, that fills in a set of fd_set variables for you with the particular file descriptors libcurl uses for the moment. +

When you then call select(), it'll return when one of the file handles signal action and you then call curl_multi_perform to allow libcurl to do what it wants to do. Take note that libcurl does also feature some time-out code so we advise you to never use very long timeouts on select() before you call curl_multi_perform again. curl_multi_timeout is provided to help you get a suitable timeout period. +

Another precaution you should use: always call curl_multi_fdset immediately before the select() call since the current set of file descriptors may change in any curl function invoke. +

If you want to stop the transfer of one of the easy handles in the stack, you can use curl_multi_remove_handle to remove individual easy handles. Remember that easy handles should be curl_easy_cleanuped. +

When a transfer within the multi stack has finished, the counter of running transfers (as filled in by curl_multi_perform) will decrease. When the number reaches zero, all transfers are done. +

curl_multi_info_read can be used to get information about completed transfers. It then returns the CURLcode for each easy transfer, to allow you to figure out success on each individual transfer.

SSL, Certificates and Other Tricks

 [ seeding, passwords, keys, certificates, ENGINE, ca certs ]

Sharing Data Between Easy Handles

You can share some data between easy handles when the easy interface is used, and some data is share automatically when you use the multi interface.

When you add easy handles to a multi handle, these easy handles will automatically share a lot of the data that otherwise would be kept on a per-easy handle basis when the easy interface is used. -

The DNS cache is shared between handles within a multi handle, making subsequent name resolving faster, and the connection pool that is kept to better allow persistent connections and connection re-use is also shared. If you're using the easy interface, you can still share these between specific easy handles by using the share interface, see libcurl-share(3). +

The DNS cache is shared between handles within a multi handle, making subsequent name resolving faster, and the connection pool that is kept to better allow persistent connections and connection re-use is also shared. If you're using the easy interface, you can still share these between specific easy handles by using the share interface, see libcurl-share.

Some things are never shared automatically, not within multi handles, like for example cookies so the only way to share that is with the share interface.

Footnotes

@@ -548,8 +550,9 @@ p.roffit {

[2]

This happens on Windows machines when libcurl is built and used as a DLL. However, you can still do this on Windows if you link with a static library.

[3] -

The curl-config tool is generated at build-time (on UNIX-like systems) and should be installed with the 'make install' or similar instruction that installs the library, header files, man pages etc. +

The curl-config tool is generated at build-time (on Unix-like systems) and should be installed with the 'make install' or similar instruction that installs the library, header files, man pages etc.

[4] -

This behavior was different in versions before 7.17.0, where strings had to remain valid past the end of the curl_easy_setopt(3) call.

+

This behavior was different in versions before 7.17.0, where strings had to remain valid past the end of the curl_easy_setopt call.

SEE ALSO

+

libcurl-errors, libcurl-multi, libcurl-easy,

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl-tutorial.pdf b/docs/libcurl/libcurl-tutorial.pdf index ab87af13130c4ba597c3f89a6f3093f951805606..564b139bfe0b57c8e2899b77b24a8c599d2fb6c2 100644 GIT binary patch literal 74083 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 Xcv`r7V%$Gqn1&#T+1ceZ, et al. +.\" * Copyright (C) 1998 - 2014, 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 @@ -29,18 +29,24 @@ specific man pages for each function mentioned in here. There are also the \fIlibcurl-share(3)\fP man page and the \fIlibcurl-tutorial(3)\fP man page for in-depth understanding on how to program with libcurl. -There are more than thirty custom bindings available that bring libcurl access -to your favourite language. Look elsewhere for documentation on those. +There are many bindings available that bring libcurl access to your favourite +language. Look elsewhere for documentation on those. -libcurl has a global constant environment that you must set up and -maintain while using libcurl. This essentially means you call +libcurl has a global constant environment that you must set up and maintain +while using libcurl. This essentially means you call \fIcurl_global_init(3)\fP at the start of your program and -\fIcurl_global_cleanup(3)\fP at the end. See GLOBAL CONSTANTS below -for details. +\fIcurl_global_cleanup(3)\fP at the end. See \fBGLOBAL CONSTANTS\fP below for +details. -To transfer files, you always set up an "easy handle" using -\fIcurl_easy_init(3)\fP, but when you want the file(s) transferred you have -the option of using the "easy" interface, or the "multi" interface. +To transfer files, you create an "easy handle" using \fIcurl_easy_init(3)\fP +for a single individual transfer (in either direction). You then set your +desired set of options in that handle with \fIcurl_easy_setopt(3)\fP. Options +you set with \fIcurl_easy_setopt(3)\fP stick. They will be used on every +repeated use of this handle until you either change the option, or you reset +them all with \fIcurl_easy_reset(3)\fP. + +To actually transfer data you have the option of using the "easy" interface, +or the "multi" interface. The easy interface is a synchronous interface with which you call \fIcurl_easy_perform(3)\fP and let it perform the transfer. When it is @@ -51,7 +57,8 @@ The multi interface on the other hand is an asynchronous interface, that you call and that performs only a little piece of the transfer on each invoke. It is perfect if you want to do things while the transfer is in progress, or similar. The multi interface allows you to select() on libcurl action, and -even to easily download multiple files simultaneously using a single thread. See further details in the \fIlibcurl-multi(3)\fP man page. +even to easily download multiple files simultaneously using a single +thread. See further details in the \fIlibcurl-multi(3)\fP man page. You can have multiple easy handles share certain data, even if they are used in different threads. This magic is setup using the share interface, as @@ -90,6 +97,8 @@ Unix-like operating system that ship libcurl as part of their distributions often don't provide the curl-config tool, but simply install the library and headers in the common path for this purpose. +Many Linux and similar sytems use pkg-config to provide build and link options +about libraries and libcurl supports that as well. .SH "LIBCURL SYMBOL NAMES" All public functions in the libcurl interface are prefixed with 'curl_' (with a lowercase c). You can find other functions in the library source code, but @@ -107,27 +116,29 @@ several threads. libcurl is thread-safe and can be used in any number of threads, but you must use separate curl handles if you want to use libcurl in more than one thread simultaneously. -The global environment functions are not thread-safe. See GLOBAL CONSTANTS -below for details. +The global environment functions are not thread-safe. See \fBGLOBAL +CONSTANTS\fP below for details. .SH "PERSISTENT CONNECTIONS" Persistent connections means that libcurl can re-use the same connection for several transfers, if the conditions are right. libcurl will \fBalways\fP attempt to use persistent connections. Whenever you -use \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP, libcurl will -attempt to use an existing connection to do the transfer, and if none exists -it'll open a new one that will be subject for re-use on a possible following -call to \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. +use \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP etc, libcurl +will attempt to use an existing connection to do the transfer, and if none +exists it'll open a new one that will be subject for re-use on a possible +following call to \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. To allow libcurl to take full advantage of persistent connections, you should -do as many of your file transfers as possible using the same curl handle. When -you call \fIcurl_easy_cleanup(3)\fP, all the possibly open connections held by -libcurl will be closed and forgotten. +do as many of your file transfers as possible using the same handle. -Note that the options set with \fIcurl_easy_setopt(3)\fP will be used on -every repeated \fIcurl_easy_perform(3)\fP call. +If you use the easy interface, and you call \fIcurl_easy_cleanup(3)\fP, all +the possibly open connections held by libcurl will be closed and forgotten. +When you've created a multi handle and are using the multi interface, the +connection pool is instead kept in the multi handle so closing and creating +new easy handles to do transfers will not affect them. Instead all added easy +handles can take advantage of the single shared pool. .SH "GLOBAL CONSTANTS" There are a variety of constants that libcurl uses, mainly through its internal use of other libraries, which are too complicated for the @@ -137,18 +148,16 @@ the library code. For example, when libcurl is built for SSL capability via the GNU TLS library, there is an elaborate tree inside that library that describes the SSL protocol. -\fIcurl_global_init()\fP is the function that you must call. This may -allocate resources (e.g. the memory for the GNU TLS tree mentioned -above), so the companion function \fIcurl_global_cleanup()\fP releases -them. +\fIcurl_global_init(3)\fP is the function that you must call. This may +allocate resources (e.g. the memory for the GNU TLS tree mentioned above), so +the companion function \fIcurl_global_cleanup(3)\fP releases them. -The basic rule for constructing a program that uses libcurl is this: -Call \fIcurl_global_init()\fP, with a \fICURL_GLOBAL_ALL\fP argument, -immediately after the program starts, while it is still only one -thread and before it uses libcurl at all. Call -\fIcurl_global_cleanup()\fP immediately before the program exits, when -the program is again only one thread and after its last use of -libcurl. +The basic rule for constructing a program that uses libcurl is this: Call +\fIcurl_global_init(3)\fP, with a \fICURL_GLOBAL_ALL\fP argument, immediately +after the program starts, while it is still only one thread and before it uses +libcurl at all. Call \fIcurl_global_cleanup(3)\fP immediately before the +program exits, when the program is again only one thread and after its last +use of libcurl. You can call both of these multiple times, as long as all calls meet these requirements and the number of calls to each is the same. @@ -173,48 +182,42 @@ your code doesn't know about other parts of the program -- it doesn't know whether they use libcurl or not. And its code doesn't necessarily run at the start and end of the whole program. -A module like this must have global constant functions of its own, -just like \fIcurl_global_init()\fP and \fIcurl_global_cleanup()\fP. -The module thus has control at the beginning and end of the program -and has a place to call the libcurl functions. Note that if multiple -modules in the program use libcurl, they all will separately call the -libcurl functions, and that's OK because only the first -\fIcurl_global_init()\fP and the last \fIcurl_global_cleanup()\fP in a -program change anything. (libcurl uses a reference count in static -memory). - -In a C++ module, it is common to deal with the global constant -situation by defining a special class that represents the global -constant environment of the module. A program always has exactly one -object of the class, in static storage. That way, the program -automatically calls the constructor of the object as the program -starts up and the destructor as it terminates. As the author of this -libcurl-using module, you can make the constructor call -\fIcurl_global_init()\fP and the destructor call -\fIcurl_global_cleanup()\fP and satisfy libcurl's requirements without -your user having to think about it. - -\fIcurl_global_init()\fP has an argument that tells what particular -parts of the global constant environment to set up. In order to -successfully use any value except \fICURL_GLOBAL_ALL\fP (which says to -set up the whole thing), you must have specific knowledge of internal -workings of libcurl and all other parts of the program of which it is -part. - -A special part of the global constant environment is the identity of -the memory allocator. \fIcurl_global_init()\fP selects the system -default memory allocator, but you can use \fIcurl_global_init_mem()\fP -to supply one of your own. However, there is no way to use -\fIcurl_global_init_mem()\fP in a modular program -- all modules in -the program that might use libcurl would have to agree on one -allocator. - -There is a failsafe in libcurl that makes it usable in simple -situations without you having to worry about the global constant -environment at all: \fIcurl_easy_init()\fP sets up the environment -itself if it hasn't been done yet. The resources it acquires to do so -get released by the operating system automatically when the program -exits. +A module like this must have global constant functions of its own, just like +\fIcurl_global_init(3)\fP and \fIcurl_global_cleanup(3)\fP. The module thus +has control at the beginning and end of the program and has a place to call +the libcurl functions. Note that if multiple modules in the program use +libcurl, they all will separately call the libcurl functions, and that's OK +because only the first \fIcurl_global_init(3)\fP and the last +\fIcurl_global_cleanup(3)\fP in a program change anything. (libcurl uses a +reference count in static memory). + +In a C++ module, it is common to deal with the global constant situation by +defining a special class that represents the global constant environment of +the module. A program always has exactly one object of the class, in static +storage. That way, the program automatically calls the constructor of the +object as the program starts up and the destructor as it terminates. As the +author of this libcurl-using module, you can make the constructor call +\fIcurl_global_init(3)\fP and the destructor call \fIcurl_global_cleanup(3)\fP +and satisfy libcurl's requirements without your user having to think about it. + +\fIcurl_global_init(3)\fP has an argument that tells what particular parts of +the global constant environment to set up. In order to successfully use any +value except \fICURL_GLOBAL_ALL\fP (which says to set up the whole thing), you +must have specific knowledge of internal workings of libcurl and all other +parts of the program of which it is part. + +A special part of the global constant environment is the identity of the +memory allocator. \fIcurl_global_init(3)\fP selects the system default memory +allocator, but you can use \fIcurl_global_init_mem(3)\fP to supply one of your +own. However, there is no way to use \fIcurl_global_init_mem(3)\fP in a +modular program -- all modules in the program that might use libcurl would +have to agree on one allocator. + +There is a failsafe in libcurl that makes it usable in simple situations +without you having to worry about the global constant environment at all: +\fIcurl_easy_init(3)\fP sets up the environment itself if it hasn't been done +yet. The resources it acquires to do so get released by the operating system +automatically when the program exits. This failsafe feature exists mainly for backward compatibility because there was a time when the global functions didn't exist. Because it diff --git a/docs/libcurl/libcurl.html b/docs/libcurl/libcurl.html index e1c00f0..c836e8a 100644 --- a/docs/libcurl/libcurl.html +++ b/docs/libcurl/libcurl.html @@ -47,13 +47,14 @@ p.roffit {

NAME

libcurl - client-side URL transfers

DESCRIPTION

-

This is a short overview on how to use libcurl in your C programs. There are specific man pages for each function mentioned in here. There are also the libcurl-easy(3) man page, the libcurl-multi(3) man page, the libcurl-share(3) man page and the libcurl-tutorial(3) man page for in-depth understanding on how to program with libcurl. -

There are more than thirty custom bindings available that bring libcurl access to your favourite language. Look elsewhere for documentation on those. -

libcurl has a global constant environment that you must set up and maintain while using libcurl. This essentially means you call curl_global_init(3) at the start of your program and curl_global_cleanup(3) at the end. See GLOBAL CONSTANTS below for details. -

To transfer files, you always set up an "easy handle" using curl_easy_init(3), but when you want the file(s) transferred you have the option of using the "easy" interface, or the "multi" interface. -

The easy interface is a synchronous interface with which you call curl_easy_perform(3) and let it perform the transfer. When it is completed, the function returns and you can continue. More details are found in the libcurl-easy(3) man page. -

The multi interface on the other hand is an asynchronous interface, that you call and that performs only a little piece of the transfer on each invoke. It is perfect if you want to do things while the transfer is in progress, or similar. The multi interface allows you to select() on libcurl action, and even to easily download multiple files simultaneously using a single thread. See further details in the libcurl-multi(3) man page. -

You can have multiple easy handles share certain data, even if they are used in different threads. This magic is setup using the share interface, as described in the libcurl-share(3) man page. +

This is a short overview on how to use libcurl in your C programs. There are specific man pages for each function mentioned in here. There are also the libcurl-easy man page, the libcurl-multi man page, the libcurl-share man page and the libcurl-tutorial man page for in-depth understanding on how to program with libcurl. +

There are many bindings available that bring libcurl access to your favourite language. Look elsewhere for documentation on those. +

libcurl has a global constant environment that you must set up and maintain while using libcurl. This essentially means you call curl_global_init at the start of your program and curl_global_cleanup at the end. See GLOBAL CONSTANTS below for details. +

To transfer files, you create an "easy handle" using curl_easy_init for a single individual transfer (in either direction). You then set your desired set of options in that handle with curl_easy_setopt. Options you set with curl_easy_setopt stick. They will be used on every repeated use of this handle until you either change the option, or you reset them all with curl_easy_reset. +

To actually transfer data you have the option of using the "easy" interface, or the "multi" interface. +

The easy interface is a synchronous interface with which you call curl_easy_perform and let it perform the transfer. When it is completed, the function returns and you can continue. More details are found in the libcurl-easy man page. +

The multi interface on the other hand is an asynchronous interface, that you call and that performs only a little piece of the transfer on each invoke. It is perfect if you want to do things while the transfer is in progress, or similar. The multi interface allows you to select() on libcurl action, and even to easily download multiple files simultaneously using a single thread. See further details in the libcurl-multi man page. +

You can have multiple easy handles share certain data, even if they are used in different threads. This magic is setup using the share interface, as described in the libcurl-share man page.

There is also a series of other helpful functions to use, including these:

curl_version_info() @@ -65,7 +66,7 @@ p.roffit {

curl_formadd()

helps building an HTTP form POST

curl_formfree() -

free a list built with curl_formadd(3) +

free a list built with curl_formadd

curl_slist_append()

builds a linked list

curl_slist_free_all() @@ -76,30 +77,30 @@ p.roffit {

curl-config is added to make it easier for applications to link with libcurl and developers to learn about libcurl and how to use it.

Run 'curl-config --libs' to get the (additional) linker options you need to link with the particular version of libcurl you've installed. See the curl-config(1) man page for further details.

Unix-like operating system that ship libcurl as part of their distributions often don't provide the curl-config tool, but simply install the library and headers in the common path for this purpose. -

LIBCURL SYMBOL NAMES

+

Many Linux and similar sytems use pkg-config to provide build and link options about libraries and libcurl supports that as well.

LIBCURL SYMBOL NAMES

All public functions in the libcurl interface are prefixed with 'curl_' (with a lowercase c). You can find other functions in the library source code, but other prefixes indicate that the functions are private and may change without further notice in the next release.

Only use documented functions and functionality!

PORTABILITY

libcurl works exactly the same, on any of the platforms it compiles and builds on.

THREADS

Never ever call curl-functions simultaneously using the same handle from several threads. libcurl is thread-safe and can be used in any number of threads, but you must use separate curl handles if you want to use libcurl in more than one thread simultaneously. -

The global environment functions are not thread-safe. See GLOBAL CONSTANTS below for details. +

The global environment functions are not thread-safe. See GLOBAL CONSTANTS below for details.

PERSISTENT CONNECTIONS

Persistent connections means that libcurl can re-use the same connection for several transfers, if the conditions are right. -

libcurl will always attempt to use persistent connections. Whenever you use curl_easy_perform(3) or curl_multi_perform(3), libcurl will attempt to use an existing connection to do the transfer, and if none exists it'll open a new one that will be subject for re-use on a possible following call to curl_easy_perform(3) or curl_multi_perform(3). -

To allow libcurl to take full advantage of persistent connections, you should do as many of your file transfers as possible using the same curl handle. When you call curl_easy_cleanup(3), all the possibly open connections held by libcurl will be closed and forgotten. -

Note that the options set with curl_easy_setopt(3) will be used on every repeated curl_easy_perform(3) call. -

GLOBAL CONSTANTS

+

libcurl will always attempt to use persistent connections. Whenever you use curl_easy_perform or curl_multi_perform etc, libcurl will attempt to use an existing connection to do the transfer, and if none exists it'll open a new one that will be subject for re-use on a possible following call to curl_easy_perform or curl_multi_perform. +

To allow libcurl to take full advantage of persistent connections, you should do as many of your file transfers as possible using the same handle. +

If you use the easy interface, and you call curl_easy_cleanup, all the possibly open connections held by libcurl will be closed and forgotten. +

When you've created a multi handle and are using the multi interface, the connection pool is instead kept in the multi handle so closing and creating new easy handles to do transfers will not affect them. Instead all added easy handles can take advantage of the single shared pool.

GLOBAL CONSTANTS

There are a variety of constants that libcurl uses, mainly through its internal use of other libraries, which are too complicated for the library loader to set up. Therefore, a program must call a library function after the program is loaded and running to finish setting up the library code. For example, when libcurl is built for SSL capability via the GNU TLS library, there is an elaborate tree inside that library that describes the SSL protocol. -

curl_global_init() is the function that you must call. This may allocate resources (e.g. the memory for the GNU TLS tree mentioned above), so the companion function curl_global_cleanup() releases them. -

The basic rule for constructing a program that uses libcurl is this: Call curl_global_init(), with a CURL_GLOBAL_ALL argument, immediately after the program starts, while it is still only one thread and before it uses libcurl at all. Call curl_global_cleanup() immediately before the program exits, when the program is again only one thread and after its last use of libcurl. +

curl_global_init is the function that you must call. This may allocate resources (e.g. the memory for the GNU TLS tree mentioned above), so the companion function curl_global_cleanup releases them. +

The basic rule for constructing a program that uses libcurl is this: Call curl_global_init, with a CURL_GLOBAL_ALL argument, immediately after the program starts, while it is still only one thread and before it uses libcurl at all. Call curl_global_cleanup immediately before the program exits, when the program is again only one thread and after its last use of libcurl.

You can call both of these multiple times, as long as all calls meet these requirements and the number of calls to each is the same.

It isn't actually required that the functions be called at the beginning and end of the program -- that's just usually the easiest way to do it. It is required that the functions be called when no other thread in the program is running.

These global constant functions are not thread safe, so you must not call them when any other thread in the program is running. It isn't good enough that no other thread is using libcurl at the time, because these functions internally call similar functions of other libraries, and those functions are similarly thread-unsafe. You can't generally know what these libraries are, or whether other threads are using them.

The global constant situation merits special consideration when the code you are writing to use libcurl is not the main program, but rather a modular piece of a program, e.g. another library. As a module, your code doesn't know about other parts of the program -- it doesn't know whether they use libcurl or not. And its code doesn't necessarily run at the start and end of the whole program. -

A module like this must have global constant functions of its own, just like curl_global_init() and curl_global_cleanup(). The module thus has control at the beginning and end of the program and has a place to call the libcurl functions. Note that if multiple modules in the program use libcurl, they all will separately call the libcurl functions, and that's OK because only the first curl_global_init() and the last curl_global_cleanup() in a program change anything. (libcurl uses a reference count in static memory). -

In a C++ module, it is common to deal with the global constant situation by defining a special class that represents the global constant environment of the module. A program always has exactly one object of the class, in static storage. That way, the program automatically calls the constructor of the object as the program starts up and the destructor as it terminates. As the author of this libcurl-using module, you can make the constructor call curl_global_init() and the destructor call curl_global_cleanup() and satisfy libcurl's requirements without your user having to think about it. -

curl_global_init() has an argument that tells what particular parts of the global constant environment to set up. In order to successfully use any value except CURL_GLOBAL_ALL (which says to set up the whole thing), you must have specific knowledge of internal workings of libcurl and all other parts of the program of which it is part. -

A special part of the global constant environment is the identity of the memory allocator. curl_global_init() selects the system default memory allocator, but you can use curl_global_init_mem() to supply one of your own. However, there is no way to use curl_global_init_mem() in a modular program -- all modules in the program that might use libcurl would have to agree on one allocator. -

There is a failsafe in libcurl that makes it usable in simple situations without you having to worry about the global constant environment at all: curl_easy_init() sets up the environment itself if it hasn't been done yet. The resources it acquires to do so get released by the operating system automatically when the program exits. +

A module like this must have global constant functions of its own, just like curl_global_init and curl_global_cleanup. The module thus has control at the beginning and end of the program and has a place to call the libcurl functions. Note that if multiple modules in the program use libcurl, they all will separately call the libcurl functions, and that's OK because only the first curl_global_init and the last curl_global_cleanup in a program change anything. (libcurl uses a reference count in static memory). +

In a C++ module, it is common to deal with the global constant situation by defining a special class that represents the global constant environment of the module. A program always has exactly one object of the class, in static storage. That way, the program automatically calls the constructor of the object as the program starts up and the destructor as it terminates. As the author of this libcurl-using module, you can make the constructor call curl_global_init and the destructor call curl_global_cleanup and satisfy libcurl's requirements without your user having to think about it. +

curl_global_init has an argument that tells what particular parts of the global constant environment to set up. In order to successfully use any value except CURL_GLOBAL_ALL (which says to set up the whole thing), you must have specific knowledge of internal workings of libcurl and all other parts of the program of which it is part. +

A special part of the global constant environment is the identity of the memory allocator. curl_global_init selects the system default memory allocator, but you can use curl_global_init_mem to supply one of your own. However, there is no way to use curl_global_init_mem in a modular program -- all modules in the program that might use libcurl would have to agree on one allocator. +

There is a failsafe in libcurl that makes it usable in simple situations without you having to worry about the global constant environment at all: curl_easy_init sets up the environment itself if it hasn't been done yet. The resources it acquires to do so get released by the operating system automatically when the program exits.

This failsafe feature exists mainly for backward compatibility because there was a time when the global functions didn't exist. Because it is sufficient only in the simplest of programs, it is not recommended for any program to rely on it.

This HTML page was made with roffit. diff --git a/docs/libcurl/libcurl.m4 b/docs/libcurl/libcurl.m4 index d7d5a52..2cf3edd 100644 --- a/docs/libcurl/libcurl.m4 +++ b/docs/libcurl/libcurl.m4 @@ -1,3 +1,24 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 2006, David Shaw +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], # [ACTION-IF-YES], [ACTION-IF-NO]) # ---------------------------------------------------------- @@ -153,7 +174,7 @@ int x; curl_easy_setopt(NULL,CURLOPT_URL,NULL); x=CURL_ERROR_SIZE; x=CURLOPT_WRITEFUNCTION; -x=CURLOPT_FILE; +x=CURLOPT_WRITEDATA; x=CURLOPT_ERRORBUFFER; x=CURLOPT_STDERR; x=CURLOPT_VERBOSE; diff --git a/docs/libcurl/libcurl.pdf b/docs/libcurl/libcurl.pdf index 4099137b02dd02b4957ebe1c6111c25128fdcf6f..387509809c59bc6e725a9f7e0696ce693e757068 100644 GIT binary patch delta 11019 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 D`>0Q` delta 10138 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size); +.SH DESCRIPTION +Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently +processing a chunked (Transfer-encoding: chunked) request with a current chunk +length larger than \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP, that pipeline +will not be considered for additional requests, even if it is shorter than +\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP. +.SH DEFAULT +The default value is 0, which means that the penalization is inactive. +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE "(3), " +.BR CURLMOPT_MAX_PIPELINE_LENGTH "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html new file mode 100644 index 0000000..7650c00 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html @@ -0,0 +1,60 @@ + + +CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE man page + + + + +

NAME

+

CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE - chunk length threshold for pipelining

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);

DESCRIPTION

+

Pass a long with a size in bytes. If a pipelined connection is currently processing a chunked (Transfer-encoding: chunked) request with a current chunk length larger than CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, that pipeline will not be considered for additional requests, even if it is shorter than CURLMOPT_MAX_PIPELINE_LENGTH.

DEFAULT

+

The default value is 0, which means that the penalization is inactive.

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_PIPELINING, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_PIPELINE_LENGTH,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8584f68be1a53bd684ce00a9a23b9d3efaa98faf GIT binary patch literal 4079 zcmb_feOy!J9?w#=bA@~%^b+C`g(q|}UjDb4P4#t;`HW+Eb0wZc8P7^9ZOX&!O0>Ri2{jbcDyUOCT?(2T2+R$(>c<9^-q1(g1 zzY%mhDBHK$&n^5E{#@~{J2w;W$x&*1D)*L zwZXv^lK5-@T+^vvTYECMKCIrz z>iM{F=_@G<_q<-69W3|iYS$-3%gUDPFF>{>+rE0p30VCr?%Ub|-4t~XrxrwaEZe9v zVqSHMS>7M-Ti)rRj4UlXQ`A+cN&48*7KZG3u)p)3;?8UBQ8}|B4)|5Q!+UQ`it2MV z8C90Qs^_~%TO_jkA!ptDny^(m_b~r4GdGhbZt>8FuU97znQ-Pv^l`}3&SJ`ZeZme1-bz_R$MVX(sTUdUnp*sKghUs?^xRKpN3Yn9>UkN zj_Jr2&l{;;t2?%I9MO3Rn?|O3l^pwIe5uE$qtDi#HD7i4;+h)z?afBv+RC~QY8r~W z>ONfTnf9G%&iLhpRM_Qc%Waj7lP$i|WzVWhDj1D#KQwb_`ycgZvhqCr)|?uV|6}y7 zA$jiVMj}&x%FsLtscG;osdU}3B&fo;by)2Bu#&i@269W_?(WHFhiKsAHB-OM`>ecf zp{gj6Qg<6leeQj;b^6Fwv#h8-@5E&PqywI{D=P0sZeJ`vNa^3tHXpdpEp7Rnb@2FcufeeA{48$O(nQR{a-B7bqQdiUINRb=O=w0SFy!NV%t zhKt6n7?sOzQPjj1jagDXEL|V?!Y_NzG?wNRLl?u>3#*j2B;&cf!z;YSjbHDLLWFWaLIrq^B3a^1(1`*?}yU3`DOx%!ZQd&L+A{+ zlCs0eD7Y3#1hAOTO@WXYiUz<6qkzjokTlF=P#2I1D`m522`j+kC<~>HCFo=XAU2G| z5q28L&9Kv9u?|rT>lIN`Kpf*begKF@LcwpK(F!xr9s>cA(?7;UFVq8Vz(LsIp%q4E z8+2AU8Djj8fl^?g!N#Z@Aj+6>z7oBXp*W2jsf<1qPVY4YjqAV-jP>g3w=H^HL4Oz! z5*ej|F@?hEq$4V)sTdK&$i?)lafI1-i=hz4BsB(!kwB8(gBTJ&A;EAsC6u_8V6uh8 z8BBzg9S%Y;XdS6Q7&3&!+R|yJa!icCrM|>5x}UB>Nf~v2K>_2_(-p)}CY&6oVFn4F zS_7E@V~(8uH{GU)XLXerP`$q**uAtnQ9v!?V%s<32(}$Jv-OU(!U_{st=uOxCPMAQFxaJbli38C2ezAxq*ZE{vm7E) zaAwE|3wE&3S#nmQCJLr0%9v%KVJ=6)!Ppot5Y}686Olt%vS5rOWC4{Hon9IP=B8I6 z_$6m$(zIEMAUQcXoE#p9vSc8bL?S^@F2d!q0SDVUpQLd+o3u^__8g8F5+8|?R*u6b zj+QbZhC~G8ph%w~6$r;-Fw+K#gc-wlI%T8fESt@slZsGoxk2U)>;Mgy|*tn-DN zHJbmOF_VdDX@*a#qO>*>!0T|;|I;wfy2d)~BZtj4i_tM1IxRvN3C1@oC^H5;)@h}B z%3{JnZ{ub&08gB0c?9$%OCbZ7w1GAf3dih)80p@F(ZI}-)QFQAa+aN~16^-3(kw+h z>EPD&R>Npe^d1~?NWZS9)XG5uvkl6IJVFiy1V5wi*(vIWOYpeKSvd?Cg45%h1oLn^ z(YSA}r#@}0r-7H9nG%q2W=^K6q|A_^7%E03nAkC2EEHt{HZX^O!r`2TsZX1iX^);_ zyM@q0D2xdp2C#ZRSSS$i1h5`<(lCJ-ypGHVlYKNEUj%}BoQ4T_;30m3#uE*qp&+Kg ze1buIm{0&#j3@L-Q1H+`K@;=AJNg7oBpPf(2sX1peB8k_iDZy3T$Dc`2ebt@7zqpb zhZ;s=4Y>r!9}KoV3M^Eh(lIa+PU, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size); +.SH DESCRIPTION +Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently +processing a request with a Content-Length larger than this +\fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP, that pipeline will then not be +considered for additional requests, even if it is shorter than +\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP. +.SH DEFAULT +The default value is 0, which means that the size penalization is inactive. +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html new file mode 100644 index 0000000..b488190 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html @@ -0,0 +1,60 @@ + + +CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE man page + + + + +

NAME

+

CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE - size threshold for pipelining penalty

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);

DESCRIPTION

+

Pass a long with a size in bytes. If a pipelined connection is currently processing a request with a Content-Length larger than this CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, that pipeline will then not be considered for additional requests, even if it is shorter than CURLMOPT_MAX_PIPELINE_LENGTH.

DEFAULT

+

The default value is 0, which means that the size penalization is inactive.

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_PIPELINING, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3740c06a59ece0eca06079c414d631abc1ce8c4c GIT binary patch literal 4035 zcmb_fc~}!?8kbe8ju*Bn)B{Ha2Zdy2awn3YB!DO>F&rX@I7ucjHOa)82?X(It=0?c zN$cHJi?S+K1*;-;)wYjEDQYdX9#Aa{WvkWJqaLfJ-y}g0*=_fEoPYT8e(!z!zLyY# zE=GV0B~Zx8o6EOCQW%42)0(;QiB7f>FZh6=3i;5H2jM~X`*3j~j@Oh4s{G~rde>3I%+{O&Z zZ_3k^wW$rSFNu0L>bgm2n3J-zTAhcA2e`Z<%rZ~Yd%2^}?={zN*DJ~}cC zd3xneRQ%!uedB{ol@)cX7j_au$>CeZ`9+(q?@}!+=vFyf!gbta6dAK#>lZuwX7__} z_rr}%Lw+GTD<|YcLsmmf!$Q|WZ1g+AM5fWV+U`&TRQjDm*l?8xO=51o|HU3ej_tUan~>)Z13zv zv&!O!e%W(=&_0&ze}022We=nrb9QNvDl+Y-y{T_M$S$IVKMx-i5#FhL=5gY!B|VdN z?LEZId7N_K_O?f-Z4vsDt98j8DvjU!|7U#th26uGUMu-`@OM2I2oLTwSbNQ_ydgc) zW8T(FNLS|=b#3;TqKmO>nVa}8F-JyT%x?%OpRPnnAS~%K2CFMlIROwpd*Op$R53gC&R44o_u8|9wx{>O!sE#S z0UfqprTq_F+>lXojSjvr^mg|_^GmF~j(xaHgKn>*EQ@m1E$vvlSP_Iw)Gqcry5od@ z(tt%dv9ne5hed8te+{ZmbHN^v0b;;>`f4z13@~Zozk_+UUR&<6(mk!u5c+0{; zeUB1>t%q2E;d+96v&Q=#2djIrpx8mGDQT(jo z6>&>O)ZoXG#?8xlV`Kae0U3eQ`o1-xOTp~*+b@LW*Y1BtGR(PjGJnfbf?=FO6$)dU25M>Vun+tG>`J?{i;LHt@+;%7M|@ea|9K zNB&x{q^j!7nQND4+_~O4rN?73Eam6=v2(>cE91YLVb(0Tnr~k>sCLwt^}*Nd^c=r| z=AmVc+lDU;nt`*`8+voWpQirn;+u_OXXbAyAk6r&&$_1(c~AFs7k2xHqQ_W$Q-j~W zcSaGPH4rg@=Wg5x95-ZQzrID^-u~rLz_N2Ck4T5b2WQ~KLm&@){9jxo!XY0`(gKf3 zc}@~F5LqOuCoL2aMZ4j23|vcR^jtrPjZ9>+`zb3 zSBq`=^9owRfY1bk9>z5qpOc=be5Q5@jb@K^zEyGJ8^i@?;22beTB5a(s-yrRK!(y4zO~McXWYK>_bm`wEP- zop7|)5bXfZC*{b3aZgVFn@gTspGw|av{??-QC2GnS_BFJhf>p z+FZ4k_*3=q%`ZGImdG?3U-L&qx}Ai1I?2H%GK+Gkk=sZ9iNKUajZBj2F}+huW>e#4 zGGyY+HWif8Qdzj-DwBS1H0`u z2di?c5s!!poOv>ez#bNEx*AE<8(@y6ZPO_Z773L?T!4$iVJkz}$y}P54&y=@0#q^< ztI7!G#;XwgQX|qHS1hENEEHENl_(}cMIr&<5U_a;j&KVc>~LVu;|P`d zOw7RwJw6G|v>l~VQCx_j&4zR!9ENgo6zza{!-R=;acacnqAV&oCNfDCWy)T;MIxctYtbX-!rFlM;jyAjO0I%b8|4+lb>>69l&m4BT7@KE0EM}Cnk-Tp#C^HT` zwwP5`nz0k0w+W{cfG5GXJPLXe(L{htj^b>j#xr|kZJhUDqxe};*$79L8gUCOq?K^l zI7E}|@Niqa)v!?-@4+L7w&-f7Rvr?VZBRD!8FFYK_$7TWPf-h8g2zpbzZEvhcf|s425|D6yPC|7me#kH!Q(#J5;h8T4!w|p*=I~EAeA5ux-n@)_ z_7uAr(h6ZPE`@l&@_w*PDiup%E9|4;QVCcy_z!k8)5H=Hc<`R5;SvQ{ncC3Aq8Dfw zi0MT>>;*nt#y|aS^eJRu?Px=jE5YmCmL>-KOdFa^+73 z;Gbj|O{8X$Ab&8}_GqwBfl3=;G|pkAVeh(z#_8bn2xW{!rxQtWi98CE%H+66B9dt3 kVy#pwk?NFUo#xLuGWcDM, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_MAXCONNECTS \- set size of connection cache +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAXCONNECTS, long max); +.SH DESCRIPTION +Pass a long indicating the \fBmax\fP. The set number will be used as the +maximum amount of simultaneously open connections that libcurl may keep in its +connection cache after completed use. By default libcurl will enlarge the size +for each added easy handle to make it fit 4 times the number of added easy +handles. + +By setting this option, you can prevent the cache size from growing beyond the +limit set by you. + +When the cache is full, curl closes the oldest one in the cache to prevent the +number of open connections from increasing. + +This option is for the multi handle's use only, when using the easy interface +you should instead use the \fICURLOPT_MAXCONNECTS(3)\fP option. + +See \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP for limiting the number of active +connections. + +.SH DEFAULT +See DESCRIPTION +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.3 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), " +.BR CURLOPT_MAXCONNECTS "(3), " + diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.html b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.html new file mode 100644 index 0000000..aa7bfba --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.html @@ -0,0 +1,66 @@ + + +CURLMOPT_MAXCONNECTS man page + + + + +

NAME

+

CURLMOPT_MAXCONNECTS - set size of connection cache

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAXCONNECTS, long max);

DESCRIPTION

+

Pass a long indicating the max. The set number will be used as the maximum amount of simultaneously open connections that libcurl may keep in its connection cache after completed use. By default libcurl will enlarge the size for each added easy handle to make it fit 4 times the number of added easy handles. +

By setting this option, you can prevent the cache size from growing beyond the limit set by you. +

When the cache is full, curl closes the oldest one in the cache to prevent the number of open connections from increasing. +

This option is for the multi handle's use only, when using the easy interface you should instead use the CURLOPT_MAXCONNECTS option. +

See CURLMOPT_MAX_TOTAL_CONNECTIONS for limiting the number of active connections. +

DEFAULT

+

See DESCRIPTION

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.16.3

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPT_MAXCONNECTS, +

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.pdf b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..75fab1e0326e6355b2944184bc7abd17260611a2 GIT binary patch literal 4199 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 L^YRLf6x03#j8nkd literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 new file mode 100644 index 0000000..7789347 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 @@ -0,0 +1,54 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max); +.SH DESCRIPTION +Pass a long to indicate \fBmax\fP. The set number will be used as the maximum +amount of simultaneously open connections to a single host. For each new +session to a host, libcurl will open a new connection up to the limit set by +\fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP. When the limit is reached, the +sessions will be pending until a connection becomes available. If +\fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to pipeline if the +host is capable of it. + +The default \fBmax\fP value is 0, unlimited. However, for backwards +compatibility, setting it to 0 when \fICURLMOPT_PIPELINING(3)\fP is 1 will not +be treated as unlimited. Instead it will open only 1 connection and try to +pipeline on it. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_MAXCONNECTS "(3), " CURLMOPT_MAX_TOTAL_CONNECTIONS "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.html b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.html new file mode 100644 index 0000000..ddcb77e --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.html @@ -0,0 +1,61 @@ + + +CURLMOPT_MAX_HOST_CONNECTIONS man page + + + + +

NAME

+

CURLMOPT_MAX_HOST_CONNECTIONS - set max number of connections to a single host

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max);

DESCRIPTION

+

Pass a long to indicate max. The set number will be used as the maximum amount of simultaneously open connections to a single host. For each new session to a host, libcurl will open a new connection up to the limit set by CURLMOPT_MAX_HOST_CONNECTIONS. When the limit is reached, the sessions will be pending until a connection becomes available. If CURLMOPT_PIPELINING is enabled, libcurl will try to pipeline if the host is capable of it. +

The default max value is 0, unlimited. However, for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING is 1 will not be treated as unlimited. Instead it will open only 1 connection and try to pipeline on it.

DEFAULT

+

0

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_MAXCONNECTS, CURLMOPT_MAX_TOTAL_CONNECTIONS,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.pdf b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b1dbd314b46f964a583ba7b36f5342ac09deaaa GIT binary patch literal 4209 zcmb^!d0Z1$T171zRHWk3dN4vEfF?7OizGrQn`GOydc13)_`dy_f&BP7 ze&giy4Dam93ftuq(j~c_HMxRB;mX|5lpP;vgQ6DVpI@#+lu|>joOQ=hTkpUYoOM%7@%bwYSG@Pi-3bBx!SMT}J;~SuXb#+gx@|e|WF& z$MqW!r*KK{<-V{7kGF7FiNj)NR+ZGRwiC=PK5xUM6t9@&l+ocj-gv?^AN!l5r)_!* zBe<1)K+#l8a{DTCw`xqG+jzU_d-v=lwQyADZXTwOZ%l~aylB6$e1gwER(@3B+L2B3 zb8shR&ga)()k&&7{+(39fJ21(oy{?;l>^anxjiR6Y=k*+@42=Yzx(O=wh-!xuHSZW zS5)$8=|4-To8C{;`9+jcZQkuW60My)AW6X5bLbZ?k(*yH%D>_1X`8!h0X-+rQDpu& zp4!kpBwr?P&MC>SZmnMR!|Z$R`-PQ0 zwn0x}($wlS%bP=O9wd;05VA9P7n*CnC2CH@(jTiD)xQJ;hGsfVJT-Mk*2D&fiJsYYOR@^ui#xubEzG4w zgdI6HAzgQ|yrng==)NeVbWW*xYjHWLEYG=I@0AO=(mnX>-T$1O0~N$5tKQ6-?)Tc< z0p|S$%d#HtI}|ZvtxJ9ka@~k4*X|$lv4d?1mc8XP*?mTJ!nxQUF{+s2_Vw+y6ZfMQ z9WBhRi)(7~T3K8v_G~K|$2OHWIMn|X{6;WNLbPsUs~?&i-{(w9>9srmYk6Gun9N4y z?Bze1@=7kJeE;;rpVo`EWFGzEX#jR;RsOiGrB4qose8S5vcUnbrPKHS=wkowdEfpE z;a3#Xw(oVxAN$y*)7fzvHLo@24a1qpOSK-bCsVMX>+>@$7na&Enwyu1w)l65OPx1y zmi&HneDeVlmesc`?Bv6a)ZmK!SB`wNy}Zn+H+4_Pwv$9L^~bEg zZtqc3`Li^hcD$f_#oB!eHhl2$lwBL<)%M(oqCaZsIhaSeo7zB0_~gyfGv%E(?%w*| zdDa2Pla=N68K%P3TQ6zi>>|nQ{@AVO3bP)1vgd8{@p!bLYSk`sLLsa7^y!-VlmPO^ zw#JIUcK#x^cb;LKmuy3ypG{Eb-JTo~=h|QoykzlC~2dy1K0G0vM;t-wa`v8m? zbtZ!xGlGdAG3ewW7#;zGnE}C}m>CCjLNgu^Vj)G*K@yP;kfSuq2N)7CAAAFjMu-?L zQW5}J^&>>8Sw%79vhRqCz! zL*fix*d+D~6a6cHbe&tR7xcVQVQfy1PS$` z!y1*=WQ-cN#uA&6q(e~~wm)1PG_;SPbOwvZvnIc{uURjX$747YgT<<}KIESpj*}sk z!iOBj6eD6iAB$7HlWf33l9z_cljG$a1=*KJ^7fU1n!zY$nVzDwEH*|6Gs=CO`O+Yf zGl5{{nl*Y2NFK ziZMxx%ghw5(FMq}D545~My54VEjm%NzU zgTf@o3_j!lNe~ner!(S%@*xftVUc00`L9YV5S!7x00L@tgEzq8ib3KklLVlx@n{Ij zq#!5-VTU3dF3RSj^aTjYMG$ZJ1xyfpK*|S;Em(B_0_h0M5u`dpC`bujtU;$#LJ63` zNJIjq(r8rrphOFq70VkYVl=`#ui9TSy;%IeJ*LqRDNW#U1vp}CB5h)LYoFwzS!6UB1)fmrG zdwyzs@S;``wZv7+w6Q*9GevJ) literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 new file mode 100644 index 0000000..c2adb45 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max); +.SH DESCRIPTION +Pass a long. The set \fBmax\fP number will be used as the maximum amount of +outstanding requests in a pipelined connection. Only used if pipelining is +enabled. + +When this limit is reached, libcurl will use another connection to the same +host (see \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP), or queue the request until +one of the pipelines to the host is ready to accept a request. Thus, the +total number of requests in-flight is \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP * +\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP. +.SH DEFAULT +5 +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_MAX_HOST_CONNECTIONS "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.html b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.html new file mode 100644 index 0000000..f543112 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.html @@ -0,0 +1,61 @@ + + +CURLMOPT_MAX_PIPELINE_LENGTH man page + + + + +

NAME

+

CURLMOPT_MAX_PIPELINE_LENGTH - maximum number of requests in a pipeline

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max);

DESCRIPTION

+

Pass a long. The set max number will be used as the maximum amount of outstanding requests in a pipelined connection. Only used if pipelining is enabled. +

When this limit is reached, libcurl will use another connection to the same host (see CURLMOPT_MAX_HOST_CONNECTIONS), or queue the request until one of the pipelines to the host is ready to accept a request. Thus, the total number of requests in-flight is CURLMOPT_MAX_HOST_CONNECTIONS * CURLMOPT_MAX_PIPELINE_LENGTH.

DEFAULT

+

5

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_PIPELINING, CURLMOPT_MAX_HOST_CONNECTIONS,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.pdf b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.pdf new file mode 100644 index 0000000..08373e2 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.pdf @@ -0,0 +1,111 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ…VÛnÛF}çW ЇRµÙåhQ@qØX Mª ¢B ©µÅ‚[$›æ#ú)ýÇÎ.¹ºÙV`Ø´³3gÎÙ9ãG „?ÃgVj¯ç.Ü7…{íQcò†¬„7 xâ‹äNëï0p p}“x>$¥öU¿¼™‡×ñ,Y]O>¯fÓYN£`Ñ»äj©›ËÑȦŒØÔ׳n[¬Ê®hóUÃÛú¡üÍëªÙEü8ןÉ{mL‰Á°z†à|G|[à3HBM&£Ÿ±%Ó8@}f÷ä?ÓÀ,1’~ŸxvO>#¾áBòMӛÉ• $|ϘÈä1bø–?h†èND3ˆk»Ãé Å·¼(à–C×ð5¤ ´˜Wɕ–uWµB®ºk›yɱé#édKŒ™Ä§†ê‚J¬JÓ5duUñLO®ga |Ì{Ñǒ=ô¦{”Ùž÷d-_Dîª fû:ù“}s”86S/nNÞLÃiòåDk›˜–ç;Òd½¾SKLJèù^¿êó ¹™GðqÄL‹øÓ'áM 7ès-c> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:13+01:00 +2015-01-08T09:18:13+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001425 00000 n +0000003315 00000 n +0000001366 00000 n +0000001206 00000 n +0000000015 00000 n +0000001186 00000 n +0000001490 00000 n +0000001744 00000 n +0000001679 00000 n +0000001611 00000 n +0000001531 00000 n +0000001561 00000 n +0000001826 00000 n +0000001892 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [<4EDD1116ACCC9D1C522F25B0E47AB18F><4EDD1116ACCC9D1C522F25B0E47AB18F>] +>> +startxref +3469 +%%EOF diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 new file mode 100644 index 0000000..2783a7d --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, long amount); +.SH DESCRIPTION +Pass a long for the \fBamount\fP. The set number will be used as the maximum +number of simultaneously open connections in total using this multi +handle. For each new session, libcurl will open a new connection up to the +limit set by \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP. When the limit is +reached, the sessions will be pending until there are available +connections. If \fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to +pipeline if the host is capable of it. +.SH DEFAULT +The default value is 0, which means that there is no limit. It is then simply +controlled by the number of easy handles added. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_MAXCONNECTS "(3), " CURLMOPT_MAX_HOST_CONNECTIONS "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.html b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.html new file mode 100644 index 0000000..317a962 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.html @@ -0,0 +1,60 @@ + + +CURLMOPT_MAX_TOTAL_CONNECTIONS man page + + + + +

NAME

+

CURLMOPT_MAX_TOTAL_CONNECTIONS - max simultaneously open connections

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, long amount);

DESCRIPTION

+

Pass a long for the amount. The set number will be used as the maximum number of simultaneously open connections in total using this multi handle. For each new session, libcurl will open a new connection up to the limit set by CURLMOPT_MAX_TOTAL_CONNECTIONS. When the limit is reached, the sessions will be pending until there are available connections. If CURLMOPT_PIPELINING is enabled, libcurl will try to pipeline if the host is capable of it.

DEFAULT

+

The default value is 0, which means that there is no limit. It is then simply controlled by the number of easy handles added.

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_MAXCONNECTS, CURLMOPT_MAX_HOST_CONNECTIONS,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56dfdf4d2369d170efc3b863adfaf1b96c2d26cd GIT binary patch literal 4098 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 KzM(N;(0>5xteHpv literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3 new file mode 100644 index 0000000..c1df1d5 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3 @@ -0,0 +1,57 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_PIPELINING 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_PIPELINING \- enable/disable HTTP pipelining +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, bool onoff); +.SH DESCRIPTION +Set the \fBonoff\fP parameter to 1 to make libcurl use HTTP pipelining for +HTTP transfers done using this multi handle, as far as possible. This means +that if you add a second request that can use an already existing connection, +the second request will be \&"piped" on the same connection rather than being +executed in parallel. + +When using pipelining, there are also several other related options that are +interesting to tweak and adjust to alter how libcurl spreads out requests on +different connections or not etc. +.SH DEFAULT +0 (off) +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_MAX_PIPELINE_LENGTH "(3), " +.BR CURLMOPT_PIPELINING_SITE_BL "(3), " +.BR CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE "(3), " +.BR CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE "(3), " +.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), " +.BR CURLMOPT_MAXCONNECTS "(3), " +.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.html b/docs/libcurl/opts/CURLMOPT_PIPELINING.html new file mode 100644 index 0000000..c56205c --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.html @@ -0,0 +1,61 @@ + + +CURLMOPT_PIPELINING man page + + + + +

NAME

+

CURLMOPT_PIPELINING - enable/disable HTTP pipelining

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, bool onoff);

DESCRIPTION

+

Set the onoff parameter to 1 to make libcurl use HTTP pipelining for HTTP transfers done using this multi handle, as far as possible. This means that if you add a second request that can use an already existing connection, the second request will be "piped" on the same connection rather than being executed in parallel. +

When using pipelining, there are also several other related options that are interesting to tweak and adjust to alter how libcurl spreads out requests on different connections or not etc.

DEFAULT

+

0 (off)

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.16.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_MAX_PIPELINE_LENGTH, CURLMOPT_PIPELINING_SITE_BL, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_HOST_CONNECTIONS, CURLMOPT_MAXCONNECTS, CURLMOPT_MAX_HOST_CONNECTIONS,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.pdf b/docs/libcurl/opts/CURLMOPT_PIPELINING.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2166f2d40c180d41381a50395ffc06fd3766affb GIT binary patch literal 4003 zcmb_fdsGuw8t*DS)X^4XIh2R!RD^(%%uL=1NhnW2iSmXPp$^FerX-n=OeBECC*Z+W ztZXe5v52pVuZjutyZi`3-w^dXBQV`_f80c;%;}(@&1!L-~ArH`#o>G zqeH{l7>5see|@vG1`@z1Or^gI$z(_rq0gW*VIiQzBH^T#CX6r=uEl90lu%J>LZN_6 zw2{DdkY&@}#1vCyqGQ2@{Xa&|DB=Dvsn_u766sbkKXGNyVFTxIfV=;?bf+oYYU#t6 z$E98J<@zO^GMew?b-Hfw_ka9en19yIzDm($&K6m+uN~i+SKYGn?~j-74*89FTP%mVtY(E#1P4%URs|vS**&L%-JB4&TgdZ2NUBfASUi%8as$1qPyKLRKJga^^cboeI3)PCM&x zeZR0Jo!6j{;B%_xaj<+F0K*KE!8nBI4#nf(;;eN6ND z2=ACTCg1A@n6T$?Pms?$ z>+|DTkB|B&Pt`-(Qny<}??)JG&;3-#KD`m1*WQ;c*JhQKt!T7|Cj8DI5w z9PjTt)76`vvHa^4^m28uZp+aUX$kwndxvVncg)>bnYnHCt_>c|tL_LTRTo|Qi?7Ub zZQf*8Hqc#A^jQ_&WS<~i&{6N-fj7CGAhzU3a19yi`qM{6yJ-`x#qd=9^7^6 z%Fo-sbm(5};_3g%UgyfL9L3Pt{=j9^2d?!E++5DTfYrZ&)2T}W9J-ii17RDzkqo#qvuZqxM%H{TAaew%$Qx4~?~p@CeOg`OK{6~!2ZKqQ<3;uvQA0G%5N0pCEQ z31&KeECfh4e2j_V2>`SKfUp&z2}b6VY7?9SG5BMlR2XP5Gb+c3GTLp!V^}f-r*SQn zF`~kTUP;in8l1q`Fk#fT=xGI`*MN|P(MlLoC~P3Dx3Zav6+w(#?5G;+HAhY*kc2r! zV#Sd7X*Py#;|j)21mhtjp41U0b}*$?TQ6^Q8-&D}(`hDF%&h>35mzz#p06O5(&75C z8p8BoWRm&}7~@*e{0EKJQ=3Z07&0PoAKV1fygNJ#I@Fizu(zHQ}AUQcXoE#p9GG-u{L?S^@F2d!q0SDWZtEX`bTW|6L_N+k26jTczQqvoVa& zuu-tsYMxk)6R29mO&5-sGmL@xls#|&4Dx^) z8BP#+dQZc--$|0k=o)ar83DhoKjE-dgYWa| z#qY`Nv=|8ugu)mfVj9-)f`tMBPXKFR8x0dOlZaWceuT#3W8gjWGz|k{<7hm|I2sD> zG@eg1jt>)xz$|~phFCBT3nmhe=M!OIAU`83;*Y0Ec;F5544-5yX4;68TEYna1j9%i znMVL$!Qd%If!7W*ykR6#uc2V;Acv61P&h><;Y-9JU@C_S_+i0(9vUtbgrdR_J}Tr& gFrI*?_;Zd_<{@RGaU*RF5KkaNA#d-nh2hY@0i%V5Z~y=R literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 new file mode 100644 index 0000000..ae39312 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 @@ -0,0 +1,60 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_PIPELINING_SERVER_BL 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers); +.SH DESCRIPTION +Pass a \fBservers\fP array of char *, ending with a NULL entry. This is a list +of server types prefixes (in the Server: HTTP header) that are blacklisted +from pipelining, i.e server types that are known to not support HTTP +pipelining. The array is copied by libcurl. + +Note that the comparison matches if the Server: header begins with the string +in the blacklist, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can +both be blacklisted by having "Ninja" in the backlist. + +Pass a NULL pointer to clear the blacklist. +.SH DEFAULT +The default value is NULL, which means that there is no blacklist. +.SH PROTOCOLS +.SH EXAMPLE +.nf + server_blacklist[] = + { + "Microsoft-IIS/6.0", + "nginx/0.8.54", + NULL + }; + + curl_multi_setopt(m, CURLMOPT_PIPELINE_SERVER_BL, server_blacklist); +.fi +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_PIPELINING_SITE_BL "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.html b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.html new file mode 100644 index 0000000..2193b7d --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.html @@ -0,0 +1,72 @@ + + +CURLMOPT_PIPELINING_SERVER_BL man page + + + + +

NAME

+

CURLMOPT_PIPELINING_SERVER_BL - pipelining server blacklist

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);

DESCRIPTION

+

Pass a servers array of char *, ending with a NULL entry. This is a list of server types prefixes (in the Server: HTTP header) that are blacklisted from pipelining, i.e server types that are known to not support HTTP pipelining. The array is copied by libcurl. +

Note that the comparison matches if the Server: header begins with the string in the blacklist, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can both be blacklisted by having "Ninja" in the backlist. +

Pass a NULL pointer to clear the blacklist.

DEFAULT

+

The default value is NULL, which means that there is no blacklist.

PROTOCOLS

+

EXAMPLE

+

+

  server_blacklist[] = +   { +   "Microsoft-IIS/6.0", +   "nginx/0.8.54", +   NULL +   }; +

  curl_multi_setopt(m, CURLMOPT_PIPELINE_SERVER_BL, server_blacklist); +

+ +

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_PIPELINING, CURLMOPT_PIPELINING_SITE_BL,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.pdf b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d12a2e018149ee11fe02fd700d468a3d98c2a0e7 GIT binary patch literal 4046 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 gRm=E%)!%c(vip>k!7Yp, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_PIPELINING_SITE_BL 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist +.SH SYNOPSIS +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts); +.SH DESCRIPTION +Pass a \fBhosts\fP array of char *, ending with a NULL entry. This is a list +of sites that are blacklisted from pipelining, i.e sites that are known to not +support HTTP pipelining. The array is copied by libcurl. + +Pass a NULL pointer to clear the blacklist. +.SH DEFAULT +The default value is NULL, which means that there is no blacklist. +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf + site_blacklist[] = + { + "www.haxx.se", + "www.example.com:1234", + NULL + }; + + curl_multi_setopt(m, CURLMOPT_PIPELINE_SITE_BL, site_blacklist); +.fi +.SH AVAILABILITY +Added in 7.30.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_PIPELINING_SERVER_BL "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.html b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.html new file mode 100644 index 0000000..ab579d1 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.html @@ -0,0 +1,71 @@ + + +CURLMOPT_PIPELINING_SITE_BL man page + + + + +

NAME

+

CURLMOPT_PIPELINING_SITE_BL - pipelining host blacklist

SYNOPSIS

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts);

DESCRIPTION

+

Pass a hosts array of char *, ending with a NULL entry. This is a list of sites that are blacklisted from pipelining, i.e sites that are known to not support HTTP pipelining. The array is copied by libcurl. +

Pass a NULL pointer to clear the blacklist.

DEFAULT

+

The default value is NULL, which means that there is no blacklist.

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

+

  site_blacklist[] = +   { +   "www.haxx.se", +   "www.example.com:1234", +   NULL +   }; +

  curl_multi_setopt(m, CURLMOPT_PIPELINE_SITE_BL, site_blacklist); +

+ +

AVAILABILITY

+

Added in 7.30.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_PIPELINING, CURLMOPT_PIPELINING_SERVER_BL,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.pdf b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fc712c03025b49e55820c9b0e6a359cec1bb4766 GIT binary patch literal 3790 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 X9#SqEchYQt1Okx+iin7b*FpaVl|mAA literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 new file mode 100644 index 0000000..bf7e6a7 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_SOCKETDATA 3 "3 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback +.SH SYNOPSIS +.nf +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETDATA, void *pointer); +.SH DESCRIPTION +A data \fIpointer\fP to pass to the socket callback set with the +\fICURLMOPT_SOCKETFUNCTION(3)\fP option. + +This pointer will not be touched by libcurl but will only be passed in to the +socket callbacks's \fBuserp\fP argument. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.4 +.SH RETURN VALUE +Returns CURLM_OK. +.SH "SEE ALSO" +.BR CURLMOPT_SOCKETFUNCTION "(3), " curl_multi_socket_action "(3), " +.BR CURLMOPT_TIMERFUNCTION "(3) " diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.html b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.html new file mode 100644 index 0000000..dd2da96 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.html @@ -0,0 +1,64 @@ + + +CURLMOPT_SOCKETDATA man page + + + + +

NAME

+

CURLMOPT_SOCKETDATA - custom pointer passed to the socket callback

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETDATA, void *pointer); +

+

DESCRIPTION

+

A data pointer to pass to the socket callback set with the CURLMOPT_SOCKETFUNCTION option. +

This pointer will not be touched by libcurl but will only be passed in to the socket callbacks's userp argument.

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.15.4

RETURN VALUE

+

Returns CURLM_OK.

SEE ALSO

+

CURLMOPT_SOCKETFUNCTION, curl_multi_socket_action (3) CURLMOPT_TIMERFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.pdf b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4beb93fc68b24f90a2d3c30651b4b11adfdf7353 GIT binary patch literal 3836 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 new file mode 100644 index 0000000..d64fe11 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 @@ -0,0 +1,62 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_SOCKETFUNCTION 3 "3 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for +.SH SYNOPSIS +.nf +#include + +int 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 */ + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION, socket_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +When the \fIcurl_multi_socket_action(3)\fP function runs, it informs the +application about updates in the socket (file descriptor) status by doing +none, one, or multiple calls to the \fBsocket_callback\fP. The callback gets +status updates with changes since the previous time the callback was called. +If the given callback pointer is NULL, no callback will be called. Set the +callback's \fBuserp\fP argument with \fICURLMOPT_SOCKETDATA(3)\fP. See +\fIcurl_multi_socket_action(3)\fP for more details on how the callback is used +and should work. +.SH DEFAULT +NULL (no callback) +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.4 +.SH RETURN VALUE +Returns CURLM_OK. +.SH "SEE ALSO" +.BR CURLMOPT_SOCKETDATA "(3), " curl_multi_socket_action "(3), " +.BR CURLMOPT_TIMERFUNCTION "(3) " + diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.html b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.html new file mode 100644 index 0000000..1106738 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.html @@ -0,0 +1,70 @@ + + +CURLMOPT_SOCKETFUNCTION man page + + + + +

NAME

+

CURLMOPT_SOCKETFUNCTION - callback informed about what to wait for

SYNOPSIS

+

+

#include <curl/curl.h> +

int 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 */ +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION, socket_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

When the curl_multi_socket_action(3) function runs, it informs the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket_callback. The callback gets status updates with changes since the previous time the callback was called. If the given callback pointer is NULL, no callback will be called. Set the callback's userp argument with CURLMOPT_SOCKETDATA. See curl_multi_socket_action(3) for more details on how the callback is used and should work.

DEFAULT

+

NULL (no callback)

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.15.4

RETURN VALUE

+

Returns CURLM_OK.

SEE ALSO

+

CURLMOPT_SOCKETDATA, curl_multi_socket_action (3) CURLMOPT_TIMERFUNCTION, +

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.pdf b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba60f53430a22cb8fb9e5172c085d53ac6d546cd GIT binary patch literal 4421 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 new file mode 100644 index 0000000..41627da --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_TIMERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback +.SH SYNOPSIS +.nf +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERDATA, void *pointer); +.SH DESCRIPTION +A data \fBpointer\fP to pass to the timer callback set with the +\fICURLMOPT_TIMERFUNCTION(3)\fP option. + +This pointer will not be touched by libcurl but will only be passed in to the +timer callbacks's \fBuserp\fP argument. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_TIMERFUNCTION "(3), " CURLMOPT_SOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.html b/docs/libcurl/opts/CURLMOPT_TIMERDATA.html new file mode 100644 index 0000000..020e5b0 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.html @@ -0,0 +1,64 @@ + + +CURLMOPT_TIMERDATA man page + + + + +

NAME

+

CURLMOPT_TIMERDATA - custom pointer to pass to timer callback

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERDATA, void *pointer); +

+

DESCRIPTION

+

A data pointer to pass to the timer callback set with the CURLMOPT_TIMERFUNCTION option. +

This pointer will not be touched by libcurl but will only be passed in to the timer callbacks's userp argument.

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.16.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_TIMERFUNCTION, CURLMOPT_SOCKETFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.pdf b/docs/libcurl/opts/CURLMOPT_TIMERDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a93b74de85957692b1a869395bde0083e6db819c GIT binary patch literal 3792 zcmb_fc~ld39&eSkc2Lk&)_Tz?3c(|pncR~mgOUJJK`=o@j_Qz1LLkY6nTZ6&Zddea zsiIx6UbG%;RnU4=w5Y2--9=l)M_Ex&>$O%CfyGy?c<=ru34+LOyYD&w@XPo2y^qiD zOK74lT8N3HQ0U2)<(nZHjKXwA7Nk}qag@WtWx{em(Ie4T8%HrP5^W|x%m2xEaNJ)uHq;-v_2s;p>*GS!glrCeRy5~CYjNr7YWQ~5!>k{eK}|C% zwC|4gb7xH?hMyZ+Sh=Wj_a4EDABQ$NiT=UIKS}$pwjkng^Y=%W5>>?^Lx(OfUK(|$ zByIaN|LL>(vvBQ%s)0dTO?CL5@^{SS3^eF|Cb9N`Auy^6o7qx0dijtGVF`hGyJ)BF+lWV<5`Q{AA@}x* z6HoG4U0z|p>G6g(^_63h6>)z)Cw_dW*Tt_tJ1F`CwBysm;+mGz%985ny=T{byx`!M z8~!=JcyM$7$5F19>CdjU?h19h_5Fk)Bfc7tQ~QstS%VH=6}2~;Shlt{_lu8y?_WP+ z)&m2}U94UI$6-Z&#b>Vzmet=ryyaF|`@PV>{im^ObYA5>%io$ZLt?I1u524Ss=#$= z*jwz_g(vn_ueNW|CkJeC^qz48H(os9NS*ra%1dWvDh947{P0Hp_6Oyu;boEo^01Wt zmQfFLh~V;X);((LyJ299IvMFS}t#JBQW=YM+lZyi?m!8iW_Pc_>(%GYrmLzBz z)Ia^;9((eg9rfpQ%!=`0|DM%civMymUlqM!UfrDC&N94j_(uWnV)V(r{&Me}e!b6M|OH=g7)7{;g@*Bo6wgltN@BfTBaypY~+YJ8G8 zp!&F>iA%}3JVq41V9&o|?l)H7Ol#RMs!zlH7q=hDZ=RAcKdYwA?|#zFJC}m1993zp zVRxJS&a^)+#;(sc>x+n>d8UDPilxdkQiE$1vh3=$M}d=4l?y3{$v52K!~+5k1N>iH zfkQr$v=b|m@|+ZsNLnZ)o-$da&tf~%FV?XJfaxp6^W*SI41V|02qX5!Ed0Eg?a4K zLxAM-k2m4PGN27O2zxwaVPvw^#KNf%@4p^Ohk*tcud<6MZ^{RQUP&#-d`^0z@|n^rAYM-2sm2p#$1R3J7@t%+V@aByBVO z1_iuNJuA@DcGA&RLzDx&C02(8#ymOwZ!URmeJXixkq$XTXEmEC&{Cj>QXxzsLF`tC zi%sv0##5WFq8(N1j6XR(uH(7GBvLs+_I<3D2vsh5wsmTDuAsfjbMf> z9*uWusZ8snxeR5PJ0;0DH`|Dt1Q7(Jjv&FvP(nB96q-HnCJR%nQ4^xo$3=(m3~rU% z?zDsEf!%hSgH^dT0*{CaoOv=LfITc+wnmT~p9pg_ZOgWDuvmnPFd-%x51Sd%PUX@} zHjIhn0-%yHnN@l)H(rI{mqw7uaZVM2?mN*0tGxvVCY0yRn~ zvy>DX&EgCphEZlA3O=EUk}6OVC6z{0(P7Tn#m$%OfeT7myu#Lf|$fO zI3|;3Ij?;f7olgs3tJ#Z{P6 zg-OSumD1Ljtvn6tG9iV6T5n8RP; z@J&N_PxCV7#Z&BNC^Lk@m<-|p%lpA{nM@*s&9IM#Nl*{~|G|z9ngmmV)#GIvCYFNt ztQ!qgzCuGmOt13E!8*}RRw4(hK{uLQ4EB_6G?@%+YTam3C3uj#)6gDhl2>U8^c9~m zg}h4+IEJ*^C*N|8poT|o9xmFq_Rca?H tl&Dm$6l0*C@`+L{j?3jbTtWOgM>@Z&u^h>8o}x)45*!K*jY^1y{sZaA1PcHF literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 new file mode 100644 index 0000000..809c3ef --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 @@ -0,0 +1,63 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLMOPT_TIMERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values +.SH SYNOPSIS +.nf +#include + +int timer_callback(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback pointer */ + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERFUNCTION, timer_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function will be called when the timeout value changes. The +\fBtimeout_ms\fP value is at what latest time the application should call one +of the \&"performing" functions of the multi interface +(\fIcurl_multi_socket_action(3)\fP and \fIcurl_multi_perform(3)\fP) - to allow +libcurl to keep timeouts and retries etc to work. A \fBtimeout_ms\fP value of +-1 means that there is no timeout at all, and 0 means that the timeout is +already expired. libcurl attempts to limit calling this only when the fixed +future timeout time actually changes. + +The \fBuserp\fP pointer is set with \fICURLMOPT_TIMERDATA(3)\fP. + +The timer callback should return 0 on success, and -1 on error. This callback +can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLMOPT_TIMERDATA "(3), " CURLMOPT_SOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.html b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.html new file mode 100644 index 0000000..800bb8f --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.html @@ -0,0 +1,69 @@ + + +CURLMOPT_TIMERFUNCTION man page + + + + +

NAME

+

CURLMOPT_TIMERFUNCTION - set callback to receive timeout values

SYNOPSIS

+

+

#include <curl/curl.h> +

int timer_callback(CURLM *multi, /* multi handle */ +   long timeout_ms, /* see above */ +   void *userp); /* private callback pointer */ +

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERFUNCTION, timer_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

This callback function will be called when the timeout value changes. The timeout_ms value is at what latest time the application should call one of the "performing" functions of the multi interface (curl_multi_socket_action(3) and curl_multi_perform(3)) - to allow libcurl to keep timeouts and retries etc to work. A timeout_ms value of -1 means that there is no timeout at all, and 0 means that the timeout is already expired. libcurl attempts to limit calling this only when the fixed future timeout time actually changes. +

The userp pointer is set with CURLMOPT_TIMERDATA. +

The timer callback should return 0 on success, and -1 on error. This callback can be used instead of, or in addition to, curl_multi_timeout(3).

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.16.0

RETURN VALUE

+

Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLMOPT_TIMERDATA, CURLMOPT_SOCKETFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.pdf b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3db1c3ecb8337666ff4c998cffb82e6b08cc7cd8 GIT binary patch literal 4481 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 new file mode 100644 index 0000000..a51c86a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 @@ -0,0 +1,44 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPTTIMEOUT_MS, long ms); +.SH DESCRIPTION +Pass a long telling libcurl the maximum number of milliseconds to wait for a +server to connect back to libcurl when an active FTP connection is used. +.SH DEFAULT +If no timeout is set, the internal default of 60000 (one minute) will be used. +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.24.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.html b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.html new file mode 100644 index 0000000..3b84a4d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.html @@ -0,0 +1,60 @@ + + +CURLOPT_ACCEPTTIMEOUT_MS man page + + + + +

NAME

+

CURLOPT_ACCEPTTIMEOUT_MS - timeout waiting for FTP server to connect back

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPTTIMEOUT_MS, long ms);

DESCRIPTION

+

Pass a long telling libcurl the maximum number of milliseconds to wait for a server to connect back to libcurl when an active FTP connection is used.

DEFAULT

+

If no timeout is set, the internal default of 60000 (one minute) will be used.

PROTOCOLS

+

FTP

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.24.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.pdf b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a5af84f3508720f0c5e93c4b10804ada9cb93da GIT binary patch literal 3663 zcmb_fd0Z1$9$)ZewkoCF6qXIZTdP*xH$xCacf0%f`2NY8-~0ZK z_d8!?N#-~?u24a;BR3a+45?uZW;5P}35<7#>{N6 zdt}&`soJW#%sS7lgj<0H_X8Hyz@;s-LTan>&b=~wP|;X<$(Fa4hK8XD!F`&G3gem* z7TtD-%B%0s*fF%OywAG4LutqN{p?KtTe+`1ug7V!=i{>2sejeAm0X@r;sp(shSX(S zYWozf4U2XM^K(|ymm<#fI8L3p6L2E$Udk{kvS{>~piece?#ic@+B&yajUm z@VFHr1;xwD8~UXGx@6LOfhFAj533?pz8#sraarZGQ$ZE#YjdxSSdzYV$*_+rOKV;~ z+_rK2=qh7L@7gPc@8liR25Fsa#@)}V)-A{^o{@8Nz_G~^C)yU=xCK45tUPpa z0;#n_eqj=C#k~r3uObKZyXgV;OLiq&1 z7wZ$oCQGciC=js3v49=Nr4P_$&=~LyB=WG>ovaWb`Rx-`w0A2Y4HyVZ7V6#svv^{tOnO`%MNhcwD~nBr~5 zp)uBkxS=Azr}w!%ZV+wQ=XNo?-e*K47CqRDWE6oVh>&GOrdX0-fn{A;v;Zp=It4Dr ziIK2_Bi&RE%Voj1LW2O2oZX?ff<$i@2)>L+rXYCqD4LU#qsSo?EayaVolb{hN>r(o z1B9HOQ&3!ip&g3M;5r=b5onfyMa5(W>lKWM z*Gt>=8Umv)i_UCew+A2lByCiR;KUgFa+ZVz^q4 z;c{$L3Z~QJTD=+{f#G@#Goam&Aozea20UfJ)8>C*?SkyW%5o_nB}`6^bvWP|6vvB^ zz!gfRf@s$$vH4L3RE$v<@4RS#ksgcXzkAH>7E@Zp>CLRo>jn)r-u(Y0%!`h(-S)&_ zkC$^v)nT`xl#3E=<3X5lV6ok%cd(qB1i4LmJTBTsiYbqRoJ33pa467%i!w>I7wr<- zH!fPNCB2JeoJPbaw^I(%>k<&tWJW^U+oR#4P3;?r5ABrooLEUDP}?AE=#$Q2g5Vdl zUYwxLb_u4D5y=soA=o`V`NcNx@5UW<9r3)f9u7vaSS7&WVx2^o^I5rB?;aaJ_ z5DY^A4AkK-ApF%3@w|E&{$zIgILZNGFs_2chSk1cjap5pVF&D|;YuyIfVg0$gGOLl z@SJ&?hAYLf(~X9ypP^ykPS4^9@RsPtOAug|ccZDrso0ICQay_!v|u22$6?RX)VgQ& zYP#Aia3t-bIPixJMw9703it{JPcas}cEsTgqw$P`g{46bq48!o&4A%L?HG+NIu?u7 sC_&_+V+l+hZ6-82LPbPJn@zurNEaVcyg+h-6d*!LV314}J24LWH~fO&kpKVy literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 new file mode 100644 index 0000000..376799a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 @@ -0,0 +1,63 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_ACCEPT_ENCODING 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPT_ENCODING, char *enc); +.SH DESCRIPTION +Pass a char * argument specifying what encoding you'd like. + +Sets the contents of the Accept-Encoding: header sent in a HTTP request, and +enables decoding of a response when a Content-Encoding: header is received. +Three encodings are supported: \fIidentity\fP, which does nothing, +\fIdeflate\fP which requests the server to compress its response using the +zlib algorithm, and \fIgzip\fP which requests the gzip algorithm. + +If a zero-length string is set like "", then an Accept-Encoding: header +containing all built-in supported encodings is sent. + +You can also opt to just include the Accept-Encoding: header in your request +with \fICURLOPT_HTTPHEADER(3)\fP but then there will be no automatic +decompressing when receiving data. + +This is a request, not an order; the server may or may not do it. This option +must be set (to any non-NULL value) or else any unsolicited encoding done by +the server is ignored. See the special file lib/README.encoding for further +details. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was called CURLOPT_ENCODING before 7.21.6 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_TRANSFER_ENCODING "(3), " CURLOPT_HTTPHEADER "(3), " +.BR CURLOPT_HTTP_CONTENT_DECODING "(3), " diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.html b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.html new file mode 100644 index 0000000..0f4aab4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.html @@ -0,0 +1,64 @@ + + +CURLOPT_ACCEPT_ENCODING man page + + + + +

NAME

+

CURLOPT_ACCEPT_ENCODING - enables automatic decompression of HTTP downloads

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPT_ENCODING, char *enc);

DESCRIPTION

+

Pass a char * argument specifying what encoding you'd like. +

Sets the contents of the Accept-Encoding: header sent in a HTTP request, and enables decoding of a response when a Content-Encoding: header is received. Three encodings are supported: identity, which does nothing, deflate which requests the server to compress its response using the zlib algorithm, and gzip which requests the gzip algorithm. +

If a zero-length string is set like "", then an Accept-Encoding: header containing all built-in supported encodings is sent. +

You can also opt to just include the Accept-Encoding: header in your request with CURLOPT_HTTPHEADER but then there will be no automatic decompressing when receiving data. +

This is a request, not an order; the server may or may not do it. This option must be set (to any non-NULL value) or else any unsolicited encoding done by the server is ignored. See the special file lib/README.encoding for further details.

DEFAULT

+

NULL

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

This option was called CURLOPT_ENCODING before 7.21.6

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_TRANSFER_ENCODING, CURLOPT_HTTPHEADER, CURLOPT_HTTP_CONTENT_DECODING,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.pdf b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33acf1301e19e0c3dffea84a174452aed789f484 GIT binary patch literal 4671 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 Bm@WVS literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 new file mode 100644 index 0000000..510e3b3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 @@ -0,0 +1,44 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_ADDRESS_SCOPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_ADDRESS_SCOPE \- set scope for local IPv6 addresses +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope); +.SH DESCRIPTION +Pass a long specifying the scope_id value to use when connecting to IPv6 +link-local or site-local addresses. +.SH DEFAULT +0 +.SH PROTOCOLS +All, when using IPv6 +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.html b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.html new file mode 100644 index 0000000..d79833c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.html @@ -0,0 +1,60 @@ + + +CURLOPT_ADDRESS_SCOPE man page + + + + +

NAME

+

CURLOPT_ADDRESS_SCOPE - set scope for local IPv6 addresses

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);

DESCRIPTION

+

Pass a long specifying the scope_id value to use when connecting to IPv6 link-local or site-local addresses.

DEFAULT

+

0

PROTOCOLS

+

All, when using IPv6

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.19.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.pdf b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..883842cd29edaac174627b99d7b4edfb02163a9a GIT binary patch literal 3515 zcmb_fdsGzH88>M>f$;$`BJJ@+Z$Yy7*u68e?{#;Huz<9zk_93LHer~Zg^}5r?aVAJ zL=9*SQHYNt#neX{$*CsBm>{(_YW1jT)kaeviSZqicmxU@Up0+dYwrw;fY_!z$NSIT z`R@0+-}n8#?`~3#D?>}@3|P{Eu4T=b5#T^5nSv%Mg&Vj3Iiw+~_|{L}y0z^)`^}46zrc&;q!^mV zP~l5o2KTvY;JxDb7x&cFl-9<(KbfU;VJ~g7NHUxc14!28VZ7qx<~6J?615pL)+<;(KZZ9&fL`IIT8u z1s7kixugDQc+$^e-~VLVjN)P0FO=Qhd9e5^KCYN@wLJN3%O$eu^O&^#<73wzy?mr; ze|qb}O^3{JhgYR|PmTW5((PK|POGr@%>{p+pu3)bz3WE8Z2t|e;qBDC>bqI9+rHR+ z@v3LjjiUMM-=9UEYu+?zag#aW;+E>RIni%<1AlA&W@X*BHBs%iw|@Bbx$sY)xE<3q zf;+7Q2EQs)&v+|~YEVa43=)QTY!%Nssz zUh3N6J>9uJq3-sm*>3{SIDAa>tU14$4oCj0rReO~7wC%3f6s`XxU{Xxfw{#%;E{znMB?)ZyBix9O>M`Nod8^V>by z?_Elik8Qkqo?JR|-aqc0uB`Y`CdV!x7ibzj%C`H}D+^W|majO#dDt^6=hs}_P|#3R zH+)I^4U7HP2c+++idx#=aHlW*#oqM2!;;Id#zr4aTxU6P;`I-X51os@uHD=|%F!_E zSn)e|lIp`3x-0jGmz+FQm<$^?-f0=i4C|i1Gf?pid=_l^HueuM?($A}t-F1Ee5cDh z`QsLTN8OaE4nAfZeG4Qhsf6#Pl;MTM!fq<+v=wA01jC>D(2(6EAnsU&zO8{#M!6M~(1*OdsvrY% zs8R;H86Qif3Sm%)qhq7h2rLHDi$RYdBOC%8afu8s1HA%LL}nx*B+`t8;F}`~bS@(o zLIiLC^O&%V8ChJeHgLj6F9hH2;5Mq3-YR0sW5yIYPoEm~n!Tr1%&MG1j|H;~WK-x7u2f25lnB8*Ho!>Q zRDtuUmsi7v!Q4=ZtmI0$6>_3CREoZbEAR*bitn!>oky*dB z%0U zlrW_%@6cS?xkm$7pF=at=*Hc_G^UK5UM(`Y)id(w>T=rZ)1){tdkTeWoY97^0;<*AdyE%nCeE3{xdS zNOovKA=YOz>2bznr711#Crh*h!T7Z}T3Vd8=m~=vXN*R?*Iclln*;2j17uK-;(&HG zgk)ccW<-Z3GbbBlmI;#FV;@*`xJd&e*MC%Aq1-$?3MiqGFxU}~&5a7zU*$r5$VuXa zQHv8=+>(b|ZG_ooBqrm84ae>90Zx>BB$|ev4d@y1KZy3@>?bOSd8j0urJ~^Xg9=8J zluQshlGN#YEUID=E<03m)Gs=ZI$l)J?f&l(3j~ysR`_f#fer;wgUxdNKLzusbL^w< zI~)v&oQe(~4H=G6e3MX`3FNVlw)q7yK%v^Ef zv*B0;OE!+;OC6f9*2nm%5GQM#`Mk>Q>&XVkI(s&%9PHEekX)%Ggl&{Ic)xQvG4P1i zqf^w^F3~h{XeyOvh;{=fztZL--MAOm$q$3|L^O&Ol%RksI7xQd6p-NrZo#dDS;dzI z$2Euz;qV7IB4|i{7+xmcpPgZm@nbk344BfedKNGljd~;Sg9wcvNHph_1^8YXX(iFX z8%QH?6M8=kq~TV4Fb&;l5TC_@o<{>^3BrP=@&h!zX^<}jX&uZ*>d{;00a?;Cm}W2x zwrlL~vn*09$B5|95rDaDHG^UW&{Ir6uN`H01DM781)vUc3}(4Np&1+(KeWN$E2)uzv$(=ZePw literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3 new file mode 100644 index 0000000..0352296 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_APPEND.3 @@ -0,0 +1,44 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_APPEND 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_APPEND \- enable appending to the remote file +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_APPEND, long append); +.SH DESCRIPTION +A parameter set to 1 tells the library to append to the remote file instead of +overwrite it. This is only useful when uploading to an FTP site. +.SH DEFAULT +0 +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was known as CURLOPT_FTPAPPEND up to 7.16.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_DIRLISTONLY "(3), " CURLOPT_RESUME_FROM "(3), " diff --git a/docs/libcurl/opts/CURLOPT_APPEND.html b/docs/libcurl/opts/CURLOPT_APPEND.html new file mode 100644 index 0000000..32cef5a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_APPEND.html @@ -0,0 +1,60 @@ + + +CURLOPT_APPEND man page + + + + +

NAME

+

CURLOPT_APPEND - enable appending to the remote file

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_APPEND, long append);

DESCRIPTION

+

A parameter set to 1 tells the library to append to the remote file instead of overwrite it. This is only useful when uploading to an FTP site.

DEFAULT

+

0

PROTOCOLS

+

FTP

EXAMPLE

+

TODO

AVAILABILITY

+

This option was known as CURLOPT_FTPAPPEND up to 7.16.4

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_DIRLISTONLY, CURLOPT_RESUME_FROM,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_APPEND.pdf b/docs/libcurl/opts/CURLOPT_APPEND.pdf new file mode 100644 index 0000000000000000000000000000000000000000..698e1f489b9fdffd1d225e93afd72e91748b3f51 GIT binary patch literal 3599 zcmb_fdsGzH8E=iA%9yH0kzylw8>NHM-I>|=#p=oct zIEuDd5Wm3Fqz4I>6>sox7pDwuYv9s}I#Lng3OAJUG2H*78!tsErTrwj6H=DkH9z6VayVtv}r} zqgzV1JX}zw-M9PTZstO4#hL;ApX~a0-?Gt{6;GP3jEt(#G!7j!cIcEz#noWc=zU*+ ziWA?BD8Id7aqIBGzow@zpV#RA_SSIfgIVtnShy%7MtQtoWklPg_a0OyCVu*5GhZto zy>0il%&9xBSG^hcD;f3oyAj33(NXuA9ThV;dq>bvW?8q}AMN8ir<$3pX0@?8S406KifuF1?*uqicb0;|~qf1_oN~(Bw{Q0dn4lhaD zYdrY=JICtSH#TAAbtTh^j}`i77VjU>V12x2`-1lMR;Mwt{L<*wM}=$moR<}|2fRNz zl0MgTY|r}p^@)pxn$PYSTTUKX&@?RX()Q*d2hL2dX>Rz_Hsix-l|Q+i-g2Y%4I_&m z&Ag&aQWiC*FTdY>;nU%FtEc8AUmsgL%{Z`MqxrR#`DFCW!v23bJMi*xp!=<16`lH3 z#Fm`R3574`7*z`&lgaXP?Yri#p9{YDO}`NZ#bX{D>tfN{<#`ji%9|^W#-z6o&MN&j ztAPAh)+yQS_>(SG<<5`Kt+pfz)83xdcCDzB+GyiSn(+F9-@Wqs(M3eVIZaJm9a9(A ze{rhw=7i4D!^@sDH-D1(+KQOcqKF4f(l|$d^a@a_)S&S&0ELBd>H*Q+T`23$uz0F26V(HFegsW z)m%Qv9MP|u|IeSbWV)!f?4s{yTtROOc`+?}e_8eUl)|FU)}!tN3xWqmML9=BoTOv# z8B1zbwc3yO)Bl*RI&Pj>(>liVR(}03wxRx`+Qze2o72lij{f?an3_S&`)Mx~synz7 zYgMdJ@mHtSAt92gyNuHcd^F}HvuVshQw*8N1wjT5kJWlL(5V!e2$sSLu&4nJxp>+u z0Hs**kWBlz0PmvxuopOa&Xr0F85ryq0868T0+dS%3X@YMQ9=ZSB6bdn6NK~u+XH5W z-w@Fc#I}-xKvKv)QAJmqfoRY`AX(@K*mQ>SgA7EpKLyDI5FsE!_7D}(LmjG1(n<;> z%VmclLe@KIfu!IGAi4!d#9Kil!mbkWo)3`1c}QW^va{vZC10hs6=4KE=tHeBvH{j3gwn_47 zPlT|yyKgbaksN+O2&GD6v4nEgG%@HSUAeRXvgmBaYesL?A3*^_nbFy52k!7$=^SQC zAy20k&Pa0==DPG0I?;ldCXz7KX<3l;$=uRY2wrLQaVLgov(+P&**~(P@xj~0qzX2ps9e1=FRA2XEK4w%300vl{c76neIWjGyPBA>y=xdI;8XQ$f!pM-hQF{WHk4fX|iR;mulh0!c6+UAF0CZNTX z%i!jC4+(Rd^!ZrEMT#kp!JI@bCU__?0!v$@+Dl-Ct_{nGwPavPZ?+i?$|%}R23P^L zq8ns%f25u0d5zq)A9RY8cro_cZN?hGEf>8CL;d)(P8oX0)SzNDy zV?ZxFg$7Pey=W>`A6p2ewlAL&hvPsmS*5ZsO|9swSFM9XL0DGcNrt6)_=gK%sZ1da zeFfk|#=)USe8T}Y)$8Vf7-2YHO|^jxlTw$c#r3$_uD2!O8eO8*mZ*k1tu9Hcuxk^v cmLKNG6z3_wK=OhVASI#EAaQX?GwsN~0rJ$pZ~y=R literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 new file mode 100644 index 0000000..f8d5668 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_AUTOREFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_AUTOREFERER \- automatically update the referer header +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_AUTOREFERER, long autorefer); +.SH DESCRIPTION +Pass a parameter set to 1 to enable this. When enabled, libcurl will +automatically set the Referer: header field in HTTP requests where it follows +a Location: redirect. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_REFERER "(3), " CURLOPT_FOLLOWLOCATION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.html b/docs/libcurl/opts/CURLOPT_AUTOREFERER.html new file mode 100644 index 0000000..f7cf20c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.html @@ -0,0 +1,60 @@ + + +CURLOPT_AUTOREFERER man page + + + + +

NAME

+

CURLOPT_AUTOREFERER - automatically update the referer header

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_AUTOREFERER, long autorefer);

DESCRIPTION

+

Pass a parameter set to 1 to enable this. When enabled, libcurl will automatically set the Referer: header field in HTTP requests where it follows a Location: redirect.

DEFAULT

+

0, disabled

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

Along with HTTP

RETURN VALUE

+

Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_REFERER, CURLOPT_FOLLOWLOCATION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.pdf b/docs/libcurl/opts/CURLOPT_AUTOREFERER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cf16c0096618776ac9c14353c2628d2138f4fc2 GIT binary patch literal 3603 zcmb_fdsq`!7I%GoyG#}Fxpu2Ei^YJF%uL=BlOQGpsYWn>qUg7sBr`B2nMr3R5>VTU z4@6yHx4XKE;InF%3Tk~+sdWXvRjbJQY>TZ{)M~91wXMQdclXYa2#VeAexLIXH|L)7 zJLjHre&=4IQ>`{RrcguCM{k#IgfuV;v(DEbqY;@*GTA~7tOXJWVxv6*$-#)tLkOgm zbg^#IY=(G&BMC1QSi3l*rKH>t@u)Fv#ku%Y@2nMAWXt(K-&~n-_DtENwM^9)RZ9oX zsUNZ+E+TP$(MPXbzFX2Sd5x#)S7A|ejr^(ASC0?+%c8>Abyv!_@0niwLg{v@ZqxnE zQ}=|`%d+aT7W|@eRz&}qZ!Rg!UGR;nxgEaHRPlx>Wn*B>&;^IR%|EWJYFvD`rfvQH z(L`lzO7T0?+#~++x9^N!yGTb29R0vhtAj6UuSca^Y+bHxy=Bi{5y#wW+qA7}XvuNX zMon#Qn_o9>#*zb>r^hvHi%J^3Gp6Ush(o1q#f{O62Ye@Y9zdNXCpV<@v^*@jhLv!2 z^Do@E5WkpvH1P{%vAlHZB&OU{dU@d1B=wy^XS~yE&Q>2gv+H5_#Rg>ycXJx9Zns>z z*6+Q0!fG9K@5R(#R^dm|eAMq`cLi-_MWN%jP}#pWZrjDxp1gv@-Wb~+RdtB`fLyp# zeRo$;`T1ddb=$$F!c|qfXRd5NkF4R}uzd}Ee4rqG_uz$duQo*AZms*wudH15y73Qz z9oU~9%x~{kN*CNLN--C*s)+^Qf{pfBa}f&4Wi}wRD8 z_pesZiN#Kr9c1N2`|FvP!+VbGvvN&s^@-aHPkl8cZuzvY&(6J7nzQA2kH1q;-#t5r zPwA1tELv6k<6kv9-)c*3avsrCJR%R2Y*O8bDu}!?{O-gAq(|7H-s`qZ{op~_gQWh& zqryMl{8_=^*5(A=xA~1X3R_MbvuI*#wg>vGyP_YpV^H|kUitHf_hFBo&YWk8F6u{U zFSMOE6s-TYq59@D-|BBFDi=8`Cx7{V!ixuvZzzaps6VW4jCIYsHebV>m<_MaZQ}%2aKH~m+ ze_OgbeCMzgp0@{WZ9Etmt{@cH?+0A}d|%in@4gVZcSvSt!u7rV=WJ1C#O!|aPJ3j; zrx(IW#vSAySc!ZUSt|b3>y=PYr0%40dcKcDQi*I5v6F6^n7{_$EEH^Oa1E?iD`!K9 zgB1X=VH9X_BqP8ok@Y}K@~oe8kvy0OsT}J{BZVvkObi%FCj$boOAH7}X_6@>0s<2o z3(PT0`T<4+VgbJaA`gqB#Q_0PFh0>m$EX2lAV64(kcW{;w3~;sATfRiG#ds8ei5>Z zsfZq&QXQ5SLLfYBb_gOEy`2;YH`sx(4ne1H-ID;F$AFNOR6C5B&A}k0Qw3c)bdYH0 z=!B7u8QR4mT--$*dPx7InkWxyO(1wu%n*`Jdr4kCf%Ukh!%Jy{kTkzj5Njo#3Iq{K zm5BFj00-+On63zk44BO{lMQ1^DVm=^ly-xVqBA69hgfNfB0&#;qGv&v8bv4?!gMOc zOEZ3cc4tgdPP-z6vfX)#O#9@}ErO}kTC+LWv&Q& zU1LY>J`0&cPb}cbw1O$=u7X?_?v}-yA!9rNTAh>!2%nsit|J~Md6y~5;+SlU5)}f5 zfY;{*MTY}k55pS*CYfYn0Bcc<$Y4oD$Ti6_?WwT9vYuR8fRzedfypsd987V9m&{|i zTo_YmWdM?MQw9g<_YOet%OuMY1fKyx^78T&c`60VWg{4l;|Qumlu9|!kn{PBKm_Cr zKMMGh0--Y>n=!mXib>&Oy$GF&Ulw9@M1b3%Y{=uuVTR!6^gTbI&T$DYC6g>q z9EM=^yS$!k8Ko2Uf=iYc(2`2BzSk3{#@uc_4l;6OyS=47_Tdlwp{I6tqBv9 lRvW6BkZ7~%EjIJdYs?nkQ@lWMf>a, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_BUFFERSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_BUFFERSIZE \- set preferred receive buffer size +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size); +.SH DESCRIPTION +Pass a long specifying your preferred \fIsize\fP (in bytes) for the receive +buffer in libcurl. The main point of this would be that the write callback +gets called more often and with smaller chunks. This is just treated as a +request, not an order. You cannot be guaranteed to actually get the given +size. + +This size is by default set as big as possible (\fICURL_MAX_WRITE_SIZE\fP), so +it only makes sense to use this option if you want it smaller. +.SH DEFAULT +CURL_MAX_WRITE_SIZE +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAX_RECV_SPEED "(3), " CURLOPT_WRITEFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.html b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.html new file mode 100644 index 0000000..265f841 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.html @@ -0,0 +1,61 @@ + + +CURLOPT_BUFFERSIZE man page + + + + +

NAME

+

CURLOPT_BUFFERSIZE - set preferred receive buffer size

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size);

DESCRIPTION

+

Pass a long specifying your preferred size (in bytes) for the receive buffer in libcurl. The main point of this would be that the write callback gets called more often and with smaller chunks. This is just treated as a request, not an order. You cannot be guaranteed to actually get the given size. +

This size is by default set as big as possible (CURL_MAX_WRITE_SIZE), so it only makes sense to use this option if you want it smaller.

DEFAULT

+

CURL_MAX_WRITE_SIZE

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.10

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_MAX_RECV_SPEED (3) CURLOPT_WRITEFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.pdf b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b63d18f2b78fd0726f57fff710ef16688cfd4b13 GIT binary patch literal 4047 zcmb_fdt6gxA1_P66PA}W^+i02Fj2O1&Ti~XHb1g4M3~T+H!jLyJA=WtGtSOnQe@-} z(I7)j6A8sgFsU@K7cxshOeB1>@a~&psg#Kq)Z|rq&Nc**_pSHy@%d-Z`8~he^SgY1 z&-|j5DlWzoLVgXu6>Nhlg%G%+L%BPtWYkV;ZV=}Ea9 zvN1GCm?1~e^0{X$7iSL5zC3l-=~o1hEc?cs+SpZ-^6R{w9TjQVO)U2k)(H|vEb>o! zXzWVgc}DCXxqF!Ba|xAFdz*Is2X77^q}^BXD}Ca=BqOn~YO*Odid**5)|$Xf>zI<9 zoew=*cHQ(D^rA<@h`J8=WYwCTSHGC^8F(tx6=W>L%i2w5gxZkmp`YOxGt)7<+9MFhy6FiU7lYb z*kZO+q~zxmPgwoNtZN*ZV!9i;nn)%+=WHjynn4IeBq@34V9v}YRQs; zRV!kAzq-Sj*Lr^Pl_4H;WDzY3L#IOp+ZWeWrOw{enlg8f*MTYb7V=6vCLH)=<@TAI z2du9{Vi6e*pg%FMR%B zjaELA--y7oX~rwO=H2p9fdN+yb(QN9-|6%ppYd+N+Lv?rbA8ZF>S1L>QH0kP&QRX1 z0W*BGJZXJXBhB}M+n&9xC|2I_Y^WCPER{@qo0~txT(W~XB|R%xHMOKvs!op_w|9y+ zf7|CDZCv1;=vM`M=PxZdF>vd8p94vof8Dh7WA3)MYkn&XTsm{L7cIPwZu< z?QfiUAnoG+KJa0DN86^;pM~wpYxK~yeD!8vj^~Fj`^swDr&Z%yf3OW%lbb1 z%}U9-l3tL6AKf!JHa{b`rQ#nK7IYFDk`qU+>zd_fZVb7bj~?z+w3bz@C2R81i_Z86 zc5Xmxj%#Kgi4)!YC$~-fyGKKas63Ntz%SYzQ)3nDFtSd6~7@9xJ=5UYpj|S(SG#sKI#b>%@?6_dTC3 z`}oS9_`BYiw4hS|b?VO@_s=yh-2cki53V*%JWw|pxxcSAme5@s zt+@JqSM%*}Mt6S01ix7;9`Oa&Y+yQL_G_9y8C<&W=<3h24z*uC*gWgqipyy^+bUN- zkcX!SCR_=aJ9f6m2ObBjKV5??{UiGN6uWPJVdi@2jqEFTI0yaL?iu^TG;M(Sw?*fg zIKKbhFK_*pSv9nQyR1O|3i5!EoGJS#yD~oY!ud##c^$N@BRA&wAN8dRhl<}CaSu*@ zZ{3{D9*q;cL(YsdERZw=F2&o+b8})0sl$(!=5C^Y_Sm(*y<_}cpX~!ki{1@wV8_BC z3xez~#uo@6H%-_BmDl@y@HU#JbTK3ohX6!|5iRLpfLy4935#)xVwg)rMFDY)@B9D|j3~f2 z&}f5M=+;1h;ev9Y4LArpJ+#3{gi&vU;~>_54U_-_4R%&#FHzQ%dkVND6$C?= zsN`-HZtvA3L+HT?jJb66*baJJLC-ZHBq~}BV{*CMN$0KHrZhniE2rsE-*gjÐCmEk%o)@F=92T&t&;T?>6Sy3MuUL_B?W3I z4#I*2h}med+Y)+ioau5Xcsc=khU7X3E7#zBHrQa&rjt!n zXd+b;Sq6vHVYZq<@xTtV$zqc_WE`i66zo|t!hxMEOqz@{UmXoI6lF>?GBBTq^Dr(Z z2!stZVJ0&vIt|8nVh&JA>kU#3=o^R&AffIs1Opza8WgT!u@bFj2J*Wt?lr(m9Tj`g}n z4qNTC$=Mxx9YUH&);AkSGX^}?>!b#XHWQ$>39A)=C&89H0&0>Y4+e*fkui~SXYb80 zF|Lit$o7)dL|Bq#90ylV8VI|I;mGG$oZNa>HcUpjYvYtddUW-ZD<=u`Hb@)t2sz{s z{FK(yQ`7^OV7SRRnJgHB-QzC_c5u7VxVx_>_t(||V6wAa0s_wV$z-LJZ8Cr#5){XR zoc+Z?Q4U}OefSp~?rxaeU%v!A8pRHpG(aefi69oRTniS9L;?|PfZa4qBmyIvU9hE_ zCJ+k2(0!bS32`t4`_Ke}Cuk_R)02GI6MUGM4+7UmpCkx8%lgvT2Sp!RkPyt)J~Xko z9~%B74HrG(3&=yS7%((pG?6s;!we%a#w-%V4+gJ23OuMlrZq4UZZS}>>$!%6E8)1{ zP@zH*#19R^RpL+upFcw+7OEsF6(5@+5QPZEsQj-v64, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CAINFO 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path); +.SH DESCRIPTION +Pass a char * to a zero terminated string naming a file holding one or more +certificates to verify the peer with. + +If \fICURLOPT_SSL_VERIFYPEER(3)\fP is zero and you avoid verifying the +server's certificate, \fICURLOPT_CAINFO(3)\fP need not even indicate an +accessible file. + +This option is by default set to the system path where libcurl's cacert bundle +is assumed to be stored, as established at build time. + +If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module +(libnsspem.so) needs to be available for this option to work properly. +.SH DEFAULT +Built-in system specific +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_CAPATH "(3), " +.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.html b/docs/libcurl/opts/CURLOPT_CAINFO.html new file mode 100644 index 0000000..528da91 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CAINFO.html @@ -0,0 +1,63 @@ + + +CURLOPT_CAINFO man page + + + + +

NAME

+

CURLOPT_CAINFO - path to Certificate Authority (CA) bundle

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path);

DESCRIPTION

+

Pass a char * to a zero terminated string naming a file holding one or more certificates to verify the peer with. +

If CURLOPT_SSL_VERIFYPEER is zero and you avoid verifying the server's certificate, CURLOPT_CAINFO need not even indicate an accessible file. +

This option is by default set to the system path where libcurl's cacert bundle is assumed to be stored, as established at build time. +

If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module (libnsspem.so) needs to be available for this option to work properly.

DEFAULT

+

Built-in system specific

PROTOCOLS

+

All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

EXAMPLE

+

TODO

AVAILABILITY

+

If built TLS enabled

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_CAPATH, CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.pdf b/docs/libcurl/opts/CURLOPT_CAINFO.pdf new file mode 100644 index 0000000000000000000000000000000000000000..572a5d453908b63fa129d1ad8247270123a02ecf GIT binary patch literal 4306 zcmb_gc~}$I7FVpcq_yA%iWa6I2A(7{lgVxp9}>bMCn1>`8r`hQ`_gVfGHd9 zo*RYn{n|GE5xG6bRbp{#xSzH-h zet3U>%dV|;?qavUSx9hELnD~Ulq$KbJ?-8XT}PzdYtqA&8^j8hkR1f)E~=SPFy~F zYkh5NuM0ya&InWEoZKe_gf2CrYyYuD7ytpIjy~0yt{7(*J9}BxeM!G~SFcmik z-|S!hO>M{Y@0V`R8h+2>l@PC6(Gj=!eV@>CF5V-u`~tjtNms=t{%|e(~%<7ch@c`ICto8+YSZq-d{e* z>-zZ*PK;bKm*eZi>bs-0{?uMabJOm$TVDNS?Ui@GE=jEltLhgfn^HG(?ZCPN7rgqW z_o=Sin!?;$_OCBbhyE5_v}99tYvkp?)HUiti9|F~=(zc+?=k-TQ#Fjop-<&K2S03# z&Na>`^?5!!eo~vfQnZTg)|kG}f66a+R&VvHFKV&$YFIn~S$=qguyDt$(m>z23T)G= z)ai9ic-E1brX}3ZTQc~gH$I%;vSDTOcAv#%1GjJM`><}WtdM_b-)+Ig9ve>WDRcK) zQ5tHHqw=7^wIfQJ-Q(2U{j1_vg?xJAVWC_8GtHbIQ~E3@8zb^uYFX@3+!|!{s98G6 zb;s$Jgi|XQhH!U%iwwO=LaocPnECe}JWJ+$(ByJ$mYH*Oliz06^!)m(@u#8>wLeXI zFwfoT=i}G4yCWuVy6^aiIl=Fmc+c${bMWW46NK|fxH>05x9m~w_(n_8rEP;EJy))u zJhSE5z4NO+YpE{&l-VDR8J9Fx~3fvilCR%?khLkf2@iP07NlNbb=UC+|-S zol)iHI+Jg}2Efy+%O^DP)+~!i*@b;k?lRq^R`%qVJUy9uA|Dnaz(EI0j2D@BV3J ziaf2MAux7F(~YP3k87Gw&*}f*c}|u`-L)SU%~sRw^jUCW@k+A_@|Sqa520Fn-_w@EahSA$n{n z8GvNBk5!~$pTU5~M}$MDOlCLI_A0w7rGP=pDZ628&+NKI5e7;-RS7Fa z3{mGn$PoTTg66PGjKR$W?JYQ3t0&B?5by-8%H|4~CNtnDOCm)_j(#IBsmpOR_M0Kb zkUI500HAGpGk}uRE5;)aKLwW|HmJ4oO=JcgewWtwuwDlma;v2htOP zHChHLz+k=BU@^ycKgt%Oml3*x*X@Sb@UX6h2gSI2nao}TlF?Qpu1X~+D3M6g8l=p- z-yUQ_TD6opkr$4H8v}@BZE&WEh{_xnt;$SQiPX%|GKOR{4oZh$S#cvvW80j}5MfqH zJp+_s3QwBBDz@s4dXPhqRj)Ic#a1cPCL#uBnhY}`8w-^xWyXd_Kom*pQneJsVT;%( z3&s2(jS1Hi>7*$YLfL#KfHbK!VkIb_PC)QW%1ovxqZo$M)6?1M7@IUD!Kg?if)NhP z;jjP)%ba1La4XAT_5%8BhG=77h#Aamn@wyLsfV?(Fv>>YE=6+i9Fx{aX-NY_E5;K^ z3ngV*ELydgk0AtKq{3M$4JVO>qJ)NpfRCjS2nc~Xk*DTrR9)(fFPZs@K5zjPV!#jJ zBnJIKZBY>>DKjV{3<^pn%~Yp;NW@0?OxXVXw`CQG&6~Xd0%~`I1n`K%LH=qo58js(i)aM)OiXg~3LPNoT7LwF)M51Z|rcgc$`Et5sqRY0~2$w{fEp^iZ5mc^Kp*QzikIl$O#F zGF$EW>!{9yPD|I4Sce;uq)aPIO=xh7j$+DU3^s0cXEbzLS?9qf2X|w=AyzgLsBI87 z_(kWCF`&2fy*;4rb_r&jl$lO9LvVU^p`hoty&HGcwa=T%+7}FXx=Mh<={oU|i|Ham zP(+A`P=T$!mxt zvRy%jE*i!cy+#8Tf_Y4T-Fzrd^coETZ+e|i@ERW~6o5_RRXh&L0rU1RG=vYv>8mu* z^bK93_n0|GJG-*d#%E1Q|ZO_VKY Pn2?7tyuAa*D;R$QS%di9 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3 new file mode 100644 index 0000000..642953d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CAPATH.3 @@ -0,0 +1,54 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CAPATH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CAPATH \- specify directory holding CA certificates +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath); +.SH DESCRIPTION +Pass a char * to a zero terminated string naming a directory holding multiple +CA certificates to verify the peer with. If libcurl is built against OpenSSL, +the certificate directory must be prepared using the openssl c_rehash utility. +This makes sense only when used in combination with the +\fICURLOPT_SSL_VERIFYPEER(3)\fP option. + +The \fICURLOPT_CAPATH(3)\fP function apparently does not work in Windows due +to some limitation in openssl. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option is OpenSSL-specific and does nothing if libcurl is built to use +GnuTLS. NSS-powered libcurl provides the option only for backward +compatibility. +.SH RETURN VALUE +Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_CAINFO "(3), " +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.html b/docs/libcurl/opts/CURLOPT_CAPATH.html new file mode 100644 index 0000000..a9cdb27 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CAPATH.html @@ -0,0 +1,61 @@ + + +CURLOPT_CAPATH man page + + + + +

NAME

+

CURLOPT_CAPATH - specify directory holding CA certificates

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath);

DESCRIPTION

+

Pass a char * to a zero terminated string naming a directory holding multiple CA certificates to verify the peer with. If libcurl is built against OpenSSL, the certificate directory must be prepared using the openssl c_rehash utility. This makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. +

The CURLOPT_CAPATH function apparently does not work in Windows due to some limitation in openssl.

DEFAULT

+

NULL

PROTOCOLS

+

All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

EXAMPLE

+

TODO

AVAILABILITY

+

This option is OpenSSL-specific and does nothing if libcurl is built to use GnuTLS. NSS-powered libcurl provides the option only for backward compatibility.

RETURN VALUE

+

Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_CAINFO, CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.pdf b/docs/libcurl/opts/CURLOPT_CAPATH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5dbdc971ed5af4bee1aa672cc86b836f45437209 GIT binary patch literal 4289 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3 new file mode 100644 index 0000000..8c01711 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CERTINFO 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CERTINFO \- request SSL certificate information +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CERTINFO, long certinfo); +.SH DESCRIPTION +Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With +this enabled, libcurl (if built with OpenSSL, NSS or GSKit) will +extract lots of information and data about the certificates in the certificate +chain used in the SSL connection. This data may then be retrieved after a +transfer using \fIcurl_easy_getinfo(3)\fP and its option +\fICURLINFO_CERTINFO\fP. +.SH DEFAULT +0 +.SH PROTOCOLS +All TLS-based +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CAINFO "(3), " CURLOPT_SSL_VERIFYPEER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.html b/docs/libcurl/opts/CURLOPT_CERTINFO.html new file mode 100644 index 0000000..ae19dd6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CERTINFO.html @@ -0,0 +1,60 @@ + + +CURLOPT_CERTINFO man page + + + + +

NAME

+

CURLOPT_CERTINFO - request SSL certificate information

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CERTINFO, long certinfo);

DESCRIPTION

+

Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With this enabled, libcurl (if built with OpenSSL, NSS or GSKit) will extract lots of information and data about the certificates in the certificate chain used in the SSL connection. This data may then be retrieved after a transfer using curl_easy_getinfo(3) and its option CURLINFO_CERTINFO.

DEFAULT

+

0

PROTOCOLS

+

All TLS-based

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.19.1

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CAINFO, CURLOPT_SSL_VERIFYPEER,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.pdf b/docs/libcurl/opts/CURLOPT_CERTINFO.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9e7273ebbf0624c95141f0d1ec7448cad0fd1c53 GIT binary patch literal 3942 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch +.SH SYNOPSIS +.nf +#include + +long chunk_bgn_callback(const void *transfer_info, void *ptr, + int remains); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_BGN_FUNCTION, + chunk_bgn_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl before a part of the stream is +going to be transferred (if the transfer supports chunks). + +The \fItransfer_info\fP pointer will point to a struct curl_fileinfo with +details about the file that is about to get transferred. + +This callback makes sense only when using the \fICURLOPT_WILDCARDMATCH(3)\fP +option for now. + +The target of transfer_info parameter is a "feature depended" structure. For +the FTP wildcard download, the target is curl_fileinfo structure (see +\fIcurl/curl.h\fP). The parameter \fIptr\fP is a pointer given by +\fICURLOPT_CHUNK_DATA(3)\fP. The parameter remains contains number of chunks +remaining per the transfer. If the feature is not available, the parameter has +zero value. + +Return \fICURL_CHUNK_BGN_FUNC_OK\fP if everything is fine, +\fICURL_CHUNK_BGN_FUNC_SKIP\fP if you want to skip the concrete chunk or +\fICURL_CHUNK_BGN_FUNC_FAIL\fP to tell libcurl to stop if some error occurred. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +This was added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CHUNK_END_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.html b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.html new file mode 100644 index 0000000..2721d5b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.html @@ -0,0 +1,71 @@ + + +CURLOPT_CHUNK_BGN_FUNCTION man page + + + + +

NAME

+

CURLOPT_CHUNK_BGN_FUNCTION - callback before a transfer with FTP wildcardmatch

SYNOPSIS

+

+

#include <curl/curl.h> +

long chunk_bgn_callback(const void *transfer_info, void *ptr, +   int remains); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_BGN_FUNCTION, +   chunk_bgn_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

This callback function gets called by libcurl before a part of the stream is going to be transferred (if the transfer supports chunks). +

The transfer_info pointer will point to a struct curl_fileinfo with details about the file that is about to get transferred. +

This callback makes sense only when using the CURLOPT_WILDCARDMATCH option for now. +

The target of transfer_info parameter is a "feature depended" structure. For the FTP wildcard download, the target is curl_fileinfo structure (see curl/curl.h). The parameter ptr is a pointer given by CURLOPT_CHUNK_DATA. The parameter remains contains number of chunks remaining per the transfer. If the feature is not available, the parameter has zero value. +

Return CURL_CHUNK_BGN_FUNC_OK if everything is fine, CURL_CHUNK_BGN_FUNC_SKIP if you want to skip the concrete chunk or CURL_CHUNK_BGN_FUNC_FAIL to tell libcurl to stop if some error occurred.

DEFAULT

+

NULL

PROTOCOLS

+

FTP

EXAMPLE

+

TODO

AVAILABILITY

+

This was added in 7.21.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CHUNK_END_FUNCTION, CURLOPT_WILDCARDMATCH,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a97a66ef5084cd707e803186f777e4697b38472 GIT binary patch literal 4558 zcmb_gc~}!!5=Rlm2r7t*c(n(HE9vfBkO)CY038Tm0FObyCh0&h7fAyVbrhAsV?abj zMjb&I@n%36L_Bds2Ny*I#S;}&bUXkZSrOgc*8#kDXZHK-fAYFs)vxN+@v1tufkJN@ zN@r1Q&pug~OJPF@q>hZCxVplAxGIW>hB$yChP~wq0@p&Yw*n(@Audr%aXz1-BeXcC zr0BOL&wi}BKHd6lP0$bJ?lBHoiLT=!O7?Av_AD*2n$uJgYU?PiHfprq8X2^4$@j<4 z9dG_l*KR@;S=lc;yPbQR+j8X9Xa?$$|Eey#w%|qlvs_UlTATmkfZ*Q5OXF(?9~*S1 zf51G`D`Q`pc@!ki%Z{w^sVIP znI$%O)wZWQ>9gFOwBgdO+#83oR*UM`cYL<( z&(1pGhpL<|o5-Y)Q^*VZJLa>-HrEx7ep9#VG^0pazB|CFNI`j1bJFMEJM8>2aO+!n zwh>VS(maF5oMJ`1Fy>WOjtDbhzRK92+g5lz*{dX^g>BT)2g`Q3x?x$t3IF`!$F(oH zP7Bwrl)katHB&n;_Rp<3PY=9GIdo#}4O*zs=ICK|hSRN_=tX|5BmW^Pw?i98S)|X+ zX$@NM^ z(bo3NTnaYN)8d#}3;$JBjofiaQ?(NW*En2*V9SyUQ+lF|R1UA%Ap zK#u+TaP!jGe_4;X-sTzhz_DcUv>8XOGU~VAN=fO9FBr&%2fN;!a5c*Ku1Z+w8-Dn; z(bSuxijIaDS?o`Z%MHFzv#x7N{7@gt;gdGj83EUZ4b{GCkN2-WsMlXTG^2`HW^QSv z&9*V0{mu56!`8o*`u@qBQa^h5V*4TYLUT(j?+7evQHPC#mQJ3h*qx!PT#NW?cbqOt zulS9z`1@qjh=}w37G>xf&TxvR%xA6t5#m;xb0Ax@= zExOssnC9^N7VGT!vdyPAa-ZX@<43KlVR!TL`ef1A8dG{>170|DlXB$L?eVF5e>VNo zTb^Hha(#iMUsqb|<1YWQgJIcyjdt(8E*+ZGx@Y-do7{>0cDfqP@9aNx@~t|j$)|$u zrVVoIxB21aEh&{2H%prqZ7+EB$EGVL1sHMJmSZ)xj$xEDGQ(j!Ac};nE)d{;pQBkI8W3xA+djw4~_Vv?IA?IU}Juidt(-j@f zo*8ti|U!DkBD)qAKq1Nc7&bj5jfs-ZfJN&<8X7c zBbiIXvsT}@Y2?g-vcxAG`efQ3kgpPlcKRnw=@<4(dc>t>)xd^|y?c>IQ-%L}diZ(R zqq~;tsDp|J{uq&FrVmbPLnObRTu_;6a?|C2h3Aubug9187WYlwV&}W&fmpwL#DQxo zrqiw+u%O-*6V**l7nNCgOFJj5Xrw(qEh)8_;*%D#sNLzIB)uFD-L5;izEql@-dMdi zdEB8b?UApG?)z>%wOhKWZ(xjlRDp$i@uVGDfsc3Q$LsA%J^Mo~KIazEG=nXK?#9nv zH%DJtK493-l3JT_w7VWH^gibtsMU&tiAFBTq7CS-wAzlbhgbjM*tz8BX5O-6xyBE3 z{E`pGFBiN@KQ*g3{ZPB0b6D6qM1t73J2dm-qq!qaR+yx8%qrFN>F4dxFX{fZv`G)W zDbsE*pK&uXeE94U6~_3!L|I=@s`Br$Xt#ziivrFKR+_2qIas{)TUVDU@Qpna_x%+M z)4gF0JL8jaEpyxnBMGO$PT??f+S0-?vx~0|@cz*uxz0$mk4dv$ao?~qH~jNQU|npH_vSQ^{L)ZSu@qqHPMP&@dlfgYC8L3!pv_c-d{Ld+ ziIn{qaIuA+R8^m_3bnp%7TU3YRN3WCUdIZ|cSJ&L>O{B2MwV`)v=8qfU5`gk7(S(r zj-T0F73px6Xosw3yy@%NoaiE4(f+dJN}=t!&aIUi?c8H?OMYMBU-?ayRPe`7tpj~{ zA@+K$&5OAE$?_+wJ@zLy?{{tu8u{(7ZMnY{=5^5Ou2)8uJ?rH;a zw7Me%;Y275 zIxz$X<9Y(fdFctCAcH81c8hqcfjG)AynxmV3&1--)Ins+7E=JJ$39X;cMAt-z(B}g zp$>w5Hgi40*t^E>Zo3b9_vLofl0v*gmz=S*X{f< z!24rR;DA68g!1`4MjB4lqe|>dA?3vHVGPIY-9-@!N;*{xi@6kT_ritZ@`(h=(IerB z>2T6paIjp7>u58;5#$nsD`1jLfrH{A2{Llz8G%W?jw7+Z4B@F(NdE=^Y15Yh#A+p` z`VhfO1x6^jDhfgkKK*Yd8FqUhNo(O=Ianx{$#9TTAcsOJC<}pQaxzO{rCb%K3wwVk zLx?^^=ndX`H_Q?F^$vR|lf~ilduqVdU9Z6;3vdF8#G~XYH)`vV6I4hpb)(K^ix81U zfJe)xCu;GaME_t(;sOa*N_FQ`T-`BHIyg;_X=pOT)To1Soy2XTKMy;ejpP^J?k(_%_IL9JZ? zp>z%vKx(Bjo*0x*Hz0U(qec^ih6lq52?_KBCS9$Kf>AD)3nL7e!Jq*Snr@+r!1Oeg zZW7REFhoA*otR2TH`qj%sFkpM4vf+fxL1)797ikH5OTE&A{Aqi>NvuU8W$&*@;FS) z89`VWO(J7N(ohta(Gc*^B$y26V$NJ9B8%)*r}@ClkMw~JppXgt09HJ3KS<*wxYmv8 z6X*x|M5}c~w|tft=lEaCDiE75djSNr#|^H4hbIF0D_bZ8w;P{vks@4XBl;B5c)iN0rk85>gBv3ko zL1%VrG>G+Zxx!?OKJd=h_7|oRiT=08lu9zCNj{!XEs0ZtYkP+9|4Epy9b>8Foxz$o zt-??pQVEPJaMCs%2r~*SmP&XswN{CN+{QE-aED@K%EKThseD(kNyrHW&NtMahl1!{ zDCA@<@f4UU%8jb0NpTq#ry!{O5S4*j+8qsroZr1L$ieTiz7Q(|3Dh)H(rLwjM4W6tL;Bc}|?1VhB$Pg59LAa>1 zp}wdHLIrG~4*!CqryA_OR4?}LIKcg`a1RV5ZJ`@Z@pVAO;rcY_83*$3B2Fd`F*vEJbrVHr#pVB_ZV=!1?y7+_- z<$Qt0{hY?)d~OSy0s4F|9-+nL3S0~RFM;47c_I${2Z5na4dyBkX)y%PP|4H~03oNo z8A2%3)x*nE$a3ZiSS)8}ffvKui^UOgIBYK#>Wl~&43z)Z9AV_hrXw&dVF(%vMc5Qu KTdx3b%6|as+HCUx literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 new file mode 100644 index 0000000..abdbc3a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CHUNK_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the ptr +argument to the \fICURL_CHUNK_BGN_FUNTION(3)\fP and +\fICURL_CHUNK_END_FUNTION(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CHUNK_BGN_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.html b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.html new file mode 100644 index 0000000..701d1a4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_CHUNK_DATA man page + + + + +

NAME

+

CURLOPT_CHUNK_DATA - custom pointer to the FTP chunk callbacks

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);

DESCRIPTION

+

Pass a pointer that will be untouched by libcurl and passed as the ptr argument to the CURL_CHUNK_BGN_FUNTION(3) and CURL_CHUNK_END_FUNTION(3).

DEFAULT

+

NULL

PROTOCOLS

+

FTP

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.21.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CHUNK_BGN_FUNCTION, CURLOPT_WILDCARDMATCH,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.pdf b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..11e87356e268ab7c03d6430309e00556f6c5530f GIT binary patch literal 3765 zcmb^!dt4LueOgP`D?Te$5$%bvh;X^Pyc3d8A%F~`X?P0=m*fH`$z8l$B;u+Qi)BI&vHDTE>U?*WVrO-Ju+#^Y`q=N1Ac$=3J|BPojAB=A${jX+c!sujW7q2AA3rzx{pB6aKQ0*Kda?IUT^%zg z`0Z4eMNK{-9})CYP-XDh6>g@w^ILV9wR^#R>!d?jdcW?=N7lg6@SKtDv!=HG(Bwwu zA`5#@VDb2>EmPLZ{uW!Cw_|t5;f7E>9o5<``GwP zbr;%KqwSGh5vwLH%9|bGdT?sX#t-L}9Z#$p-Sx%8nniyvU4C(CY3jSK%z!0|@fSZi zR$&M**hL>zSh>;Ev@-qO+NS1zZw)b6r(f)}`c~3lw6BE@*^44SYJczKj?HuA z=L5SwZK0Q-_xzfXptXC(Z%x?7IqECc1ies#Bt^9SuD&O8K2=pe_4>5Qs^IG5Q@5p` zy?VXU;X3FaD%g7Fn%;j-NR2*jcuVGylFZ7+d$$kvc3g>{-#Q|%A^mnzhawrd5PoT& zaAN+>ace&ey>Z%<_|>wEaoYpW@7Y$ztoSkI=%|tp4t6T`c7|m8HH!_sy&FzQp|}9( zur4S*+*L3wq8!~fwsp)#)4cJ@b9CD=1$465@Y&rF6{E@uzJJu*@kn`K!}Cjb5IwOY z+ot$OzkhD>n02#nwdV9}7R4o{ZwAyGSxek^>t;N zx+QN!&f8U5zF(=BJ*wr^tHp&UAGnpHJ6e8kSgEe5uFJbtxI9Xqc`iTojnjp#xv@9% ze#*R)_*XhFD?0PlQLVd=oq1(@LtxCN3s|6mUh1D-6*%^XmQU)}RNOI1Cmb4Gmp9h+ zhuYMR?$=I_l+#-cl}Ouq=brs-!l^%nuz%jSuKVtlo=!>is`y)(c6AK^Gsk%(D~ID7hO@zP6}5~9Cxxbi!LX78&5VLelzUyjgSSwntQvu z=c^wLTjKZfDU!DMY8c%3y63B%|5ZvQkPjs3ZwV=j9VBWX@<~)rS|}o#al=^{c$O-q zutFlrflwpEfd&C%0E;DQ4i@v>1As{<<6_OE6Z91W%b1f%E(-;n2S!s!HwWlq-CTUK zhZM)XBykKN$3>nG&}z^a@C`URVZKEfApr8}$BXc`EWiyY2zxYi!e}C8al%;;ufGw> zfdK~>&vF1MFUr^Lyp%BnN7$JBJ{CUh^(04Fzzd9fdG*VdKgpoq3<#ZT(8IV^>r>KW zl~0sW4)Juxel{L6`(AMj!g;3}QKJ%4dM^q{F^Gc4@KHn)PLlT)nnKx0Cz1e6pv)du zpgb5tlU*i`j~s6!P^r&xJnx}dL^C$aFJQpyG&BPvV<+f=9AarOGAKG9#yvj$Zz_3S zeJpux(LOpu zArCwNfnwkXa8rTCU~!pARwIZvB*F0ojFa=qhm}H1CP01WKP#<3Y=-s%2&m5uYJj8C zgT%Ei)`7OB6=Ap(!Egjqq+m)FE>}rK;TW#MFf}>|69gZS#(?z*tV_RubO7c6Qie?d zDWT108LJguM6ymk61Y$#5{kVNJ!C#CHOj|mfOnp?zX*q3|GzzExAQ5@*fSu#(~Bbv&zb_b^_!!;c$TFN$@F;f}9j+ z)!>n%I2)<;)ZQ!`=e^h{zLr!rg3i|n+=zv=5-uAj(5BKJY>PJTj1|xM>7Md@}^MCl?8RaQnJ(UtP}_s;tAnWap~{IGnGO z89EhTWEhSqFeNVc)RzFm1ON@x;m=_Bs$s@Z^%C}Y6uVi{3SlrVh4_Z$J+MqF6-!|& z?1SMVIT+FWf$2V&7?**e`y>n(;a~_3f??99U>LCJX*@BQz=LST65zN&FsTx3WrJa2 zu)7R`Nn~KQ4uXjlPs1eqlpTa8lRu?17_tL=z_A2nBU$jr5Jr=!ViNcd2HPG37Ag>F zBa9}{RtEO2YiNQF&YF?vcs(;41T$MCl}o2*izKpau}l=1L1l|YvSM@C&m!dTo0^j& TSk4nNu^0#cQbS|s#zFr9^w#s4 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 new file mode 100644 index 0000000..64f829c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 @@ -0,0 +1,54 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CHUNK_END_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch +.SH SYNOPSIS +.nf +#include + +long chunk_end_callback(void *ptr); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_END_FUNCTION, + chunk_end_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This function gets called by libcurl as soon as a part of the stream has been +transferred (or skipped). + +Return \fICURL_CHUNK_END_FUNC_OK\fP if everything is fine or +\fBCURL_CHUNK_END_FUNC_FAIL\fP to tell the lib to stop if some error occurred. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_WILDCARDMATCH "(3), " CURLOPT_CHUNK_BGN_FUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.html b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.html new file mode 100644 index 0000000..6322c73 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.html @@ -0,0 +1,67 @@ + + +CURLOPT_CHUNK_END_FUNCTION man page + + + + +

NAME

+

CURLOPT_CHUNK_END_FUNCTION - callback after a transfer with FTP wildcardmatch

SYNOPSIS

+

+

#include <curl/curl.h> +

long chunk_end_callback(void *ptr); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_END_FUNCTION, +   chunk_end_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

This function gets called by libcurl as soon as a part of the stream has been transferred (or skipped). +

Return CURL_CHUNK_END_FUNC_OK if everything is fine or CURL_CHUNK_END_FUNC_FAIL to tell the lib to stop if some error occurred.

DEFAULT

+

NULL

PROTOCOLS

+

FTP

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.21.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_WILDCARDMATCH, CURLOPT_CHUNK_BGN_FUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f9dfde6b5b7216e0f11a560e6051c73f5307d2f8 GIT binary patch literal 3885 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 new file mode 100644 index 0000000..b8af353 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CLOSESOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first +argument in the closesocket callback set with +\fICURLOPT_CLOSESOCKETFUNCTION(3)\fP. +.SH DEFAULT +The default value of this parameter is NULL. +.SH PROTOCOLS +All except file: +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.7 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CLOSESOCKETFUNCTION "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.html b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.html new file mode 100644 index 0000000..44fa4ff --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_CLOSESOCKETDATA man page + + + + +

NAME

+

CURLOPT_CLOSESOCKETDATA - pointer passed to the socket close callback

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETDATA, void *pointer);

DESCRIPTION

+

Pass a pointer that will be untouched by libcurl and passed as the first argument in the closesocket callback set with CURLOPT_CLOSESOCKETFUNCTION.

DEFAULT

+

The default value of this parameter is NULL.

PROTOCOLS

+

All except file:

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.21.7

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CLOSESOCKETFUNCTION, CURLOPT_OPENSOCKETFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.pdf b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7d78bda297dffc0294186f62934540c6bc653619 GIT binary patch literal 3813 zcmb_fdsGu=7Oz%oJ5}jH&-z?y_sfdZw$e3*;m=MakKGatohs9D|`vHWiXW{#;|k{7l3aQg*B zQCc{&Ic)o>{PtBX*O~}pR6^b01=1@&iWfYZ6$)+Ys%`keu(t~GPLL0)s(my%Rk{8r zqq0MCr2mXhOMbWe`%%#R!VcAJZHaQVZuPXH>`>GYBfD=udFxym^Z8@cIq99hzE?e( zn(zIMZWMYWzIa4*&J(P7{X}W%!URXou1&>cZYo!OrLC*^&$Z1r7f&1?jW&KgA+G|T zRcB00zV+Ci;Yg@2X*u!uLB9d_BU|o#Ht6KoZQo-%FO&~FpB%CZu0oEFOsk8lANb~- z%}+WuFEcsH_RMX5eD6u2-WJ+499x%o`B`TB1MjGvXOmWZG3e0q_Mva9)?dm!Djy?W z{GhJ!;f{nxNqTJRq}`3{CZ1{-QgiHj!StBbBdE9NX=qWY*=-cf}S2PaId`JyknA4zWdf}^h&?^DKp_ceXv4p5gccPVM${Wi>UX?RYTJLhdY)!&amTrJm%^*!9+23h z^x~?r&mVl8diUatl?^2>@~6$=XZM}j7}8j1a!s!^emaFBkN+!vGP&31W zJ_2Kai=|vVEESpzAX6OUVJ#E~+D{V8Sdu9|9R&>vMpGy+59H##{N!YxD31F@3=9y* zCB7e^BcXBNH$dcIp_7>*KnmC=sPK0-fCdbNeHL;snm}7QI2{t~H$xdPK=25VJwydn zfu`t}j3ar{!PtWk0qac^Pg=nZjQg>=bt_*6=za!-PD?VuxK0-^()X%>Dzg$2DPO>WL8V0+WSy*5dtVM%zsGhdj zD3DShhteTjhM_hZ!j)3gNxM8;M)#w9A?k?`3|_Yz(oBiL8Hh_|3Y{)c0-9*Ao3!Lo zJe)<@X_r=XcW;9Trmb4h47mw2x#Os8dP)IHB^OLhu@vN5)K*cn4$?%EpmHe0OS%!8 zZ(PK0eN>7?=*HW$Xl3K4*0tv138%Eu1~erZM7Jntq@G(SIIoG%qKtR2PG zYBh>UP>BQq90)hZ#gksd#k~*o`3#}cUWmCkvCk&4g>j;E8j6cCG^j`qp2N~^o@QLI zpqR{JJiJ!q@z7R6AtjX-HDvHktmn$DB?fr3F4h&saQ8(6){G|0iKy zcZ{u;7Y4gMtix9wRtriwD8V)kgc%1GTP=i*VVxw%ZPM)qJ(Ltu9tAlm(rLgYPxB5+ z=c~OK2k$>PXrYz}2kEkFMP9^8*+`Fr7wJ-6K5nZ&8V*|LKltR(Zmd3HA zbPgQ^zozf?0d==aFypkMe4!bF)64sWFuw!cI9S(_eU8Kro>;d8CR;n$PVK1EJ-^k7W^9tqsepu1^fqtrH=u76^OJMMvX2T0}D|H zTc1%6r)v~3GP%N_k5#B+z(|Od#>U1=lrd_RTCbGpafL+p%N!ZP%Es{|%lm>Rl`1eO KA|ig80s1f0Zxs~) literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 new file mode 100644 index 0000000..2594b16 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 @@ -0,0 +1,56 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CLOSESOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function +.SH SYNOPSIS +#include + +int closesocket_callback(void *clientp, curl_socket_t item); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETFUNCTION, closesocket_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl instead of the \fIclose(3)\fP or +\fIclosesocket(3)\fP call when sockets are closed (not for any other file +descriptors). This is pretty much the reverse to the +\fICURLOPT_OPENSOCKETFUNCTION(3)\fP option. Return 0 to signal success and 1 +if there was an error. + +The \fIclientp\fP pointer is set with +\fICURLOPT_CLOSESOCKETDATA(3)\fP. \fIitem\fP is the socket libcurl wants to be +closed. +.SH DEFAULT +By default libcurl uses the standard socket close function. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.7 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CLOSESOCKETDATA "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.html b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.html new file mode 100644 index 0000000..1b004a1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.html @@ -0,0 +1,63 @@ + + +CURLOPT_CLOSESOCKETFUNCTION man page + + + + +

NAME

+

CURLOPT_CLOSESOCKETFUNCTION - callback to socket close replacement function

SYNOPSIS

+

#include <curl/curl.h> +

int closesocket_callback(void *clientp, curl_socket_t item); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETFUNCTION, closesocket_callback);

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

This callback function gets called by libcurl instead of the close(3) or closesocket(3) call when sockets are closed (not for any other file descriptors). This is pretty much the reverse to the CURLOPT_OPENSOCKETFUNCTION option. Return 0 to signal success and 1 if there was an error. +

The clientp pointer is set with CURLOPT_CLOSESOCKETDATA. item is the socket libcurl wants to be closed.

DEFAULT

+

By default libcurl uses the standard socket close function.

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.21.7

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CLOSESOCKETDATA, CURLOPT_OPENSOCKETFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19edee517069bb38aac2a4c32e10b55e88f9bd24 GIT binary patch literal 4160 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONNECTTIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, long timeout); +.SH DESCRIPTION +Pass a long. It should contain the maximum time in seconds that you allow the +connection phase to the server to take. This only limits the connection +phase, it has no impact once it has connected. Set to zero to switch to the +default built-in connection timeout - 300 seconds. See also the +\fICURLOPT_TIMEOUT(3)\fP option. + +In unix-like systems, this might cause signals to be used unless +\fICURLOPT_NOSIGNAL(3)\fP is set. +.SH DEFAULT +300 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.html b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.html new file mode 100644 index 0000000..97ca35b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.html @@ -0,0 +1,61 @@ + + +CURLOPT_CONNECTTIMEOUT man page + + + + +

NAME

+

CURLOPT_CONNECTTIMEOUT - timeout for the connect phase

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, long timeout);

DESCRIPTION

+

Pass a long. It should contain the maximum time in seconds that you allow the connection phase to the server to take. This only limits the connection phase, it has no impact once it has connected. Set to zero to switch to the default built-in connection timeout - 300 seconds. See also the CURLOPT_TIMEOUT option. +

In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set.

DEFAULT

+

300

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Always

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_TIMEOUT, CURLOPT_LOW_SPEED_LIMIT,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.pdf b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdf8c4f4b9aad46130a34ba7f523bf44215cd786 GIT binary patch literal 3907 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONNECTTIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT_MS, long timeout); +.SH DESCRIPTION +Pass a long. It should contain the maximum time in milliseconds that you allow +the connection phase to the server to take. This only limits the connection +phase, it has no impact once it has connected. Set to zero to switch to the +default built-in connection timeout - 300 seconds. See also the +\fICURLOPT_TIMEOUT_MS(3)\fP option. + +In unix-like systems, this might cause signals to be used unless +\fICURLOPT_NOSIGNAL(3)\fP is set. +.SH DEFAULT +300000 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.html b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.html new file mode 100644 index 0000000..91b2c9a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.html @@ -0,0 +1,61 @@ + + +CURLOPT_CONNECTTIMEOUT_MS man page + + + + +

NAME

+

CURLOPT_CONNECTTIMEOUT_MS - timeout for the connect phase

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT_MS, long timeout);

DESCRIPTION

+

Pass a long. It should contain the maximum time in milliseconds that you allow the connection phase to the server to take. This only limits the connection phase, it has no impact once it has connected. Set to zero to switch to the default built-in connection timeout - 300 seconds. See also the CURLOPT_TIMEOUT_MS option. +

In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set.

DEFAULT

+

300000

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Always

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_TIMEOUT, CURLOPT_LOW_SPEED_LIMIT,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.pdf b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a001f5d6e5deceab30419b58345d35d69fa1dda GIT binary patch literal 3893 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONNECT_ONLY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONNECT_ONLY \- stop when connected to target server +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_ONLY, long only); +.SH DESCRIPTION +Pass a long. If the parameter equals 1, it tells the library to perform all +the required proxy authentication and connection setup, but no data transfer, +and then return. + +The option can be used to simply test a connection to a server, but is more +useful when used with the \fICURLINFO_LASTSOCKET\fP option to +\fIcurl_easy_getinfo(3)\fP as the library can set up the connection and then +the application can obtain the most recently used socket for special data +transfers. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP, SMTP, POP3 and IMAP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.html b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.html new file mode 100644 index 0000000..a0fda31 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.html @@ -0,0 +1,61 @@ + + +CURLOPT_CONNECT_ONLY man page + + + + +

NAME

+

CURLOPT_CONNECT_ONLY - stop when connected to target server

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_ONLY, long only);

DESCRIPTION

+

Pass a long. If the parameter equals 1, it tells the library to perform all the required proxy authentication and connection setup, but no data transfer, and then return. +

The option can be used to simply test a connection to a server, but is more useful when used with the CURLINFO_LASTSOCKET option to curl_easy_getinfo(3) as the library can set up the connection and then the application can obtain the most recently used socket for special data transfers.

DEFAULT

+

0

PROTOCOLS

+

HTTP, SMTP, POP3 and IMAP

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.15.2

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_VERBOSE, CURLOPT_HTTPPROXYTUNNEL,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.pdf b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..969689bb69c6a861ed29e7a0ea52408bb85ead1a GIT binary patch literal 4060 zcmb_feOy!J9>2-Wm*dNaN)ycFppBuqopUz!>NXPwgffH)2?6QZb~X-dJLBxk4Yar# z_j1Vul{6Jm%RsG+%RXFTw`n4bACs+FmW?vrs?Sj9I>z;Tm`BL!c27|TO|H$ca+zq@qS#I0G z%D3+{?-?}G;H;XjwGDf^W{b$YbSCaNOex-Jt|)oQ_ua(Lwr#$#?90>*c{9;A(aNBIZ-kWV znXUyDDQ6pNTDAxhDlaxC?Yx}k)4VGE_NMPHj^UI{j%C^unJcx48~%A%kdeBD|MG<5 z;A6>cgFfB5((ldunU$f(!|z^L9+x}vqOttjmtrLg}ejiO4-;krYQTv9e`$*;PkkvYhJoBH6 zzT(|GY9}r2iu}bq;`x-rqnfT9I{nix{-yPGNA3%1-e|aMMQeW=|1NHmu1FekUjO}N zL(TQI-9HqqxMSAFd=MLB{U9efE~`!V;>}BD8Y|J%?J26-HFRv%LIbYf*|I6{Nad&% zgKtwcH>Kk@_W9l03O1LWT1CXQ z*D18&Cl*V(wq~JcSKn+~^kTU)azew>^Et)3b9d0S+m>uNm=B%I$i9LgOO73C^o__= zGY7P149ucu&VRBn&*6;9xmB|1)Sx57$1l3%7`y-aTf1{5J?k3_x`uau-=h2*R!=Uw z(i1Xm|MAjqS~!t`Q2mRcd3s~gnqz{Fxh)q`M+Fg~V=|_vjSSk}S+{R{&+Q>=52q^(bZ>L^00!wXF$m8SPhJ+R9=woS9wioB@ip8 z?Nj4^X74SALKy2*Euxh{GS5K@Ne4)<9A1e~+)l9GLgGmaVdq7GCy;u#D-f0pA#)r$ zhK(HiMgXbTajfpgs|cmchCiWz#q@XuTFQc3`)dfdg1JgsO)%#6>3@UdzV)hP(IUNa zh?+DS36N4Chms*oB19~t)nQNVdyP9b{Y87D*7yEIO?2<*$AlqbmCBp^is>#JuFoJC zSVx#htCD+T&t5J}8kF3*A`Pmsg%N4wtJyR$Cp#uypPiwX8MxC`kYYLxYKGvsa2wC) z-XZKTVb?1shH0ZCCbA4Jxyxd+faHN)7PHkZcPY7U5ji-sWP}U5S(pqZH&GJ{GZbac zAQ@P|m+>(kCY%ZzY1~3MDLMnj_+lE+bb6sgietUzZ2e$9WDi^b zgF@g3aFT<@U~uROTFH%!jfNxBC_Ce^56k$dn2UIy|D;fX*gW0~AfR41C;*RK0}|Jm zr3P(HB|tF|55;(>G#-`7F^OCxcp1gyD5^jPaDw0i(J-(>f}QeDi1y>`CrZ)rASF~L znlc*U1q5wpBZ2V+0>02=(JkiXQXp)M`g!L``wO>eH2>RU77LrwET3FW=^Yl(ucOre zPr^Lu7#s8t0NWh2*MuDuy%#&a-}Y%R&nxYeZOx_Ab{h&#*-SCwFOa~nL-Fq10J!7YdM>3U48+$2!j zAZ*Bk&Y^i9dU%sy2e-Ey_ttgrNM(05JA>1VJ7_{N MDuFnh@Yxa2@62M8q5uE@ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 new file mode 100644 index 0000000..ebc4d77 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 @@ -0,0 +1,82 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding +.SH SYNOPSIS +.nf +#include + +CURLcode conv_callback(char *ptr, size_t length); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_NETWORK_FUNCTION, + conv_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the +CURL_VERSION_CONV feature bit set if this option is provided. + +The data to be converted is in a buffer pointed to by the \fIptr\fP parameter. +The amount of data to convert is indicated by the \fIlength\fP parameter. The +converted data overlays the input data in the buffer pointed to by the ptr +parameter. \fICURLE_OK\fP must be returned upon successful conversion. A +CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP, +should be returned if an error was encountered. + +\fBCURLOPT_CONV_FROM_NETWORK_FUNCTION\fP converts to host encoding from the +network encoding. It is used when commands or ASCII data are received over +the network. + +If you set a callback pointer to NULL, or don't set it at all, the built-in +libcurl iconv functions will be used. If HAVE_ICONV was not defined when +libcurl was built, and no callback has been established, conversion will +return the CURLE_CONV_REQD error code. + +If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. +For example: + + \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047" + +The iconv code in libcurl will default the network and UTF8 codeset names as +follows: + + \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" + + \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" + +You will need to override these definitions if they are different on your +system. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP, SMTP, IMAP, POP3 +.SH EXAMPLE +TODO +.SH AVAILABILITY +Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), " CURLOPT_CONV_FROM_UTF8_FUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.html b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.html new file mode 100644 index 0000000..dea2c03 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.html @@ -0,0 +1,75 @@ + + +CURLOPT_CONV_FROM_NETWORK_FUNCTION man page + + + + +

NAME

+

CURLOPT_CONV_FROM_NETWORK_FUNCTION - convert data from network to host encoding

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLcode conv_callback(char *ptr, size_t length); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_NETWORK_FUNCTION, +   conv_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

Applies to non-ASCII platforms. curl_version_info(3) will return the CURL_VERSION_CONV feature bit set if this option is provided. +

The data to be converted is in a buffer pointed to by the ptr parameter. The amount of data to convert is indicated by the length parameter. The converted data overlays the input data in the buffer pointed to by the ptr parameter. CURLE_OK must be returned upon successful conversion. A CURLcode return value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an error was encountered. +

CURLOPT_CONV_FROM_NETWORK_FUNCTION converts to host encoding from the network encoding. It is used when commands or ASCII data are received over the network. +

If you set a callback pointer to NULL, or don't set it at all, the built-in libcurl iconv functions will be used. If HAVE_ICONV was not defined when libcurl was built, and no callback has been established, conversion will return the CURLE_CONV_REQD error code. +

If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. For example: +

 #define CURL_ICONV_CODESET_OF_HOST "IBM-1047" +

The iconv code in libcurl will default the network and UTF8 codeset names as follows: +

 #define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" +

 #define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" +

You will need to override these definitions if they are different on your system.

DEFAULT

+

NULL

PROTOCOLS

+

FTP, SMTP, IMAP, POP3

EXAMPLE

+

TODO

AVAILABILITY

+

Available only if CURL_DOES_CONVERSIONS was defined when libcurl was built.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPT_CONV_FROM_UTF8_FUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2b9d62ccd99224b38b785b9f1f8f565b1cce7fdf GIT binary patch literal 5150 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 F{{q8Qyq^F7 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 new file mode 100644 index 0000000..682e1c5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 @@ -0,0 +1,81 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding +.SH SYNOPSIS +.nf +#include + +CURLcode conv_callback(char *ptr, size_t length); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_UTF8_FUNCTION, + conv_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the +CURL_VERSION_CONV feature bit set if this option is provided. + +The data to be converted is in a buffer pointed to by the \fIptr\fP parameter. +The amount of data to convert is indicated by the \fIlength\fP parameter. The +converted data overlays the input data in the buffer pointed to by the ptr +parameter. \fICURLE_OK\fP must be returned upon successful conversion. A +CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP, +should be returned if an error was encountered. + +\fBCURLOPT_CONV_FROM_UTF8_FUNCTION\fP converts to host encoding from UTF8 +encoding. It is required only for SSL processing. + +If you set a callback pointer to NULL, or don't set it at all, the built-in +libcurl iconv functions will be used. If HAVE_ICONV was not defined when +libcurl was built, and no callback has been established, conversion will +return the CURLE_CONV_REQD error code. + +If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. +For example: + + \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047" + +The iconv code in libcurl will default the network and UTF8 codeset names as +follows: + + \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" + + \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" + +You will need to override these definitions if they are different on your +system. +.SH DEFAULT +NULL +.SH PROTOCOLS +TLS-based protocols. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), " CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.html b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.html new file mode 100644 index 0000000..2ed2c13 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.html @@ -0,0 +1,75 @@ + + +CURLOPT_CONV_FROM_UTF8_FUNCTION man page + + + + +

NAME

+

CURLOPT_CONV_FROM_UTF8_FUNCTION - convert data from UTF8 to host encoding

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLcode conv_callback(char *ptr, size_t length); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_UTF8_FUNCTION, +   conv_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

Applies to non-ASCII platforms. curl_version_info(3) will return the CURL_VERSION_CONV feature bit set if this option is provided. +

The data to be converted is in a buffer pointed to by the ptr parameter. The amount of data to convert is indicated by the length parameter. The converted data overlays the input data in the buffer pointed to by the ptr parameter. CURLE_OK must be returned upon successful conversion. A CURLcode return value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an error was encountered. +

CURLOPT_CONV_FROM_UTF8_FUNCTION converts to host encoding from UTF8 encoding. It is required only for SSL processing. +

If you set a callback pointer to NULL, or don't set it at all, the built-in libcurl iconv functions will be used. If HAVE_ICONV was not defined when libcurl was built, and no callback has been established, conversion will return the CURLE_CONV_REQD error code. +

If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. For example: +

 #define CURL_ICONV_CODESET_OF_HOST "IBM-1047" +

The iconv code in libcurl will default the network and UTF8 codeset names as follows: +

 #define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" +

 #define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" +

You will need to override these definitions if they are different on your system.

DEFAULT

+

NULL

PROTOCOLS

+

TLS-based protocols.

EXAMPLE

+

TODO

AVAILABILITY

+

Available only if CURL_DOES_CONVERSIONS was defined when libcurl was built.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPT_CONV_FROM_NETWORK_FUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dfa30c3d17ba90a14d937a54ad9aa9eac182c2bb GIT binary patch literal 5050 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding +.SH SYNOPSIS +.nf +#include + +CURLcode conv_callback(char *ptr, size_t length); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_TO_NETWORK_FUNCTION, + conv_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the +CURL_VERSION_CONV feature bit set if this option is provided. + +The data to be converted is in a buffer pointed to by the \fIptr\fP parameter. +The amount of data to convert is indicated by the \fIlength\fP parameter. The +converted data overlays the input data in the buffer pointed to by the ptr +parameter. \fICURLE_OK\fP must be returned upon successful conversion. A +CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP, +should be returned if an error was encountered. + +\fBCURLOPT_CONV_TO_NETWORK_FUNCTION\fP converts from host encoding to the +network encoding. It is used when commands or ASCII data are sent over the +network. + +If you set a callback pointer to NULL, or don't set it at all, the built-in +libcurl iconv functions will be used. If HAVE_ICONV was not defined when +libcurl was built, and no callback has been established, conversion will +return the CURLE_CONV_REQD error code. + +If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. +For example: + + \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047" + +The iconv code in libcurl will default the network and UTF8 codeset names as +follows: + + \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" + + \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" + +You will need to override these definitions if they are different on your +system. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP, SMTP, IMAP, POP3 +.SH EXAMPLE +TODO +.SH AVAILABILITY +Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), " CURLOPT_CONV_TO_UTF8_FUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.html b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.html new file mode 100644 index 0000000..40f8c2d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.html @@ -0,0 +1,75 @@ + + +CURLOPT_CONV_TO_NETWORK_FUNCTION man page + + + + +

NAME

+

CURLOPT_CONV_TO_NETWORK_FUNCTION - convert data to network from host encoding

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLcode conv_callback(char *ptr, size_t length); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_TO_NETWORK_FUNCTION, +   conv_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

Applies to non-ASCII platforms. curl_version_info(3) will return the CURL_VERSION_CONV feature bit set if this option is provided. +

The data to be converted is in a buffer pointed to by the ptr parameter. The amount of data to convert is indicated by the length parameter. The converted data overlays the input data in the buffer pointed to by the ptr parameter. CURLE_OK must be returned upon successful conversion. A CURLcode return value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an error was encountered. +

CURLOPT_CONV_TO_NETWORK_FUNCTION converts from host encoding to the network encoding. It is used when commands or ASCII data are sent over the network. +

If you set a callback pointer to NULL, or don't set it at all, the built-in libcurl iconv functions will be used. If HAVE_ICONV was not defined when libcurl was built, and no callback has been established, conversion will return the CURLE_CONV_REQD error code. +

If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined. For example: +

 #define CURL_ICONV_CODESET_OF_HOST "IBM-1047" +

The iconv code in libcurl will default the network and UTF8 codeset names as follows: +

 #define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" +

 #define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8" +

You will need to override these definitions if they are different on your system.

DEFAULT

+

NULL

PROTOCOLS

+

FTP, SMTP, IMAP, POP3

EXAMPLE

+

TODO

AVAILABILITY

+

Available only if CURL_DOES_CONVERSIONS was defined when libcurl was built.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPT_CONV_TO_UTF8_FUNCTION (3)

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..18cf2d532690782d742a4cd263476641233dceba GIT binary patch literal 5129 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 lF&+M{10jilo0>` literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3 new file mode 100644 index 0000000..379296a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIE.3 @@ -0,0 +1,62 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COOKIE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COOKIE \- set contents of HTTP Cookie header +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It will be used to +set a cookie in the HTTP request. The format of the string should be +NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie +should contain. + +If you need to set multiple cookies, set them all using a single option +concatenated like this: "name1=content1; name2=content2;" etc. + +This option sets the cookie header explicitly in the outgoing request(s). If +multiple requests are done due to authentication, followed redirections or +similar, they will all get this cookie passed on. + +Using this option multiple times will only make the latest string override the +previous ones. + +This option will not enable the cookie engine. Use \fICURLOPT_COOKIEFILE(3)\fP +or \fICURLOPT_COOKIEJAR(3)\fP to enable parsing and sending cookies +automatically. +.SH DEFAULT +NULL, no cookies +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +If HTTP is enabled +.SH RETURN VALUE +Returns CURLE_OK if HTTP is enabled, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIEJAR "(3), " CURLOPT_COOKIELIST "(3), " +.BR CURLOPT_HTTPHEADER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.html b/docs/libcurl/opts/CURLOPT_COOKIE.html new file mode 100644 index 0000000..df42e64 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIE.html @@ -0,0 +1,64 @@ + + +CURLOPT_COOKIE man page + + + + +

NAME

+

CURLOPT_COOKIE - set contents of HTTP Cookie header

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie);

DESCRIPTION

+

Pass a pointer to a zero terminated string as parameter. It will be used to set a cookie in the HTTP request. The format of the string should be NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie should contain. +

If you need to set multiple cookies, set them all using a single option concatenated like this: "name1=content1; name2=content2;" etc. +

This option sets the cookie header explicitly in the outgoing request(s). If multiple requests are done due to authentication, followed redirections or similar, they will all get this cookie passed on. +

Using this option multiple times will only make the latest string override the previous ones. +

This option will not enable the cookie engine. Use CURLOPT_COOKIEFILE or CURLOPT_COOKIEJAR to enable parsing and sending cookies automatically.

DEFAULT

+

NULL, no cookies

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

If HTTP is enabled

RETURN VALUE

+

Returns CURLE_OK if HTTP is enabled, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_COOKIEFILE, CURLOPT_COOKIEJAR, CURLOPT_COOKIELIST, CURLOPT_HTTPHEADER,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.pdf b/docs/libcurl/opts/CURLOPT_COOKIE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3a7edbc109235c9cc2614361107ab04ba8276408 GIT binary patch literal 4379 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 new file mode 100644 index 0000000..a4c3b02 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 @@ -0,0 +1,59 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COOKIEFILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COOKIEFILE \- file name to read cookies from +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It should point to +the file name of your file holding cookie data to read. The cookie data can be +in either the old Netscape / Mozilla cookie data format or just regular +HTTP-style headers dumped to a file. + +It also enables the cookie engine, making libcurl parse and send cookies on +subsequent requests with this handle. + +Given an empty or non-existing file or by passing the empty string ("") to +this option, you can enable the cookie engine without reading any initial +cookies. + +This option only \fBreads\fP cookies. To make libcurl write cookies to file, +see \fICURLOPT_COOKIEJAR(3)\fP. + +If you use this option multiple times, you just add more files to read. +Subsequent files will add more cookies. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +As long as HTTP is supported +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_COOKIE "(3), " CURLOPT_COOKIEJAR "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.html b/docs/libcurl/opts/CURLOPT_COOKIEFILE.html new file mode 100644 index 0000000..10539bc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.html @@ -0,0 +1,64 @@ + + +CURLOPT_COOKIEFILE man page + + + + +

NAME

+

CURLOPT_COOKIEFILE - file name to read cookies from

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename);

DESCRIPTION

+

Pass a pointer to a zero terminated string as parameter. It should point to the file name of your file holding cookie data to read. The cookie data can be in either the old Netscape / Mozilla cookie data format or just regular HTTP-style headers dumped to a file. +

It also enables the cookie engine, making libcurl parse and send cookies on subsequent requests with this handle. +

Given an empty or non-existing file or by passing the empty string ("") to this option, you can enable the cookie engine without reading any initial cookies. +

This option only reads cookies. To make libcurl write cookies to file, see CURLOPT_COOKIEJAR. +

If you use this option multiple times, you just add more files to read. Subsequent files will add more cookies.

DEFAULT

+

NULL

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

As long as HTTP is supported

RETURN VALUE

+

Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_COOKIE, CURLOPT_COOKIEJAR,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.pdf b/docs/libcurl/opts/CURLOPT_COOKIEFILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9e0064c01018e83763af6cdabfa6b0ef76a878f8 GIT binary patch literal 4173 zcmb_fc~leE8gHpp84Fme<+)Tw0fS;PGuabE5W*smC`J$pvV>$3Mv_cSCK9k}d2F>V z6a}Rgd@Wk6EInB4rc`Ocs*h5{o@$X&s9RkqDq1V9?@kDU;(P5o$N7hw@BY5!emmZg zK_N_x#f7|&^c0jsJQ#(^l;w~_g2-{Bj!K33fTBb~2t9?HVI)MaqVOPGO=@td6tYle zTxEc4rMXKxj2$5p-#8UBZI_$(3zo+7WvPqjuPBPbn3e1@e(kvItta`fBu-?#9@C$9 zFZ|(NU3y00L`K$g&1Vw7|E{$C^)*ggBGJRU?k$lU9o!}merU2W7b}ut#O{4#}~eHd{VOBZF6cl zv*J$c*y*8rB7Qy|^5!vZd0FetbB)ufX0J_`vICfy9;#o|ko&MZ;`{gI<3=l9e)Va!4-%xEn+1zzq?-+XEd+u%SmR`u33;~+cav_gS7kZ6EDn5PHJH-jJbic z3*4QatCS~r_r21vZBL0O?i$uTr*N^-w-% zx<0?Ckze!jbl0%cUi&m@Ope!%h#$X=ney(HrEg`&HGViID*J_$18a_3Z-21-#>P2w z!uf9co&@Wd1C=%Bv-9V4B@@TmK3N^);mU_unStXY6?ux&yH=ld_WI)dg9b74*R26d zotkTxG1JcU)+W0o?T#Ofbl2Z0J)eKIUF1p^zZUz>Iq5HM(@H%xFzGoi*I&J^Xu5~ zQf$V*ic?Ex-uIbOsQdhzl=7*i&u@o>zM*w7-q&tzty{#DWu#qind(|_bgH057#FeP zc+m`J>BYJCW;H$>Bgk#K`g8gH#!=SyVvX;IRKqWo8f)cu1BfxpUq*W7C4BPr8<#VV z-)&8o6-y3(*6y6uT*-};=jUX3q(0QvzpTl1F}S@!FARlU0mnH;!Ue3T;03CzqiJDouME>*PmE@du(l2wdFT;8BdRT z^M6}^RQi2MV0g>)%G^m`NhPjz*K3UVsbfyHRa9M9w(neLT(Jr-`qnkC(D26;b;QrT z|9r1`S=QFN)$h%3yP)`N(u1SWx5a5qi}R_vtnx~neSJnO)fimQ9lLM+^$o`+7nHnq zcIMX|@1!26o29sx9l5qs)L?ZguJYQouDWAAgw_EVmjz6=vB!BHEh-Up;X0-?($XrTC&8Kd@CJ#-l z_@X^i*Shmka|U?wN{YoeS1`@2a z$YHFsD#!2{;FPH-m7dfMif~x3z$ujm+`!m?tRdZk#{~>M140%>Dqu`1br@-Xl|z+M z0MUHPAu;x64&GuYgwak_B1#b?8aN0c;S(G*!od-!vf#A0kSM}{TbNjJH zZ7nj$hXfH?Ee=u&aZyA|K$w7o7zm@)k}&irdx(Zh7!2N!8)6mm!CeF6aQRZH zqXs1YHj_%7hEs3~t|N?ojH?F@F>@Rvdo ze-$VloM}^;m|FYNVu5js+Ha;zDG!-R18icO!DIkA1ltUHqeX1pN>L^; zf~2RXv(h;%(yT);kw}D~Y=q5b0tC~NVWd|i!OjHe%;Wf?m>5MR$P-8qe84ILODkAn z{|4(Y`h zo{$b4?0m?Otf$1vP6D+J!iGHR98w5=M&Gj&G}JD^jPqlp)6Ec^9$zTv`R(Y&gLUom zw6dNJ20UFQz~OYA_ymdRB117$h>9?Qy}lSI$^bA>hkt=^RD;jc>Sgw$iEK0DS_p+P z9z-{+fe+^McpM(Ag&j1EF8~`6{lUgT8i&UpLBseMnCOq=FfMNd4Fzu+iQ|mGVFE5# zO`eb^0!!8i8VBqFPvC@n;PfYG0^vxSkls2T$FWht2wT_~7mVyd9A#D!dfW{DU5Ak+ zL?#aW2ZN=L1bY>Tv=T, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COOKIEJAR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COOKIEJAR \- file name to store cookies to +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename); +.SH DESCRIPTION +Pass a \fIfilename\fP as char *, zero terminated. This will make libcurl write +all internally known cookies to the specified file when +\fIcurl_easy_cleanup(3)\fP is called. If no cookies are known, no file will be +created. Specify "-" as filename to instead have the cookies written to +stdout. Using this option also enables cookies for this session, so if you for +example follow a location it will make matching cookies get sent accordingly. + +Note that libcurl doesn't read any cookies from the cookie jar. If you want to +read cookies from a file, use \fICURLOPT_COOKIEFILE(3)\fP. + +If the cookie jar file can't be created or written to (when the +\fIcurl_easy_cleanup(3)\fP is called), libcurl will not and cannot report an +error for this. Using \fICURLOPT_VERBOSE(3)\fP or +\fICURLOPT_DEBUGFUNCTION(3)\fP will get a warning to display, but that is the +only visible feedback you get about this possibly lethal situation. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIE "(3), " CURLOPT_COOKIELIST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.html b/docs/libcurl/opts/CURLOPT_COOKIEJAR.html new file mode 100644 index 0000000..a4f45bf --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.html @@ -0,0 +1,62 @@ + + +CURLOPT_COOKIEJAR man page + + + + +

NAME

+

CURLOPT_COOKIEJAR - file name to store cookies to

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename);

DESCRIPTION

+

Pass a filename as char *, zero terminated. This will make libcurl write all internally known cookies to the specified file when curl_easy_cleanup(3) is called. If no cookies are known, no file will be created. Specify "-" as filename to instead have the cookies written to stdout. Using this option also enables cookies for this session, so if you for example follow a location it will make matching cookies get sent accordingly. +

Note that libcurl doesn't read any cookies from the cookie jar. If you want to read cookies from a file, use CURLOPT_COOKIEFILE. +

If the cookie jar file can't be created or written to (when the curl_easy_cleanup(3) is called), libcurl will not and cannot report an error for this. Using CURLOPT_VERBOSE or CURLOPT_DEBUGFUNCTION will get a warning to display, but that is the only visible feedback you get about this possibly lethal situation.

DEFAULT

+

NULL

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

Along with HTTP

RETURN VALUE

+

Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_COOKIEFILE, CURLOPT_COOKIE, CURLOPT_COOKIELIST,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.pdf b/docs/libcurl/opts/CURLOPT_COOKIEJAR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0626bd4f6446ae633c02c95b08f188adb8f3ef1 GIT binary patch literal 4607 zcmb_gc~}$I78e)#jEF@=!HsdjfSAloRuUm>Nl+nx0aQeM4ao!o*-R!95ch?Gttb`{ zaRrNtLKPJe6j2aGd5TqB5Q_?EU0a|opnbkO0Th+KzW063Ke==6+0Q-qcP91$d?5v; zGD!C4o+f9Jm=FSK!lOtoF0e1Aj=&=!7NCe>p+bpcItUgjB{;^%q#7B<JC4(?U=Io z+#MfrN}haBQlECD>Z1O#>#O+>=&0kw$x9#YXvu#ScW+ZkK}1T)FAv9UTE~C)ZA{bD z)q}^l{X?_(vBktv!P~MN7wBGo#MYliTy4jUdftvxJHBgpQSN_o`K;stW=c!8>*Zag zK4%hsNk!+)AN|s>qatC#Nvm1y#=xX04Rik7)x71JEZ=O|q}bUh>KeE57}wD+wV?y@ zyzZ&IHqEm*SkZ^sXD>r*^{i&$)W=1#$i=M{%GH^o`g8Lin;UkoLzn&{S7cm6m(XM* zsF|eLk;z|aMGfXQO?ItJ>q+YttqkHg?mzMMq)TmY_&@xjG<^ zO}v*=&gn5jezw_Q9BtiX-L!Jw{8!83E!#6&TI12<7UZ^!{J#2NtL^9S)1uA~afq>g z;eI4~{3&5b%5=1>dY*DC?c#&t>7!<++t;kJJ#u=p#fVgHx>^r9xKyXVQwGRSn~+ zmZZI+B$$8wv+?};Aotw74e^$guNIf9n*k^gyCnEOcLRA6bx+cPyjG1Gk0&vCgGXLEhZR85%xnv-~YfMb8^-Ensd_$yrUJc8E*Jf&DQ zKFhwaI+i!Ms8$|M53U|rKC*w*PM@{6$RQz#kzR#Y62&%$_dUGP-1bKctle$juxre7 z#9wo>aO_&cUVhFz%_h4kGiPHdcgz|$6ch||2+SDfe%S9Ge@QC~ZkjwWF=T6Te(j?U z@elS}?Y?&2UY~OAE##lb^D3w>d+k*BY{lN&E~4N)p+VS#jqE#F?q=lOfkods~hIpKf{nQF=Jcv&c{)sgD2H`HZ)~bFSvh)6}RT;H_2Q2xcA$ilzqK2E$@44 zr*RmWOc^516}+`MX1go!wxOcfT~JzHc_ne9|EyVG1y0HwXDFI;)t$WLw(J_SpO;V2 zTJvcUBD-(0;zoE->^jUGZXOMr*tgK#V}R%S|E6?TTkl+(omR}YzJA-v6iJ8jM;?Dkb-H`B zzQXF>cXbrU$${f`cWhl=kzDt<&YhiNd3|BzI_P#p7mO}%B768_a+Z^e`ISVFe`eJbDdfvcsk&2OUJ*97uZ#|#m_s{mO9b=K+IBqlj)ycY*=1&?In&-_fxv)!o$MUTE zp=Mj(L-34@16OKS-#n20dO^qb)rT)NFTHulQ4 zj#?wttB#~Sj2@aWf*Dr3rENoX<}^xXhkSo-`;oS^emBkTMy_}}YHj-EKDO`B;-anV zpD3!{wS`$1I@?@dkZq*jSbcn}TMJ^TjnI#7&0WpzaIf<&SRgN5{$5tg+l>OGEvRRfJZl&S3{~0CkgNMi4`!DQ^SQL8tks$4f6o;! z3Wfz2*`<{O{hs7~`*L@^_o1EsE+=hIm@8kswo7Q){9Vq)*o$iKQ4N=}pF7;QnUy-H z-gktlysuC~Z)Ps^4Iae7D+x^N1t2y7z|jrc`b90sY2 z#`u7HL9tp44v<7(un3bWB%T^06pDatCWi?*GiYHXSggST3PK3r(qU>Gq7x7a$e3PZ z&`B{p0M7uOMjD9Wp)i0~2oA!GIFJ(9ca`;1P+Ty zfYjw5VWJb4fi~bEWb#lC!9EI^9ttH9{)z*E97zv)Dsjil!P)6Sgr{BAV>JvyDOd=rL3nTe_@!2t#<`tjY^{K zso_H?rn3HJD4!nMZn@qBa@G#bO9a4bThb|wE-a*7NoWUk~nOc5f|dSQ`@>2W$NFwQSX8W%0)$jELyl8c)J zv>-+?O0*QYX{6Lcm|p5S!AtBboIo%bxki;%1i5a;_M(VW&dy=1PvlaV-~y zV`5^cF?6a%7XhOj4hKePFpWk5929-58kZO;YW+lD&*X?=?t3w{o@(-mD%Gf9#atMr zB5=1MJ_tvr(BcY>8X^o!!Zilmm25C5WLy@5F6XeM5{gt#3#XtcCZ{0ap~#rdESXHg z2}k9eZgbimZhmABYyg9FkO#2hf_p}0kYYMlvUh+l)4i#aM;jZw%lvkiO zy=MUwv?~oRfQKsrttgM>gIkhELr^9KK`DrH5W?Z2Y%Y`TgrHmmae+VK1jPrUUf`1g zd}90$qCGf!h-!2};7ITybQ-xFT7>EJL?uuvjYg$+S~Q7uak;=mje2C~OXo|X6^Z_P z##AceNE3WqzD83fH@2A$H>9Wp75DKWw~Jt#8@JeEnha*a+U z0cTsH)q=ZNLL7M*oJlgz1#IF9T#4~az2~9CI~Pg?(Mw#VL>=KuHd17mTw+k-WL~h^ z#4YQrhEl=nT$tqG54w7(m5Bs;8M%J8flwBSxUf1Oh{a^mnUEanq5&TO#t{#s?xxW>&H%$drlA}r0Mk!sY|dvi1jO_? zANw;t8sZEP|6_eL2J$%{odE#z6FwU9ISr-tLSueTqd9*TFO9(gzF19eV>@C-f_>cXaR=mHPKlTJegEE=E9 p5wMufYzAM*VlZe3hsOJRjxb^z)Z-EzZYm@LAUVn2Uf?ez{RdU7fsX(H literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3 new file mode 100644 index 0000000..815def1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3 @@ -0,0 +1,71 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COOKIELIST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIELIST, + char *cookie); +.SH DESCRIPTION +Pass a char * to a \fIcookie\fP string. + +Such a cookie can be either a single line in Netscape / Mozilla format or just +regular HTTP-style header (Set-Cookie: ...) format. This will also enable the +cookie engine. This adds that single cookie to the internal cookie store. + +Additionally, there are commands available that perform actions if you pass in +these exact strings: +.IP ALL +erases all cookies held in memory + +.IP SESS +erases all session cookies held in memory + +.IP FLUSH +writes all known cookies to the file specified by \fICURLOPT_COOKIEJAR(3)\fP + +.IP RELOAD +loads all cookies from the files specified by \fICURLOPT_COOKIEFILE(3)\fP + +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +ALL was added in 7.14.1 + +SESS was added in 7.15.4 + +FLUSH was added in 7.17.1 + +RELOAD was added in 7.39.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIEJAR "(3), " CURLOPT_COOKIE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.html b/docs/libcurl/opts/CURLOPT_COOKIELIST.html new file mode 100644 index 0000000..382eb60 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.html @@ -0,0 +1,81 @@ + + +CURLOPT_COOKIELIST man page + + + + +

NAME

+

CURLOPT_COOKIELIST - add to or manipulate cookies held in memory

SYNOPSIS

+

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIELIST, +   char *cookie); +

+

DESCRIPTION

+

Pass a char * to a cookie string. +

Such a cookie can be either a single line in Netscape / Mozilla format or just regular HTTP-style header (Set-Cookie: ...) format. This will also enable the cookie engine. This adds that single cookie to the internal cookie store. +

Additionally, there are commands available that perform actions if you pass in these exact strings: +

ALL +

erases all cookies held in memory +

+

SESS +

erases all session cookies held in memory +

+

FLUSH +

writes all known cookies to the file specified by CURLOPT_COOKIEJAR +

+

RELOAD +

loads all cookies from the files specified by CURLOPT_COOKIEFILE +

DEFAULT

+

NULL

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

ALL was added in 7.14.1 +

SESS was added in 7.15.4 +

FLUSH was added in 7.17.1 +

RELOAD was added in 7.39.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_COOKIEFILE, CURLOPT_COOKIEJAR, CURLOPT_COOKIE,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.pdf b/docs/libcurl/opts/CURLOPT_COOKIELIST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..896acd61705ae61c623d35b9b8cc703d2a96a804 GIT binary patch literal 4195 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COOKIESESSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COOKIESESSION \- start a new cookie session +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIESESSION, long init); +.SH DESCRIPTION +Pass a long set to 1 to mark this as a new cookie "session". It will force +libcurl to ignore all cookies it is about to load that are "session cookies" +from the previous session. By default, libcurl always stores and loads all +cookies, independent if they are session cookies or not. Session cookies are +cookies without expiry date and they are meant to be alive and existing for +this "session" only. + +A "session" is usually defined in browser land for as long as you have your +browser up, more or less. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.html b/docs/libcurl/opts/CURLOPT_COOKIESESSION.html new file mode 100644 index 0000000..4231e9d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.html @@ -0,0 +1,61 @@ + + +CURLOPT_COOKIESESSION man page + + + + +

NAME

+

CURLOPT_COOKIESESSION - start a new cookie session

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIESESSION, long init);

DESCRIPTION

+

Pass a long set to 1 to mark this as a new cookie "session". It will force libcurl to ignore all cookies it is about to load that are "session cookies" from the previous session. By default, libcurl always stores and loads all cookies, independent if they are session cookies or not. Session cookies are cookies without expiry date and they are meant to be alive and existing for this "session" only. +

A "session" is usually defined in browser land for as long as you have your browser up, more or less.

DEFAULT

+

0

PROTOCOLS

+

HTTP

EXAMPLE

+

TODO

AVAILABILITY

+

Along with HTTP

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_COOKIEFILE, CURLOPT_COOKIE,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.pdf b/docs/libcurl/opts/CURLOPT_COOKIESESSION.pdf new file mode 100644 index 0000000..92a3c9f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.pdf @@ -0,0 +1,106 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ…VÛnÛF}çW ܇’…´á.o»hQ@vT‰bª4° ƒ–h› E:¼ÄÑ?ôWú]ÞDY!€´¹»3çœ93äW0 SþÚûf§½YyðPj&k×úÅÕj,Ãۋ ø0÷×þz=.otëƀM]¤·qTîo˸ʟ*cÊ“˜¦§ã?Iž•ðãÃÆßá{mjF1áñÄC„#!Y.„ M¿œ?#\¥q„…0í¦ôðŸÌ$¶éÁ”2¹lJÔ§AÃPVQQAY,c0â¨èžC,ÞFÞȕ&«M¨k²v!Ï¿$1”qY"³Áä)cˆÑF.ájÿúóe°\Ï×c°H­ªÿ”d›´ÞÆð›Ôñ¼Çß.[ñ—$69n8ÖùF-Á/Q¶MãÉi•'æÙ$YRÝ¿¢’c¼ +H‡õ­¿¾X͗!“ù±,Ôiªr÷2ê„;<&ñ„R¾,Q^•±B•£³ð²‹Š/P=&¸Xöò[„‰¦º6áì¤þbϛøMÎÚ:œ˜Wðœ¤)ÜçÅ&†4¹“jɜÉC–1D¸¶Q§JH*HJŐz‚¸¬ãDцNc÷è.¯î4¶9B»CÂ.ÔÜù×cx*b‹¶·ôoI^—IœïaßT6…àzT§Õ¤‡¥]PÉÖr]b9 +ƒÆ”gpá£WH U̶Š‰åyDÐÞþÄ´-%”Ä_²Ÿ ¶ñSŒ— u¸—àÛ.G¤Þ=„ý‚à¬ë¢ï‚^×¼€,¯¬žK庿Ÿ“êQJÛäĒ ¯ øý))öŠ‹JqÎǽ¼ªX²=À+AÙ»SˆÓh-q€vG™*étC2r¸+å&í\ÖH÷ ÷ á\¬~Gc8”Lj»ú÷¤¬ô;°±xoNȳto¸­7ˆ*w‹~Jmœh@Ùësv6$Ä!Üd»ÖûH¶.k¬¦tÔ¿Y¼ÅbÂ]‘ …Ìӟ˸€TÊ$q`—©Äû>¯á1ê­¦²3Ç!Ì{AzHŽHçuÑgäŽÝd¬Ÿ&°“m†ISې<5Œ>7ïÚ"86Wxp/µ[õÙUÓ¢R¶vú3×êܲ{”Ãx’Ì<ϳì~J™/Gôhä-W-Ûâí°a®×¶Ù”ÓiæMBÐ'dñL·{]‹£éŽ˜‚Pü†ËW€øÍ>.~çJþù‡¡]Ÿ¾ ZµÎ_¼I§¶;ûlRT[ñš}‚ÙÀË$®C»3_ÌÎç‹yøyLË`ÙÇÍ9S6“½ ¯s½ÖW~xµº„OµÐE.Õg‹+¿µÌ Ê«¸ª‹ö3¿ >¼"åÚ÷a¶Xö£xãå»ùâèS‚R>Ì`õ™2ÇÂTî0ŒÇáÆ¡„œýÎ!֔áœÇçSËñˆÛ¨Ò½<üè"¦1¥Ž#lâèԃ÷u njÒÈî­Ge(?ÔþÄßÿ4‹=endstream +endobj +6 0 obj +1141 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +12 0 obj +<> +endobj +13 0 obj +<>stream + + + + + +2015-01-08T09:17:53+01:00 +2015-01-08T09:17:53+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 14 +0000000000 65535 f +0000001465 00000 n +0000003276 00000 n +0000001406 00000 n +0000001246 00000 n +0000000015 00000 n +0000001226 00000 n +0000001530 00000 n +0000001705 00000 n +0000001640 00000 n +0000001571 00000 n +0000001601 00000 n +0000001787 00000 n +0000001853 00000 n +trailer +<< /Size 14 /Root 1 0 R /Info 2 0 R +/ID [<92DA738D7286633AF0F76D4DE60DE35D><92DA738D7286633AF0F76D4DE60DE35D>] +>> +startxref +3430 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 new file mode 100644 index 0000000..d35aebd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 @@ -0,0 +1,70 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_COPYPOSTFIELDS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COPYPOSTFIELDS, char *data); +.SH DESCRIPTION +Pass a char * as parameter, which should be the full \fIdata\fP to post in a +HTTP POST operation. It behaves as the \fICURLOPT_POSTFIELDS(3)\fP option, but +the original data is instead copied by the library, allowing the application +to overwrite the original data after setting this option. + +Because data are copied, care must be taken when using this option in +conjunction with \fICURLOPT_POSTFIELDSIZE(3)\fP or +\fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP: If the size has not been set prior to +\fICURLOPT_COPYPOSTFIELDS(3)\fP, the data is assumed to be a zero terminated +string; else the stored size informs the library about the byte count to +copy. In any case, the size must not be changed after +\fICURLOPT_COPYPOSTFIELDS(3)\fP, unless another \fICURLOPT_POSTFIELDS(3)\fP or +\fICURLOPT_COPYPOSTFIELDS(3)\fP option is issued. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + char local_buffer[1024]="data to send"; + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* size of the data to copy from the buffer and send in the request */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L); + + /* send data from the local stack */ + curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, local_buffer); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.17.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POSTFIELDSIZE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.html b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.html new file mode 100644 index 0000000..f2b7a0a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.html @@ -0,0 +1,74 @@ + + +CURLOPT_COPYPOSTFIELDS man page + + + + +

NAME

+

CURLOPT_COPYPOSTFIELDS - have libcurl copy data to POST

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COPYPOSTFIELDS, char *data);

DESCRIPTION

+

Pass a char * as parameter, which should be the full data to post in a HTTP POST operation. It behaves as the CURLOPT_POSTFIELDS option, but the original data is instead copied by the library, allowing the application to overwrite the original data after setting this option. +

Because data are copied, care must be taken when using this option in conjunction with CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE: If the size has not been set prior to CURLOPT_COPYPOSTFIELDS, the data is assumed to be a zero terminated string; else the stored size informs the library about the byte count to copy. In any case, the size must not be changed after CURLOPT_COPYPOSTFIELDS, unless another CURLOPT_POSTFIELDS or CURLOPT_COPYPOSTFIELDS option is issued.

DEFAULT

+

NULL

PROTOCOLS

+

HTTP(S)

EXAMPLE

+

+

CURL *curl = curl_easy_init(); + if(curl) { +   char local_buffer[1024]="data to send"; +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

  /* size of the data to copy from the buffer and send in the request */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L); +

  /* send data from the local stack */ +   curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, local_buffer); +

  curl_easy_perform(curl); + } +

+ +

AVAILABILITY

+

Added in 7.17.1

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_POSTFIELDS, CURLOPT_POSTFIELDSIZE,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.pdf b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f376e1724b42d379d89e495134df0b2f5344944c GIT binary patch literal 4668 zcmb_gc~}$I78eweXhCuN6sseOK`@z_?1>N*0;mvyfPx~(kW4T@G9j6eKtWs(aY3|- zD^*-^L8*#M@l$cDD@YYlM5s$uK$I4-DsJyi0QdLW_kGSkxpVG0zjN+c?l}{uK#30n zWpZdvXB)FO(YO!-5z({XHiR&QPCmthl2`(oTxL8cnlR6wz z(@eQpq1C#3zxGOf80xPc+%It1uuE2aBG=`~+DGLN7WS~JsvXDd*TvTR22^s!X<_b# zAumE-XV?ES3mQ8YaWtAQpVbjIJeB>0kO|v8Z)&e@Vh}R$O{$}+iQ)- zdE2AeQC`sTOkU?VJ;sW?XP(pc+%$t9HRy*wFW2TiXA(hEpkjC85Wch$qtb z6MLFQCB|&tGID=T=C1rnP7Tr1tA{m+ZX~317jN;7+!(t4VA_&n4vPo*+uT~wX;aUh zcgl0}R?pv5RZ={#ni$$G%!!%k)pg9~XC|uT;b~*ld&0z+n=>Wc3tvgG;9niu)V9ji*0yT^u%_l zL(8Fr?>85ZvCm#|+gUL#0$MJ19Bfq$}&U*q@E+{NPm$#=6a3m~?B{_kp1n^P-L|yZ1~FBRS7S*gajni1r6w%vr~n;yN&R!Tl#a3bY)+i zRp!}DuhEK-Yq!zTAxmviPtWRWaVP&MRNJ(l6J)il*>&Q=J3)-i`D++#xih0+V@j%opIx44!BiGl)ik*5*{QUiV@d1G zj&51!+`Y>m)fNNdUL4!$mv>_H@O=|{AK1A_Hq&mb>mTW8qo}~!_R?^PT~SK#iX#nS z`Oe4S#U)J}V$YY2D7=47*)V%1dDbyc@Wf$o(13JNv(3~Ex2#XtI~h*q#RYDTbZs(7 zGIsdcS+QgO2ym_+nAd2S&$tx7z;$(`A$-c#fe}-M;%4j2$ol=$r`Q#DdA@#k!8>~Q zi(YT1V(adeeV>tAbk6H#ZVzT}-6e~gj|YggmK)zK3|X(PM!cNUyi+Xjm{?--{?zRg zOGa0*t&eQUZ;jF17e6Q;o?RMLJuAw#)ATa~H;n#iR(<}G(o?>ttXEn4oE)lJuFN7h zXK(IfL8ZVQb^xQ>#q12Q{P9@7zD|xFq=|8LQ7Th_*N-PiZ9WuI{n2 z6lHza`%D|eqE-|*p7EFGcy(?gOz*F2e%JS*r!HX|FtjOR$4DQ`I z#{pb{gkHLk>yO;&31qgTqo>p~5@~6BLesZLW|D2{^0>8Z0A7(4HX#aOrRj39+f( z4am5jFzDpC9(46U9U%|K$#59-eFzT0O(c->Hj%!;W>FMv6Y(K{ILb1=fJP5{fp>tY zho}KTMgydF`zRG{0|P(<20~^F^$_f*Qs|*@8fCwX76AbS0|oh!D5a`>)@YOT!bmKh zi0Oc6w_b{qm;&rTXdBiC-TY4hJ{*Gv2LwtXR4i^c(tN6RRWd$}l9PRaF(0#I7e#0& zFWS8LXBxYM)1~vflZ}}fl#wg|C>qX-F8UITDU_FmZ+3U9HbP; zp>P_?L13kdhVt34TBR}QBR(9;9HNgAI)eAX4PjFMj?ofjb9iELdkwgGn6#KY4kw{# zJVvE)r#BrrPKQ(qcX}vSib%Cy_zcy!WE~!yJTXL`948kl=pJI4n+FC;2WOZtEkkLZ zQS}h6m%BT9$^3mBDF&0sq}HlI4nZb$yhblFxzo)eBCw{&FdZ_pka6zxFlit}5=4BQ ziiB89Arobw>`{ zHh@Al@B>(h!2O^w$Z?%J-8ax5@|{8G$u|9vkcsfiK80k@l&g`ivpf-(?62qF}rd=Z!Jil8C{af3hO1i=TQUf>%Ae6#!u(T_Mk5+!sY zASJ{xIzp+05^Ojb^cSE;pEp(MR6-*8ak@QtAKpm|9JxG{q;95ORYW zT-)O%|4+hv>liEK?+w-(bn)iuP{?6C9;a;6gD|7OVuf6!By?&FomPGNGCdQp^VkmGWW{4;0;z=4ax1uc?@hWlK!Yl`W z!1_w8%p_3TAZ+man?p>4zR~mTfIeK8pvSq>jnribR-X, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CRLF 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CRLF \- enable/disable CRLF conversion +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLF, long conv); +.SH DESCRIPTION +Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to +CRLF newlines on transfers. Disable this option again by setting the value to +0 (zero). + +This is a legacy option of questionable use. +.SH DEFAULT +0 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +SMTP since 7.40.0, other protocols since they were introduced +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), " CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CRLF.html b/docs/libcurl/opts/CURLOPT_CRLF.html new file mode 100644 index 0000000..c3f7e9b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CRLF.html @@ -0,0 +1,61 @@ + + +CURLOPT_CRLF man page + + + + +

NAME

+

CURLOPT_CRLF - enable/disable CRLF conversion

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLF, long conv);

DESCRIPTION

+

Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to CRLF newlines on transfers. Disable this option again by setting the value to 0 (zero). +

This is a legacy option of questionable use.

DEFAULT

+

0

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

SMTP since 7.40.0, other protocols since they were introduced

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPT_CONV_TO_NETWORK_FUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CRLF.pdf b/docs/libcurl/opts/CURLOPT_CRLF.pdf new file mode 100644 index 0000000000000000000000000000000000000000..767bc0908a3d274ed95cf5bccbc77a209c135d72 GIT binary patch literal 3753 zcmb_fd0Z1$9$$(_9jbV>idY@37+p1#i5qi%P8rSTDe0m43Vht$5S}@hn;q+uAoF2#UMi{d|1?uJ=2>zZaiK zm70t3gpkkCy9?GrA{d3~q*O>QN5TnnGLr&}0Y!_bDI-HzVMJ}j8A3(qX#=5DLN>-q z;3mkiJTLa1xj44>?+-Q(-0Tm0cGqzI;1oph1b} zZLZk8zs0LtVQ#N3kKAVu&B_@uBs=rI&M&#CVN_wo52X#aldjIr^Jvs9;w_GOwsY*_ zzrTpx``N!ot%>$)))yuFlxJ1_?)S%q#;C(yEB961af{{T@c%Zm`=d>_=5@bc^6tRm z@ILRq+vR;atA@B;^WKFvPQY!7Tjfn zv1ekx%|(MI=I7Vexn0e^^25l;B^O)v_PU}Rusp>Rb5!ikEG@a7!uPJ(7n!&Fi-zBJ zo;cTFUVLzom4$v(qg|-S6%A2b!J66)*zke@igONA+4UsLz_#$D$lCKaGRep^3m!en09m9+ZIh~1xP3j@xkO={7h6LYUdnRa-KK2J!jF672; z3~j1k_x%8~t|I>gmauj53|+|1Gyg1@5xU@)S$BWhQmh(Rk%RgihW2IWloxdI{u*0f zz5UUk)NGFhW$T3X+%I)sEj&N{;HKd#?;fuX&K(z4U*mI=U(1~JI&NCxRg&_-is?xQ z@{0FV+Lw(9Qm1hZep4QcdQB^zyO?qhfIM=-#;*0wZyB6dT6I%}sZ0U9*&8ljw$-dX z>A7{@GWRai#$lnSGb}R`yDeQjY0rb%FHV1!?};u$w`~nr9`a?}v8RcdWMa3GrQ1m1 zwgIH2Ypy$Yyu9+)>)7C)%J)K!G^Z`~P7etE`s9u?wS+vUuWpQ+aQxui{l1?T>(Lzh zbIf-&r+4OG)1>Kld14>-z9D)tWu<4uh?8S4ct>lmL?p*7qSG41-^vO)MQQKNxvA*SE1vk^o74|xp#x8>4T^tSUc7Xw@Voda z;kqGbJiK+hqxf&Nm8;yIe#$A#j-PV;X!5zyWe+7S+KZE)Yvm2+n&cxiwU<}PeDq77 zk!jm!jK1AXaWY4%LBm#? z-5#a>W4ik})zstn1nVExce{c19Gc-}d90Zm@$K}=E0I~jSAsq}f*jbewL|N@F2yK-N z!WrC1C%36^d9NWD+yG8std-Di+xJxk?bm>iiIEx@Qz~6fI&bANrS*kaIc>Wd=QZ0- zrI3_8MYIw~@+uokcX0*cHiC^15>1&18#j`4rpEB02viMCL&`rfQS zOPg?WM-9PdFgPf4GK}$^-uwrR&Qq64))>+zho~r$BtQ*-q$fa_uK+PoX1h(-?u;{- z9Yx#1-0psyCcJI7VFIC8sdQDV+}~lr^=SkHClSe%S;2Wwc7Ov@1_kG1kp|URf`}9< zG|NgvWkp2mv(ofZ1IJ$p$^CIqPMi3T%T3pKyKa~1&~lz803IQrU8XZW~u-VDfuWS;-VNAl|-Xb8Rjb!3C5t9 z3`OP0Yn&kYKr{$ElE9lV}o8s(pD1=Y8$s$jFcW{OCA9=$x+I|Aww}nLh0ITC-uKl&u@59MZ1q4Y_iXKyQPzAuo|b3Bhk^y*)+ka0#Z7f|J35 zA=te-`dOHFp>bPZk9t#Ej|QWd?Gg}hwogW>WNee67%D-fn6I;wK_09M!~#`(0jBm9s@1__EKn>7 mlAwHHV1OVnP=qS~nnTAvq-+dsWt<5T2>2-E;}bkl4gCq=Kn6en literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3 new file mode 100644 index 0000000..adc0e99 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3 @@ -0,0 +1,60 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CRLFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CRLFILE \- specify a Certificate Revocation List file +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file); +.SH DESCRIPTION +Pass a char * to a zero terminated string naming a \fIfile\fP with the +concatenation of CRL (in PEM format) to use in the certificate validation that +occurs during the SSL exchange. + +When curl is built to use NSS or GnuTLS, there is no way to influence the use +of CRL passed to help in the verification process. When libcurl is built with +OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both +set, requiring CRL check against all the elements of the certificate chain if +a CRL file is passed. + +This option makes sense only when used in combination with the +\fICURLOPT_SSL_VERIFYPEER(3)\fP option. + +A specific error code (\fICURLE_SSL_CRL_BADFILE\fP) is defined with the +option. It is returned when the SSL exchange fails because the CRL file cannot +be loaded. A failure in certificate verification due to a revocation +information found in the CRL does not trigger this specific error. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.html b/docs/libcurl/opts/CURLOPT_CRLFILE.html new file mode 100644 index 0000000..a92de84 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CRLFILE.html @@ -0,0 +1,63 @@ + + +CURLOPT_CRLFILE man page + + + + +

NAME

+

CURLOPT_CRLFILE - specify a Certificate Revocation List file

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file);

DESCRIPTION

+

Pass a char * to a zero terminated string naming a file with the concatenation of CRL (in PEM format) to use in the certificate validation that occurs during the SSL exchange. +

When curl is built to use NSS or GnuTLS, there is no way to influence the use of CRL passed to help in the verification process. When libcurl is built with OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both set, requiring CRL check against all the elements of the certificate chain if a CRL file is passed. +

This option makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. +

A specific error code (CURLE_SSL_CRL_BADFILE) is defined with the option. It is returned when the SSL exchange fails because the CRL file cannot be loaded. A failure in certificate verification due to a revocation information found in the CRL does not trigger this specific error.

DEFAULT

+

NULL

PROTOCOLS

+

All TLS-based protocols

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.19.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.pdf b/docs/libcurl/opts/CURLOPT_CRLFILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ecefbc884308d897a9d47d330c3038ff74d2b84 GIT binary patch literal 4541 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 RoJa=3@+P^u222Yi{Rg91SWy4~ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 new file mode 100644 index 0000000..fd33118 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 @@ -0,0 +1,95 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_CUSTOMREQUEST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_CUSTOMREQUEST \- custom string for request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. + +When you change the request method by setting \fBCURLOPT_CUSTOMREQUEST(3)\fP +to something, you don't actually change how libcurl behaves or acts in regards +to the particular request method, it will only change the actual string sent +in the request. + +Restore to the internal default by setting this to NULL. + +This option can be used to specify the request: +.IP HTTP +Instead of GET or HEAD when performing HTTP based requests. This is +particularly useful, for example, for performing a HTTP DELETE request. + +For example: + +When you tell libcurl to do a HEAD request, but then specify a GET though a +custom request libcurl will still act as if it sent a HEAD. To switch to a +proper HEAD use \fICURLOPT_NOBODY(3)\fP, to switch to a proper POST use +\fICURLOPT_POST(3)\fP or \fICURLOPT_POSTFIELDS(3)\fP and to switch to a proper +GET use \fICURLOPT_HTTPGET(3)\fP. + +Many people have wrongly used this option to replace the entire request with +their own, including multiple headers and POST contents. While that might work +in many cases, it will cause libcurl to send invalid requests and it could +possibly confuse the remote server badly. Use \fICURLOPT_POST(3)\fP and +\fICURLOPT_POSTFIELDS(3)\fP to set POST data. Use \fICURLOPT_HTTPHEADER(3)\fP +to replace or extend the set of headers sent by libcurl. Use +\fICURLOPT_HTTP_VERSION(3)\fP to change HTTP version. + +.IP FTP +Instead of LIST and NLST when performing FTP directory listings. +.IP IMAP +Instead of LIST when issuing IMAP based requests. +.IP POP3 +Instead of LIST and RETR when issuing POP3 based requests. + +For example: + +When you tell libcurl to use a custom request it will behave like a LIST or +RETR command was sent where it expects data to be returned by the server. As +such \fICURLOPT_NOBODY(3)\fP should be used when specifying commands such as +DELE and NOOP for example. +.IP SMTP +Instead of a HELP or VRFY when issuing SMTP based requests. + +For example: + +Normally a multiline response is returned which can be used, in conjunction +with \fICURLOPT_MAIL_RCPT(3)\fP, to specify an EXPN request. If the +\fICURLOPT_NOBODY(3)\fP option is specified then the request can be used to +issue NOOP and RSET commands. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP, FTP, IMAP, POP3 and SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +IMAP is supported since 7.30.0, POP3 since 7.26.0 and SMTP since 7.34.0. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_NOBODY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.html b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.html new file mode 100644 index 0000000..c6e5124 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.html @@ -0,0 +1,81 @@ + + +CURLOPT_CUSTOMREQUEST man page + + + + +

NAME

+

CURLOPT_CUSTOMREQUEST - custom string for request

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request);

DESCRIPTION

+

Pass a pointer to a zero terminated string as parameter. +

When you change the request method by setting CURLOPT_CUSTOMREQUEST to something, you don't actually change how libcurl behaves or acts in regards to the particular request method, it will only change the actual string sent in the request. +

Restore to the internal default by setting this to NULL. +

This option can be used to specify the request: +

HTTP +

Instead of GET or HEAD when performing HTTP based requests. This is particularly useful, for example, for performing a HTTP DELETE request. +

For example: +

When you tell libcurl to do a HEAD request, but then specify a GET though a custom request libcurl will still act as if it sent a HEAD. To switch to a proper HEAD use CURLOPT_NOBODY, to switch to a proper POST use CURLOPT_POST or CURLOPT_POSTFIELDS and to switch to a proper GET use CURLOPT_HTTPGET. +

Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CURLOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. +

+

FTP +

Instead of LIST and NLST when performing FTP directory listings. +

IMAP +

Instead of LIST when issuing IMAP based requests. +

POP3 +

Instead of LIST and RETR when issuing POP3 based requests. +

For example: +

When you tell libcurl to use a custom request it will behave like a LIST or RETR command was sent where it expects data to be returned by the server. As such CURLOPT_NOBODY should be used when specifying commands such as DELE and NOOP for example. +

SMTP +

Instead of a HELP or VRFY when issuing SMTP based requests. +

For example: +

Normally a multiline response is returned which can be used, in conjunction with CURLOPT_MAIL_RCPT, to specify an EXPN request. If the CURLOPT_NOBODY option is specified then the request can be used to issue NOOP and RSET commands.

DEFAULT

+

NULL

PROTOCOLS

+

HTTP, FTP, IMAP, POP3 and SMTP

EXAMPLE

+

TODO

AVAILABILITY

+

IMAP is supported since 7.30.0, POP3 since 7.26.0 and SMTP since 7.34.0.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_HTTPHEADER, CURLOPT_NOBODY,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.pdf b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f93faa3754a4d573b759a601e693decc6c47ba83 GIT binary patch literal 6299 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 E0FC#E%m4rY literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 new file mode 100644 index 0000000..ebdb0c5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DEBUGDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DEBUGDATA \- custom pointer for debug callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP to whatever you want passed in to your +\fICURLOPT_DEBUGFUNCTION(3)\fP in the last void * argument. This pointer is +not used by libcurl, it is only passed to the callback. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +http://curl.haxx.se/libcurl/c/debug.html +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.html b/docs/libcurl/opts/CURLOPT_DEBUGDATA.html new file mode 100644 index 0000000..d5a09e7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_DEBUGDATA man page + + + + +

NAME

+

CURLOPT_DEBUGDATA - custom pointer for debug callback

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGDATA, void *pointer);

DESCRIPTION

+

Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in the last void * argument. This pointer is not used by libcurl, it is only passed to the callback.

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

http://curl.haxx.se/libcurl/c/debug.html

AVAILABILITY

+

Always

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.pdf b/docs/libcurl/opts/CURLOPT_DEBUGDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80247b7c04a87d6ec944e17a588ffc6f690cf57e GIT binary patch literal 3822 zcmb_fc~ld39&cBLI{I2%VbNA$KrxCYGm|?p30H`MMA!rr#DG?>YbQ%lG%akI(N* zM2c3&#{^<1;`C1|OCbr2!gO{nq*5VCq}{^iz*0alAUev*k_?RKtT;<*NfS+w8V%%R z84|Za?hPB$ZrE?=0{--1>cES^m-bFMbT%`qxOA>nw9ue4L`3Gy2=?P+Yo`~n+Q=1} ziuQ(SOu?$3;P{y6@TwYx<@~u}b3RNQlHz*Qe)as2^O^2(1EH0tg6F3#-rPQAd{q&8 z-1tf91>Nh9`>dP)ZQZ>+vTK`u_`-DjBU8Zc zftv=cGk$h^<+aCSPM2R;q$rv}#Q!-=bqZZMQCBehZpyqnL!5cHN?JGe+gYPIlHAnf z{(L0)CUtrr!HzFwH&kOcC&zwx<4RcNc4L|~U~5Fppxe~kHv>x6$F7;5y?@W|7CA#* zVMkLh4P21w9_UwTJc2$Vi?uJSnU=WCU+1r968pOF<5kKxQQ4LI6|1V{jf2`PSDzjK zVCBA-bFW4bl$oWy56zn`|59RT_al~zUfzK zYz;iv{}1&o&&GY4%quMXYS-ciK`!&m(DYm)R-LsaxL>VgWLcfAy0&%wnEKlDwH9ra ze6MR_NlnWr!Ro<+%H6ej747SD@W6`jlj>s&8$u6JCrgLcUuN^}`@1Wfhi*G5ySr;a zdDZA*iB%MR(KM&wN&m-H#xH*?SiSkSe$C?k{)gJ^ii1;{uD+UT$@zJreCyrabEW;a z&irHS)o4{v<@51D)9Py~=A0NZQ(Ja4Yl)k_BTgAr(&lc6n3e!HT9?j>Z~x%-^@195VELoIhT*d^>+N}B-dS`unfpp?cGkr<1PvG!aN2gbcyLj1k&$iB&D+%@-?T0d{AbE{rm9aP zKf4<^e3|u3W}|!F^TX?|-CUgZvZyg!)2i`nfF|rSUpaN>VeYUMWy$3~?j2DXJ@+4{ z%yp0BbJsQ>%y4dqzCLHkIny)4;77mT5{(y`JtnZ6|8n-T zFUGfL-&D*z99-c4FuC>x4qr^(pxhSHCpw?)f50y(ab$%4{>fKye#7dvB?=l>k&$Tu zLyz5kfh;|a9U|?7Z}P#3LkkWgxW5>R${`<3+=(Qq1r8EP!7U`BCkYCVrQL7_3a%vz z2`m>2Ga+C>?`9_$ zJ)#)q717Z^920te0E9x~z;B?@33JG1fB?zoA7{dgbU+($5cYWJgpo-U;e<0F&VK`x z2?Gr-PGuKS&Xf-%y^?V_i(6?+hYFwfdXmKna06prU7faN-4%3(0U^mLdKlAad`^0z z@|iNoAWqKEsm2p#$1R3}^mF%!K>;be2RS6~A;EF@Bw}$V$z=;krEH{=p8!IjOrBIA z92r84u56a892X;SsUvZm?%q|z(pKU(DByhRU4enN;r6Z?;_cw2q3jkI^W^lux#YR^ zspPyxI^+;7Wj2$br9cm5K$uK~*eJWpnb{eQr#4+hJF3?52gq;Z>mI(>K$=p4mGimA&rHTQ%!|=CI!KZ(m<*x9Lx;K zcjFGe+4HJ8VbW<*hsPO`bm1I>Tj{nrY@m5yx6NvID&1?W(K#B`81OUV*)7;sALGU(g5bhs}THB^Kw|$p+u1U{Cq*a zNI)|d1XCy!2r5K`LO$T&I}7YA?&jN_BY-`RBUJiZF}qXX@kwB!Z3vZ)U;-5BFr)?H zFqDI(Xgkaq#+0G09(U-<9KD^Q!>vj7U}OM?pV zDD|Lm%>`NjYZ@VnN%$znN9C!gLW#+g67g6RQ=+H}>A?w#4@Bd@Rt2`K-yqtBvx_Lr zq=J^vSQy%DhG&tCldA+K5DEn%uSJiTk4uGcHR_U`_nj}?q1XTKjM;2lOLKfmEp2ky z0A43(|DT3=-!&#oZyk2H7^`PG2opkDNzOMXC^H5;CQM2*&De0z+qlC4z!T?M9sxbc z)2P5DOR-i`F{uRX zDLrTsIat+t(lGEK_n?VIz0joZ(qy7{eUT};Ho& literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 new file mode 100644 index 0000000..6c4721b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 @@ -0,0 +1,184 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DEBUGFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DEBUGFUNCTION \- debug callback +.SH SYNOPSIS +.nf +#include + +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +int debug_callback(CURL *handle, + curl_infotype type, + char *data, + size_t size, + void *userptr); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION, + debug_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +\fICURLOPT_DEBUGFUNCTION(3)\fP replaces the standard debug function used when +\fICURLOPT_VERBOSE(3)\fP is in effect. This callback receives debug +information, as specified in the \fItype\fP argument. This function must +return 0. The \fIdata\fP pointed to by the char * passed to this function WILL +NOT be zero terminated, but will be exactly of the \fIsize\fP as told by the +\fIsize\fP argument. + +The \fIuserptr\fP argument is the pointer set with \fICURLOPT_DEBUGDATA(3)\fP. + +Available curl_infotype values: +.IP CURLINFO_TEXT +The data is informational text. +.IP CURLINFO_HEADER_IN +The data is header (or header-like) data received from the peer. +.IP CURLINFO_HEADER_OUT +The data is header (or header-like) data sent to the peer. +.IP CURLINFO_DATA_IN +The data is protocol data received from the peer. +.IP CURLINFO_DATA_OUT +The data is protocol data sent to the peer. +.IP CURLINFO_SSL_DATA_OUT +The data is SSL/TLS (binary) data sent to the peer. +.IP CURLINFO_SSL_DATA_IN +The data is SSL/TLS (binary) data received from the peer. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +static +void dump(const char *text, + FILE *stream, unsigned char *ptr, size_t size) +{ + size_t i; + size_t c; + unsigned int width=0x10; + + fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", + text, (long)size, (long)size); + + for(i=0; i=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.', stream); + + fputc('\n', stream); /* newline */ + } +} + +static +int my_trace(CURL *handle, curl_infotype type, + char *data, size_t size, + void *userp) +{ + const char *text; + (void)handle; /* prevent compiler warning */ + + switch (type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + default: /* in case a new one is introduced to shock us */ + return 0; + + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + + dump(text, stderr, (unsigned char *)data, size); + return 0; +} + +int main(void) +{ + CURL *curl; + CURLcode res; + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + + /* the DEBUGFUNCTION has no effect until we enable VERBOSE */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* example.com is redirected, so we tell libcurl to follow redirection */ + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/"); + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* always cleanup */ + curl_easy_cleanup(curl); + } + return 0; +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_DEBUGDATA "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.html b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.html new file mode 100644 index 0000000..ab3950b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.html @@ -0,0 +1,179 @@ + + +CURLOPT_DEBUGFUNCTION man page + + + + +

NAME

+

CURLOPT_DEBUGFUNCTION - debug callback

SYNOPSIS

+

+

#include <curl/curl.h> +

typedef enum { +   CURLINFO_TEXT = 0, +   CURLINFO_HEADER_IN, /* 1 */ +   CURLINFO_HEADER_OUT, /* 2 */ +   CURLINFO_DATA_IN, /* 3 */ +   CURLINFO_DATA_OUT, /* 4 */ +   CURLINFO_SSL_DATA_IN, /* 5 */ +   CURLINFO_SSL_DATA_OUT, /* 6 */ +   CURLINFO_END + } curl_infotype; +

int debug_callback(CURL *handle, +   curl_infotype type, +   char *data, +   size_t size, +   void *userptr); +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION, +   debug_callback); +

+

DESCRIPTION

+

Pass a pointer to your callback function, which should match the prototype shown above. +

CURLOPT_DEBUGFUNCTION replaces the standard debug function used when CURLOPT_VERBOSE is in effect. This callback receives debug information, as specified in the type argument. This function must return 0. The data pointed to by the char * passed to this function WILL NOT be zero terminated, but will be exactly of the size as told by the size argument. +

The userptr argument is the pointer set with CURLOPT_DEBUGDATA. +

Available curl_infotype values: +

CURLINFO_TEXT +

The data is informational text. +

CURLINFO_HEADER_IN +

The data is header (or header-like) data received from the peer. +

CURLINFO_HEADER_OUT +

The data is header (or header-like) data sent to the peer. +

CURLINFO_DATA_IN +

The data is protocol data received from the peer. +

CURLINFO_DATA_OUT +

The data is protocol data sent to the peer. +

CURLINFO_SSL_DATA_OUT +

The data is SSL/TLS (binary) data sent to the peer. +

CURLINFO_SSL_DATA_IN +

The data is SSL/TLS (binary) data received from the peer.

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

+

static + void dump(const char *text, +   FILE *stream, unsigned char *ptr, size_t size) + { +   size_t i; +   size_t c; +   unsigned int width=0x10; +

  fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)n", +   text, (long)size, (long)size); +

  for(i=0; i<size; i+= width) { +   fprintf(stream, "%4.4lx: ", (long)i); +

  /* show hex to the left */ +   for(c = 0; c < width; c++) { +   if(i+c < size) +   fprintf(stream, "%02x ", ptr[i+c]); +   else +   fputs(" ", stream); +   } +

  /* show data on the right */ +   for(c = 0; (c < width) && (i+c < size); c++) +   fputc(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.', stream); +

  fputc('n', stream); /* newline */ +   } + } +

static + int my_trace(CURL *handle, curl_infotype type, +   char *data, size_t size, +   void *userp) + { +   const char *text; +   (void)handle; /* prevent compiler warning */ +

  switch (type) { +   case CURLINFO_TEXT: +   fprintf(stderr, "== Info: %s", data); +   default: /* in case a new one is introduced to shock us */ +   return 0; +

  case CURLINFO_HEADER_OUT: +   text = "=> Send header"; +   break; +   case CURLINFO_DATA_OUT: +   text = "=> Send data"; +   break; +   case CURLINFO_SSL_DATA_OUT: +   text = "=> Send SSL data"; +   break; +   case CURLINFO_HEADER_IN: +   text = "<= Recv header"; +   break; +   case CURLINFO_DATA_IN: +   text = "<= Recv data"; +   break; +   case CURLINFO_SSL_DATA_IN: +   text = "<= Recv SSL data"; +   break; +   } +

  dump(text, stderr, (unsigned char *)data, size); +   return 0; + } +

int main(void) + { +   CURL *curl; +   CURLcode res; +

  curl = curl_easy_init(); +   if(curl) { +   curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); +

  /* the DEBUGFUNCTION has no effect until we enable VERBOSE */ +   curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); +

  /* example.com is redirected, so we tell libcurl to follow redirection */ +   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); +

  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/"); +   res = curl_easy_perform(curl); +   /* Check for errors */ +   if(res != CURLE_OK) +   fprintf(stderr, "curl_easy_perform() failed: %sn", +   curl_easy_strerror(res)); +

  /* always cleanup */ +   curl_easy_cleanup(curl); +   } +   return 0; + } +

+ +

AVAILABILITY

+

Always

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_VERBOSE, CURLOPT_DEBUGDATA,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9dae92f396d2ecd07c34e3f4d794fecc37c9c88 GIT binary patch literal 7759 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 new file mode 100644 index 0000000..a81f907 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 @@ -0,0 +1,61 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DIRLISTONLY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DIRLISTONLY \- ask for names only in a directory listing +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DIRLISTONLY, long listonly); +.SH DESCRIPTION +For FTP and SFTP based URLs a parameter set to 1 tells the library to list the +names of files in a directory, rather than performing a full directory listing +that would normally include file sizes, dates etc. + +For POP3 a parameter of 1 tells the library to list the email message or +messages on the POP3 server. This can be used to change the default behaviour +of libcurl, when combined with a URL that contains a message ID, to perform a +"scan listing" which can then be used to determine the size of an email. + +Note: For FTP this causes a NLST command to be sent to the FTP server. Beware +that some FTP servers list only files in their response to NLST; they might not +include subdirectories and symbolic links. + +Setting this option to 1 also implies a directory listing even if the URL +doesn't end with a slash, which otherwise is necessary. + +Do NOT use this option if you also use \fICURLOPT_WILDCARDMATCH(3)\fP as it +will effectively break that feature then. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +FTP, SFTP and POP3 +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was known as CURLOPT_FTPLISTONLY up to 7.16.4. POP3 is supported +since 7.21.5. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CUSTOMREQUEST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.html b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.html new file mode 100644 index 0000000..63d094c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.html @@ -0,0 +1,64 @@ + + +CURLOPT_DIRLISTONLY man page + + + + +

NAME

+

CURLOPT_DIRLISTONLY - ask for names only in a directory listing

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DIRLISTONLY, long listonly);

DESCRIPTION

+

For FTP and SFTP based URLs a parameter set to 1 tells the library to list the names of files in a directory, rather than performing a full directory listing that would normally include file sizes, dates etc. +

For POP3 a parameter of 1 tells the library to list the email message or messages on the POP3 server. This can be used to change the default behaviour of libcurl, when combined with a URL that contains a message ID, to perform a "scan listing" which can then be used to determine the size of an email. +

Note: For FTP this causes a NLST command to be sent to the FTP server. Beware that some FTP servers list only files in their response to NLST; they might not include subdirectories and symbolic links. +

Setting this option to 1 also implies a directory listing even if the URL doesn't end with a slash, which otherwise is necessary. +

Do NOT use this option if you also use CURLOPT_WILDCARDMATCH as it will effectively break that feature then.

DEFAULT

+

0, disabled

PROTOCOLS

+

FTP, SFTP and POP3

EXAMPLE

+

TODO

AVAILABILITY

+

This option was known as CURLOPT_FTPLISTONLY up to 7.16.4. POP3 is supported since 7.21.5.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

SEE ALSO

+

CURLOPT_CUSTOMREQUEST,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.pdf b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3da3d2fb273d378cc8c027bf1c2117be6b5a6db9 GIT binary patch literal 4586 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_CACHE_TIMEOUT, long age); +.SH DESCRIPTION +Pass a long, this sets the timeout in seconds. Name resolves will be kept in +memory and used for this number of seconds. Set to zero to completely disable +caching, or set to -1 to make the cached entries remain forever. By default, +libcurl caches this info for 60 seconds. + +The name resolve functions of various libc implementations don't re-read name +server information unless explicitly told so (for example, by calling +\fIres_init(3)\fP). This may cause libcurl to keep using the older server even +if DHCP has updated the server info, and this may look like a DNS cache issue +to the casual libcurl-app user. + +Note that DNS entries have a "TTL" property but libcurl doesn't use that. This +DNS cache timeout is entirely speculative that a name will resolve to the same +address for a certain small amount of time into the future. +.SH DEFAULT +60 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_DNS_USE_GLOBAL_CACHE "(3), " CURLOPT_DNS_SERVERS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.html b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.html new file mode 100644 index 0000000..1076303 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.html @@ -0,0 +1,62 @@ + + +CURLOPT_DNS_CACHE_TIMEOUT man page + + + + +

NAME

+

CURLOPT_DNS_CACHE_TIMEOUT - set life-time for DNS cache entries

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_CACHE_TIMEOUT, long age);

DESCRIPTION

+

Pass a long, this sets the timeout in seconds. Name resolves will be kept in memory and used for this number of seconds. Set to zero to completely disable caching, or set to -1 to make the cached entries remain forever. By default, libcurl caches this info for 60 seconds. +

The name resolve functions of various libc implementations don't re-read name server information unless explicitly told so (for example, by calling res_init(3)). This may cause libcurl to keep using the older server even if DHCP has updated the server info, and this may look like a DNS cache issue to the casual libcurl-app user. +

Note that DNS entries have a "TTL" property but libcurl doesn't use that. This DNS cache timeout is entirely speculative that a name will resolve to the same address for a certain small amount of time into the future.

DEFAULT

+

60

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

Always

RETURN VALUE

+

Returns CURLE_OK

SEE ALSO

+

CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPT_DNS_SERVERS,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.pdf b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bceefc387603c78ede5ffa065a64a44800a1e910 GIT binary patch literal 4454 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 Ofiyza)~<8ip#K1vZCoP& literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 new file mode 100644 index 0000000..c33d791 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_INTERFACE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_INTERFACE \- set interface to speak DNS over +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_INTERFACE, char *ifname); +.SH DESCRIPTION +Pass a char * as parameter. Set the name of the network interface that the DNS +resolver should bind to. This must be an interface name (not an address). Set +this option to NULL to use the default setting (don't bind to a specific +interface). +.SH DEFAULT +NULL +.SH PROTOCOLS +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.33.0. This option also requires that libcurl was built with a +resolver backend that supports this operation. The c-ares backend is the only +such one. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, +or CURLE_NOT_BUILT_IN if support was disabled at compile-time. +.SH "SEE ALSO" +.BR CURLOPT_DNS_SERVERS "(3), " CURLOPT_DNS_LOCAL_IP4 "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.html b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.html new file mode 100644 index 0000000..11dac38 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.html @@ -0,0 +1,60 @@ + + +CURLOPT_DNS_INTERFACE man page + + + + +

NAME

+

CURLOPT_DNS_INTERFACE - set interface to speak DNS over

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_INTERFACE, char *ifname);

DESCRIPTION

+

Pass a char * as parameter. Set the name of the network interface that the DNS resolver should bind to. This must be an interface name (not an address). Set this option to NULL to use the default setting (don't bind to a specific interface).

DEFAULT

+

NULL

PROTOCOLS

+

EXAMPLE

+

TODO

AVAILABILITY

+

Added in 7.33.0. This option also requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one.

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_NOT_BUILT_IN if support was disabled at compile-time.

SEE ALSO

+

CURLOPT_DNS_SERVERS, CURLOPT_DNS_LOCAL_IP4,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.pdf b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3b079691f591cc6b1b18cd3d1bc064a9d15789ef GIT binary patch literal 3946 zcmb_fc~}$I7O&bx2CU0tajjD=1jS@#vXP`oP!a-GKun^7NS{My5(3$nOd#;A)w-iR zYtdpAl&vUYRTR{Uq861}Tv}Tdp3mKit+lvRTPxb$8G@krUf=sZ??1V7?m546?pbdF za_fkZG0+mllvxg3cmZ6-Pe76XbF(U>hXNx_K5g43j$G}sAJsf3&~ zMdDV-U9fV>4O^+k_i^j`ffZr?C2s#!m-wlZkBr}NHR<#&acu27qrL0jDz7?#xl7+$ z_}XKkj*{K$_n=vt_P{z=tGUUcaR|<5v2$(uV9A#SI7U?*CX*hBW&p z1zzm8=(QvDV+*U6x5DfC4@Fm4UORj*+5gbDM3&$aq#^IEf=9-n_xmpJFAqKfkEoy1 ztKp-WGnQ_if8?VRUgbT!SIn6vd8sx3Kwan+mxldIoNqUZo#0D zueRy*WbW~@M-tLCK=bLj(>wBZySDS_@2j;GoXHIsCZM)g=g~ifuXbYF7+#b2(@4;Wgus(I-Tt8ce8`7Aw8CHC^!o8WwF@VHZR zcefl{a%;h`d$qks)KdV30hexZ2j`-VGt6OuorOs2WZuzjfE)-kc zSe`Suf(-CoJEkORdS6k#=vv!>m*FvMvNhRF!ro0MeZL=hu(9&a+%Y~yzVl}f-1?GD zksH7LN7eYK+N_OL=kNEa@Vf~2-d$Dh`hyrd<{|M%hCE~zVO?J$Ys@bUpSZ1P>dDI$ z{oea$&F+gQ$J(XaE6xqbe)F>(iz@xTyuE14XOm9)WnL{Ss%U*UFGJBAKJoRr8!NHG znjh7K-`JiFcSX^v*Szm|4Q}wtS@yxp#P&T?`fj-rH6SBu=F#7Os1J+$d-t$N0wHm3uEin<^;^1 za6SFL%A@Kw|n@`%KI_g08MM@S0|@z z&Y#urYeleD@56sPI%2V`AbI1Wgzu=m8>zd)!cA$ruC#o4mUFZa^UgbD`M?&lX7&vC z4lKvNSa~mF#~ZsgloT4Qj0Xnfv*`$e>=+&cd|U9=&=@VZhzaJ}tV8_%D`hw1 zq7$*a;b{K)^fy0iN#O2#xV-eYY+r7J?)RJPh7(b6ERu>~iIATJAzC{P`X!74E{e3#uz+c% zfJ{2=F3LbUL7R=E>;@f4CnBH`!-$@A(?Bl5O-JfjQH%iuA{sjo$1wH-bY4USz5${W zW;(VO0wj-pjEeRS4$y#sFl(U`MkbgEC!EOIuZ5CefZ$>vyNELA?V=t@6;9(8yQu@h zV|@%s;{-T?v35eI?$Da@tN9_L?21Qb@|2B3cO~ zd76!(d$_`JC&_pS(VMNLlN)Zg5bPCLw?T-`l}t0SV*CM&=x`N-_j~}Y-HO|~B1G80 z$TQnaFve%C`45QfsRxqHjt)6QZ8jQ7kOLs-i4Z145u+KxLIsG`Y;!r2I&ETo+7+S0 z+nu+FkBROW&X_@J; zU3RSAkez0b5}Yt4BoD(uUXxrm?%*2PDer_yr$I47rH$5%U>Mvox7A? zD>$r(4D1;)!hu;9I!(cekBNh6yWNszreQu$%EP#rU<_=ea4VT%SxSWmu?8Bn&|@8H&o0 zXE;Idfv5_+^1!R_e-Q1$*+tY&=|M^;O_beegfmFW$wUI<@%cPKyGB;b!zD+U77{{9`<@aTdCLV=*(eB(vZ)lY-;s5~LA# zS!j-OvW?{?+M{7HE891$9MXyPoLI3WP}?AE$dk^Ygy0vnUK~(oy97f?!O3KrA=o|r z0${qmryF4*gzfr1&5~^f}d9} zqn?aVH$@sD6vl)Q)3DkXEEb6bBG?FfXqZR{W*oC%TL(=b5P`w@Gz}9Ik7g`PUpt%zMg7;}p#XNFc%lP+(xhL=E&O!L@1M literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 new file mode 100644 index 0000000..f5db645 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_LOCAL_IP4 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address); +.SH DESCRIPTION +Set the local IPv4 \fIaddress\fP that the resolver should bind to. The +argument should be of type char * and contain a single numerical IPv4 address +as a string. Set this option to NULL to use the default setting (don't bind +to a specific IP address). +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. + +Added in 7.33.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, +CURLE_NOT_BUILT_IN if support was disabled at compile-time, or +CURLE_BAD_FUNCTION_ARGUMENT when given a bad address. +.SH "SEE ALSO" +.BR CURLOPT_DNS_INTERFACE "(3), " CURLOPT_DNS_LOCAL_IP4 "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.html b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.html new file mode 100644 index 0000000..efd1a57 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.html @@ -0,0 +1,61 @@ + + +CURLOPT_DNS_LOCAL_IP4 man page + + + + +

NAME

+

CURLOPT_DNS_LOCAL_IP4 - IPv4 address to bind DNS resolves to

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address);

DESCRIPTION

+

Set the local IPv4 address that the resolver should bind to. The argument should be of type char * and contain a single numerical IPv4 address as a string. Set this option to NULL to use the default setting (don't bind to a specific IP address).

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. +

Added in 7.33.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, CURLE_NOT_BUILT_IN if support was disabled at compile-time, or CURLE_BAD_FUNCTION_ARGUMENT when given a bad address.

SEE ALSO

+

CURLOPT_DNS_INTERFACE, CURLOPT_DNS_LOCAL_IP4,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.pdf b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..49fc03d4f3d96446b2570ae4f53b17cfeba6be5a GIT binary patch literal 4048 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 DT+4rc literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 new file mode 100644 index 0000000..56865bb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_LOCAL_IP6 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP6, char *address); +.SH DESCRIPTION +Set the local IPv6 \fIaddress\fP that the resolver should bind to. The +argument should be of type char * and contain a single IPv6 address as a +string. Set this option to NULL to use the default setting (don't bind to a +specific IP address). +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. + +Added in 7.33.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, +CURLE_NOT_BUILT_IN if support was disabled at compile-time, or +CURLE_BAD_FUNCTION_ARGUMENT when given a bad address. +.SH "SEE ALSO" +.BR CURLOPT_DNS_INTERFACE "(3), " CURLOPT_DNS_LOCAL_IP4 "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.html b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.html new file mode 100644 index 0000000..67d3af9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.html @@ -0,0 +1,61 @@ + + +CURLOPT_DNS_LOCAL_IP6 man page + + + + +

NAME

+

CURLOPT_DNS_LOCAL_IP6 - IPv6 address to bind DNS resolves to

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP6, char *address);

DESCRIPTION

+

Set the local IPv6 address that the resolver should bind to. The argument should be of type char * and contain a single IPv6 address as a string. Set this option to NULL to use the default setting (don't bind to a specific IP address).

DEFAULT

+

NULL

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. +

Added in 7.33.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, CURLE_NOT_BUILT_IN if support was disabled at compile-time, or CURLE_BAD_FUNCTION_ARGUMENT when given a bad address.

SEE ALSO

+

CURLOPT_DNS_INTERFACE, CURLOPT_DNS_LOCAL_IP4,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.pdf b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0aba0cfd4b513e28939e523905147502ddc6fb44 GIT binary patch literal 4060 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 S&A5Ul5Tg=k;>5`KDCj@_jEB, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_SERVERS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_SERVERS \- set preferred DNS servers +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SERVERS, char *servers); +.SH DESCRIPTION +Pass a char * that is the list of DNS servers to be used instead of the system +default. The format of the dns servers option is: + +host[:port][,host[:port]]... + +For example: + +192.168.1.100,192.168.1.101,3.4.5.6 +.SH DEFAULT +NULL - use system default +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option requires that libcurl was built with a resolver backend that +supports this operation. The c-ares backend is the only such one. + +Added in 7.24.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, +CURLE_NOT_BUILT_IN if support was disabled at compile-time, +CURLE_BAD_FUNCTION_ARGUMENT when given an invalid server list, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_DNS_LOCAL_IP4 "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.html b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.html new file mode 100644 index 0000000..ba803d0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.html @@ -0,0 +1,64 @@ + + +CURLOPT_DNS_SERVERS man page + + + + +

NAME

+

CURLOPT_DNS_SERVERS - set preferred DNS servers

SYNOPSIS

+

#include <curl/curl.h> +

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SERVERS, char *servers);

DESCRIPTION

+

Pass a char * that is the list of DNS servers to be used instead of the system default. The format of the dns servers option is: +

host[:port][,host[:port]]... +

For example: +

192.168.1.100,192.168.1.101,3.4.5.6

DEFAULT

+

NULL - use system default

PROTOCOLS

+

All

EXAMPLE

+

TODO

AVAILABILITY

+

This option requires that libcurl was built with a resolver backend that supports this operation. The c-ares backend is the only such one. +

Added in 7.24.0

RETURN VALUE

+

Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, CURLE_NOT_BUILT_IN if support was disabled at compile-time, CURLE_BAD_FUNCTION_ARGUMENT when given an invalid server list, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

SEE ALSO

+

CURLOPT_DNS_LOCAL_IP4, CURLOPT_DNS_CACHE_TIMEOUT,

+ This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.pdf b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a15db8de42df254af0759b9a35b9f97b2710e7af GIT binary patch literal 4081 zcmb_fdsq`!7O%xB4pyot0u>#x7*vv($vc6B1p-1P1$l`g$dF86N|K3_K_Xf$B4XywAYidwqTPsO^lAU^5~m9{=uRuF5|qCgR7t+ZgP-8&%&7I(Y*ea=7JoO{mioO|AQ zMyP_h7*7a!*4)o4fkZG0Q^{{bzP?BpVN79CVKJaYBEh7dA!ry0*5eGJA~ckiP%0ra zLld|Gvh2)>Z8z?TeeFqCsWfus_}F{ixjtmfg~cK53CRmzr;gIGYft`E=$vh5sjCiL zw6Ci{Hqmtd*o8>@o%p??0_ynfv2FSAhmV^@O?in(!oza+w$|@k7pr=vZr-8KJD@>- zY{<6wjO%)>+3kF{`hKt1&AhE`nXbX>q?H8+H^&@`{{BR;>Ae2?eE_YZqlyS9I|v7zA?bz3_x=~DQ7H+cm!kvx-BQ}wr%@13uc zjd(a^)uhY2cgJ5B3TKP)1q=dsAmaQ&lsfg_F^4~_1u-*tS)8TFw;UdlR)^VdZ9TJC}eIjf!9E<;n6RiqAQu9U0( z(d4{u9Q4ByGWUJw1LL;^HSNw^mPmYOat;1xeQQ>U#v#FLf5jg1o3O^T4#ADixo>^G zDs*^Ao2$qEtc0;Kp?O5^-0D4}i-HbyW;U<>s#)Ar)mWO)B{{gDxU9{kVd}*7vhtH2 zlXk(9z4Y0+UPr4s#Pf2i+LZcph*6oezJ5yhglJ>h7b5gT)(`Qj9Sz&o6nnjT@64}v zzw~Q+5^;6b#xXtmBKb*;HcN2l^?d2%>G`dXdhWWr7B!p_FB$H1;!1mbqo(OWoXP&S z)125j1)uiLz^gacjp#PtC0!iz!*3*As5+3g;GMCOi_6{DglHZwZ}jtMyja++c$2q% z+&+TddU^Ee#YBhDuD#+?k=t1>H`I0dlJwGRYsm45>pl10wfkn+C;S<;U0Y}MnCZ{$ zvsZXmAKVzUe3gILzup;kXZq&uBZ@AEnJt3ascy55-uk)OT|Q$nbG|(EQqg>AWpU1D zJ&%_fFMHLka#4J+dz@;M?B)c!tk)k|yxp$9f5Cg*$d9G1q1^?y3Mw{NwEE{*>(;!wd&7$B3t?&PyRnt_S0_8_g>fMpv&A#A zPnAv}7C^YL)zlb4Kb+2Y&sAZwvME-tt7x6DP7 zi~P0MYGs+F0jF`baPHyns}rwaMaoCB}Dg=h^^7>?<+c-zHol0B0ucafW=#G z9B7Fe;ZxwfG9hi8P

    ^Z1@HsRKUulIG!&Jrf?q?d)(FsjB5?(kt(jq$U>~JLkOq zcGie>r#D3In<=fSN|_n+C5C0)n)dPo)Pie_KYvos*?N4^oNGSYf<2nNh!1LWv<^4z zDjN^G?Wt;Os@}MzRb1)N>Cx+7H|-5&RL-#5zpa|~Mpdak=Un$G)uXZa2SK;o4WHu&mWMvS zKN%_hwSGNe)Y=*=II+!`ZNcncOdyg$HkxptQAaN|5l94{LLh2FOX2~P1&&9-wMZs{ zr9yrJghWydXxlIfxM;%2zyh|X12SQz(rFE02Hie_rZiCm6OVv-03*?ag#mIw7G`#o zRTN_Zfk-d~#4*hJ0}KEp5c~#+W|$oukq{u+>|<5*4HAF`41}!~nqg!PsWrp#5Nm%V zlmG*SbQW@uD2r~JL4A^eID_k{lzs@C^=g8_wcrNE`UnHMCC>s3JOe_)Bh)aaRN9QR zzRIR5QUbAZkpnQ+XZGL9AQ^j$L`os)vurHg#ub2@3D!eMG-)8r+yF|iwLaeJHVBDI zPiELyv9AI~^t+11dp0pF@Zx6g8P94_2BVYodSgEunt*@WOglp0W22LhY zNTY(&b@T)WCbbIAJdqkzn*xbcG9;5GqB7r#)?}t>WLl1&67u!KL9P>A3vS}-tjmTO zCd?XzM_^=Fum{Uvky{KV0|+{7G3bqExkbUTipas4B_kZz%EF{6IC1I-n4u_r8p*(X zo{WcaF@ZO%qj3X~LD6Y2#uIY@B(2rSBSF6R0fJu&PAbEghWDI?4( z#*?XZM!`u>C$)01P%GtYg*aEE<0o@5jL>mW@Np$liB2NY$)r*O?N?_SWacyazy(k! z0Db@`IVfmtx`v<@fYZ42_d|f(HLm!$=gFNdRBLU?Zcz(!78npD3+4wX|C%F#-KWe9PBYd33B*Dv L, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE, + long enable); +.SH DESCRIPTION +Pass a long. If the \fIenable\fP value is 1, it tells curl to use a global DNS +cache that will survive between easy handle creations and deletions. This is +not thread-safe and this will use a global variable. + +\fBWARNING:\fP this option is considered obsolete. Stop using it. Switch over +to using the share interface instead! See \fICURLOPT_SHARE(3)\fP and +\fIcurl_share_init(3)\fP. +.SH DEFAULT +0 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Subject for removal in the future. Do not use! +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SHARE "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.html b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.html new file mode 100644 index 0000000..8fb0da9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.html @@ -0,0 +1,61 @@ + + +CURLOPT_DNS_USE_GLOBAL_CACHE man page + + + + +

    NAME

    +

    CURLOPT_DNS_USE_GLOBAL_CACHE - enable/disable global DNS cache

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,   long enable);

    DESCRIPTION

    +

    Pass a long. If the enable value is 1, it tells curl to use a global DNS cache that will survive between easy handle creations and deletions. This is not thread-safe and this will use a global variable. +

    WARNING: this option is considered obsolete. Stop using it. Switch over to using the share interface instead! See CURLOPT_SHARE and curl_share_init(3).

    DEFAULT

    +

    0

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Subject for removal in the future. Do not use!

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SHARE, CURLOPT_DNS_CACHE_TIMEOUT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.pdf b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9f19ac9400e674749994b50a2b823691b29a0ea GIT binary patch literal 4015 zcmb_fc~}!?8gIR7r^uqBt*CXxVgOBMCU-&-3JEAm6ap?FqE3=Y7)df=GJ!yC-PJ0G zR;@?XqQzr%wQ9i&MXG|`)>g5yC?3#b6)&);tD<<+?l(ygM0VSK9_Jsvyx)5tzwad| zP7}?=ctR-X*e^>qLLwN2Dg7)+p+I5@o0&<6#ekwiqDc!w&@d8h!5KnB7$_s5Qb7)e zCU7g{TD$Vk4Yr18zxU52#n$BM{<`lfos&`)_38!Fz@Xh*CnVNZ@_H3cP4P*u9T_t8 z*R4+t=2epT!v6ldqn3uPm6>_wd;OTmh*iap0+hbIH+>cUJ%_*D=jT3&!z14>c>7}L zyFGa$dR0WU`u0Bd$}!@@3O|MK&Am73^v$Q{wVt$;Pv;(Lt=Kk4WE}iYXCB$u^e9&$ zY;C^z=umdauE!T^^uC#CTcYw5DGN*6%xU@j_d;L&t#K@O>b!I7DxRE|{j~4<-+Wa* z(Q+)f$0ENY3)>1ZVxZ~;Gvzg=#*3%M51G6zYV4|!J7hTk}gd3{1$Lsp*&V zWX_tSN8nof^86FlY2S`fymMi6>?cYZCW=^LA+1tom!) z4#)k=y8Y{A#wNA4?Sr>Xm$0xg7D>Al6kYH)IIV&nG8DSze}3*WOHuM*$Bn=wzZ>hniHZ9vs4Szl{@z0= z?+Q;+QL_bFH>}q`de^*>KQTCJnSbcXIFmiN*HJlFcJz&ju7c&g3e``CJ@|I$;K1E2 zqx+W3Q@nA0@4H*otE<{V{NfMy{dn%!68gIX5eL31@^7xaK56@ee(}6Wk?AiFN(U9h zW%rt^Tvl~Ns20Dsw|;Sm_Ex4vXuEyTcg1;e(%3-@CIr4y-8bS`>c2FQ>$gG?6%LkczrQ8XzZ9|g_PxmPcCVPm~2WN** zKSQ6JxONPAy`Nx5L%|s1CH^YO-)w-owUkvX#t~_VTsA~gl z()`mm`#l`ttmh_d9^AWbbBpVvq~;Y9zTUC#eCe8m;z{$$u7&yRp1Zhl=4na&`r^jx zjV2;J^Ru z@vx>#ywm9j>ht;fVWCvZoDY+CE*UjH#CP)Kl<9>n^J^=Q+eMG1cQXaEip?1_cA^gh zdjy3~yZ+g0jZL+;zFq5oMDo+G2ko)Cu<}m>Y8Dt6{dxq&H^MBZ?%sbI{Vfe846OmVT37aeP)KH(Nrnv7< zX60{XuJoQ4{_ndZ4lXDzC2U47bb%8KcPz-Ue=$CaL0+1$0}2y!>;w{rn+Zfq7)d;m za>1!6xE9GouvExTgAg6X0APesz(o@_1{ScW3CM(la?%FE0q``ArVI%LlZpVug^@(U z#Q?b|7c(xwEs9|tk!T8tV|@1y0I`S~{015wFbmB(2#~z~u_ioF4YUCVVYi147@0^K z9dIhd`mcl1V4%Uts_Z1nn)0H&M^cS5xP>yetMGcSB^cZYZeYx#tHZYBc?BI|K*;1c zEsUvDUMJmAc}?jg5G$waP~#4>{T4$Zj7_Qz(a9j0=OBfoT_jizuS6v7AlPgniKLZq zaAQCSq`{pEge5~rf>Y11m1AQBF106))!n^{NXlaT0}5E5x>um1thlYShA10&DoL9e z#@spmZ!WoSy((F6k#;#mLz+wkXerP`sSqX+AXd`mbfk4eC41$66gqgG{Ikzf~aA4A?;i zvC9!8J3E_~E#OhK8Np;S8G`Z=KA#IXxQ-kfgS)sk$0%UW?FgCtOw8usxqadpC@VrH zBNz`w+6`$yI5cTzNXiDYhH*XRWRx7IlQhc3A_-~`7;vt^#Mg5%j4*Lg@NortpD0uLmr(r@dSed%e1n3Ji6vXrbA7A(?L4$vYVI+afB|!dQ zu, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_EGDSOCKET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_EGDSOCKET \- set EGD socket path +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path); +.SH DESCRIPTION +Pass a char * to the zero terminated path name to the Entropy Gathering Daemon +socket. It will be used to seed the random engine for SSL. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. Only the OpenSSL and GnuTLS backends will use this. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_RANDOM_FILE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.html b/docs/libcurl/opts/CURLOPT_EGDSOCKET.html new file mode 100644 index 0000000..18a11ee --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.html @@ -0,0 +1,60 @@ + + +CURLOPT_EGDSOCKET man page + + + + +

    NAME

    +

    CURLOPT_EGDSOCKET - set EGD socket path

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);

    DESCRIPTION

    +

    Pass a char * to the zero terminated path name to the Entropy Gathering Daemon socket. It will be used to seed the random engine for SSL.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled. Only the OpenSSL and GnuTLS backends will use this.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_RANDOM_FILE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.pdf b/docs/libcurl/opts/CURLOPT_EGDSOCKET.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31c65b9baa65e167575ee6b4a504d8da38479f2b GIT binary patch literal 3736 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 N02M$%LF)J@=--cC0I~o8 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 new file mode 100644 index 0000000..577202c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 @@ -0,0 +1,72 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_ERRORBUFFER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_ERRORBUFFER \- set error buffer for error messages +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ERRORBUFFER, char *buf); +.SH DESCRIPTION +Pass a char * to a buffer that the libcurl may store human readable error +messages in on failures or problems. This may be more helpful than just the +return code from \fIcurl_easy_perform(3)\fP and related functions. The buffer +\fBmust be at least CURL_ERROR_SIZE bytes big\fP. + +You must keep the associated buffer available until libcurl no longer needs +it. Failing to do so will cause very odd behavior or even crashes. libcurl +will need it until you call \fIcurl_easy_cleanup(3)\fP or you set the same +option again to use a different pointer. + +Consider \fICURLOPT_VERBOSE(3)\fP and \fICURLOPT_DEBUGFUNCTION(3)\fP to better +debug and trace why errors happen. + +If the library does not return an error, the buffer may not have been +touched. Do not rely on the contents in those cases. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + char error[CURL_ERROR_SIZE] + + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* provide a buffer to store errors in */ + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_DEBUGFUNCTION "(3), " CURLOPT_VERBOSE "(3), " +.BR curl_easy_strerror "(3), " curl_multi_strerror "(3), " +.BR curl_share_strerror "(3) " diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.html b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.html new file mode 100644 index 0000000..40d29b1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.html @@ -0,0 +1,75 @@ + + +CURLOPT_ERRORBUFFER man page + + + + +

    NAME

    +

    CURLOPT_ERRORBUFFER - set error buffer for error messages

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ERRORBUFFER, char *buf);

    DESCRIPTION

    +

    Pass a char * to a buffer that the libcurl may store human readable error messages in on failures or problems. This may be more helpful than just the return code from curl_easy_perform(3) and related functions. The buffer must be at least CURL_ERROR_SIZE bytes big. +

    You must keep the associated buffer available until libcurl no longer needs it. Failing to do so will cause very odd behavior or even crashes. libcurl will need it until you call curl_easy_cleanup(3) or you set the same option again to use a different pointer. +

    Consider CURLOPT_VERBOSE and CURLOPT_DEBUGFUNCTION to better debug and trace why errors happen. +

    If the library does not return an error, the buffer may not have been touched. Do not rely on the contents in those cases.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   char error[CURL_ERROR_SIZE] +

      curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* provide a buffer to store errors in */ +   curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_DEBUGFUNCTION, CURLOPT_VERBOSE, curl_easy_strerror (3) curl_multi_strerror (3) curl_share_strerror (3)

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.pdf b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5a0ddd4cb0d161c823c010ac05fccc287f1686f7 GIT binary patch literal 4609 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 Wv?Qh>4M}rGIW9CuN3Yr5wEqC(1*32P literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 new file mode 100644 index 0000000..81f4571 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EXPECT_100_TIMEOUT_MS, + long milliseconds); +.SH DESCRIPTION +Pass a long to tell libcurl the number of \fImilliseconds\fP to wait for a +server response with the HTTP status 100 (Continue), 417 (Expectation Failed) +or similar after sending a HTTP request containing an Expect: 100-continue +header. If this times out before a response is received, the request body is +sent anyway. +.SH DEFAULT +1000 milliseconds +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.36.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_POST "(3), " CURLOPT_HTTPPOST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.html b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.html new file mode 100644 index 0000000..b5cf9c6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.html @@ -0,0 +1,64 @@ + + +CURLOPT_EXPECT_100_TIMEOUT_MS man page + + + + +

    NAME

    +

    CURLOPT_EXPECT_100_TIMEOUT_MS - timeout for Expect: 100-continue response

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EXPECT_100_TIMEOUT_MS, +   long milliseconds); +

    +

    DESCRIPTION

    +

    Pass a long to tell libcurl the number of milliseconds to wait for a server response with the HTTP status 100 (Continue), 417 (Expectation Failed) or similar after sending a HTTP request containing an Expect: 100-continue header. If this times out before a response is received, the request body is sent anyway.

    DEFAULT

    +

    1000 milliseconds

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.36.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_POST, CURLOPT_HTTPPOST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.pdf b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4184fe56e405355112d0b18395ec830d76e15f6d GIT binary patch literal 3851 zcmb_fd0Z2B7WZuHXcep?wH{Lxf~(2QWO55ZAO^KWVgi*a=nlywOi5?u16K?qH8VIquy?<^}awXig>dgJzy19UBs)uNrE7<+wSM%{KGHr_ulv2@AnAR zYqUa4B!NPY)D^9Pq%aCIX&*un5lB2qTe);t1}FwZOW8P*g%Pcd;7AQ=V$7sk4LLcM zB$<6hvUR-br6Z`D)xcdk!Ny;3#%>fTWs!e)1WCOAL6F}LdTgJkl@1wVvn;zCL~XRD8v zkVVa>M-ISyq4O`o}(Kv0C{89Y3 z%#^b8&G{R1&R-YFA4@99g3jePS1cdal(jPGf;M&kg2f{J@acm#(8p_owm-CdIvE;4 zR$Y2{e?^ba>v|OLXt>9UgHJ?@D@&^Thb=4h7Q&sg4T z(9(?Y5i^sP$Day+IJ|aSQpL2}#c$7p?v1+?zF7C}w%m#Cy~g*7S5?pHF;T(bo}`4j zYk!<{babZ+b0_UIxs8@0)lf)3>`1Pms88?aErIoC8eCgNJeZP(F*Y|jW=TTYr zF!%bvYrmTpY!z;MdUAz$-&wAhN+;nF8GE+deAyL(XL)SUzqeIK)Hmsd{ zFtTgGj8Qep?fDlcX-bO=@@{n6e}CMVC#Rn-J$CoP`_a7v=cv|HUU}FDZn*ul${n1! zvS*H>qH$i=S>-ha+pmUwnH|!rT*mcTdFbHgWkG*^XWEm5im1jl2M27#FaEwd2M_Lj zW2up?4k|Jg1||IS-p5P+-m9@o7m2h4aqinL*t|lgy?cxpB3M*j_tX)zBS^LGPYoNc z+?jvecFw)Xljk8%)?6|jE`79T4?B4zhtbz%4q3Be!k~oeoP|LJ7nU|3TC?#R>-n=6 zLl%}qtq6+?Dc@aD-!wy9yskMMtAZ)fiu zdDn2)QP@;C?sDznpl;Q3hP)M0tEqOIa;gVht6e>?=JBa1aApHD2Vo*X#-$4N>+DY&neu)^uN%GM`5-B_B6pjZjP$q9E5S|PnMpqigXO8y~ znA8$D9=l_R7{+G)4FJ4N9RnB`J3+Ta7)yg^h@!19=8frpGs%1FhvcnATI3K7WwDT; zq(BW#g)lje*eTlOOl|eXo13>zKUo*w@={{BM5b2zi$5aD?I27UBnPLFR*H@k z+}ZPu0H(~5g2_@Hs&mAW>D0JvmNaHhOf+R@n3QHglp2bNB0$fOLO0U+s0^TQe1PCrq#&K+94Z9K%*+&J;v$B%BA8OCL{Kpz z77GD~(3wSZgj+~EhXH+FL#X8EVzg7_wMk@R>NU?LQ0QKSLxu#|(N7#ijk6KRZ# zixjwAlvyQ{%25+;B7`Q3I8BIQq(z8=Pl(A(a)}r>LOPc3XX&95s4(9cE&Hqy{uR6zO z({qCzF4pGl4zmd%Z6t4-6Qmgf7Mo2f3&Yw8P}_vV0fr~RmplS$QlO3immI~}NVT{3 zqHUb-V59h6QrQUF8YyrK&7_5J**JkZiS}}vec7;4YTv;thqPjKkSi|<^fpKv@_cfr zA@~)2uMVhnT!P0fQjp0HLvVU=li(k2|1@st>+p`+dIWgc`7Qwg=ldjFqvD$k#ZU#R z#N^)o5}>F6uz^1O6%Kzlgm=_0Bc4CSZkDt_D2z!Veqi}NSSFR?QrH6fX&5d8y8-{f zbPEj^OThF0A`Qb);AlG)v<`JT*co zR%)VS6iOV8MI{O;E|#NOg(5lzkHv7Y6dSAlb&gbiS95X%%XyQA<4Oe-8ag&X3;hEA CpDG&w literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3 new file mode 100644 index 0000000..a8267fd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3 @@ -0,0 +1,53 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FAILONERROR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FAILONERROR \- request failure on HTTP response >= 400 +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FAILONERROR, long fail); +.SH DESCRIPTION +A long parameter set to 1 tells the library to fail the request if the HTTP +code returned is equal to or larger than 400. The default action would be to +return the page normally, ignoring that code. + +This method is not fail-safe and there are occasions where non-successful +response codes will slip through, especially when authentication is involved +(response codes 401 and 407). + +You might get some amounts of headers transferred before this situation is +detected, like when a "100-continue" is received as a response to a POST/PUT +and a 401 or 407 is received immediately afterwards. +.SH DEFAULT +0, do not fail on error +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTP200ALIASES "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.html b/docs/libcurl/opts/CURLOPT_FAILONERROR.html new file mode 100644 index 0000000..931f763 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.html @@ -0,0 +1,62 @@ + + +CURLOPT_FAILONERROR man page + + + + +

    NAME

    +

    CURLOPT_FAILONERROR - request failure on HTTP response >= 400

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FAILONERROR, long fail);

    DESCRIPTION

    +

    A long parameter set to 1 tells the library to fail the request if the HTTP code returned is equal to or larger than 400. The default action would be to return the page normally, ignoring that code. +

    This method is not fail-safe and there are occasions where non-successful response codes will slip through, especially when authentication is involved (response codes 401 and 407). +

    You might get some amounts of headers transferred before this situation is detected, like when a "100-continue" is received as a response to a POST/PUT and a 401 or 407 is received immediately afterwards.

    DEFAULT

    +

    0, do not fail on error

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTP200ALIASES,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.pdf b/docs/libcurl/opts/CURLOPT_FAILONERROR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d4044af808acd6dfbc090a08fe36e2b18f41ad77 GIT binary patch literal 4046 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3 new file mode 100644 index 0000000..7c57aff --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FILETIME.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FILETIME 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FILETIME \- get the modification time of the remote resource +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FILETIME, long gettime); +.SH DESCRIPTION +Pass a long. If it is 1, libcurl will attempt to get the modification time of +the remote document in this operation. This requires that the remote server +sends the time or replies to a time querying command. The +\fIcurl_easy_getinfo(3)\fP function with the \fICURLINFO_FILETIME\fP argument +can be used after a transfer to extract the received time (if any). +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP, FTP, SFTP, FILE +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR curl_easy_getinfo "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.html b/docs/libcurl/opts/CURLOPT_FILETIME.html new file mode 100644 index 0000000..904d68d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FILETIME.html @@ -0,0 +1,60 @@ + + +CURLOPT_FILETIME man page + + + + +

    NAME

    +

    CURLOPT_FILETIME - get the modification time of the remote resource

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FILETIME, long gettime);

    DESCRIPTION

    +

    Pass a long. If it is 1, libcurl will attempt to get the modification time of the remote document in this operation. This requires that the remote server sends the time or replies to a time querying command. The curl_easy_getinfo(3) function with the CURLINFO_FILETIME argument can be used after a transfer to extract the received time (if any).

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP, FTP, SFTP, FILE

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    curl_easy_getinfo (3)

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.pdf b/docs/libcurl/opts/CURLOPT_FILETIME.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33728beaac1adeaaabbc9ab96ef97a2e71cf6531 GIT binary patch literal 3849 zcmb_fdsq`!7FVgSajjUXV6k>^VFPM1Gnu?4K}Y~aBN&i}Nb4k-KqSe;$wVU7Rcb8? zz7^lEVsWh~B2-&zSFwt$TBR1$bwzZcf`Z*D_(WazP7(x>-FCmv`G=cx&->i-JBNT6 zRRkB~37~+AJ1g=bA&kP5b|w@Yj7%aesZ1Iy0u&7rVKgx$4I>dIf+1C;j?$9~1!QAr zk}yM#Ez9DsTCPTT&TC8<^JDhvti!b_AFfm7_R3N2jM7iYyAD*!K zD<2i?ZOJ}UvN00%tNC=Zpfc)yN=P$uueP|q!Rsgg1tZ_`lHB+5tccWVH&m^9fcMCb zZ6Xk+$CgCj2DN_4vA)H_j`RNcw_TIoAF}AdA4aw194ZOBI5}T=bn*+ew)eoPw?p$k z-nreoWo1H>rlDfwD*N)Dfxa5OUSpp3{VC%@%S>!r z?mg3<5|5jEwx519rBX-kln$D8f#E1pW&t7Pbo?lZRYVaJmJj0Vee`UBS{j2xF7cQ?`(D$I%)WD^m@_9ekV~dKi z(x(qRv99E?HjC~@6a@|Vrt(sOXgB6H<8g6xUh3QA?d%niNx^?9v#kE$?XqKM{0_z; z-fO?IeIMshzIkjZb?p)~%ZDF=l6i*B-(7Z8+RCs3B5_UBfx@6`!%I~|TGz&pT~rhw zw|=Rz=i8qzdzd%$R8?~l=d;-7Q@%&j8~u6Jeia{j_OY~@l80b@uh&Oy2I?FI60Xu)LF>jIYu54wGI1d|Vq4iqXy_#|5pOp{Rd|fb` zDUAMdTFSZe#L*L*tCrk?A25YyB#q0ju2TNFSk#c)=ac5NelZ@c#PueB(TS4-gv;7xAfc#OZCfdmq2zduq0l zyh6sB_czYEKX_SYL;r{Jf7Flo>-*8C>Z)=-Z!NA5TRyZh?Yg!o?^?^f>R;odvOf-9 z-^e(IA32k+9N$#__2QGiXmb?Ps(U_pT0LBC+37vkP9So2QcQBE$PEibVi9}F99OFBG0MtU1;5X1{gIToGK!D`- zk2T>!KcEdb2s=Hr!N^3T-UcT_tp6G)1qK@ItjbQJtSL8ex+IkZLzt-4b`@^#)g(jc z!3~VLbamJkzp9`k3CE62tNTxw4otGjy@VU$V#I~1@! zb+14}nF&j04dE6reTg>8C}J=|m>5UQ zMvL8+(h-!iM4dIX7q24?iRwx1a}vV^B89@;1HmB>>MKGyUilBUi&*uUTu5FHm zAsk$b?T^5o(-C9hOEHU$=k$rEqs)jg5y5yU(r!ov!l8{;#z(b8TeW*hLHv?3O=qD*GZ)UQlgXU@OE?7PHw(p4_p9)ILHGy$pAj+?K+Z{ zb0T9V!I5c{jd9tBr94!`LEPcLDX&0ny3YbAs5=e8fJdeV@7FL#1<*~wM=>E6#ki;> z4wcFFC0Mw?0`@yZJ8^arrRX^DBowJMWiY_AN!rF%0^{-d zJlti`Ddy%1M%Ws4%Fdh47hzSa|98gBX7)+5d@>cKvzq~IPf-0o59UqRSg(8Ou+>hR zoZX?FN*>D7gTo!@RWZtv^B?%FyC40yInK*HHR2~^40CPOh)f=V&5v%fef z$^mSk4}XKh-3@`=^-IvpiR_?B1BAku5Mlw#^}!;c5EsG**iFN5Aqar|U`sm<=L=q= zVSFhVYp?QQ82%a!1u?zO#}2(NvH}cj2wi9*F<4i+(onFmb)gAyFqgZ~1j24;lGkZs z;p@IgFt8}J>tkrbXd-FwuO^Jd8Z$|dKNu{16xgdkr8O`z!D66b*VcwiP{GN;;aHdi zMTG)!r~pMH@K8(?E|3bsab=i5g+?fG#cy+@uq&I5A!x=~G#r, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FNMATCH_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_DATA, + void *pointer); +.SH DESCRIPTION +Pass a pointer that will be untouched by libcurl and passed as the ptr +argument to the \fICURL_FNMATCH_FUNCTION(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FNMATCH_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.html b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.html new file mode 100644 index 0000000..6745382 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.html @@ -0,0 +1,64 @@ + + +CURLOPT_FNMATCH_DATA man page + + + + +

    NAME

    +

    CURLOPT_FNMATCH_DATA - custom pointer to fnmatch callback

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_DATA, +   void *pointer); +

    +

    DESCRIPTION

    +

    Pass a pointer that will be untouched by libcurl and passed as the ptr argument to the CURL_FNMATCH_FUNCTION(3).

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.21.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FNMATCH_FUNCTION, CURLOPT_WILDCARDMATCH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.pdf b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..297371cf5c42bb4a358a9ed029c83c878dae81af GIT binary patch literal 3756 zcmb_fdsGu=7GLcuI#Q)5u2#Xp9u2r8Gn02h5)VlPsfI_02NXnyWCBx?nRI3XL93qC zT0E=bsjj8<0k$Zjuu}J|9$jo%k@{ev*aN65T_0#g1uNQRx7Jekn~ z-QT_UyKm+s8DoW*ND9q4*S+l%NCu-Yo%I%^(IATnDx1rJ<$z*FVo3)_FfbD9z&XN5 zSZN!f(?Kl95V#Za?Ag1-Nq58s{q*e$%v}3ngyU3AW^KiiITL5@j6PTX>DRq~u$;#d z_Kn$nru^X3ihN7k5?W_{BAF`wdT-->I3-c%10OW z^@dAV+?#rBVPH?|D^IfS=0}_e%qX4Q9B@(=)^zio*UwHqd171GSnZpUM=PuiHxoA} zKTLgc>28WX@_g&QDR^ijTzo(LOkwG(ER0{=Q5!xgq~o<1VY$`u=DXEdVNHS^^Lt@! zw_N(T7Nv_Zc2I4v(k#VYg@*- z&$gz=-C0*2IytZ>>hPqhzuYz~4N1Qe(siogUr8Z7+vy$imdEUJ$eZJTs3~8)EYiKE z1KQsmR2}=_nk^j{9Gd9rz>PVF#kJ|3_wIb!cq5>#A-cD)YHii@cGzIJcDJr&v{h8o zXPI@nY2Jn6-Q80~Q}oM9)|kTYw5L5-m-EQkp6PDQJ{}kKEUj+V7mtLco`cYlVpq%E zf44sU>Gv7mw?rrBPHB9v<&m-IR>i3O`fV*C-^{%bS#|NmdXK#N=--03A1SEZzrMMv zX>5r^d3(v*3se6dTvGd2dta4hj3p>9erZR`{`&6&^V-6;e^z%xAJk5Sj;?$yb5eU$ zb?eHNCqzZdUQOKNj!{}WTPkOq32pmLE!EhkdHpbRtkAL}A#Zcjrib!S`0{&ADV+x& z|3mSo@$HpQw;XLP|6|CVtzQYbo$^_%XF^az*`ClbZKE!`cNWZOD=V0`)^vbcw8$!U zrd>H@k8#$M-*ic`?uFRT26wzM_g4L}J$WI4w|eTt3)|zuLf>DldJ+(J8re`7Kkd&u zZm(gt+u}AbGGOOlX;IfmD`RT+j_0^%DCtoz9AXNq9w78r$=E+)2|rg}XMm!ZHFasp7NQZTR(! zNvCJ84d^Ofb-(x6sIK6KGgNAKrK2Eyw;|xmvi#()Z`J)6B<#3aasP``6$>}?Hc^f1 ze>L`I)VI*d{oL`-T!tq)ws|pgZ&Ebz@1TT~Ll8WNAEC!tg7+3;A)N#(j0aC3tzK6kJQ+e# z+*uqSIsT2nq<+WovPTx7ryaImAb_`NWC3Q{iBp3mETF)gAgOE^^ZN9^ndH6oi{!0E z`f-SnwA%@gQXq%YAxt4boFwIDmk+$g8=Jw<{-_PSKh3nbf0SVosa&V?=e}mX$Aw#S z2@cL8vPnuScvw>_fJvKHkSa5wCYOQ8As4P{#3WI$oxz<%KF#F9m`E-FA{m=qZ3cDY69|531vwn&QX@!ye!eJQBBGgW z1XHP02r5RzVj&!XL&R^WD%Hnm))K&=uhF0|UkSwajW>_QZLLR6-ZVp&$XOlg<)t8)!9^96n2 z0w|OKKY)`OGzOd7N-$bMT+(7VE{A40pMF>+LgfO)|NNI_6^PBqUH}30yFmkZ)FzO) z_5velYdSHC$%H5-M3oj)rN$I$ne4YHrbbZ>GK3QZA3zOYCjvXtFMtl>90a8q3rGoF zHbdL(a2~<1d?YZDSS*tGG}G!P~}yFk`@Cn^kS687B^M8+W-t^Thd-M?g*rbQ*BU zk(`6jd227m!TAmjlCLGT1E;dJ0*}x}*m1Xm6X=#uUT&K&8V*wDJ9u%(fUFT>qg@y!9nOQ2}5Bb@($J{%VLAsa_(Vk75r)*dY|gWDwu5d><^A$s{t^4*O}C zSPnKJ{)4H0ngo-AiTNT86Qf|1522ybVKfxHX*i!44A3E1i3IEM5NR`v#8Y+} z=A#bQy?7&>uF=P!da+a{H;APMqXH9S#sxCDBu1$>D#bBIg, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FNMATCH_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback +.SH SYNOPSIS +.nf +#include + +int fnmatch_callback(void *ptr, + const char *pattern, + const char *string); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_FUNCTION, + fnmatch_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback s used for wildcard matching. + +Return \fICURL_FNMATCHFUNC_MATCH\fP if pattern matches the string, +\fICURL_FNMATCHFUNC_NOMATCH\fP if not or \fICURL_FNMATCHFUNC_FAIL\fP if an +error occurred. +.SH DEFAULT +NULL == an internal function for wildcard matching. +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FNMATCH_DATA "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.html b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.html new file mode 100644 index 0000000..34e595d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.html @@ -0,0 +1,69 @@ + + +CURLOPT_FNMATCH_FUNCTION man page + + + + +

    NAME

    +

    CURLOPT_FNMATCH_FUNCTION - wildcard matching function callback

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    int fnmatch_callback(void *ptr, +   const char *pattern, +   const char *string); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_FUNCTION, +   fnmatch_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback s used for wildcard matching. +

    Return CURL_FNMATCHFUNC_MATCH if pattern matches the string, CURL_FNMATCHFUNC_NOMATCH if not or CURL_FNMATCHFUNC_FAIL if an error occurred.

    DEFAULT

    +

    NULL == an internal function for wildcard matching.

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.21.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FNMATCH_DATA, CURLOPT_DEBUGFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5386b57d9dd2a7d2a32d58ac6c299a99f17178e5 GIT binary patch literal 3948 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 new file mode 100644 index 0000000..3a32cae --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 @@ -0,0 +1,70 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FOLLOWLOCATION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable); +.SH DESCRIPTION +A parameter set to 1 tells the library to follow any Location: header that the +server sends as part of a HTTP header in a 3xx response. + +This means that libcurl will re-send the same request on the new location and +follow new Location: headers all the way until no more such headers are +returned. \fICURLOPT_MAXREDIRS(3)\fP can be used to limit the number of +redirects libcurl will follow. + +libcurl can limit to what protocols it will automatically follow. The accepted +protocols are set with \fICURLOPT_REDIR_PROTOCOLS(3)\fP and it excludes the +FILE protocol by default. + +For users who think the existing location following is too naive, too simple +or just lacks features, it is very easy to instead implement your own redirect +follow logic with the use of \fIcurl_easy_getinfo(3)\fP's +\fICURLINFO_REDIRECT_URL\fP option instead of using +\fICURLOPT_FOLLOWLOCATION(3)\fP. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* example.com is redirected, so we tell libcurl to follow redirection */ + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_REDIR_PROTOCOLS "(3), " CURLOPT_PROTOCOLS "(3), " +.BR CURLOPT_POSTREDIR "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.html b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.html new file mode 100644 index 0000000..36c40c9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.html @@ -0,0 +1,73 @@ + + +CURLOPT_FOLLOWLOCATION man page + + + + +

    NAME

    +

    CURLOPT_FOLLOWLOCATION - follow HTTP 3xx redirects

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);

    DESCRIPTION

    +

    A parameter set to 1 tells the library to follow any Location: header that the server sends as part of a HTTP header in a 3xx response. +

    This means that libcurl will re-send the same request on the new location and follow new Location: headers all the way until no more such headers are returned. CURLOPT_MAXREDIRS can be used to limit the number of redirects libcurl will follow. +

    libcurl can limit to what protocols it will automatically follow. The accepted protocols are set with CURLOPT_REDIR_PROTOCOLS and it excludes the FILE protocol by default. +

    For users who think the existing location following is too naive, too simple or just lacks features, it is very easy to instead implement your own redirect follow logic with the use of curl_easy_getinfo(3)'s CURLINFO_REDIRECT_URL option instead of using CURLOPT_FOLLOWLOCATION.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    HTTP(S)

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* example.com is redirected, so we tell libcurl to follow redirection */ +   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_REDIR_PROTOCOLS, CURLOPT_PROTOCOLS, CURLOPT_POSTREDIR,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.pdf b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c986ead9a28e8db122c21d297b77a073b3bb702 GIT binary patch literal 4656 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 O;538c=;#$7qWlNpgT+Mv literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 new file mode 100644 index 0000000..c588ca5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FORBID_REUSE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FORBID_REUSE \- make connection get closed at once after use +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FORBID_REUSE, long close); +.SH DESCRIPTION +Pass a long. Set \fIclose\fP to 1 to make libcurl explicitly close the +connection when done with the transfer. Normally, libcurl keeps all +connections alive when done with one transfer in case a succeeding one follows +that can re-use them. This option should be used with caution and only if you +understand what it does as it can seriously impact performance. + +Set to 0 to have libcurl keep the connection open for possible later re-use +(default behavior). +.SH DEFAULT +0 +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_FRESH_CONNECT "(3), " CURLOPT_MAXCONNECTS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.html b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.html new file mode 100644 index 0000000..6a968ea --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.html @@ -0,0 +1,61 @@ + + +CURLOPT_FORBID_REUSE man page + + + + +

    NAME

    +

    CURLOPT_FORBID_REUSE - make connection get closed at once after use

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FORBID_REUSE, long close);

    DESCRIPTION

    +

    Pass a long. Set close to 1 to make libcurl explicitly close the connection when done with the transfer. Normally, libcurl keeps all connections alive when done with one transfer in case a succeeding one follows that can re-use them. This option should be used with caution and only if you understand what it does as it can seriously impact performance. +

    Set to 0 to have libcurl keep the connection open for possible later re-use (default behavior).

    DEFAULT

    +

    0

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_FRESH_CONNECT, CURLOPT_MAXCONNECTS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.pdf b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c534b60a270f045a277f79c17dce61f181f3400 GIT binary patch literal 3990 zcmb_fc~leU7T1c^H&p>wgnF2&7*vv($(|UZh7dpmF@&W>)FGLWkt7o*6BF>bv}&oM zpjO4@iIzUA7PS-+wIbH1g1e~bb3M)T4oW3g1@_AxoKRU3xp3{c@};Mxi%ou0GrEKg zcr~K7{=B&=H7>dE{--4xYx9b`F&E8Ue~qjERWtc$=za7-x)d3Hj1 zdiR<=*-6iXR`h$B7(3PSJ9KXHt)wyXZPcL)*Xgn^hBdA^>FX$tPx~gthTNL`L#J2q zCF{0@rR>@=qHoEyfbHt*Wt-Kx(uryRMndT&^5Q2l#msIV%(=;X41ig~jF znSOmP4=kE1IFJ?{yvY{5>4uLzHSkA%*I)jvUp0(eAHG}lRgUj8-~Q5vk@*#oyxQU0 zo2KpJ-LAZ{u&m2r!{q9l7k{o?kU4L6K*gx44X29BL&x;!E{L*3T)JV*eYL+LS9+r8 zYAr8i{XYXjFYaqJ-l)IXNmx2cqq7!1EctlO_wbhuwwk`Tx`!Mq6J$JfUfE?xn|9nh zUJlh}Sfq_X3Bi|qR$rNo3?7;?5Q$taSsxvGYGUtsJFsup4)xDi_ZjC-e)=+EL08$z zz|BzklArtgKmXCE=(aC`NF4D!Y5t&bbhLP+W+bB=-x+l1#8ExAkXUf zhi?XOMDj&+%8J~8yInr#o!|e##lq7ePs<8!W+UZYZf^;e+&CV8_p7qH>inSl!(gN& z5dBwS(*7A))90%?^=HDq9Wm=9Yz(`%a+TR)J+i|YdCed)`CO96&W_EaE%=ca(<=OV z2REF_bLPZLE54fq&D?r@FZ0{RE)uhVi=t-ZKj21f^FNam;?f9v5 zpmBY_x(zGVovKPLQH)iM7eb;;Vx`;)fz=%=Zk^7v)&@|fK7gw^0hC~#s?jm0wdFNR6Pke4QG zMLb=$jX)CcOah4`3?#0iTyPo+u0=8tEEV$8Aw)|t0RLbVaM6U7fdwo$0y1Hz9JHRW z1K3QUDSaZrq#*!UVMIr`7$6tvVxkh=q8R28(NI7f_0}T#VWgAh}lo!lBk`XwAo2kqe6<+V-2nIKR z8yNHGYPBtSQ$g!9AY?*99E>TIUMJnJ@|x00AXZM>s>c1ymRk&kFgB=KL@R@2o`V#U zz9qqOcqLT0onWJd=tv7;=f;31ka~A05S9!fiH;10%^dqi;8IKASlu0~P*G;XUr@mM z)Ug6BWx=g&HAGs$L?o@5Fy@Zwe{;!w>s85mi?qlgYSL&VKuLibN`o+o0I`r(hdsUZ zHSXNB6>Z5{>-$sV#@eHOvM8AK*&4d*oMJHUZSLpUcz6oXE z?71BwQ(uc&?L4S zuHMMc;9?kI-@{CDLQ$W6yl015SmK>>K=aiDOG*=hi5N>5d^LYY~MYouj zOM$RCY7?Dz9WUG#7x%v-X0fm(&GO0Bl-^+hcpanue+uSZ=h&cs?Xb;3o88@E&?AJI zV12WLG-JSHgI;c=zn)BHb@)t8ab2@{EohNr>GS!!Eg)b zI9V_Rr#CkVc5r*qxTUW{J8J9UV6wAa0s_wVNvK-RHW`YcQdEXX-2KHtQ4U}OefTFF z-fjr(s9%P^9>p%2FhVGdi69oRJRd9;i3B3p2zzP312ACO54N_@1Oh3TU2oDbfOhR@ zd}%ux3f|P7Puz|V6N%gNNii^~-?A$afmP%!npg_fx3_6%2Q)!@nhb64i%i@m1`Lgp zW`YL)_rgdbnL~j1!C>2?z(NHwt%Z>otC4~|>lzZHhSLwEz{U n#`1*%DPJs-sl=G_&pFcBUCqwmG~-U1KqQbrAt8|yG|+zlbk18q literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 new file mode 100644 index 0000000..1caaf61 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 @@ -0,0 +1,52 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FRESH_CONNECT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FRESH_CONNECT \- force a new connection to be used +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FRESH_CONNECT, long fresh); +.SH DESCRIPTION +Pass a long. Set to 1 to make the next transfer use a new (fresh) connection +by force instead of trying to re-use an existing one. This option should be +used with caution and only if you understand what it does as it may seriously +impact performance. + +Related functionality is \fICURLOPT_FORBID_REUSE(3)\fP which makes sure the +connection is closed after use so that it won't be re-used. + +Set \fIfresh\fP to 0 to have libcurl attempt re-using an existing connection +(default behavior). +.SH DEFAULT +0 +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_FORBID_REUSE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.html b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.html new file mode 100644 index 0000000..062da52 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.html @@ -0,0 +1,62 @@ + + +CURLOPT_FRESH_CONNECT man page + + + + +

    NAME

    +

    CURLOPT_FRESH_CONNECT - force a new connection to be used

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FRESH_CONNECT, long fresh);

    DESCRIPTION

    +

    Pass a long. Set to 1 to make the next transfer use a new (fresh) connection by force instead of trying to re-use an existing one. This option should be used with caution and only if you understand what it does as it may seriously impact performance. +

    Related functionality is CURLOPT_FORBID_REUSE which makes sure the connection is closed after use so that it won't be re-used. +

    Set fresh to 0 to have libcurl attempt re-using an existing connection (default behavior).

    DEFAULT

    +

    0

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_FORBID_REUSE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.pdf b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..326ec751ae40639edaea05cdd4b01514833fbe52 GIT binary patch literal 4013 zcmb_fc~}!?8b_^yqZVoLKr0L?1k_|^azP@A0s(~*!GMAy$|RYZ2&Dt_QB`Ri&;j+bSZ8cE3r2pt9TU^Em(T<^A6K_-8$s0gZ6zzV?Dh(eFD)Ojd*GVa6F+VY zT-a|*oB#Dy*E51>A3ATf%r9!GmkqTgFrVdNCchu9seOz$m)1UPIrmsC_cWDO)m{mV zE#@~YJ0vxZnmp)yl|(15%|FzuZOy=(#YcawXia{K3j;S!4n@0#$#2yj<@%p4%^0DP zW99R^?^O+Lkh^cJ&(_{>*F9~S?>6G!I#w1=Uc0%@mi8nJ&qUIO#Pd;?WAgaWgD8O zyEiR<6k=c2U+42{#E<;CJ)46F&s4!g!87;g+a^9(QZ>7}$EmZHyd&F15vQ*WD&#ya z7nbY2sLA^ml}-u{f`qZyR0yl9INx@&{OW;}6^SLMy~bBnG+lEOmFZiVHGK@LjeXi0 z6GvSCdVt=&@06F@PgidqR*#jn1T7z0)ob5;PUWYuw#FpkuG8Oc->YwZGTZM;P+5I- z|7|%vXMNfIllr*$3;yzw*dnq%>A;EGl1cifV`9_o%btAXmPRgGC^?in(tFyB9tCOZ zMu*=SQ+B%^%0AjBxPIQhWsltYaWzfXqU?er4f(alM`b>_ee(MRkC6{s)3SEVi#>2x zu6%aJ|H9m@k}cixcklGxwPc@XZjZGA)BHsRwyL0pr}&K@d_%t&Jj^(BcX#OEkYUQ$ z^ilf`PAIBLTfMxxX;A4r;a35L50>!uKI*<-+psz2)B#yavmbw8U_>nEVo6ogc;AZP zCmxRrnqt@0jMtY#o)PhN(6I*I_HY z&y2h~Xw5G(D=WD1qkl@=b61*^uqWxJ;Dssui%t%%SNi zONK1mAvm=#az@^Ol|Ia|RePiI2fkX+cc0fCrk1JMn3gY3f7b1U&&j;Wm&dt%(k3}P zt8U@GvYWO_(e%EH3bN~JQZuUz=jT|@udc1Gs2ry(&hy1#v+&i=CF9l@`}1WdG>qov^v-N@DYLsNv-L8}%bD@%k-l^xsq(AGo;p zvtjx;ooDUI{JsZ!NBzC%#j!Q%mCv8|IF}qgKd|!ho$nuSznNNM{VLhJrQn;e8q>>L zhkj|n9`Ji!%FoEXmp(Nu?krYi^y_tT8}G%1d&|7^!MdqUV@7@6v%b;O{>pQVV)0nQ zq;&xoII&>ILLB=S!z2>OMH6-aVN#BnKoal_0#OoL5|5zla4HI}MG_GlD&(g@h>BtW zEW#+@q6rfN3s}qqWWqvOX$@fkXqrG%nnZ$0MF8HyND^UZfLxTFnULrZ#W1HxGzG*l zzT*b~SR@ks1{y6e3(P7AkX-(;CY(SGv;hZUhldsz`JB{R;8ck9Uj?PXK!cT4*-4Z& z<-&NUWF*eu1}dXnh0A*-!QfhO17l8I9kxT>R?ra!gv2K(VN5P}Iq8VXWl9wSv2v;o zHI6XbZ!r|Y*rciul?0MF51~-#I}$91OCkcd5Nx)PB+^J&xG^9EQsYPk!jd5*(W++H z%CRv5m)aA@>h4-a1ZB|v4h5`FT`N#gM%>g{LzD?Tl%y#G#vD2QZ!S4*T`E~`k#;#m zLF#k_XerP`sSp+-K#ZixYDw#e#!;KjqU}}dh(ARc*Z!7c0-;zgcQt?5IJ+6wWDyLk zCNfBqjMG$ej02Ne87En!M3v@9B9ok$OB0E?lae&KSsIC!GfobLjl;pr5L`QM=IR_v zfdwWk8rkqjRb2FNmccHy8_h=0Jh0tpFj=H_8OI?a1!tCwa9{@ulO^M%C=+0Yq6}Fi z1M_(j9>&E4V_+SP8wndlXTcax%mFHCtxl=}bK_J9e#tnQ3}coeh|Ol>*#ta_&OpHM zN)VKf@cCT8!L{U=7~IY^Sw;YR4oAq8H)19W&*2kKLm3e=1;KbI(r!or!l6ksLsBM~ zHH@n%D`$;0c+Og>l-4B|KEjL0sW~D6c?my3PV9s4ER&fJdqXjjPL1 z09cdrQB1@|F)kXKgi54Xh*TsVjbc(14MX1H1jPrUkzgqVOXBYk?Znwhl%kVBOUN^5 zN~eRf3EIL|0^{-dJb}}qL(Ih$hOjm2l${TqFWjtD{_l(#jciM^d{PCau^Ith$0+`v zhWXGn)@t53Y_`${$8=~l2w@;t-z=ca81PuDk?JVgh=bn7&1L|eINS0F=t+(|3|ulK zV<6;?*$X!?&VzwuXGvVQk|xXCy+77W4Z?M;GxxLs)6KG#8Ajdd`1+1V)p31{adNFim1 z48_n;RDy*#=8J=(9KZ(V@HaSI(-73vyac~_itRL^gHRX~K`dZ7KUgdh2}H0CcF`~q zAG}lS2b, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTPPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTPPORT \- make FTP transfer active +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It specifies that the +FTP transfer will be made actively and the given string will be used to get +the IP address to use for the FTP PORT instruction. + +The PORT instruction tells the remote server to connect to our specified IP +address. The string may be a plain IP address, a host name, a network +interface name (under Unix) or just a '-' symbol to let the library use your +system's default IP address. Default FTP operations are passive, and thus +won't use PORT. + +The address can be followed by a ':' to specify a port, optionally followed by +a '-' to specify a port range. If the port specified is 0, the operating +system will pick a free port. If a range is provided and all ports in the +range are not available, libcurl will report CURLE_FTP_PORT_FAILED for the +handle. Invalid port/range settings are ignored. IPv6 addresses followed by +a port or portrange have to be in brackets. IPv6 addresses without port/range +specifier can be in brackets. + +Examples with specified ports: + +.nf + eth0:0 + 192.168.1.2:32000-33000 + curl.se:32123 + [::1]:1234-4567 +.fi + +You disable PORT again and go back to using the passive version by setting +this option to NULL. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Port range support was added in 7.19.5 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTP_USE_EPSV "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.html b/docs/libcurl/opts/CURLOPT_FTPPORT.html new file mode 100644 index 0000000..2ef4187 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTPPORT.html @@ -0,0 +1,72 @@ + + +CURLOPT_FTPPORT man page + + + + +

    NAME

    +

    CURLOPT_FTPPORT - make FTP transfer active

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. It specifies that the FTP transfer will be made actively and the given string will be used to get the IP address to use for the FTP PORT instruction. +

    The PORT instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a host name, a network interface name (under Unix) or just a '-' symbol to let the library use your system's default IP address. Default FTP operations are passive, and thus won't use PORT. +

    The address can be followed by a ':' to specify a port, optionally followed by a '-' to specify a port range. If the port specified is 0, the operating system will pick a free port. If a range is provided and all ports in the range are not available, libcurl will report CURLE_FTP_PORT_FAILED for the handle. Invalid port/range settings are ignored. IPv6 addresses followed by a port or portrange have to be in brackets. IPv6 addresses without port/range specifier can be in brackets. +

    Examples with specified ports: +

    +

      eth0:0 +   192.168.1.2:32000-33000 +   curl.se:32123 +   [::1]:1234-4567 +

    + +

    +

    You disable PORT again and go back to using the passive version by setting this option to NULL.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Port range support was added in 7.19.5

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_FTP_USE_EPRT, CURLOPT_FTP_USE_EPSV,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.pdf b/docs/libcurl/opts/CURLOPT_FTPPORT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4bd409ab3819b7b011c90cadb898d19899da6494 GIT binary patch literal 4725 zcmb_gdpuO>8>g#gQQ4wwatck+IOoimF*6vKL0J?-5vj(^8HO=4W{wQD+O{IBD3w@L zvI!xjdrB$U?o@L7t#sM?t+u2{Nq+AcY}eoI^XdHKoacR>@AJIR<$b@y%*)x8f?8UU z%q~7j%_Gqv1d;`Zk!)>Y4@??@he8Y>;lZwA363cs*j2*EF=tF56Ji_=Nr@{kegsLC zo#NlI>7J|pyX!t%E9_5f%rf-bR#sW}ea_T?nS8_gh*>syCc<4BAwPRcXhvPyG22#M zv@5t|9qO7GFycwkn`?jBWc=Bdc!62oS@vexUvbZJZ4Xjn^_zNDKZ~rKUsQHG_w9sp zV~m%t|0S1Iok-qjF#nISrme3Y_ch&AQFRQ)x8v-XKNHS$|B!K<+R2w4dm1xc$sD&l zPHA}B>vcW3Sdcr{*Ed^#gZUwDld+b~inY(YR2vUfKn7`N;_Z9#Ei%8IQcKcu(V07o z`M7)peWX|VXx%XO0VDr3Ar!Rg?(^x^fyYv9el)SzmCF60EnxOsQQ-8c^4%G2S+jPm zgF^J{JJ-F}N(tS7x8qu`Tt3i7Y)sc77n?OaSP)qZGr z;o<)H-Xg<|%8m`AY?wRRsmq`J@a`=$larczy=3>if4REb#j+vZVIal$_|^vnvPc zF146W`_6AawNXB`(xB4$bc@SB+1^Jp%1=68wF^91bN`AW<>`v`GD)Rbal=H$i{oY| zPB*%+UY9cW-F6>nbL}hL&6EETXT-JF-q~iKvbR07OZCU$V%LRxToqM66f|6!9H8({ z+c@nYlQKga8#8`Qk*!H*Me5CczTv#BG1*c#-!$&ld2yrNwL)p<$HuMotf%c$UUFUa z%Qpe~S=Zt%?q+UxSs{3vVLtzO^7p-74|ZQ(cZca#%iFxFqQTo(YlZ4Yb5}h1uKQE# zyGBK$JbHC>Qqt4EUHe$PyG1!^zDJABPqeM^*NmoR=|@arrI!fr?+NG^Xs#X^BHdOV zX=PRyn`0qooZ7JH;BQ?uZ(ihAo6q<~Z^9bxGLko|^uQ)0A`zF={_{uewAvNOH^&lX zT2AJgdIwz+JYpRj&X(0q@Mt)n9WB%_+LC{R^eAlSwxmhs1I-CD1xwEDjb|0l^}Jnl zerFR(-jMk6guvEhpXY^wRk)L%OV;d>TC_*(%nfyIj7(ZVf@#uC-CBwlo-x_XZEbRI zT2a^G@!RN~(=tS_4f2kksyo*DYRQV*b2Ypc+L#5*S(Sb2hTz1Q?hx_Yv9}~zmt^yP z+*Et@Zv3QzeyaP8-25bg9{ggqy*TyGjl(sDQ@C;U4Lg%~f63U9QFi;=qgEt$cUN62 zY<@Z81?6(O6?@jh%s$Ri%bBYVuDfJ%(>rge;}(4vNp`@^K>wc-*Hk@ik^Xw1#a!37 zs)D8eU{UfT29sS`=VT5g9NOjC)zug<*65Oq?NXOkUXr1yY|)t!zCc%4m1)AxK4Nq- ztb9T;d-r1RB->`8+m`O#u;%!sZ%C&CbCFHa)>9ljYp%LwoH%vLZ13oKEcN9dh1T~{@Itmcb~ z#l8iHY8-ygpW6Am6_tPD%=&jGVGVfUS)1&{^w30|iM)|BS^T+bE zro5WE3SN2mRfTvT1}9WZ`=fOvfQ+<|8m3xadj zjQoyW{Er97+a8a#4&7~2+Z+Zi*6w(abX2^(_;4N9sbWJL9(%nc*slN2h9~P?{U(0v z{;N@iuwHk>{mvGxW*37c-xS_w>6{MfoUz7DTom)8460r#YO*Zzp$GP08aMaBg-KVh zJJjP%4B@!b2U=RM?YW(CI@jY@?xH2gp7@B!+SWr|JvB$}9BaicZo&V7HRjxj8Fx4? zCdi4d&>7g+laN0mJe^B>rQ7@X*6Z=)=!TqMgUT{JVxTF}tHvb#?#5rz;Na9rVLEq* z`ps5d-EiLE#YvlY9Y(f|2>s-Ay`1W9jSdfsc4b3hidRNV;DOW*X$BtFV^I4pSy$Q; zGMQ4O6*kp3(f&&P5%+~no<+VPoeUFqc~0ik1MJ6!c^!RC+M|?m+5+m5L-{mq&C4aO zCN~SaM)a}0%I{gP;F_UP6GwBd)d+f4PMR#Qd;ZrU@0YuIHD@=KT&&cvIbQx?wJ6K1 zXaAqeX12yI&A)$u)_iA=Mf1a$TuJ?wJWId5!AJMhR7lN_yevNMb!^$gt!p)Qj%|M8 zHh)%0py`XbM^Bqo?)({+>h4;p5nGYuFsJW3yZC|10jAOTj^5t3>`T>)b#{#^oAaE{ zdwuzNzs0Lcjc7*wjgm#>Z=IV@8ar1-se-V1_xp@p?|b*YZe?h#ujs%0HkVl+>@V(oKvihX4L?f15pEmH9w zqGi&H)fXO+^<+iU3k%1YmRR|8w1nM!^1R@poAHHF+jpI@wVd@PY(05*vE$L}hnEI8 zUORW;0snbqulMrSEXk|P(6D=trkEdbvBn-5u6ua*Ndu$6X0+W|?Vabk>)ay)rdf-$ zCr?Nj>FevfZ129aQ%3U# z0j30u!%HC(_+WS-3^)k{`(i2_*tw|ic|K}WlmG-Kt}Hc0S7FHZ>NaE5|Z?`p^u&zeNo@!rFzw>iAZBC&{7n8zeB zKUO2;Lt0LJB}QZj_7z89N{W+AB2;f)oi-Be6BUdTwIX%}f*4K}f%jzqo-Bed{Sd)L z3fP}m8UmqIbu|A5QN20@NjQUt?OxSZYUpcJd4v5)19fesoX7Q_jUg z#q(nom{05iUqNiRfF&f`b4a%Ke9-F{Ma7p>L~6pTgfOMRZYG!K;X0F0P_b1J@(56L zNEIQGD%mPKvf6|V-U%^GhSVx}xE5QBh(co54U> zbiNgzA`nr7DJY7GCQR2FsEo&19^Kk^3_fI}L{19)SDffhyyFohj? zo|gwSFI1+)2mM1VON2p&hqnK9Q;5gz?5tL3rPzu8I zMObXqnoVa|ASfF_Y~fEdLGghp7yRG>KY;!R(+@O1FqJ8MK}&E#6f%(rT8Sx?L?uv5 zD%FxU=uvGpq-6^eHTobsUprrXxu@rU&R9eQ(b9w-+gT=viU8-VoAdwEFkidILc!kw z%cB$$^>hdYFebr>*p#5mD2P}nV2fmm2tMd-zFaO53;0CK!=NY099yu6i*X6YQO};E z1Rs2nh>2NZOZd_dJFktV zOoWA6tLKZ1AY`Bh=J3C03{AuAFU`xGzpqf00uzxC2(=;+2iD*NG3ay}9TGu9GAfM< zu2$lKq{A{Rlm_m-k7ZOU<8v8^{Zl;z?CDb(6=8m+N2Req;y&>~XM7e5m5zL_XGH_F z;uBjd#^*AI6(9hg=vjXlAFkkwC71&ITL*%D#IYF26$BWW43Hk;4u@bjsYnK??{gCD z<_rbeI=UjxE(}Kmz|cV55Y)-V+KFZ5=uG7@9BFhe=f7(N5qwIC^A)(dKvv-XAeouD IEOaIP3(`sHDgXcg literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 new file mode 100644 index 0000000..bfbea9c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 @@ -0,0 +1,53 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTPSSLAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPSSLAUTH, long order); +.SH DESCRIPTION +Pass a long using one of the values from below, to alter how libcurl issues +\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated. This is only +interesting if \fICURLOPT_USE_SSL(3)\fP is also set. + +Possible \fIorder\fP values: +.IP CURLFTPAUTH_DEFAULT +Allow libcurl to decide. +.IP CURLFTPAUTH_SSL +Try "AUTH SSL" first, and only if that fails try "AUTH TLS". +.IP CURLFTPAUTH_TLS +Try "AUTH TLS" first, and only if that fails try "AUTH SSL". +.SH DEFAULT +CURLFTPAUTH_DEFAULT +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.12.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_USE_SSL "(3), " CURLOPT_FTP_SSL_CCC "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.html b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.html new file mode 100644 index 0000000..5e688a5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.html @@ -0,0 +1,67 @@ + + +CURLOPT_FTPSSLAUTH man page + + + + +

    NAME

    +

    CURLOPT_FTPSSLAUTH - set order in which to attempt TLS vs SSL when using FTP

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPSSLAUTH, long order);

    DESCRIPTION

    +

    Pass a long using one of the values from below, to alter how libcurl issues "AUTH TLS" or "AUTH SSL" when FTP over SSL is activated. This is only interesting if CURLOPT_USE_SSL is also set. +

    Possible order values: +

    CURLFTPAUTH_DEFAULT +

    Allow libcurl to decide. +

    CURLFTPAUTH_SSL +

    Try "AUTH SSL" first, and only if that fails try "AUTH TLS". +

    CURLFTPAUTH_TLS +

    Try "AUTH TLS" first, and only if that fails try "AUTH SSL".

    DEFAULT

    +

    CURLFTPAUTH_DEFAULT

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.12.2

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_USE_SSL, CURLOPT_FTP_SSL_CCC,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.pdf b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..710d984f9cc3783e842614a2e0fe3ad331dcc7c9 GIT binary patch literal 4065 zcmb_feOy!Z8ozoYZH9_iBEFr5FoL_CbN0Tm&DaJ=Y=8q1M9kxM21mA?ads915?|0j z@v2!QC0B~8q?UMHik2c-qNxF0eAn_NKMF}|T9%2y{he(Hiucz2d_4c~+w*&#@ALeg zcS4i3v0RiVWQ893VO0%F1R)SPcOFZjfOWVno6dp6fMS4S2@8!=5FBg4Xk3dMNfWM8 zu^cpoV^)@{syWR{o=qFw-Lg%3WM5^(zJ_hZXKLex??-U`p03TT(3LF=RLG=FVbi)b zJx97Pw=|pzI(Imj*s^0;_|UGss&*Ot%ED1kr!F{h^Mtki&hgT9do`D8f7jybS{U#&cEo}j@HC4%f>7j#ER=& z$r^fPq>|=U75sdoEnsa{`t|(p*|V>%Dp&B_dulqVv1^dz;oVc+*5TF<7ie!rsb3D1 z1aH+5`Ml6742fJJI*=Z}iQZi|dimWKc7HC22nif_g3<*%x4iB6p?$^0x;InUn@8|2 z-xKY8f7j({%ad!>6NcRPtMoJNaqcZK4I8n}v~v-=1fOz6^CK|igWw{Kcz zZI`sPGwao1GxFZ8z+7R^CXKvSzGnTi^Ji9+riAYpzwboS>d>Ko8MWU%IqLOg6Y-9v z*0sc3c)49A7QS#~aO?J0@ZaW1qFz5-wn=^_dN3z_ z<@7hkpKZw*RvjKaBL4iT&cpM}E%x7nBtfm%RtD}x&gb~A=ZfrmC*#X0$Q^o!VE)01_`1>RX3u|kPR%@oN<a=P%By+ z*OW81a_n-qu0Fi^U+C{tg(K;1l5Ds=IjO*UDq#TDn4s>e>~z^R{28 zI5lqp+C3+8(1_8FrfbTzH*el>PpDI!gVXG)dq{Bp_N3x*+=EwjZOhMn}S^`pU9aw)fuR6Jb z)clY*Z2HU_L#jJAo^_5Lu8DuEq_nH+_vfW}+hjQM9^blUlC!v}^};VD{yn(Ook zQMiqU1WbbkWZXeIDI@Lxtv8t>jVU;t34`Vg!Kt{5268bjIxfW{ilSbTSQ3b%e9sTi zjbRP=4GA3Dq+PP+<5Q=!su}Y%#c}digPZ_M2>kQ zFsavZ4EEz8)TG7qCjc0m9uHt3t(dJpLW~VeRl=4Hp&p<9H)_Y)(g3-=jPs>W|PHygoOi>vg^J9~B72DwVGW6jNMw%$SSQ z&|Ey5uqin=_cU@K!ldNP5a|)UU4!QkQwu3Pr7$toSeR>+nK)BaEX5QIln%~yVRo+B zvq(4~++kF*H3nTQn_+OtT~@mlH1`dCP_;! zK|_3=jE8bj!QUV=g<0`@lFEfpo|pq5DU(@l0OjKa1izG=9GbSvVK_fOpO-J-kyJK} z%49Ma;lq4B7jSSL1vVOUaczzepwD9nk^Vr;=HPj3;u%RROr*mo4}p6XX~AW5@JM9hJG&wo-@f!I9W3m~9AHz)v)To3Zs zT%ZNrO~pr05f?$Zh%^s+7fv5&7l3=m?6Qcb%`-zfNDo6=c zHbt7v(5pD*U?PF?_-GQJV^%AZ(hQ$mOB$V4(6-~X z|4+g^=@^@g4-B?DDT}8%Ohy>D;EZh!5M~ruY%G4uWt18>quS;P6#L_~Yv3#Rn7FMd4-^0-+)n)3CfBBo>JTBFGH+ zXsAdGW*qZDwqBY*C>lTmmV#mWFdrB#184|%(?CA{06tVK0AunIJgF3H4Uf|Jz`>8u zBqFe-JVFyo2GS(RK$=WEz!p9NJn{gKrZB>SQ{Z1{2u>jiao|4)EPW){t3ad;5FBqa zlaP07gX6VOrb4Dxi?kXI9}x;<60Iy+Du|H*Kg0r6s7M+kRsAtX7PGQBXpEvgK@*5k MJ}WddCMlNnAJ_7JPyhe` literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 new file mode 100644 index 0000000..3c34247 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_ACCOUNT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_ACCOUNT \- set account info for FTP +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account); +.SH DESCRIPTION +Pass a pointer to a zero terminated string (or NULL to disable). When an FTP +server asks for "account data" after user name and password has been provided, +this data is sent off using the ACCT command. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.13.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.html b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.html new file mode 100644 index 0000000..20db542 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.html @@ -0,0 +1,60 @@ + + +CURLOPT_FTP_ACCOUNT man page + + + + +

    NAME

    +

    CURLOPT_FTP_ACCOUNT - set account info for FTP

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string (or NULL to disable). When an FTP server asks for "account data" after user name and password has been provided, this data is sent off using the ACCT command.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.13.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERNAME, CURLOPT_PASSWORD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.pdf b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..def965a25e406bd4d435ed81914ede1ded2593a4 GIT binary patch literal 3777 zcmb_fdsGuw8W%;xpj{svt(C`!N^muqnYlP0#+A61)Zq#R zi=wSKW@6dDToTu8ZdQ$2@>BeXOF0`>?{8UP4_!MrS3Tqp>CuHdYE`lBf`~-pRL!KF zuI=Jq;-BXiCzqSoO?2NI*>1VGS!&SFTB#0b?ELCz)t-k7+x|vnG(Ipc7VVI^zAQAg zB(HEe@?uirgqJft=oCp^F9nIM;arjxsQM$Si_IW0p^mWodNV~SWA^F z&P=&|%ssv<5oH*f3Ts@}@y^U+fx4D;pPZW~58Bc5exIC-Q z{Zzr|@S2?F74FxH@7`S4k; zRq=xT@vM@s4Yf!9xl(idv+Ew0YCb<+&MhlX-&*#trDOX}my#O1aADYcrYi;C@n=L9 zq{;LBCKMK#o>xyBH}2CMTXgWeh{C8Nx7V)vW^em3F`Cl!>($>6zy9;!xJJP66)oqyZWRu%2Iw`fuYa!9RbpO}UUiYCKukQ(uxkI<#|5IJ~quOVs=hwdYpw4!6 zMWox)YvaQbd$|4-MBnUbyzlZ!;Ep zKJ8dFJ9C~_c#Ujh>!_%0qtCa@FV;jXm^+4g_Gv2l#OFYo-M6hH0D6%{i4>c3geC-l~02%>ANF>9N(7eJy9-Kw&naN&RyN1 zY6!?Ww0q>L8-vk{?ZkVOU_5uq1NRO4j;7pYQy=(0y7RtbUV+D$+RI+5M^TGzH*ZKD zaVIBr9^Iv?XtzvQw%l48*;qmS`14D1yttUo_7(Upd;jzopA9$a6?sLKO&*;WcHJ-E zX7(&s=04AG8(Y5-Uwq)u?>bs{K5oT$0gpeK?&Wr)vU-ztOWD%2t|!qU`SBZknr#i9 zTfgC_mXkMAzlb}Sk{J2R%!ehr3;4C%OWxH71=ANy^lroIiyxVMRwH@(hdb+wyk{m) zev~NjPKqUOw7fjWjag&eB(*gpr}&3OUJ3NHot;@J=T`V*?-{Cwc~mvV*6QVlmkduG zb_4eH9Bun9NooIn9~47f0m!u+C$P{?x91iio$n`Ob_D9nJvYFtNPA*3BjLcp<5 zDug5gUNQ^TkTifH2mxGH+)P7!2BQEOr%0Psi&Fr-qO7Dg2B(u?fNu~Si`!`+7iOo! zV;rI=qY#LwNFa`)jt>B6a47f&8YzeYLJbR$oc=K;x`7dB0}etC4=D)#kkC<35{vO) z!%BvL1{d*VIMEX-M&G~+G^7bL_tg+)29ty^8z7YD@a8{gbeuX>GREK@Iao>P^*E>j zkn|)LDnMX8!9vA+*hH9ZRC2FRj+pk<&=c+6TO_C>duATW7l;%JXVJ=M*)5nh1E--h z+(4KE*&PRuvLQkj$c`7P5w#^0PbX$)Tk)9eIkDR846Rhho~2;PXJMe$agH6caP*Gh zNkKTJ4fG4uM5_E42D{8|vY0^9A-l?(glCf03<%|l*g&OKr}}FUxDm&nzqPbI5RVoo5|;rRs)Pm zrBWE-!8{%ZaB!$BGmY6fW@<99=Wv8bcr9k8xDKDVTG9j)2{6h<;2uLta2+dQp$XCq zF@~`;(nbfeZ8kzD6NwP15EEb=t)7?0K~Y@KLBQf*e4Y+P^b$me=z7dq`ndUqJ#YXF z@;W&*JCy#%~r&j9o)L^Y#0ee_r@Uy_v#uTR}K>B zZICwjHF79e&^uc1PEjvhf}s@1&Sbz4?B09yk$cy0#At^8g0c0BW?wM5g|B+$i_jeAn+n1!J~(n;Sd~Q){~H9p0nTx zC6pu&3FZq`BB3ZuEI>r6P?0iJ%$JCz!4efuB9w{*ir?l)X5Ld2jag|&g7|y^_{Tam IY_5v+Zx, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ALTERNATIVE_TO_USER, + char *cmd); +.SH DESCRIPTION +Pass a char * as parameter, pointing to a string which will be used to +authenticate if the usual FTP "USER user" and "PASS password" negotiation +fails. This is currently only known to be required when connecting to +Tumbleweed's Secure Transport FTPS server using client certificates for +authentication. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.5 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_FTP_SKIP_PASV_IP "(3), " CURLOPT_FTP_RESPONSE_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.html b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.html new file mode 100644 index 0000000..f681034 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.html @@ -0,0 +1,64 @@ + + +CURLOPT_FTP_ALTERNATIVE_TO_USER man page + + + + +

    NAME

    +

    CURLOPT_FTP_ALTERNATIVE_TO_USER - command to use instead of USER with FTP

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ALTERNATIVE_TO_USER, +   char *cmd); +

    +

    DESCRIPTION

    +

    Pass a char * as parameter, pointing to a string which will be used to authenticate if the usual FTP "USER user" and "PASS password" negotiation fails. This is currently only known to be required when connecting to Tumbleweed's Secure Transport FTPS server using client certificates for authentication.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.15.5

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_FTP_SKIP_PASV_IP, CURLOPT_FTP_RESPONSE_TIMEOUT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56fcd4935e1a70bbe2a619bfdbcccaceaf429566 GIT binary patch literal 3933 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP +.SH SYNOPSIS +.nf +#include + +typedef enum { + CURLFTP_CREATE_DIR_NONE, + CURLFTP_CREATE_DIR, + CURLFTP_CREATE_DIR_RETRY +} curl_ftpcreatedir; + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_CREATE_MISSING_DIRS, + long create); +.SH DESCRIPTION +Pass a long telling libcurl to \fIcreate\fP the dir. If the value is +\fICURLFTP_CREATE_DIR\fP (1), libcurl will attempt to create any remote +directory that it fails to "move" into. + +For FTP requests, that means a CWD command fails. CWD being the command that +changes working directory. + +For SFTP requests, libcurl will attempt to create the remote directory if it +can't obtain a handle to the target-location. The creation will fail if a file +of the same name as the directory to create already exists or lack of +permissions prevents creation. + +Setting \fIcreate\fP to \fICURLFTP_CREATE_DIR_RETRY\fP (2), tells libcurl to +retry the CWD command again if the subsequent MKD command fails. This is +especially useful if you're doing many simultaneous connections against the +same server and they all have this option enabled, as then CWD may first fail +but then another connection does MKD before this connection and thus MKD fails +but trying CWD works! +.SH DEFAULT +CURLFTP_CREATE_DIR_NONE (0) +.SH PROTOCOLS +FTP and SFTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.7. SFTP support added in 7.16.3. The retry option was added in +7.19.4. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the +create value is not. +.SH "SEE ALSO" +.BR CURLOPT_FTP_FILEMETHOD "(3), " CURLOPT_FTP_USE_EPSV "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.html b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.html new file mode 100644 index 0000000..04f8c61 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.html @@ -0,0 +1,72 @@ + + +CURLOPT_FTP_CREATE_MISSING_DIRS man page + + + + +

    NAME

    +

    CURLOPT_FTP_CREATE_MISSING_DIRS - create missing dirs for FTP and SFTP

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    typedef enum { +   CURLFTP_CREATE_DIR_NONE, +   CURLFTP_CREATE_DIR, +   CURLFTP_CREATE_DIR_RETRY + } curl_ftpcreatedir; +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_CREATE_MISSING_DIRS, +   long create); +

    +

    DESCRIPTION

    +

    Pass a long telling libcurl to create the dir. If the value is CURLFTP_CREATE_DIR (1), libcurl will attempt to create any remote directory that it fails to "move" into. +

    For FTP requests, that means a CWD command fails. CWD being the command that changes working directory. +

    For SFTP requests, libcurl will attempt to create the remote directory if it can't obtain a handle to the target-location. The creation will fail if a file of the same name as the directory to create already exists or lack of permissions prevents creation. +

    Setting create to CURLFTP_CREATE_DIR_RETRY (2), tells libcurl to retry the CWD command again if the subsequent MKD command fails. This is especially useful if you're doing many simultaneous connections against the same server and they all have this option enabled, as then CWD may first fail but then another connection does MKD before this connection and thus MKD fails but trying CWD works!

    DEFAULT

    +

    CURLFTP_CREATE_DIR_NONE (0)

    PROTOCOLS

    +

    FTP and SFTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.7. SFTP support added in 7.16.3. The retry option was added in 7.19.4.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the create value is not.

    SEE ALSO

    +

    CURLOPT_FTP_FILEMETHOD, CURLOPT_FTP_USE_EPSV,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.pdf b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..adb73afc35646b83e92b92e0dd2a332a529f1ad1 GIT binary patch literal 4696 zcmb^#cU%+q-c`jQ!$EOjPeFsF$=zj<#1JVX$esd1v4rFTCrK_Qml9Acpn{@M0j&dQ z6%=P3SnMk(Ql3^6Eh-{b6eo&Qao|7{eZLD(tomO2J|FL&{Osl}u!nxSA# z*gb6%@8j-0Tb(Ory68U}19b{6|30pvB%z@uH>{{$aW^}?1j=W)e`?nfQh#T{;;c-A(r zG+Z2hU20+~E?yaVr}9J?YrDnH2wuzX$q!(M72^jTT$O(9%7sU_J2QS+7MMSH-I%@U zDQnW1)mD?1Zyg-Zn^ZX{Y43@sw)8>vNB&6Fk2bsUWztQh#O7As$e-pvuMN*RJS*b( z<{Wu`gFaN0qYrJ62Zs)sWb3(ans=vbswkB=NNL-C#`*I(m4&B>wRtVmA*-UQ@Ygk& zoGW{#KBp_%BVW3I|9a`Q1I2t^M&TE=W;sU}c`q7P**-mI((n{Z{;VM;yA&OB$W2$J zk4ej~JB}M{y4G)On38GjT36P*BQC#u-HX7Cnl4-So8?mqx~7cq@eHuaS8NTYt$%5L zL!vrq^7DZuXGfLJXBH1DbE`~DKXUs~+QMB+R`0udaOH+?6WrFV4e&C%A?++=dLK?I zcsTd@?xL2K80`fATkMa?w((K^pkY!sLpI+G6;dhbnjE-hW!EZZq{&I^+$SZFqje%Cq*~$5G0~O%JMy58Sp%FljKaDcsTO zu{_N^u&i#oS#awy`kcIH^YSct4(9X6mOnx7Vt(tb!L1db0vXnVu+o_ARwqI3x zD{a%csw8FZt`xWUit7CjR!s{Oj@TsqxqhB*bFh5axsEiyrq!;MDaQ{zvC9vfTQb}) z&?{!wfa>(uxHy0E#8d0;MVDEAsxsy z&cBLA%yx3^&7kXQW%`4`w&A-#QAN4q$ zJ+`eX5Kr2xe9R_al;3``u}mV!65aXtP0weR20ZSQpGK98G`0UBl(xF*s|8;3lZ(g9 zzTYj&Du>5wJIb%zbjmqrU%YFmExok)ILG_ZOXsI$m+r1fF>iU*aQbLdfhy8!R>_g( zjN~z@fwq$0b5ah@IOyBHsonq8=|3XQJ}H}kH6=IOE&c3Sz_U_&`HnSkK?-f1W4gua zBTq+svV~b=x{Nhq;g8pg)Y+xGu_r}iCb;;@-G6lOTzqzanRms23;2Ymnu%wk%TC5u zSo-U&d|J2NzIkNLrnc;R2j*ulUy%BhxVxxit%m&tY?VFUWds7qrVUfW;Wk=guh zL$|)L_)s>w^?LNN$r;C7&e-@DM%nCbTlOe0Y|!LGmZ#pRXV)Z~hW<%j){*0K$6ccH75G^aEB9<;0NU zqYXOEq`bt8+K=5IKdT;B z_hQ~HN%8rHOY#e5X%@`|62E0Rm+^2DRoD$j`9izl`+uzXG$QX#=ZoXysKZVeZOh_z zv)@7lbN94tNRj@sPIhifpOR@P8Ua@FU1x~wy|4Zg3~ z6Wg&#Q?~CFKk`(=3YQl@j@u2>2F^_tRdnbZAC~ROH`Ooju3mMZ{Pd;A^%LcG9!`!v`g;ABg=@|}jQivFZ0AYHG>f zZ+5M0^P$|QyotjXMvbf)c%iMltoY1UKAB!3&) zrGF4D3IZJT6w5bADN((9NDrl}l$0uo*gh7$+WTUpR1R(+w1-!}Y{$Pc=r@A~`v>?! zs94;qq|vHgQ9+J0iY}<1jnT}$TNI(8lv9J?AOTI#bKukXZ&6Sfy%a7|9Y%Qz4#8EJ zj^PPRz-2~Pz!aDU2kT=3>tnc-za8(iZNcgWYh20s|=paww99au8U7(@;k?tisiLT~xnO#t^;9p)Yv- zZV31F>03KdHist`_tt=Dra>c>#bYECgT>-%C;I)0!*mFjJJG|qzKE~J6^p}XC26tX zB)PJZbTX$Yu0cMMDHMW1Xi#ZXAcr7>N~zWf z4Ni0;i4dGAFieMxC}g}7J=`|{A_+nnkCPCKDPW=ul>Hf`&`MQU0-=qEP$rKKSZd`8 zVGt;v9){q}i5^Fi8X*iPBqT5s*i1qj3!?&o07h6ai^TvK3|*p{lo}Xnoh^`OR0I$I zlT58+8g*jI2o;Qn!zdGh`vkcGbF{dI#0fP-36{nXdeVum*W+>_kB11jQjU}%Q?Ozf zD2gc<2zVG=9)}g9P{i;Y`B zLIe@PZ()Mq15#J;{Q|yc{sHM5m~W60+7OTu;#e)AP(WW{S{)S$l*wW-**y}CWW87- zn2OOG-uck}l4^W?|F_3fDk`NZJfRyQ)2l$+_H_Gy66Qn4ST6fhVU1p^G**XP24hN$ z(oF}#i~^12GNFRds-z&dr5X+Bp;9X4VUUw_u?Sp}IH|X=voT?LhHz8GI2#W9#0qSV1FFJzI0UD^o zzrpCO2K)Eb%k)1dvO$X}Xb6OIX;j1Nc_1E_%jQA~s29cpEfg|dLFzsj2jRa1V}XJ6 zHXbVAzXL;nP4D9I-oazBcwp0@o_@J3E(+%DTQCk6jMKMZZ2mhkSZw4yFktE1v^*g3 z9T*R6g?%zetrS;cTJX;e1P9|u81NqimOcXPRUpzq5bUW|5Kzz7279_eks^Tv;UE$g yB0*f-IUtg*jsjP{JDY=`t}Fo`br=6VMijNO=}4)TGzN{s;;?B`r@H$~X#WA|DAC~n literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 new file mode 100644 index 0000000..62396b9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 @@ -0,0 +1,62 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_FILEMETHOD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_FILEMETHOD, + long method); +.SH DESCRIPTION +Pass a long telling libcurl which \fImethod\fP to use to reach a file on a +FTP(S) server. + +This option exists because some server implementations aren't compliant to +what the standards say should work. + +The argument should be one of the following alternatives: +.IP CURLFTPMETHOD_MULTICWD +libcurl does a single CWD operation for each path part in the given URL. For +deep hierarchies this means many commands. This is how RFC1738 says it should +be done. This is the default but the slowest behavior. +.IP CURLFTPMETHOD_NOCWD +libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a +full path to the server for all these commands. This is the fastest behavior. +.IP CURLFTPMETHOD_SINGLECWD +libcurl does one CWD with the full target directory and then operates on the +file \&"normally" (like in the multicwd case). This is somewhat more standards +compliant than 'nocwd' but without the full penalty of 'multicwd'. +.SH DEFAULT +CURLFTPMETHOD_MULTICWD +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FTPLISTONLY "(3), " CURLOPT_FTP_SKIP_PASV_IP "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.html b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.html new file mode 100644 index 0000000..1ffba47 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.html @@ -0,0 +1,72 @@ + + +CURLOPT_FTP_FILEMETHOD man page + + + + +

    NAME

    +

    CURLOPT_FTP_FILEMETHOD - select directory traversing method for FTP

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_FILEMETHOD, +   long method); +

    +

    DESCRIPTION

    +

    Pass a long telling libcurl which method to use to reach a file on a FTP(S) server. +

    This option exists because some server implementations aren't compliant to what the standards say should work. +

    The argument should be one of the following alternatives: +

    CURLFTPMETHOD_MULTICWD +

    libcurl does a single CWD operation for each path part in the given URL. For deep hierarchies this means many commands. This is how RFC 1738 says it should be done. This is the default but the slowest behavior. +

    CURLFTPMETHOD_NOCWD +

    libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a full path to the server for all these commands. This is the fastest behavior. +

    CURLFTPMETHOD_SINGLECWD +

    libcurl does one CWD with the full target directory and then operates on the file "normally" (like in the multicwd case). This is somewhat more standards compliant than 'nocwd' but without the full penalty of 'multicwd'.

    DEFAULT

    +

    CURLFTPMETHOD_MULTICWD

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.15.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FTPLISTONLY (3) CURLOPT_FTP_SKIP_PASV_IP,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.pdf b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b0e2e4ec0fd2818f3e1140f0ad4b5823e3de80b GIT binary patch literal 4441 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 CjznPq literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 new file mode 100644 index 0000000..18dbc2f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_RESPONSE_TIMEOUT, long timeout); +.SH DESCRIPTION +Pass a long. Causes libcurl to set a \fItimeout\fP period (in seconds) on the +amount of time that the server is allowed to take in order to send a response +message for a command before the session is considered dead. While libcurl is +waiting for a response, this value overrides \fICURLOPT_TIMEOUT(3)\fP. It is +recommended that if used in conjunction with \fICURLOPT_TIMEOUT(3)\fP, you set +\fICURLOPT_FTP_RESPONSE_TIMEOUT(3)\fP to a value smaller than +\fICURLOPT_TIMEOUT(3)\fP. +.SH DEFAULT +None +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.8 +.SH RETURN VALUE +Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_TIMEOUT "(3), " CURLOPT_CONNECTTIMEOUT "(3), " +.BR CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.html b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.html new file mode 100644 index 0000000..98a833c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.html @@ -0,0 +1,60 @@ + + +CURLOPT_FTP_RESPONSE_TIMEOUT man page + + + + +

    NAME

    +

    CURLOPT_FTP_RESPONSE_TIMEOUT - time allowed to wait for FTP response

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_RESPONSE_TIMEOUT, long timeout);

    DESCRIPTION

    +

    Pass a long. Causes libcurl to set a timeout period (in seconds) on the amount of time that the server is allowed to take in order to send a response message for a command before the session is considered dead. While libcurl is waiting for a response, this value overrides CURLOPT_TIMEOUT. It is recommended that if used in conjunction with CURLOPT_TIMEOUT, you set CURLOPT_FTP_RESPONSE_TIMEOUT to a value smaller than CURLOPT_TIMEOUT.

    DEFAULT

    +

    None

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.8

    RETURN VALUE

    +

    Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT, CURLOPT_LOW_SPEED_LIMIT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.pdf b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f52ae68b44705527fd9086c7846fbd803216bc13 GIT binary patch literal 4087 zcmb_fdsq`!7RLvQgM6Z*ma27HflwuxnYTB07)Ua4GAY4UKT&Dj zRnRI(RVY@sx?Ad_TCI=TiVBKvtyU4Jw6zObsOZ)Qk9PM?2!hCNyWi*iCwI<0uX`T9 zd*YuMq2^*dA>@CmWzAMd1fwvOkp(FfNE~4?GMTU#P&9~|G%*AXBWe@Q5D|oq(i2K0 zWMgOoH$#rn;yHDeI<@!W>vMxHy|*rZf9>>=RpZ@#-WybOdh4{yG0P8nzqHUSD2|T$ zo9Xtpjx}Xz3;e!`sSm$Y5L_>7I=6A&lCYsk5iJ$Jeb=H!Hb4#9smm;5|-5*=|tR19pD3YkE>ij%ZoVg7L){_k3GA?B96B*XtzPu*%ip54_U9S?ZNd zet+N1f8YC(@+YA~CMSP9CieUwdR@Vnt4=2<%h%#VJ-1%^fPbV*H@$vB>#sCheEeElVG5KRhI(`uoKz=#l6t;jxcY`#aDz6Dsc9 z#l#bSu;zyTRAqSk^vI6$e|>y>Nn_nDvvh3XuBxN2znUKSOL0p0*Y(>Y4~UG-QA5M9 zcR#+i`mCGhwXC-e?Eg#Y2B>1~+C6E3t0wM<&i(uDt~V#P?U>}AH>PInhr734Yo`xK zZ@*u!R=NMf1U>P(uR*=cUKQjq|7C7|-jhjZmtNM*xv4)Y==}2BrQ(tadme8O+I#m*6p?o~ z#ag{f;nUdkb9LZD^ZX+}7uVkEY*d9a%^O3`R8&_AeWZzaLaod*Juz=~><8&Jsdq1s z_Kq*S@(g>gOQu#@XC#m9x-2+!al{F6!mPu7GiOxiQKzaccZ9z_@?E;{wQ;^HYiq}~ z#?Ag%Qr#|%+)RHl>KbG1iqs|L1v!uQ&s{q|aGkxZvURarh2qA7iEsGc%)^Qv)U@~p zSI3d>Tp78eZDxli{bpyGP&{b(j&DaDsPv(_5?i-y{PYOk=2iEm;Pkc=M!)vLF;DK4 z>hg}KhHkR$u4@m7Y@X)z*?}pWxB(@W;`s+#M^p{|uApw-mDt5A(hGJL4fbRnoI875 zk^i7Md0tS8&$3`2bdFnAMZ-(mhdM59;LS{|Z(1?yqv%UzB~ABD)@g%GUedxDTQ*&6 zT={!xYLH=;%<__19fPx$KSwyyGEv2O5( z*VC0#+?ia%XQPzXQ!jd5*$)3TmnPcw=TB4Urb`T~>B0X|Q1Zgl3prk+zr9hZOfS5^(-ImsS z8)t6%iuPo!_x{Q8aXnK3CJ>61N>}kKLLF9ImrXEm24N&EA)I?hzUIKBK7=z@6pzMR zRYWEky@)1~7R}V^7G>*XdQPYkQiS55X9%tXw{i{6@xlfZHeJYTDovdFHI~64cbKha zP&}~1Y_izoju4JhL=N^W8R5WA7A8A{lN_H2GZbaYCK;H|lkqSvCJ2HJG;StxC^{R) zcw!DvN$U-A4d|P0h2SfMlgThvIfCTm3Vm`o-^P(H%va{&j}mTO^f2iIbo z3hX%@A(NkqS!_I~PdpuEM#y9YLO6Cish5kzs7!=@_10VhTI4MYf3(fiMS}nMWtF)CdVXl zk$5_a$x&2+^y37{2cjx4UV?G+Pl)#6>?2CiT2K;7BTX3$@LL3JV>5yA_D@CWfP&ZEKj4{W^Hr*)9PAXZs{DLe4fBilI_ehDn_L#X(UHU;};l z2OO?$2pp(iUVr)&J7~fHp)e+bSitIDuvjD#h+qTkqG2K#c%s<_TY6{$p%gs2&(biF z06c>IXadP|G!)$Fc|Or|e3)1a0@qKU3X?GO#}`8Si?vXxrhMqgTb^%fq@ESS_30776S!$k84Ow1e~H!NyAa02n!d= v1QJw*3B*#VAWXuK3{#_gzFHNg{9}$Zc2=`7IL$bdCJ+n2|9t<*1U2*@I>(Pi literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 new file mode 100644 index 0000000..b1803fd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 @@ -0,0 +1,52 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_SKIP_PASV_IP 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SKIP_PASV_IP, long skip); +.SH DESCRIPTION +Pass a long. If \fIskip\fP is set to 1, it instructs libcurl to not use the IP +address the server suggests in its 227-response to libcurl's PASV command when +libcurl connects the data connection. Instead libcurl will re-use the same IP +address it already uses for the control connection. But it will use the port +number from the 227-response. + +This option thus allows libcurl to work around broken server installations +that due to NATs, firewalls or incompetence report the wrong IP address back. + +This option has no effect if PORT, EPRT or EPSV is used instead of PASV. +.SH DEFAULT +0 +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.14.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FTPPORT "(3), " CURLOPT_FTP_USE_EPRT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.html b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.html new file mode 100644 index 0000000..35b781e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.html @@ -0,0 +1,62 @@ + + +CURLOPT_FTP_SKIP_PASV_IP man page + + + + +

    NAME

    +

    CURLOPT_FTP_SKIP_PASV_IP - ignore the IP address in the PASV response

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SKIP_PASV_IP, long skip);

    DESCRIPTION

    +

    Pass a long. If skip is set to 1, it instructs libcurl to not use the IP address the server suggests in its 227-response to libcurl's PASV command when libcurl connects the data connection. Instead libcurl will re-use the same IP address it already uses for the control connection. But it will use the port number from the 227-response. +

    This option thus allows libcurl to work around broken server installations that due to NATs, firewalls or incompetence report the wrong IP address back. +

    This option has no effect if PORT, EPRT or EPSV is used instead of PASV.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.14.2

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FTPPORT, CURLOPT_FTP_USE_EPRT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.pdf b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b9ae3028a5109ac990483b94bf9e13a88681696f GIT binary patch literal 4127 zcmb_gc~}$I7H^AfHC3@lYps4dr9yB?W+r>mECNXsFclL}l%*Y#2~0^c>0|-{#J*Qi zZ0p*(OGO2>?$9Ey6|10DD-Y1uYE>x8u2jSYl~&aE?t~zyyw|?(^Zvt~bI5n%*t}*ESPz1X|>k(!6`%R4poAmeBH>5`SDso6A{jo!@^MpWV>YZ+FN@>HQWETv2(G1 zqA0b@_w&_hAq}ia?-ft3BhRZ$X)7l04}b38CpPF-tn_c=KgbGRk=HmwUROTcM<>`5 zUOMoM@6Zmx?&dWY%b2+|bd7^iOvOTwbp-SY- zT{mIj3Pnw4*{#|HAMF=^?B?u<&}sG|-i<$RRCZMF9aiy;V#4abm!DYP@NjTIjhQT~ znN*I2oqXM|EMs;?bBga>|4nlunjvk$zJiT-)S0V0v*?eefBKVt^{j|B@CVaB`e**{ zhI2>v7lh!;4DTGB$_l)iot?j%-qp5CZ}`V(dO-D_z^un7p z2e!DXuaCQDh>u);Hap{tBc|zP#V6yWlQYh3TI*;%eCt&y9 zK})}n$$G!MKCWx~cpvWV3{k_(u(-hrugl@{Twy!M#jqvCMOEWk3L!E#>V`62#VhZK zJrNhXMFm|D$tGMnpWu%jUSL0zG}X~kJw%*4s3h+fne@$|)ALhrpw~@W_J1e zvjU2b8C$8vnMqeSEjqIPrBC5|b1sUwn}_dHWak_A?-gvz+}ibt+TR&BV%G(oYMwP` zBbKzXtkV)6GE8J^DAtHqti84W+m3-P+lLeyW83MF2eotWwf!1Yq5SyDjJlwkD#^!} zj^`dBPT$$uxvx?F8#eH>mU&(c4-UQ-o_2B7(c0}l{%p%98W-M7yyBg{^3sgjCSkzO zH)~GPKAGP&EsQF#oGP(AylKwc@ItKig@@vE`;Pl9vW?)E+6pZ#?;Lq!Iyt`>i`O6j zJ%8tCcMlBT-6C!pbZchvXj$5CY%2EakpOXl*@jJgvtuTMgvFBeZ&Z~~)- z4VhPVN|mKP_W-wjacqvafj+k(MD!yun}h4NiEAXS zFcA%-Tmqz2ca2s=%XHi%J-C6G>9!FDd-1K7zxeK0wVIHh1uiI@gWNg^F|w|+><=igGeF~sSFj%grbQEDnk%C`~)WmJ`fE7 zV<;F)|AJ^A&OV|f6$ze%GLa(9W+(-x984roE|16McWZQudAQ^-6Qe%fdDi~I>^j~5 z_L$YmJZXkcrY4O}D=6Ec>i_4#JnI;njE@YqJ1L7hJ4{9xx8RIz4iIJ(SZp%N%p_&S zz}v>`c2Gkx=E=k0O|q48a7Yuh1y{OrFUUf7Z!83pOEL>)OH{C3920KFoEDm`jIz18 zP2JJ35X$b2TMq8U>L*ri63A^3HuzEHP_m$Bw4NPMZ@C0LPQgxPiXqrNK2R|I+f$8u z@;b1;v>p!{Jd-8B;Y^+cs%1=)At)k2q^Q`PUu*p+YejB_8KP1x(L>oQ8lqJxN3P z(x>=P5g4eRkVT~e(6ArJLnRV0kvvI5!4&rdP0a6yCVGm-L-A lcp*Y@NH7SlNcra+am>i(pfQSe2aPWhgZ~HkYo=>i{{b?2xv2mE literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 new file mode 100644 index 0000000..5391285 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 @@ -0,0 +1,54 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_SSL_CCC 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SSL_CCC, + long how); +.SH DESCRIPTION +If enabled, this option makes libcurl use CCC (Clear Command Channel). It +shuts down the SSL/TLS layer after authenticating. The rest of the control +channel communication will be unencrypted. This allows NAT routers to follow +the FTP transaction. Pass a long using one of the values below +.IP CURLFTPSSL_CCC_NONE +Don't attempt to use CCC. +.IP CURLFTPSSL_CCC_PASSIVE +Do not initiate the shutdown, but wait for the server to do it. Do not send a +reply. +.IP CURLFTPSSL_CCC_ACTIVE +Initiate the shutdown and wait for a reply. +.SH DEFAULT +CURLFTPSSL_CCC_NONE +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_USE_SSL "(3), " CURLOPT_FTPSSLAUTH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.html b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.html new file mode 100644 index 0000000..051cdcc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.html @@ -0,0 +1,66 @@ + + +CURLOPT_FTP_SSL_CCC man page + + + + +

    NAME

    +

    CURLOPT_FTP_SSL_CCC - switch off SSL again with FTP after auth

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SSL_CCC,   long how);

    DESCRIPTION

    +

    If enabled, this option makes libcurl use CCC (Clear Command Channel). It shuts down the SSL/TLS layer after authenticating. The rest of the control channel communication will be unencrypted. This allows NAT routers to follow the FTP transaction. Pass a long using one of the values below +

    CURLFTPSSL_CCC_NONE +

    Don't attempt to use CCC. +

    CURLFTPSSL_CCC_PASSIVE +

    Do not initiate the shutdown, but wait for the server to do it. Do not send a reply. +

    CURLFTPSSL_CCC_ACTIVE +

    Initiate the shutdown and wait for a reply.

    DEFAULT

    +

    CURLFTPSSL_CCC_NONE

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_USE_SSL, CURLOPT_FTPSSLAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.pdf b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fc5a13bb73a13ee36784d4e3bb2ed265864e8c7b GIT binary patch literal 3918 zcmb_fd0Z1$9tZIpwc>%R?joa=jsnTdUid*qU zEEY@EDjp!7SX-=jsnmxkP3OkJGC+w#BWN>6u`n88COJw=85kp_Rzr4&7J8jt7@E4(xYV(WG3;dLNJ7I_(iY;_lCW z_jWH$)>MhBx(3yE^1jn4UlY@{z9DtpoY6HmKJCew%vE!lD#=k4^4F*gDdN*3cgM|?LBjB?`{`M)F##W(8qAQud3&jBp0Uc zls(W4iKv}FKXKBf&0ZOTufy)IIy>a9Z_SY})_TnT-fMP`{a)!lL%Ls#iVa3I$2w2H zwp6j8NfiEol8x0CuDavtGxS+)?8o!2{!&!6Vc8F->Sr}hDx7KgxNn_6konWE^%wUK zYRX>F=j@{79iyKFu3hynZp+CrDShWw1Uh;z?oe9hd*{K}l+4iXIb@ybZ*z(Y!&SwH zF0i@%YID!c*zZ*_c*~(P51}UEnvxD)5BKj%!=t)chK-PRS;oTFqzD?6tAq!~7NNpV)Y zu-L}&k(2Vq#OSrldxoMLzF0OQZqVW%!^(PPCPj}w-nG}<(met1e_V0!xm;4>pZ$-C z+##Xh`$?(~KbiNe+iZ`X_F*06n;yputm}H6IZ%Ios;BB`(O=si@Q5AJvErRRp|?6J z&iehZYI54=(`RT-`A5Y5_+-nJsRQ+%+smhplx*>hu1hB}j(dgg9~3D1#(z=N*(nwI z=%KKk>o29q=R7R0vmGzbU7XvHm2j)w=+BOAbo4)-CA|zetkL@vo<2KG(=(@-eeWaZ zeIgHI(xanCuFj7B`>LeSZL!Onq>l^zZg$Mf$!Yu(y8h%5CdrN$$7nhlr9jN@y=R%mXlJY)Paz3g!X7{7Q8$*6S z`Y7+Wv@<&|GC_4&HI>uV&i3}heiM^3YBINvIe2MwS>Ilbae_tb_sm?fpeR$_pj(;J zZO_8T$iCY3%WijQEOgiv^L_pz&ujdZtsno8mYuqH`FMAQHgnM&if)f~TCbZg?zpSA38W0+**TJ}2 z?RL_2E4QgQImFAwwW@Jlv*nb42>uj}Q$UKB*?78}D~z;Le1y;h+Ctd{VT{@6y1XlF z5E}1D?hw*pSIgo@YqW(9GKg|xQS5N-w2jkc!4xX9(rf6(YUb*to!p)GQ#mNuCv zPy-<8Nf0gu!$ut)C7jjfN`M=0V-LeNf`$Uy;&jn3P#3poK1-3vfs+ z!f>eo!v&Zk0V9;STq%_WVz?5+ROl<5Ao)O41733AW%oabw&83e%CHHbB-H6FV=}>6 z6l>=*feS?MalrmGiZ+4Jo9C&OrC`}A&Awg}EHk+9?kbKFbpe7Nu3LJ7YXQtGy z-U~Hz%^Ne#_ma{~TGN9Or@%;=NQaq2)T68}Zew#c%(S|Bhws1+{3Gzvy0@L&jbFOPm6=G|!A($_=Z)YikmDCWBa1f1`ap;{&1WEhSq zFanpm`U}A@1h9cV{1Xm$Hw=AKzYKdZJDn_Lf-o4DKs;bIFIXm(ilwj#cGGaF2+UM| z!PXXwGdXcu%|{ zE0euWQ%Jz%e}#`|>odoaw3%YT|5X@`r*kL}D;PY*81UNRhc}EySxpS=8srcfrG=AJ zgow~eG_vqeToW$G39VEn3CF@PNf;&yQ)nUx^`CPj^A9OIN3xtNL1KwQ3i, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_USE_EPRT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPRT, long enabled); +.SH DESCRIPTION +Pass a long. If the value is 1, it tells curl to use the EPRT command when +doing active FTP downloads (which is enabled by +\fICURLOPT_FTPPORT(3)\fP). Using EPRT means that it will first attempt to use +EPRT before using PORT, but if you pass zero to this option, it will not try +using EPRT, only plain PORT. + +If the server is an IPv6 host, this option will have no effect as EPRT is +necessary then. +.SH DEFAULT +.SH PROTOCOLS +.SH EXAMPLE +.SH AVAILABILITY +Added in 7.10.5 +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_FTP_USE_EPSV "(3), " CURLOPT_FTPPORT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.html b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.html new file mode 100644 index 0000000..bc48556 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.html @@ -0,0 +1,61 @@ + + +CURLOPT_FTP_USE_EPRT man page + + + + +

    NAME

    +

    CURLOPT_FTP_USE_EPRT - enable/disable use of EPRT with FTP

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPRT, long enabled);

    DESCRIPTION

    +

    Pass a long. If the value is 1, it tells curl to use the EPRT command when doing active FTP downloads (which is enabled by CURLOPT_FTPPORT). Using EPRT means that it will first attempt to use EPRT before using PORT, but if you pass zero to this option, it will not try using EPRT, only plain PORT. +

    If the server is an IPv6 host, this option will have no effect as EPRT is necessary then.

    DEFAULT

    +

    PROTOCOLS

    +

    EXAMPLE

    +

    AVAILABILITY

    +

    Added in 7.10.5

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_FTP_USE_EPSV, CURLOPT_FTPPORT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.pdf b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b8530a4b3d9fc254e103ad38cbd5bfffd12092e GIT binary patch literal 3999 zcmb_fdsq`!7T;B9*V#VQ79UmXh~R*l%uJHW%Oq3?QIM20prVL6B$F^EnF*7L1gur7 z_EWnSMXgp_T~utvsKyDd=@MR5;JO`ojk?CsKH6{l%BG% zR!XOXJUmB{F39)(>-xjQ`?hHW-{eWFp-ynfa(#XlGP_4J0i1FC;B*TkAyE%g0iR%`21 znCE=%R`gfTu5SykZYs~|w_mboz@)~xvqQo6jv2N?dvVk=%CEf1!zJ4=( zt32|}gP3*iq_*dm%Cny_k0}mo+q8D5)3By?)=$vs&`&C^N57^xudGT|{setGXiDiF z-SUcNM~P?kt}=SNR{Y!C*Ap*h9Nk;n`#`^p2!U*{Nm3I~Wnf*7;myi77`PQfl!)DwftBzD1&t4e4=w`3vmEHRF zS|6RDoV)q-w>>-uL%*xAo3_k2KmPZ!<{1avJ^E}L-#YG-{U7ApFZ=SQ^`EaQLUktH z+iO?Mu2B(E+pMCD+XKVLF6%z8@wp|3->f>)&@(ZEi9eb!`u*+$UYYVrVL^nVXFGlQs(No7va8$PhyuCo?4Ht4lCjj+yFXu2n!D3{#)enI=U!}F__851J1zZK!KY2d z|Jo7Sv?%M90h1;u<4iwJT^T-n&g5Fz(Ty(Vxyxsw&bDj_pLM&YTz&J(@u}N(a8`#+J=&u=7npcqWA5*8}jaf%JkzQ=f1E_Uh?JQ^ob28A-)lt ze0V!8`7$Mb4g9rkIB!3ZUGVv(vXZ$UMV-1_^wEG+WYyKL-t~sXZkjfo(tOWC(@h&r ziAU8Hp1x-?o_?p|oOtLS+F5lz`NAFQ`1IAw5bOT=`|3l`UU?0u_n7QZW`3A>h5O{# zu~O?BuWviC^V@x!zK+grX}z-hM&rG@7Fq86)e%d6%;5&^q1O>ZXwzE*2h`Vu{G4^B zW>KnV`L-*L!TFy*(=76y>a*C~@B68d^}9>@@x-dU-LFFbuJjfRc0)Gb!fz} zx6V&BFC7xnT&&+!l&<2kUZ`s^w8|FHv*L$nhyUWZHB&ulyE|vAvWiRplK=Ab1$6R=*D6TwiKWP<FF>zg7!$KVrA7F>Vo z;~$=mT;(DLZ_n*1u5G?`(mtiJnt>8UO0gP&@f6852`>2`Qp@|^o~e2!ir*xHd> z8upGTY3_Tm=5pfZhTi**Dn6Jqf1FH{BtP2dTeW6(;h?C9YZXPq4B5=pQE4Ujcm3*X z{rjQPaW#l%#DS1?iLG(hl)8%p`?O8I`+DLR2EM!KrM}p+FD^KI>DFzu^}{(06k`o? z6j%woCa{_C7snM!C@7P4a9(Pzn?g;bokES2l_q0ZADoVXZ9+xBN|_`BLd`4>7!byQ z7Dq8WEEVVxh$#>2m`cD;fWmZ6fow) z9D{HnsbeQp5>h^5A!r0GVo47rWD8BDU6eP5#t#O{P_c+(;k>H9^)Nad80#4!q!5$*2Wox*&`AJ_m6r63Pr zr3U<9^;#%Si;OWP!DF&m44kET%)HarLk>GBVZa3giQn>OcxRZ!Z12%b@cTzfk z?~QiyfrXP6dP(gh8M_woiL8{3^g4M&H=glpTLaZ_(z?LHZ-;hZbx|w72=q268~T7b zbP)W6z9$FNL6_i-(;_(n8G_Zr1BLK@2ids2ucNwZ>uB)63ta*dF7!#1UM(~khGR-h zg)991gh8ife63>gb!xg zWm2i?F&QqCfoJVuJzS!EOoo9oJ+3EzOb;jIU_y8VPbmT8$|Eub0VcLbWO5~Vmmig3 zUC5-5%T(Cov8d!=P-w^FIg)l#9QX$qMpNiK3giz4Lmvy~Do|-Nj3zKP77k2pXo4P2 z*ANofXgOgRZIH?I3POd)>WMg|j8H0KC0MLMiR=DYBSRS3JUq$q{-Q|, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_USE_EPSV 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPSV, long epsv); +.SH DESCRIPTION +Pass \fIepsv\fP as a long. If the value is 1, it tells curl to use the EPSV +command when doing passive FTP downloads (which it does by default). Using +EPSV means that it will first attempt to use EPSV before using PASV, but if +you pass zero to this option, it will not try using EPSV, only plain PASV. + +If the server is an IPv6 host, this option will have no effect as of 7.12.3. +.SH DEFAULT +1 +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with FTP +.SH RETURN VALUE +Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTPPORT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.html b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.html new file mode 100644 index 0000000..3ebd105 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.html @@ -0,0 +1,61 @@ + + +CURLOPT_FTP_USE_EPSV man page + + + + +

    NAME

    +

    CURLOPT_FTP_USE_EPSV - enable/disable use of EPSV

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPSV, long epsv);

    DESCRIPTION

    +

    Pass epsv as a long. If the value is 1, it tells curl to use the EPSV command when doing passive FTP downloads (which it does by default). Using EPSV means that it will first attempt to use EPSV before using PASV, but if you pass zero to this option, it will not try using EPSV, only plain PASV. +

    If the server is an IPv6 host, this option will have no effect as of 7.12.3.

    DEFAULT

    +

    1

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with FTP

    RETURN VALUE

    +

    Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FTP_USE_EPRT, CURLOPT_FTPPORT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.pdf b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2da167197c402d79de1c65edf69deea4b32fdcbc GIT binary patch literal 3956 zcmb_fdsGu=7VrA#Sx1ks>H@mf9pqq8NM>-9v(Wzdf#cv z9QxxpGojvcwtK4ity0oScfJ_R$q!yKI}uYTwB(>{1ED7yJoH0rhU%gY<_ zGcn0yfBY_O!ik3mR}&4vXU63Q?YJQNzG*@W~ z3nKjeGd_f7L~g@x`xlO5mhEPyH>_;T7H&v0Uz*0wxKXCtALTV|$l-}P+Xdg5FRRxv zscYj4edGdXMO)0$_Vtc6d_&uUMC`(cBO@o`@tf^+Gj?vS9F*d}%BkMpd zZOY}mkEyz#3Chojcbn(uXWm`2vsKJb+Osz#;fukubKW@_-4s?!O*4<2cBW81IVWasY#uOf8$L0q6mHB7X^I+7 z%0)wBhAvLo+jeTut@1S9t}BoBMH`;xW)!b3-t~3osU?SIb-_u`W<8d4+FGINdi%A- z=gH6f9>m_R`d#^7hehzd(LU)o*k0?GvTWe^l%vcC=YDAPs&Dz@CVJ)6%A1F;hM%Q1 z|6EwTy>?_0??3BGHtjvT{!?gj)yvM6Aq$qIZ?XsrV~(E3)Bb(?#^{f_%C}foFXulw zSG&DTJN;f|YWeD}l4U;O8v};bC#i}}Xkn4y?+MmA?GLo!h9bW6MoL{1au%7gvvF-A^`&tNmNoEjdygpXbPb zTw^Xe_q@@sQR-h;7=+ddD2Ta)#w>`KaKj3NA%fK=3u3YszY};!%EXkPQqsL01r5EV8uZc z_ZP!N639an_W)T!o}EDA@GJt+5hfB3r<`yq3a%w`2`m!}(;-Apu>jU!6mZdmjfF)V z<^eLnP!8HiFaQnXXv%0H*i;1IC5$8xP8P^bb+VBLmneq0MYI$U$AqpQ03eYF@Ed4k zU=CRI5FmN{<4m}L7H9(w!Y&UP7@0J8sM&SU8i&B5f+( z{R4-2Flkcpk|a7*XOAGV$*6fWVVE~P!8k9+C^zxK)Q~a^2dzW!ow%KEcFlGMCK#h? ze1twmJDy{3Dx6lk71R*yv|4P8!l~l9L=@o6kr5v3VqtSsykuP*%udF=lfXz>5i%LU1SryNNCTcjlXjM*Y%pgS&!ilz zisx{UCWTarV`kKd^NnUXC7whzk%sFa6zp8vMI0=elw3Lv4LFem|!LI>*CoTmZkrWT@@ zgpXo;RF;6s6?KOk37{m@Su|xf!*dCm z;WB{;Zh=8j(SDsZO03@>vaD+Vpc0x(j1>cLm3@b0Nc@;|EFNyc8*QP zR}R}9w8hmOCL=;v2+lVKq!|Mqn~VxGMO$%D+qm5hFcjxX9sxDUQ!BwGOR^S1?drWL z7S?^RkX$b*EVwO8#dGpagc)~OSe`o3=HfQFvtc3C?t@DX>Cx3su3RM0+aPVoE96i^ z@LT%co}wPO1T#*>%jLijoL*ljxcTitaVRQf&tHU2?#jXCqWto*JLP$%1}8L z>gq2Zit+#(=)+&(@N`2^fBiD?)kJpEgc(9%OagI$<^Eu)L?V*FX4pf+#1b$hxevB= z(?lY19~ziPU>?8DhY7`fXefA7Up`?UK1?D6o5maZLPNp4eUruw%r|IKabFt}X+Jcu zw7n@SllJvRE(BX)w+)uYNee-P|7u~xK+YpT{9v&3QDCnEnbyNdw9QPx?yU`p*1)Ms zRHhY$VnU5bHYGx;5l)edF!>aXP%D>;WSCg1RsT9iI=8YhEKakoq=_V`2nr0G8moo= E3#{B+r2qf` literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 new file mode 100644 index 0000000..b20f3fb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_FTP_USE_PRET 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_FTP_USE_PRET \- enable the PRET command +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_PRET, long enable); +.SH DESCRIPTION +Pass a long. If the value is 1, it tells curl to send a PRET command before +PASV (and EPSV). Certain FTP servers, mainly drftpd, require this non-standard +command for directory listings as well as up and downloads in PASV mode. Has +no effect when using the active FTP transfers mode. +.SH DEFAULT +0 +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTP_USE_EPSV "(3), " diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.html b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.html new file mode 100644 index 0000000..f2cfc71 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.html @@ -0,0 +1,60 @@ + + +CURLOPT_FTP_USE_PRET man page + + + + +

    NAME

    +

    CURLOPT_FTP_USE_PRET - enable the PRET command

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_PRET, long enable);

    DESCRIPTION

    +

    Pass a long. If the value is 1, it tells curl to send a PRET command before PASV (and EPSV). Certain FTP servers, mainly drftpd, require this non-standard command for directory listings as well as up and downloads in PASV mode. Has no effect when using the active FTP transfers mode.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FTP_USE_EPRT, CURLOPT_FTP_USE_EPSV,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.pdf b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c48929af15d4f732f4c03df4633bf3c19d4ba054 GIT binary patch literal 3708 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 new file mode 100644 index 0000000..13f3cec --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_GSSAPI_DELEGATION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long level); +.SH DESCRIPTION +Set the long parameter \fIlevel\fP to CURLGSSAPI_DELEGATION_FLAG to allow +unconditional GSSAPI credential delegation. The delegation is disabled by +default since 7.21.7. Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG +to delegate only if the OK-AS-DELEGATE flag is set in the service ticket in +case this feature is supported by the GSS-API implementation and the definition +of GSS_C_DELEG_POLICY_FLAG was available at compile-time. +.SH DEFAULT +CURLGSSAPI_DELEGATION_NONE +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.22.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.html b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.html new file mode 100644 index 0000000..f9beaf9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.html @@ -0,0 +1,60 @@ + + +CURLOPT_GSSAPI_DELEGATION man page + + + + +

    NAME

    +

    CURLOPT_GSSAPI_DELEGATION - set allowed GSS-API delegation

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long level);

    DESCRIPTION

    +

    Set the long parameter level to CURLGSSAPI_DELEGATION_FLAG to allow unconditional GSSAPI credential delegation. The delegation is disabled by default since 7.21.7. Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG to delegate only if the OK-AS-DELEGATE flag is set in the service ticket in case this feature is supported by the GSS-API implementation and the definition of GSS_C_DELEG_POLICY_FLAG was available at compile-time.

    DEFAULT

    +

    CURLGSSAPI_DELEGATION_NONE

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.22.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTPAUTH, CURLOPT_PROXYAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.pdf b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d7c67bea1a847b051f7e96b2085071aea35098db GIT binary patch literal 4142 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3 new file mode 100644 index 0000000..130575a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADER.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HEADER 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HEADER \- pass headers to the data stream +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADER, long onoff); +.SH DESCRIPTION +Pass in \fIonoff\fP set to 1 to tell the library to include the header in the +body output for requests with this \fIhandle\fP. This option is relevant for +protocols that actually have headers or other meta-data (like HTTP and FTP). + +When asking to get the header info passed to the same callback as the body, it +is not possible to accurately separate them again without detailed knowledge +about the protocol in use. + +It is often better to use \fICURLOPT_HEADERFUNCTION(3)\fP to get the header +data separately. +.SH DEFAULT +0 +.SH RETURN VALUE +Returns CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_HEADERFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HEADER.html b/docs/libcurl/opts/CURLOPT_HEADER.html new file mode 100644 index 0000000..7cbb9d3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADER.html @@ -0,0 +1,59 @@ + + +CURLOPT_HEADER man page + + + + +

    NAME

    +

    CURLOPT_HEADER - pass headers to the data stream

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADER, long onoff);

    DESCRIPTION

    +

    Pass in onoff set to 1 to tell the library to include the header in the body output for requests with this handle. This option is relevant for protocols that actually have headers or other meta-data (like HTTP and FTP). +

    When asking to get the header info passed to the same callback as the body, it is not possible to accurately separate them again without detailed knowledge about the protocol in use. +

    It is often better to use CURLOPT_HEADERFUNCTION to get the header data separately.

    DEFAULT

    +

    0

    RETURN VALUE

    +

    Returns CURLE_OK.

    SEE ALSO

    +

    CURLOPT_HEADERFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HEADER.pdf b/docs/libcurl/opts/CURLOPT_HEADER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b4168cf58f40c31df5cea15aca139a8bb14b6dc8 GIT binary patch literal 3815 zcmb_fdsGu=7T+pXo%*UubrogQ)nMslX7VH<36F%Af?&WJL{^7n5{4u*aWavhu65N~ zK?TIuv5SbXT`kt)3#y>F^|4g(ji{^kc&v8IsUBrT*}6sCZ;~L0?6!N3^ABI{ckl1s z@4lIwq>Dyyp#+*-|Dd1@lEN6wWMn}q6&g>{7A_N(0g4`trfeL^!f3RO;7A>5WK5(+ z135XCBba{k3R*@NZSz01vR~nm)Wo*uOOyeLML%3v(XsPuj#&Io|I6A_^4wk=C`zO>&~wqEd6&# z-1z!Q>-v6vRT_W0KJ48a^^S2P#!KRphhyeu-NXH5aV3}X7e@DaC@V><{$u^2qcpKC z@9w*(+5SD2eoig!SC~Ur6j~alrNkV)x_;M|Kh3#Q^lZ-N-IF%gM%L^5!GUMm%h7n{TSN#I|gWIlg+^j>$>_giw`s(O4L2R*XCA+BsqXhh=iFzXI}fgURCb!3x2Yn&A;7=ZAJSC} znRuaKum5a+vShk@G#B9>doQ@iz3N=$ZOnc6iD|!M_1|Mv0r;5XfoZABcFhxwRAkLB zm$IoZT-2wtzpSa=b85)q0l9{}C;hTZ{FXQN$-PJ@&m>PecISBXazob8Z85W1q+N^TzLgpFKC+wLQ&{m?3X~g> zl3BkI)dgBFU9SE{E^Z+-HP;T5{##qaQ~ zU60v8>Vp}B_l}cZYHn!HZ|=Bd*jgu?gB;#5s_N>U!;j88svedHJ)Y5i^U2M-Kc6lc zQuK`TI~IDjH7-C@8&*7&p3-zmQasJI>xR|ZqU!j#{q|FAbofUhW4C`x_o29QZ7<6@1Z6ZD}ZmN6!iTp9{G6^y2kZVt#rxw)8R zk0_3NMWPuXj*C1$Kx;y^;5R^Y!hB29LxAM7k5}PsaR3b%2zxAa!sv9$lChb71pseT?*MwnPSD*EqG&K;DB1$!9-saQSC7SOqtYz+0q0o!J#EHsn|s|Hc05wA* zZo+|>J>%2~lTM?0qE;UtJ&|W{E8TX79V8Fzw%cf@(ybPFM3msnlTiWeVd1Q5fgvFY z<`~9ir8rn5R0wed7k>boS;9_cGprTHg)#wvWKCwJ9@LE&5d2aLGC9tnMA7W*Y+<%o z$gma^S11%HCPGCb1aKhE9GWBC2<@B%^mz=S3@^oKr_f`Q(8$-~eDVRcu%au}jFor8JOojH~1i=TQTCh%m_3BrMcH`_O%CIRQ zB{UY6F`MCqBC)k~~A zBv9KRZ0O6*p@HBx^u0Ntu67BAn_7^~H$!lGb(7!+x33#_)^$*CWjz&4cD_o0!}&T1 z(kb~O!*DDFQ{Zw>eF-p30N6ks{sM=u8iIPOm#HsDv705$5C-E?h;LZl50*)#VkvBf zeKcGw0&52U!E`50EW*IRdzFTZWMF0LLBp}vXkeXs4G%o=H9lOd0E4{;o=gJPjvh3r z98B+?G=9nGL6eAkp~+sS$wjZ*A`j_iGshB?jby<;k}#S~Eh2&cV6g2mV4(t$*28EV zZDwHax`xK-;53yyL>>{PkVc3^GF*;DiKSX?h$KQ0A;IJ_om3W~`DKoDephpH1j~7X QCKk&?(B#QciP6x10F-OV literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3 new file mode 100644 index 0000000..c0a45f2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HEADERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HEADERDATA \- pointer to pass to header callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP to be used to write the header part of the received data +to. + +If \fICURLOPT_WRITEFUNCTION(3)\fP or \fICURLOPT_HEADERFUNCTION(3)\fP is used, +\fIpointer\fP will be passed in to the respective callback. + +If neither of those options are set, \fIpointer\fP must be a valid FILE * and +it will be used by a plain fwrite() to write headers to. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_HEADERFUNCTION "(3), " CURLOPT_WRITEFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.html b/docs/libcurl/opts/CURLOPT_HEADERDATA.html new file mode 100644 index 0000000..122cad9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.html @@ -0,0 +1,62 @@ + + +CURLOPT_HEADERDATA man page + + + + +

    NAME

    +

    CURLOPT_HEADERDATA - pointer to pass to header callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);

    DESCRIPTION

    +

    Pass a pointer to be used to write the header part of the received data to. +

    If CURLOPT_WRITEFUNCTION or CURLOPT_HEADERFUNCTION is used, pointer will be passed in to the respective callback. +

    If neither of those options are set, pointer must be a valid FILE * and it will be used by a plain fwrite() to write headers to.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_HEADERFUNCTION, CURLOPT_WRITEFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.pdf b/docs/libcurl/opts/CURLOPT_HEADERDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c28b8c4fdcd12d9fb9f1e62ba4fbd61d1e42ded GIT binary patch literal 3901 zcmb_fc~}!?8b{nh8Sr2iFSI)KAYe^qCMQW@ED%tTNDL?}7B z@j&tR*@8FLr}eg40To!!$F8fkUhB1ZRKcTYaZ&f15CoCkcAv-jhcEB<-pB8I8KzZ7 z2{Dlr8dm#oaVaE&QJ7Ah3WbCqv7|MPONZrvqC=u6Ge%P}Nj zfgI}=O~|0H$o*c`PY#|x4x>? zFU$Th=CYs1;5mm6FJ{kve@CH4Bab(4Z+LnnQyzaWdY{O`Pd6#MOA8yOUvEn7t=asfanQ}jgV*VQxt*8YwJ<31$*wKEF0Na}J~_EV zoRs@8>sa4zi$1~R(#mCjtTPWiK-SbP$o$unay+>{v&p{3FYZ!gvUMMsS2?FfwPav( zvE|}N4{F|gKI2kAWxwi)Z*p?_T)6l}Wpe-g-K#y^zA5p@pS1+9bMJP5epKsOG_+(* z;tYI_>HF#;-x2e|yPkabJTCv@os-{4*J^uEyI;{)qVBF@J~_}W_0(14&*E!eG5PzV z$E|A6uh}t$Tz#iWv#a^iCP&gIja_5iN1v~qwFrF^vLW_vS<{y?ZI1o~@>BNehQy$k zXS8l=suX{m9qUiz8+V3&N+io|K&>#q*`dHjYA_>iX>Z!hn@bx)^DC!8Dbr>vLf zz9{?Bv!s{mCzWmI%L?3cmiM54zwYvJpPS7&@-;POCk`z0STVLA;wIK~@0u7reP-UR z!Q*uMi^Wj+@%!Vw>^6@^581YXJsriRxl4EYtXzC(N9?$)l^1tdi}my6`=?PWMdu#| zCi>fAr`qw2o(HJY@Z7EYCX`Rm)l_~RK)Pe!HvTQAyWm{qWABu*D^|Ua_t^& z=FTjlwmrr&(!wtsDe4{*RI+1p*P7THSDuxn>=`SWcaSap(JyFwnrYVy1;8Ey(?IZDo->wnv`}ZUJcN zwV|F%%cm*|`}-#k@X3UJ8NTMoAf)u(3hCzE!@a94z2T{K<M#tE-pnn;UXjJvZxh%)pzIkM%eoxI@-AC$ps5;$Jso+m@>8jYr3LRCy~l z%1boTuI098FV9!)_4fI7*~M`G$YcA<(*5%4_aRsJhS{{q>v#8`*!VcdoVN46N5#R9 zHWc2~jxH$pHeEclz6$fcU2R^7HwH-$KHsKT*!!#8v4`iK86kXe=)o)BNpaUJW;ccS z{D7{BOWs{nu`(^WPY>qTvC7bCQD^pESpNFfjYnrE7Unjd9x`#JJKLQeu$Vx7{LvUwdiWIt$0^KTNn@$r`5n1j=P+6M&&Z4Q$W0&u1$?I%+^~B1?lJS z5uFlJwj6??;0_Wzhf5-yU`ak(NCIUcSz$B?figH#f$(GqiMOY6eC7BUflIB4<8^ng zBAhlGe}@9zr_L4VXbWL&uOZS39xlq724l{g{x_GLw=R{uw@9lTqNYqH60{WPp%e&H zNDvEUwX^!RXq>faFWOqQw)m4Yv8`__CXvc<+|~RcBONxvkU?^ADw#%ELj?_oDg-cP z3>75GG^oZFL8eoqvl%izdu)OsJHwzf3P$2k$VdXr3@LOFHlfM+NV71>8bSw0=whP= z^9&A^!(y|5=7Aj+vz1jjLIq9{6*%)`L;yQkxQtLil12-2G;PkHI9M!FiZCH283CIZ z!a`=!Oa_dJ*^m2$GqZDaw?HXeJH8lu9LniV?9`2sngn zmX#wMLMuB2*mF8UCA}51vLdHXA_Hwfs3Zgvp-8JCH3)~HY#c>fVcsy2O53?mf!$6S zRdP9jnNR~EG?>JxLJT8KLKJ*LgG`pHl#x;b!=$a|Z0+29#~!!<1|=X5;G_b;V6+=Z zCR8v=8w-z0r&+GWKCBd>aslEB|3i5NYSVcZKtWw;2mw4Q4QO0bmKwksE=Dn#5XFRO za004SVG5N@@fnJ#P&5STzzK>EL?ghG29~zpA=-|!ohZ#DfR@117}{ilr;!ZHR{|4> z#Ue?IMW>jHD+J+d)Gj+8I$wlMqxs(%vsn0+=J`}=+F-W;ypC4?KMnJtYiu;Ub=YQS z%+BdB8W7S<^1iX4%oy<4Xi%AG#zKJJCTunUo&?|W2 zQ2}5BbNCw^u4xGDY+i!iKE)1(G(jkg$siuET0U4VlSyQ-33kyiDgR*eA8c)e9D06NV>yE1oJEsJrNPj!VUclB(0>3@ CFfw8Q literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 new file mode 100644 index 0000000..b6100f2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 @@ -0,0 +1,89 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HEADERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HEADERFUNCTION \- callback that receives header data +.SH SYNOPSIS +#include + +size_t header_callback(char *buffer, + size_t size, + size_t nitems, + void *userdata); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION, header_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This function gets called by libcurl as soon as it has received header +data. The header callback will be called once for each header and only +complete header lines are passed on to the callback. Parsing headers is very +easy using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP +multiplied with \fInmemb\fP. Do not assume that the header line is zero +terminated! The pointer named \fIuserdata\fP is the one you set with the +\fICURLOPT_HEADERDATA(3)\fP option. This callback function must return the +number of bytes actually taken care of. If that amount differs from the amount +passed in to your function, it'll signal an error to the library. This will +cause the transfer to get aborted and the libcurl function in progress will +return \fICURL_WRITE_ERROR\fP. + +A complete HTTP header that is passed to this function can be up to +\fICURL_MAX_HTTP_HEADER\fP (100K) bytes. + +If this option is not set, or if it is set to NULL, but +\fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to +accept response data will be used instead. That is, it will be the function +specified with \fICURLOPT_WRITEFUNCTION(3)\fP, or if it is not specified or +NULL - the default, stream-writing function. + +It's important to note that the callback will be invoked for the headers of +all responses received after initiating a request and not just the final +response. This includes all responses which occur during authentication +negotiation. If you need to operate on only the headers from the final +response, you will need to collect headers in the callback yourself and use +HTTP status lines, for example, to delimit response boundaries. + +When a server sends a chunked encoded transfer, it may contain a trailer. That +trailer is identical to a HTTP header and if such a trailer is received it is +passed to the application using this callback as well. There are several ways +to detect it being a trailer and not an ordinary header: 1) it comes after the +response-body. 2) it comes after the final header line (CR LF) 3) a Trailer: +header among the regular response-headers mention what header(s) to expect in +the trailer. + +For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get +called with the server responses to the commands that libcurl sends. +.SH DEFAULT +Nothing. +.SH PROTOCOLS +Used for all protocols with headers or meta-data concept: HTTP, FTP, POP3, +IMAP, SMTP and more. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_HEADERDATA "(3), " CURLOPT_WRITEFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.html b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.html new file mode 100644 index 0000000..8d112ce --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.html @@ -0,0 +1,67 @@ + + +CURLOPT_HEADERFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_HEADERFUNCTION - callback that receives header data

    SYNOPSIS

    +

    #include <curl/curl.h> +

    size_t header_callback(char *buffer,   size_t size,   size_t nitems,   void *userdata); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION, header_callback);

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This function gets called by libcurl as soon as it has received header data. The header callback will be called once for each header and only complete header lines are passed on to the callback. Parsing headers is very easy using this. The size of the data pointed to by ptr is size multiplied with nmemb. Do not assume that the header line is zero terminated! The pointer named userdata is the one you set with the CURLOPT_HEADERDATA option. This callback function must return the number of bytes actually taken care of. If that amount differs from the amount passed in to your function, it'll signal an error to the library. This will cause the transfer to get aborted and the libcurl function in progress will return CURL_WRITE_ERROR. +

    A complete HTTP header that is passed to this function can be up to CURL_MAX_HTTP_HEADER (100K) bytes. +

    If this option is not set, or if it is set to NULL, but CURLOPT_HEADERDATA is set to anything but NULL, the function used to accept response data will be used instead. That is, it will be the function specified with CURLOPT_WRITEFUNCTION, or if it is not specified or NULL - the default, stream-writing function. +

    It's important to note that the callback will be invoked for the headers of all responses received after initiating a request and not just the final response. This includes all responses which occur during authentication negotiation. If you need to operate on only the headers from the final response, you will need to collect headers in the callback yourself and use HTTP status lines, for example, to delimit response boundaries. +

    When a server sends a chunked encoded transfer, it may contain a trailer. That trailer is identical to a HTTP header and if such a trailer is received it is passed to the application using this callback as well. There are several ways to detect it being a trailer and not an ordinary header: 1) it comes after the response-body. 2) it comes after the final header line (CR LF) 3) a Trailer: header among the regular response-headers mention what header(s) to expect in the trailer. +

    For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get called with the server responses to the commands that libcurl sends.

    DEFAULT

    +

    Nothing.

    PROTOCOLS

    +

    Used for all protocols with headers or meta-data concept: HTTP, FTP, POP3, IMAP, SMTP and more.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_HEADERDATA, CURLOPT_WRITEFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..acf174a3de24650f52f2f11d5a3e293deae0c395 GIT binary patch literal 6359 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HEADEROPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HEADEROPT \- set how to send HTTP headers +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask); +.SH DESCRIPTION +Pass a long that is a bitmask of options of how to deal with headers. The two +mutually exclusive options are: + +\fBCURLHEADER_UNIFIED\fP - keep working as before. This means +\fICURLOPT_HTTPHEADER(3)\fP headers will be used in requests both to servers +and proxies. With this option enabled, \fICURLOPT_PROXYHEADER(3)\fP will not +have any effect. + +\fBCURLHEADER_SEPARATE\fP - makes \fICURLOPT_HTTPHEADER(3)\fP headers only get +sent to a server and not to a proxy. Proxy headers must be set with +\fICURLOPT_PROXYHEADER(3)\fP to get used. Note that if a non-CONNECT request +is sent to a proxy, libcurl will send both server headers and proxy +headers. When doing CONNECT, libcurl will send \fICURLOPT_PROXYHEADER(3)\fP +headers only to the proxy and then \fICURLOPT_HTTPHEADER(3)\fP headers only to +the server. +.SH DEFAULT +CURLHEADER_UNIFIED +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.37.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_PROXYHEADER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.html b/docs/libcurl/opts/CURLOPT_HEADEROPT.html new file mode 100644 index 0000000..dbcd319 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.html @@ -0,0 +1,62 @@ + + +CURLOPT_HEADEROPT man page + + + + +

    NAME

    +

    CURLOPT_HEADEROPT - set how to send HTTP headers

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask);

    DESCRIPTION

    +

    Pass a long that is a bitmask of options of how to deal with headers. The two mutually exclusive options are: +

    CURLHEADER_UNIFIED - keep working as before. This means CURLOPT_HTTPHEADER headers will be used in requests both to servers and proxies. With this option enabled, CURLOPT_PROXYHEADER will not have any effect. +

    CURLHEADER_SEPARATE - makes CURLOPT_HTTPHEADER headers only get sent to a server and not to a proxy. Proxy headers must be set with CURLOPT_PROXYHEADER to get used. Note that if a non-CONNECT request is sent to a proxy, libcurl will send both server headers and proxy headers. When doing CONNECT, libcurl will send CURLOPT_PROXYHEADER headers only to the proxy and then CURLOPT_HTTPHEADER headers only to the server.

    DEFAULT

    +

    CURLHEADER_UNIFIED

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.37.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTPHEADER, CURLOPT_PROXYHEADER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.pdf b/docs/libcurl/opts/CURLOPT_HEADEROPT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..686bd2011f88434df0abf806cd27fcf823fd284a GIT binary patch literal 4412 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 aj&O2UGZ2`bFeQy8;0P#=j-Io;DE|RX=RKYP literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 new file mode 100644 index 0000000..1454ed1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 @@ -0,0 +1,56 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTP200ALIASES 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP200ALIASES, + struct curl_slist *aliases); +.SH DESCRIPTION +Pass a pointer to a linked list of \fIaliases\fP to be treated as valid HTTP +200 responses. Some servers respond with a custom header response line. For +example, IceCast servers respond with "ICY 200 OK". By including this string +in your list of aliases, the response will be treated as a valid HTTP header +line such as "HTTP/1.0 200 OK". + +The linked list should be a fully valid list of struct curl_slist structs, and +be properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and +\fIcurl_slist_free_all(3)\fP to clean up an entire list. + +The alias itself is not parsed for any version strings. The protocol is +assumed to match HTTP 1.0 when an alias match. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.3 +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTP_VERSION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.html b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.html new file mode 100644 index 0000000..72c6a9d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.html @@ -0,0 +1,66 @@ + + +CURLOPT_HTTP200ALIASES man page + + + + +

    NAME

    +

    CURLOPT_HTTP200ALIASES - specify alternative matches for HTTP 200 OK

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP200ALIASES, +   struct curl_slist *aliases); +

    +

    DESCRIPTION

    +

    Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 responses. Some servers respond with a custom header response line. For example, IceCast servers respond with "ICY 200 OK". By including this string in your list of aliases, the response will be treated as a valid HTTP header line such as "HTTP/1.0 200 OK". +

    The linked list should be a fully valid list of struct curl_slist structs, and be properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. +

    The alias itself is not parsed for any version strings. The protocol is assumed to match HTTP 1.0 when an alias match.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.3

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTP_VERSION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.pdf b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.pdf new file mode 100644 index 0000000000000000000000000000000000000000..714de64128591c22781a00a3f026385730fd51f6 GIT binary patch literal 4152 zcmb_fc~}$I7PnN3MsY#>a6uhJ8mJ~SlRc3H6o{fkF`&{0tV1#hkt7o)6AV1{p_VEx zV5@aOun0vFm5NyRwboKC0xGDWR*IE^U|kS-)oObu1VQD!_I;o84>#wY^E>CB9q+Ip zISXa;7~Un#={XEOgg`{he1@MN9EzKCR4gO_6eTRz8z`KFV7URK@E}}GXmFW~VWCJI zGcs(MDYKi>YUFM&%EMP*8vRW!p1?j)Fw1+N=Ldb>VZ3kLuktMEcY00H$n@ja7cDx5{JA$j{G&`B z5{{1;^kc~yH|xwRPu3ppIk-;sz>7tuo`^sAT=zHu8M|p_z|`cKy;qwXK2Y8WyhzQv zAb*k$ITb41d&fh=jm}q|6^(pu9kXOm^T5$AzTq2F>z?;BK88Qfn{w%<*UI9LA`+u^ z%!jilMyH%v;rvOz{->h|D_k*=#R;0!oP=E~thjnxQr$N-AvnctxRZ$YZ=KK9*x{V? z82=s_qx$bpt178pSd_85tSb4*?9|r44CaT$LmG5<9)FW`=Gn)UWPR+i_2<7z?zQoY zLzg#J{J1ES;KsLxjx0Piw_N(|xg+yGuW9x!j=0i*XXX{TJt}+AxO3FhhSW`0Z&zI) z_pNxprFwJjpW_UJM!UGg*Cs4JIu_Zs&h>2m_)8x1Ke_9)SfhV&cDp3%hO6qU#vv0% z<}`VGM`sK>(>!$jhUY0KdluAQ9(7r`sYgpl_7T^3muDreH?NoWI);QjGd!!AJ!!*Q zqi2zn^1MH{HgZ=TwAQWaxJ!t4<-_qa&n4WsGBzuz-@C=^yiLj(CBJ&^X@d~GCfcK7 z?suw+8<@{cr!R+1&FV2B?dsHp;SHjBGw!|TzHNvPcJJ)e$A?qow@q8FtD5frC#)bU z)HQzavUO7H_tSTJUHI+nFZJpXP41DqunNoghMFGxV+Ze(V(v)1Pjbk{?oAmpnL0QlIVbYCOhX`F`(X>{Cu@eFiLJ zYnfq3&)09=*Y}aPAbvyZ@>6|wr#B9o?WG-4HZ$DG%{4J=_IuS-PYaflACmuU)7^Kc zU6q$O=Y8W=-GAcwM>%plDg;p|8bwz(FWI|%`!U*SA=C8nX)o;+gYW+Ioau{vsJLEcR_%(IryiX0Xv%lh`lY%!|I;0|DbB`zEe|v zU3f3joOQ}0TGZ2b&+3ac+4)PVM`f4ZHm-`i+~BiM__1Q>t+vCK(DMdq*5c*g$5ih# z+vb(_^f);(An?=F#I(KjgEB^=!%AciB_%}tRONSOI?;S%e?}b5#!Qh&(E3MG<;D&?p$||_t^Kg-`7Zz_?xHa zr2kr%?Ruln(w1-252$Wl>^;24)(I!}v|jlrEw`2YRCaCs1kvMsenw%5`|-+YpSI?h z3ZBFpj%_{}*jV$^(5R-pJ&~o|^ER zIwmmg@U~^qef#GfRP3F02~Kp&r5i2%7v*xf z32O$qYxLM8!Um}jaLpIkFtlTD?&%`I^7Vd2<=!bP%cj(lR0X@&);Uo)Nwck#o#)D!SfZ&&u8B0-S2@Ee-uzD~(VV#;Qj?A)66Xc+Xe_Jdsx?!@XQR(2AoZ4fs2 zW#^DFpttnBJ)q8Z31*y>xqxnl;PmQ3LC#PyruI zYWjmr9W*YV_XZ8+i@_{>l@H}{-=HDjO>gp{Z}6c)4shIScw!;g&R(a{d&O%s5f6;m z*JwgPH#G4ZG!DXl!xj$80b5T89z|k$15Sef%^^5kpM(SdL15`4z+MF+t%TqZla_$m zw>CH=2vYe(0f&V}aRfYF6vE-z7EX%-SWz6VAc-$f{%f)C-!eqg3!8<)NXi~Et`I>P L-rm78, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTPAUTH 3 "2 Aug 2014" "libcurl 7.38.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPAUTH, long bitmask); +.SH DESCRIPTION +Pass a long as parameter, which is set to a bitmask, to tell libcurl which +authentication method(s) you want it to use speaking to the remote server. + +The available bits are listed below. If more than one bit is set, libcurl will +first query the site to see which authentication methods it supports and then +pick the best one you allow it to use. For some methods, this will induce an +extra network round-trip. Set the actual name and password with the +\fICURLOPT_USERPWD(3)\fP option or with the \fICURLOPT_USERNAME(3)\fP and the +\fICURLOPT_PASSWORD(3)\fP options. + +For authentication with a proxy, see \fICURLOPT_PROXYAUTH(3)\fP. + +.IP CURLAUTH_BASIC +HTTP Basic authentication. This is the default choice, and the only method +that is in wide-spread use and supported virtually everywhere. This sends +the user name and password over the network in plain text, easily captured by +others. +.IP CURLAUTH_DIGEST +HTTP Digest authentication. Digest authentication is defined in RFC2617 and +is a more secure way to do authentication over public networks than the +regular old-fashioned Basic method. +.IP CURLAUTH_DIGEST_IE +HTTP Digest authentication with an IE flavor. Digest authentication is +defined in RFC2617 and is a more secure way to do authentication over public +networks than the regular old-fashioned Basic method. The IE flavor is simply +that libcurl will use a special "quirk" that IE is known to have used before +version 7 and that some servers require the client to use. +.IP CURLAUTH_NEGOTIATE +HTTP Negotiate (SPNEGO) authentication. Negotiate authentication is defined +in RFC 4559 and is the most secure way to perform authentication over HTTP. + +You need to build libcurl with a suitable GSS-API library or SSPI on Windows +for this to work. +.IP CURLAUTH_NTLM +HTTP NTLM authentication. A proprietary protocol invented and used by +Microsoft. It uses a challenge-response and hash concept similar to Digest, to +prevent the password from being eavesdropped. + +You need to build libcurl with either OpenSSL, GnuTLS or NSS support for this +option to work, or build libcurl on Windows with SSPI support. +.IP CURLAUTH_NTLM_WB +NTLM delegating to winbind helper. Authentication is performed by a separate +binary application that is executed when needed. The name of the application +is specified at compile time but is typically /usr/bin/ntlm_auth + +Note that libcurl will fork when necessary to run the winbind application and +kill it when complete, calling waitpid() to await its exit when done. On POSIX +operating systems, killing the process will cause a SIGCHLD signal to be +raised (regardless of whether \fICURLOPT_NOSIGNAL(3)\fP is set), which must be +handled intelligently by the application. In particular, the application must +not unconditionally call wait() in its SIGCHLD signal handler to avoid being +subject to a race condition. This behavior is subject to change in future +versions of libcurl. +.IP CURLAUTH_ANY +This is a convenience macro that sets all bits and thus makes libcurl pick any +it finds suitable. libcurl will automatically select the one it finds most +secure. +.IP CURLAUTH_ANYSAFE +This is a convenience macro that sets all bits except Basic and thus makes +libcurl pick any it finds suitable. libcurl will automatically select the one +it finds most secure. +.IP CURLAUTH_ONLY +This is a meta symbol. OR this value together with a single specific auth +value to force libcurl to probe for un-restricted auth and if not, only that +single auth algorithm is acceptable. +.SH DEFAULT +CURLAUTH_BASIC +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Option Added in 7.10.6. + +CURLAUTH_DIGEST_IE was added added in 7.19.3 + +CURLAUTH_ONLY was added in 7.21.3 + +CURLAUTH_NTLM_WB was added in 7.22.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication +methods. +.SH "SEE ALSO" +.BR CURLOPT_PROXYAUTH "(3), " CURLOPT_USERPWD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.html b/docs/libcurl/opts/CURLOPT_HTTPAUTH.html new file mode 100644 index 0000000..c184acb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.html @@ -0,0 +1,90 @@ + + +CURLOPT_HTTPAUTH man page + + + + +

    NAME

    +

    CURLOPT_HTTPAUTH - set HTTP server authentication methods to try

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPAUTH, long bitmask); +

    +

    DESCRIPTION

    +

    Pass a long as parameter, which is set to a bitmask, to tell libcurl which authentication method(s) you want it to use speaking to the remote server. +

    The available bits are listed below. If more than one bit is set, libcurl will first query the site to see which authentication methods it supports and then pick the best one you allow it to use. For some methods, this will induce an extra network round-trip. Set the actual name and password with the CURLOPT_USERPWD option or with the CURLOPT_USERNAME and the CURLOPT_PASSWORD options. +

    For authentication with a proxy, see CURLOPT_PROXYAUTH. +

    +

    CURLAUTH_BASIC +

    HTTP Basic authentication. This is the default choice, and the only method that is in wide-spread use and supported virtually everywhere. This sends the user name and password over the network in plain text, easily captured by others. +

    CURLAUTH_DIGEST +

    HTTP Digest authentication. Digest authentication is defined in RFC 2617 and is a more secure way to do authentication over public networks than the regular old-fashioned Basic method. +

    CURLAUTH_DIGEST_IE +

    HTTP Digest authentication with an IE flavor. Digest authentication is defined in RFC 2617 and is a more secure way to do authentication over public networks than the regular old-fashioned Basic method. The IE flavor is simply that libcurl will use a special "quirk" that IE is known to have used before version 7 and that some servers require the client to use. +

    CURLAUTH_NEGOTIATE +

    HTTP Negotiate (SPNEGO) authentication. Negotiate authentication is defined in RFC 4559 and is the most secure way to perform authentication over HTTP. +

    You need to build libcurl with a suitable GSS-API library or SSPI on Windows for this to work. +

    CURLAUTH_NTLM +

    HTTP NTLM authentication. A proprietary protocol invented and used by Microsoft. It uses a challenge-response and hash concept similar to Digest, to prevent the password from being eavesdropped. +

    You need to build libcurl with either OpenSSL, GnuTLS or NSS support for this option to work, or build libcurl on Windows with SSPI support. +

    CURLAUTH_NTLM_WB +

    NTLM delegating to winbind helper. Authentication is performed by a separate binary application that is executed when needed. The name of the application is specified at compile time but is typically /usr/bin/ntlm_auth +

    Note that libcurl will fork when necessary to run the winbind application and kill it when complete, calling waitpid() to await its exit when done. On POSIX operating systems, killing the process will cause a SIGCHLD signal to be raised (regardless of whether CURLOPT_NOSIGNAL is set), which must be handled intelligently by the application. In particular, the application must not unconditionally call wait() in its SIGCHLD signal handler to avoid being subject to a race condition. This behavior is subject to change in future versions of libcurl. +

    CURLAUTH_ANY +

    This is a convenience macro that sets all bits and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. +

    CURLAUTH_ANYSAFE +

    This is a convenience macro that sets all bits except Basic and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. +

    CURLAUTH_ONLY +

    This is a meta symbol. OR this value together with a single specific auth value to force libcurl to probe for un-restricted auth and if not, only that single auth algorithm is acceptable.

    DEFAULT

    +

    CURLAUTH_BASIC

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Option Added in 7.10.6. +

    CURLAUTH_DIGEST_IE was added added in 7.19.3 +

    CURLAUTH_ONLY was added in 7.21.3 +

    CURLAUTH_NTLM_WB was added in 7.22.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication methods.

    SEE ALSO

    +

    CURLOPT_PROXYAUTH, CURLOPT_USERPWD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.pdf b/docs/libcurl/opts/CURLOPT_HTTPAUTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..34aa232cc31a8bcd2754832519105c3ecf7e2540 GIT binary patch literal 7475 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 S))GSji$sDXC3TE+LH`5)odYfa literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3 new file mode 100644 index 0000000..c14c387 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3 @@ -0,0 +1,59 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTPGET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTPGET \- ask for a HTTP GET request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPGET, long useget); +.SH DESCRIPTION +Pass a long. If \fIuseget\fP is 1, this forces the HTTP request to get back to +using GET. Usable if a POST, HEAD, PUT, etc has been used previously using the +same curl \fIhandle\fP. + +When setting \fICURLOPT_HTTPGET(3)\fP to 1, it will automatically set +\fICURLOPT_NOBODY(3)\fP to 0 and \fICURLOPT_UPLOAD(3)\fP to 0. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* use a GET to fetch this */ + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_NOBODY "(3), " CURLOPT_UPLOAD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.html b/docs/libcurl/opts/CURLOPT_HTTPGET.html new file mode 100644 index 0000000..cd70851 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPGET.html @@ -0,0 +1,72 @@ + + +CURLOPT_HTTPGET man page + + + + +

    NAME

    +

    CURLOPT_HTTPGET - ask for a HTTP GET request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPGET, long useget);

    DESCRIPTION

    +

    Pass a long. If useget is 1, this forces the HTTP request to get back to using GET. Usable if a POST, HEAD, PUT, etc has been used previously using the same curl handle. +

    When setting CURLOPT_HTTPGET to 1, it will automatically set CURLOPT_NOBODY to 0 and CURLOPT_UPLOAD to 0.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP(S)

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* use a GET to fetch this */ +   curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_NOBODY, CURLOPT_UPLOAD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.pdf b/docs/libcurl/opts/CURLOPT_HTTPGET.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2bb9c9ea6c8964ff3dcf78992fa27096e818785f GIT binary patch literal 4043 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 new file mode 100644 index 0000000..10fcf08 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 @@ -0,0 +1,83 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTPHEADER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTPHEADER \- set custom HTTP headers +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers); +.SH DESCRIPTION +Pass a pointer to a linked list of HTTP headers to pass to the server and/or +proxy in your HTTP request. The same list can be used for both host and proxy +requests! + +The linked list should be a fully valid list of \fBstruct curl_slist\fP +structs properly filled in. Use \fIcurl_slist_append(3)\fP to create the list +and \fIcurl_slist_free_all(3)\fP to clean up an entire list. If you add a +header that is otherwise generated and used by libcurl internally, your added +one will be used instead. If you add a header with no content as in 'Accept:' +(no data on the right side of the colon), the internally used header will get +disabled. With this option you can add new headers, replace internal headers +and remove internal headers. To add a header with no content (nothing to the +right side of the colon), use the form 'MyHeader;' (note the ending +semicolon). + +The headers included in the linked list \fBmust not\fP be CRLF-terminated, +because libcurl adds CRLF after each header item. Failure to comply with this +will result in strange bugs because the server will most likely ignore part of +the headers you specified. + +The first line in a request (containing the method, usually a GET or POST) is +not a header and cannot be replaced using this option. Only the lines +following the request-line are headers. Adding this method line in this list +of headers will only cause your request to send an invalid header. Use +\fICURLOPT_CUSTOMREQUEST(3)\fP to change the method. + +When this option is passed to \fIcurl_easy_setopt(3)\fP, libcurl will not copy +the entire list so you \fBmust\fP keep it around until you no longer use this +\fIhandle\fP for a transfer before you call \fIcurl_slist_free_all(3)\fP on +the list. + +Pass a NULL to this option to reset back to no custom headers. + +The most commonly replaced headers have "shortcuts" in the options +\fICURLOPT_COOKIE(3)\fP, \fICURLOPT_USERAGENT(3)\fP and +\fICURLOPT_REFERER(3)\fP. + +There's an alternative option that sets or replaces headers only for requests +that are sent with CONNECT to a proxy: \fICURLOPT_PROXYHEADER(3)\fP. Use +\fICURLOPT_HEADEROPT(3)\fP to control the behavior. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +As long as HTTP is enabled +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CUSTOMREQUEST "(3), " CURLOPT_HEADEROPT "(3), " +.BR CURLOPT_PROXYHEADER "(3)" diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.html b/docs/libcurl/opts/CURLOPT_HTTPHEADER.html new file mode 100644 index 0000000..308887a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.html @@ -0,0 +1,67 @@ + + +CURLOPT_HTTPHEADER man page + + + + +

    NAME

    +

    CURLOPT_HTTPHEADER - set custom HTTP headers

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers);

    DESCRIPTION

    +

    Pass a pointer to a linked list of HTTP headers to pass to the server and/or proxy in your HTTP request. The same list can be used for both host and proxy requests! +

    The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. If you add a header that is otherwise generated and used by libcurl internally, your added one will be used instead. If you add a header with no content as in 'Accept:' (no data on the right side of the colon), the internally used header will get disabled. With this option you can add new headers, replace internal headers and remove internal headers. To add a header with no content (nothing to the right side of the colon), use the form 'MyHeader;' (note the ending semicolon). +

    The headers included in the linked list must not be CRLF-terminated, because libcurl adds CRLF after each header item. Failure to comply with this will result in strange bugs because the server will most likely ignore part of the headers you specified. +

    The first line in a request (containing the method, usually a GET or POST) is not a header and cannot be replaced using this option. Only the lines following the request-line are headers. Adding this method line in this list of headers will only cause your request to send an invalid header. Use CURLOPT_CUSTOMREQUEST to change the method. +

    When this option is passed to curl_easy_setopt(3), libcurl will not copy the entire list so you must keep it around until you no longer use this handle for a transfer before you call curl_slist_free_all(3) on the list. +

    Pass a NULL to this option to reset back to no custom headers. +

    The most commonly replaced headers have "shortcuts" in the options CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER. +

    There's an alternative option that sets or replaces headers only for requests that are sent with CONNECT to a proxy: CURLOPT_PROXYHEADER. Use CURLOPT_HEADEROPT to control the behavior.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    As long as HTTP is enabled

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_CUSTOMREQUEST, CURLOPT_HEADEROPT, CURLOPT_PROXYHEADER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.pdf b/docs/libcurl/opts/CURLOPT_HTTPHEADER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e471f2ec49aff030189e3429d523a41863228a0 GIT binary patch literal 5350 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 H?tu6=kLdHQ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3 new file mode 100644 index 0000000..0f35b63 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3 @@ -0,0 +1,78 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTPPOST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTPPOST \- specify the multipart formpost content +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPOST, + struct curl_httppost *formpost); +.SH DESCRIPTION +Tells libcurl you want a multipart/formdata HTTP POST to be made and you +instruct what data to pass on to the server in the \fIformpost\fP argument. +Pass a pointer to a linked list of curl_httppost structs as parameter. The +easiest way to create such a list, is to use \fIcurl_formadd(3)\fP as +documented. The data in this list must remain intact until you close this curl +handle again with \fIcurl_easy_cleanup(3)\fP. + +Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. +You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP. + +When setting \fICURLOPT_HTTPPOST(3)\fP, it will automatically set +\fICURLOPT_NOBODY(3)\fP to 0. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +.nf +/* Fill in the file upload field. This makes libcurl load data from + the given file name when curl_easy_perform() is called. */ +curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "sendfile", + CURLFORM_FILE, "postit2.c", + CURLFORM_END); + +/* Fill in the filename field */ +curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "filename", + CURLFORM_COPYCONTENTS, "postit2.c", + CURLFORM_END); + +/* Fill in the submit field too, even if this is rarely needed */ +curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "submit", + CURLFORM_COPYCONTENTS, "send", + CURLFORM_END); +.fi +.SH AVAILABILITY +As long as HTTP is enabled +.SH RETURN VALUE +Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.html b/docs/libcurl/opts/CURLOPT_HTTPPOST.html new file mode 100644 index 0000000..226621d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.html @@ -0,0 +1,88 @@ + + +CURLOPT_HTTPPOST man page + + + + +

    NAME

    +

    CURLOPT_HTTPPOST - specify the multipart formpost content

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPOST, +   struct curl_httppost *formpost); +

    +

    DESCRIPTION

    +

    Tells libcurl you want a multipart/formdata HTTP POST to be made and you instruct what data to pass on to the server in the formpost argument. Pass a pointer to a linked list of curl_httppost structs as parameter. The easiest way to create such a list, is to use curl_formadd(3) as documented. The data in this list must remain intact until you close this curl handle again with curl_easy_cleanup(3). +

    Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER. +

    When setting CURLOPT_HTTPPOST, it will automatically set CURLOPT_NOBODY to 0.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    +

    /* Fill in the file upload field. This makes libcurl load data from +   the given file name when curl_easy_perform() is called. */ + curl_formadd(&formpost, +   &lastptr, +   CURLFORM_COPYNAME, "sendfile", +   CURLFORM_FILE, "postit2.c", +   CURLFORM_END); +

    /* Fill in the filename field */ + curl_formadd(&formpost, +   &lastptr, +   CURLFORM_COPYNAME, "filename", +   CURLFORM_COPYCONTENTS, "postit2.c", +   CURLFORM_END); +

    /* Fill in the submit field too, even if this is rarely needed */ + curl_formadd(&formpost, +   &lastptr, +   CURLFORM_COPYNAME, "submit", +   CURLFORM_COPYCONTENTS, "send", +   CURLFORM_END); +

    + +

    AVAILABILITY

    +

    As long as HTTP is enabled

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_POSTFIELDS, CURLOPT_POST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.pdf b/docs/libcurl/opts/CURLOPT_HTTPPOST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3889f02e01961d203061a4cb32e207bc7c773099 GIT binary patch literal 4474 zcmb_gdstIf5(fo!Q&dn<5VcndM1j z)JjDKv_3$=VpS-VD#}_E#TN+3Lr_r>L|I?8bs0cg4T_^M#q=o8mGP zI}deDPxSjdbIxU1#i-GUBCZ`a6574$5~|HQ$}FC3XMu z`N5q^3)AxF_Fr@!kdJxn-(f!a>Bvb(lCqP9qt7fXvwPST$IRH*d$W|Cy&!k_%0nT? zxu4&smP(3~$`9GV*TX;Eo{>EE^p#fc&<^XQUe52&p084yWKEp6)#OW)fYu5tPuD4D z+OwIq_p3~%1#eorvtop%H|P6^4N0%6CM&K~{Mfd~6ghKrX5kD^!Rp+&3t#uO+4eem zAL6#(+mSiVW76%oh@feXf|`(;YuCe;jxv#XhIdsrJ$c|q-?{lt=@@Cs`NO||b;mCl zws{%yNIUzFw%f3MQ?X!C@1|RbGbGzp5_WRkf=qgpG=H_{cilJYA#&}@uRZE+T609(Ar{+mZ0QyM4d#S3Oy+Y2m`y-clLe(r=^)*AQ{M}>2FW^r~+ zO6{bFFY1Y^+|tYoWzD|@q_wQOByvp(h-+=U?>2Gt1~`6I{t}3iw$J|TkA;F)W2evV z@R{fsP)rtCN}RvU@kIalenx9WqN}guljjx%q!~|>3dSUFbZOm_=Q8SIb)5e<(bci0 zG3PRrqw4RS=-ugwZceuOO7d&;Y2p@|Cgnh_+|90& zY1u>O0sidz+|>2l-`p(LoVJ;6U7lON#%r>`-dXZVni>5@?2Y}!B6@z@wT$F@US4%K zkz~69sSBak)5*N(Drey~`>px=w>S744BE-!f0|$y$Bc-YxY=Xx%9BysF|T#UBEE4i z_d6RKc_eC9&9lOjr^^KX{;qV(WrdwqU510rhh|^+blWXKOoGXn=Z2C{`6a6Zp}Rwi zvvYDE!G*LxK9eG&PL*8#N#+}Su66sou_bZsdGe4MvkI?K%A2P}SkC#|)CO~l1E#`4 zZ(Z>`m!w_J8Iu%Mrz#5*BZBt^^3NS)x!*`;ug*JH@=(%qs%<%YMY8jVs|`=bEva1V z+;J=%+m-3Mac%XU`l_;(<1EJ9U9Y%#!fKpFPD?L6#^n5+BD;cJ_xF+bYV4ICGxD)n z`=}A~zX%S~rv(McU(p6PyLjueExM>K*GAl?^ zY_YPl@yE94mX@OK)U!vYH>xd1SE`QNMmm$v%u~Hom1NfCXSAn7T$@7cUiXU)#bH_D z=~YM4&fd$PD-N4rUNm!aUCQd{81Iv5lh4d*=%ACjY*j0E*W~mzOU>&|TRZ=evafuE z!z-nMGrcEbLjEc>+hgvOoNs@9Uc1C{MOh7@#4{?yY3%4GvEX?A@vJzie@U%(NWOG@ zSxo?=s72CHI5+Q(e_&Hi(6*@hOq-FGb+X{t7j@l+(0Wb!bvKiUar?%N9G~HN*DXGn z5LI@qb%xV<3p3~Qk2`{#5-Tv~?q$N~LbvlT?JrZ^`dAHFX~8Qm%)dEd<1c+X8aFKM z?uMt-c0KNP-4VG^-zqcMKCNAJ=CS!BL*A{@!qnQOuBm!w*55~%R)tl!b%cipWb8?w z;HzsGZ|7iZc@rbNS|+S|eK@bj`bvk}ET45d1zXwQRX%wg9<;dSi0E+KEkUiX!k1x| zvGGCq>?}J{PyU1C#Os3AmlG6p2eYxO9Z9zJ!8P@3j`@#E@h()qULEt|u)nnSh?Pra zpKyUV^2Hy&T-=cSV18`6)tKrZ_TILblOvXMMlEX#z48@x>iCw7v$@Zc)Ha;@qkF4W z>7_H-o~GVY4?AhOBfs5kWwSN4$L(@D^ON>NH_TRD-DLi3^ofe`RZH5kpCyhn?@g;i zpHw^ll*-%PC!T{wHE&p4ajoOD!(~!fLhF?d^4C+A_Xb63njBs}-MoXsKi%to|6qOT zqvI3({ja1hV)I&b*od$#*DG&_Kj`T;f1r}f8XF(p%&gQjRVKLo(rfCRn`{@o1i2bo zw6X0ANhcIdEG){k8eeuqCq0$64Q1Aziiy3{1}KaIwiz4-#HLdt2(U=42jm7(fR+|j=^+}< zd_auq)CpP%sso%DpjAr(QGFN;SQCPSP=g-W2@HDQK%*&w^qcsofjL4o{s1%ydxPHq zQ3v7lDk1>UKzz81e!2x{AVA0%p$>xQV^SRyM!@425h5UfkbpzJWs18RVCsHLZ?Rsi zP|F7)2BH_Dda)GjKuAB;GzI4~hbk5>*qBM50Q zaX9veA-vQI>0bcAWBM?FNUapB-bN6pz_^2{3<8!xH|xeM+*Oow>5K@F1Z!{L0m!w4llNJO?lHw&CDRB;u;66tTS_dT=#2S*! zIN|9aR44JU_ZIp4*y9QYu0g3$f;$8mlnRxOYw#c%O}Jo!Kc@SgudJPwb6B853i8QiW zD~AydhXYfnFqKLI8YJCvm0oNhsdS$Kf5t$trEknsIu3j8+506 zE6jKNfeql02J!$_T<|_f6C|kCgXkOJ5BbKbb^3n)5Qj`*65)a4f2^oLZ9bd@P|$%i zxC0%o5Zqtcaz1$7cvK3)AW;w!g&joUa1j=l!FHh_Tnfb<9;OM34@|wmgbybEzhL^7 z=3Ay}Z4kH;Jh@galR?W+tq!jQLZ(v5w0@69vjHu47_ZS=+48 z9+$6{Bq+hN?Z^LrF3iWSu~hOVU`>KnVeAg61V$Ao9-9u7837SXC0v?IJ^_X6P@{GMVSE27;C@{R2xC*gK?m;w=q^L}spwJU}i&aK#X@4~o z7_Wa}w1bDRK2R&82=q268~o, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTPPROXYTUNNEL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel); +.SH DESCRIPTION +Set the parameter to 1 to make libcurl tunnel all operations through the HTTP +proxy. There is a big difference between using a proxy and to tunnel through +it. If you don't know what this means, you probably don't want this tunneling +option. + +Tunneling essentially means that a CONNECT is sent to the proxy, asking it to +connect to a remote host on a specific port number and then the traffic is +just passed through the proxy. Proxies tend to whitelist specific port numbers +it allows CONNECT requests to and often only port 80 and 443 are allowed. +.SH DEFAULT +0 +.SH PROTOCOLS +All network protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.html b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.html new file mode 100644 index 0000000..6f1688e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.html @@ -0,0 +1,61 @@ + + +CURLOPT_HTTPPROXYTUNNEL man page + + + + +

    NAME

    +

    CURLOPT_HTTPPROXYTUNNEL - tunnel through HTTP proxy

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel);

    DESCRIPTION

    +

    Set the parameter to 1 to make libcurl tunnel all operations through the HTTP proxy. There is a big difference between using a proxy and to tunnel through it. If you don't know what this means, you probably don't want this tunneling option. +

    Tunneling essentially means that a CONNECT is sent to the proxy, asking it to connect to a remote host on a specific port number and then the traffic is just passed through the proxy. Proxies tend to whitelist specific port numbers it allows CONNECT requests to and often only port 80 and 443 are allowed.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    All network protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_PROXY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.pdf b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..babdf5229b3c2b844f84b9c6aeccc50a5aeb8600 GIT binary patch literal 3964 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTP_CONTENT_DECODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_CONTENT_DECODING, + long enabled); +.SH DESCRIPTION +Pass a long to tell libcurl how to act on content decoding. If set to zero, +content decoding will be disabled. If set to 1 it is enabled. Libcurl has no +default content decoding but requires you to use +\fICURLOPT_ACCEPT_ENCODING(3)\fP for that. +.SH DEFAULT +1 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " +.BR CURLOPT_ACCEPT_ENCODING "(3) " diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.html b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.html new file mode 100644 index 0000000..cacd17e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.html @@ -0,0 +1,64 @@ + + +CURLOPT_HTTP_CONTENT_DECODING man page + + + + +

    NAME

    +

    CURLOPT_HTTP_CONTENT_DECODING - enable/disable HTTP content decoding

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_CONTENT_DECODING, +   long enabled); +

    +

    DESCRIPTION

    +

    Pass a long to tell libcurl how to act on content decoding. If set to zero, content decoding will be disabled. If set to 1 it is enabled. Libcurl has no default content decoding but requires you to use CURLOPT_ACCEPT_ENCODING for that.

    DEFAULT

    +

    1

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.2

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION, CURLOPT_ACCEPT_ENCODING,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.pdf b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36983d89b2dd624fafb887e423653c1fea996b2f GIT binary patch literal 3785 zcmb^!c~lc;UhUhhj;MHcMU+`<3@FLWWD;^T2@eyZRH7IT*#&AR$s|OQOq@(0ut*iK z)~g|fjD28~aZ?E10NnjMFjPoI-5{V_9Rwf;e01yMBv)LJvh7p~eU`Q=#qRgaP4Y?Vb zBpi^pv^epOb8AxI(}wt!jUh|U9y=0}yE~C*tf;<9)*QNbc79^263)1RPO$ezqzn~aamhc_WAvmp_dbbmb`N(#`M!d+A1jvaf&W#u)vG8wH?Jd(Cs-QNVXVmbE+B91#;SGCYo8t{ zFD-d@!=z<#V@tC-bXW4r+Ac&_)&2hN?hXAPo<2NuXLWgHYs)t2sfP6v|3LDmoT|wc zm&6vu1fMbdod2hNqvy>Lr_}|KA5Kr*b7;W0hPZ}`?Q=)(jcUHYYix49S^e*%`2|l5 zXC`mjtL5*4CrB>cT;J(-xK_c(dC0z42(UzNL94x1M3so zHK%`ryrc5l%@qpXyOT#wm=)SyJZNGiPZIv%#^QjEppMoMtkXx2`cbmQCjJ`PR^SQXLT3FJ^JN*5!=;KS5TOMVcrg!ZL zyZhIalWzU?)w=$9!?xVlZu~O!$CGWV43iyos>VmH8*)ie@T|s3 ze_P`bKaIXLvngM=`SO^rKSJdJb!%6bBBvJ=W`7p;aN}os>-gWrheGGHfvJCn%(a6K zDYs3X1*`kfQNi;cRU1bwwT4C4Pgo}_Uvs8&=-TVUp5G7$bbeBKEjEU3sVQ6;UuO)? zx>BC{$k;SQKRao{d2{@wxW{EDB7fSF9@u)awdnluO@&1*_h&9hFF=QHz486UwjH)l zr@gmG6IgJ3zh_rNz8PC_y{M)zMp<$zuX13$r8RVHYeiMlTg4X>YNkBv_jt^X@YeSR ziJ}wl|B~F+8a}?C^U!|R@P!{4HOZar|Co|AbA~$k6WK<=4_|#n1uhDyzp-@<{#NHk z`Rr3Q_J`$~O)=-Ljw#+yQ)j9yc-(P0FY>|kRRtLVM~``*Scb1^Jf$35vh4AK=g*HE zBZ#83I^~d`4=$9_xl%kcZV48NU*fej*N#b8HFnd^ywm%$Pde{)I&KFpZnv6h!w0`Z z-1?5((KZ z5{Vr?|`kVA6cMFz=wQLq?( zifM$KWW9wX*c_x=5CcrGnK)Mmp1UBm)~stIet6w^twM!#1;uKUbnh^)3yWZkv%q zlkqvT5==Q6Cb^j(sfLu11SlC&;3ZrF3pX&`FzGg_CTa|^x``};SK)QI93XjMufy(i zE4(T`N1_0C7L4#=4u#23@sss&Fhf!H3>yQBgmNJ!!0>R`LK6-$i=s1NOc=ojENQbv zVE}dGV+g)f{B(wKDG($pD@&M#3n|))U~;(}K}Cp2Bmfu!ceaxuyaK2DZ6J?R#FqSm z%;^?#Itfjb1FtlL$~ufXWh3xdM|aB(kX}ra)08 z(hCy=ACPLm!UPtm-$2>}vj-_fCxDbtTWQK-fip?k%|-$fibO)(Cy^ubV<{0fMm@aq zy8T7C^!oqpF^7XqX%Uu5HCKC4cE)$H+t^xC*a@dq#rF!#q=oR< z8NNEv$zhv)(XiXpz6(c(bo1&XRvZY_HV7N?qI0Mr_%)r^$Edqqg5jp(XR*x?++JQJ z*um}Z#$9zC+E-bJfyvHR32-=DC!tyeTVyDP%1}8bhM=E{M8WJSG|P2 z7{y+iv_L3~Ng%di`3@W*k>C>80{dZ@2y8Um6YT7Q;g}Q*Joa?MFcA(mrd}{q`U(sM zHob}`0c$`nT08;__Fk|EcC__^NyK1!_kxLKV4vv?L;HZ?ufihaujmZC-$Q4HCTw<+ z27eV{B;J-o0{_8a+oQlj1tM*Lkr=0if_>{65~GDvlro(djTXr?VoWwoi|aHpJW4AO kqY)B~RHDP9B, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_TRANSFER_DECODING, + long enabled); +.SH DESCRIPTION +Pass a long to tell libcurl how to act on transfer decoding. If set to zero, +transfer decoding will be disabled, if set to 1 it is enabled +(default). libcurl does chunked transfer decoding by default unless this +option is set to zero. +.SH DEFAULT +1 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTP_CONTENT_DECODING "(3), " CURLOPT_ACCEPT_ENCODING "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.html b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.html new file mode 100644 index 0000000..ddf9eea --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.html @@ -0,0 +1,64 @@ + + +CURLOPT_HTTP_TRANSFER_DECODING man page + + + + +

    NAME

    +

    CURLOPT_HTTP_TRANSFER_DECODING - enable/disable HTTP transfer decoding

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_TRANSFER_DECODING, +   long enabled); +

    +

    DESCRIPTION

    +

    Pass a long to tell libcurl how to act on transfer decoding. If set to zero, transfer decoding will be disabled, if set to 1 it is enabled (default). libcurl does chunked transfer decoding by default unless this option is set to zero.

    DEFAULT

    +

    1

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.2

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_ACCEPT_ENCODING,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.pdf b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.pdf new file mode 100644 index 0000000000000000000000000000000000000000..151796c93d155d3654960b4c67563da55c462db7 GIT binary patch literal 3635 zcmb_fdsq`!7H{op+tH${Znu2xwxa@p)yX`PkVi>W@}RgTVFMz=6Gx}rVbKL5*p;e)F0*B!XLJ4cawdgGzUcKTh# zx{%eg+*eO;9XCfZdq{mMH@`4z?xnQm>*L$Aj@`{vui7iy{8RdZw$#5BWp+kX*0!FG zeABw7e)P%I&;i^sW8~rb`Lh}<$|LpurAN={U%CC!Qe*h@5uFbn{;C7*w7hQ1Ai_2o z3v~Y))qq5$hAddWF0QasHlZoeIqXDz*|vA&5A>M}Q0p(2FY#S$DqDW>_MP@?XjRLP z5!TxB4dvD{RrReEYj&D%l~tV}zW(E`h?Zd%eVD=#(wS7=az1h;5>b*E0Ug?OJ8JZ{ zJ0s#xFO^@KP_XzUGt|q5TMjiRMOCiYVT-%A&zl%FLo?_6%|U-3*&3F!N`;o}O3wJ4 zDA@h&>6y^UsL=T(2lI(x6{_--4KHn3F*iT%hHZ zi#7YXueQ9tesIp(a!bs@<~&=;vP$Kx+MBK4VcHEN5AR!aap2O%x|h#QO}l|aPsyGV z(XS$H+$l%X>_fBE+l&8dpJ(veG6$|4w8Y|^QJlS{VqV)0#Q29xQ{GxUK3Sja&uN-q zJ(TuBP1UzsZ|omYJ9)qbMFf@Fn3Eg%)0Gi{^W_KjE6d0#OUa$8ipWsaH>S|nLX0cd zthyO;U3oTqIgGb7>^{DD^0Cx`Uk$8zJLFW|d)x52H$t=D-*WVy)7p-Y>Ri_Fy@EmFUE!4m)*uz%u7E%b8JU`_78<`mu;=7Ej@b_IdNTj^my65p>3{; zbo! zT{}4KRY}918`E|Un)FtIl{jXW${a+4%Rlw_T=Zgc+Y3w ztBMY9T6QG6y6y5`r2MqwnIE{gS#qfJAvXQvRd<_*v|KK^rni{SOj|yt^p~G3Y`^^C zM=8?Pd&}Ck9ava%w&d!`)z4KB8|Pkcs6TSMIQHHPV;?@heO$j!DX$|4QLqzWEr410 zRTDTAB*}XapEScqp$VjmLd}$eCS#cZoQ8p8g<1itp`E`EScg6hFH(8$3; z2eLtc6!cFp(bbWFHsByEddR`(?`Q`Hr$K`MHYgni8vKIFUZR5bU^DBI)RR2vW?bDW zg5H}co^*f{81EwV*j7HSpywJ8YE3Z1xK0;zQoL2rluZc zW!cpZ$ygl}GnNE3P9Xu(hd9M?#laM3*N)WNCYnYH3;|8R|{v~mCLYMFfNUj0F|u6sj-1V?@|c9 zw31Ao_i0cxH#b+BE0Z#;3&quHHHr}^K_Gww;bwSwGJtrwQNW()2%Yjs%*#ndpQLui zgVHG|F2&GpLk4gimiF;9pv^6 zKyIEM1(48S7-9gA#taJAIl}<@kdDA`1%lxSrb@!p8eFMSs77PB2E$^|Cpba!fv6rl zSHSb-e-Q1(*-MmRlR!!6TrA^s!Z{Sn37Np91R<4mSro;BTrsGSqh8T@*6|{JX7hiK zn8zcOw7{n^Fm}HOG}w5<|5Gr}I>!$CBZqx{)-9sLVMi%9CHTgHG~>Wyhh5`jSPuzm zoAmkIw4D@69tAZi(Zzs6p61<@PQ>1LH{Z2!(*l+>Zqn=0N&<+3a*}>GFVRi%irkK_ zY`AG%*G7~>dvrY|S0V{u8>9_=)H!qz{EXJKQ`FNg!8FoJa)o9Hc8^bfq0I-oaW}3b zp9bqFFp33~fPf1)i8N>gkYPBc!qm7@#FqraB!CUz@Mk!JXo!3oUZNh&&Hzg}Aq>Xl zkkGKY796cm$P};>4$^Q!4(7bDU~e}~hRMOedz^;jD)4@If`$=&Xc)LtUp@>xkDic~ zVPGmhL6fWc_=3yvzI-wTc7)_+}C=e?cJjEFB z+7X5~jK+JN3@i?E2#q(uX)$_*L50hVa+3^Knqmz~Oi!p(2Ge+TY^;8~O0C!ZJV(0l Vkm7if<;4Wa2#kQj!;MxG^lt^X*z^DZ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 new file mode 100644 index 0000000..ed5ea82 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 @@ -0,0 +1,57 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_HTTP_VERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version); +.SH DESCRIPTION +Pass \fIversion\fP a long, set to one of the values described below. They +force libcurl to use the specific HTTP versions. This is not sensible to do +unless you have a good reason. You have to set this option if you want to use +libcurl's HTTP/2 support. + +.IP CURL_HTTP_VERSION_NONE +We don't care about what version the library uses. libcurl will use whatever +it thinks fit. +.IP CURL_HTTP_VERSION_1_0 +Enforce HTTP 1.0 requests. +.IP CURL_HTTP_VERSION_1_1 +Enforce HTTP 1.1 requests. +.IP CURL_HTTP_VERSION_2_0 +Attempt HTTP 2.0 requests. libcurl will fall back to HTTP 1.x if HTTP 2.0 +can't be negotiated with the server. +.SH DEFAULT +CURL_HTTP_VERSION_NONE +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), " diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.html b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.html new file mode 100644 index 0000000..7169870 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.html @@ -0,0 +1,69 @@ + + +CURLOPT_HTTP_VERSION man page + + + + +

    NAME

    +

    CURLOPT_HTTP_VERSION - specify HTTP protocol version to use

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);

    DESCRIPTION

    +

    Pass version a long, set to one of the values described below. They force libcurl to use the specific HTTP versions. This is not sensible to do unless you have a good reason. You have to set this option if you want to use libcurl's HTTP/2 support. +

    +

    CURL_HTTP_VERSION_NONE +

    We don't care about what version the library uses. libcurl will use whatever it thinks fit. +

    CURL_HTTP_VERSION_1_0 +

    Enforce HTTP 1.0 requests. +

    CURL_HTTP_VERSION_1_1 +

    Enforce HTTP 1.1 requests. +

    CURL_HTTP_VERSION_2_0 +

    Attempt HTTP 2.0 requests. libcurl will fall back to HTTP 1.x if HTTP 2.0 can't be negotiated with the server.

    DEFAULT

    +

    CURL_HTTP_VERSION_NONE

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSLVERSION, CURLOPT_HTTP200ALIASES,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.pdf b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7351f4d2be6fcac60e59cded6bccc5a7a20adc2a GIT binary patch literal 4178 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 new file mode 100644 index 0000000..11bff65 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_IGNORE_CONTENT_LENGTH \- ignore Content-Length in HTTP response +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IGNORE_CONTENT_LENGTH, + long ignore); +.SH DESCRIPTION +If \fIignore\fP is set to 1, ignore the Content-Length header in the HTTP +response. This is useful for Apache 1.x (and similar servers) which will +report incorrect content length for files over 2 gigabytes. If this option is +used, curl will not be able to accurately report progress, and will simply +stop the download when the server ends the connection. + +Only use this option if strictly necessary. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.14.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTP_VERSION "(3), " CURLOPT_MAXFILESIZE_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.html b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.html new file mode 100644 index 0000000..7616ae5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.html @@ -0,0 +1,65 @@ + + +CURLOPT_IGNORE_CONTENT_LENGTH man page + + + + +

    NAME

    +

    CURLOPT_IGNORE_CONTENT_LENGTH - ignore Content-Length in HTTP response

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IGNORE_CONTENT_LENGTH, +   long ignore); +

    +

    DESCRIPTION

    +

    If ignore is set to 1, ignore the Content-Length header in the HTTP response. This is useful for Apache 1.x (and similar servers) which will report incorrect content length for files over 2 gigabytes. If this option is used, curl will not be able to accurately report progress, and will simply stop the download when the server ends the connection. +

    Only use this option if strictly necessary.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.14.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTP_VERSION, CURLOPT_MAXFILESIZE_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.pdf b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90a31bc0f6d02f64f604197517a764dd530291b5 GIT binary patch literal 3904 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 E0Q?~@8~^|S literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3 new file mode 100644 index 0000000..129414c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3 @@ -0,0 +1,58 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_INFILESIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_INFILESIZE \- set size of the input file to send off +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE, long filesize); +.SH DESCRIPTION +When uploading a file to a remote site, \fIfilesize\fP should be used to tell +libcurl what the expected size of the input file is. This value must be passed +as a long. See also \fICURLOPT_INFILESIZE_LARGE(3)\fP for sending files larger +than 2GB. + +For uploading using SCP, this option or \fICURLOPT_INFILESIZE_LARGE(3)\fP is +mandatory. + +To unset this value again, set it to -1. + +When sending emails using SMTP, this command can be used to specify the +optional SIZE parameter for the MAIL FROM command. + +This option does not limit how much data libcurl will actually send, as that +is controlled entirely by what the read callback returns, but telling one +value and sending a different amount may lead to errors. +.SH DEFAULT +Unset +.SH PROTOCOLS +Many +.SH EXAMPLE +TODO +.SH AVAILABILITY +SMTP support added in 7.23.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_INFILESIZE_LARGE "(3), " CURLOPT_UPLOAD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.html b/docs/libcurl/opts/CURLOPT_INFILESIZE.html new file mode 100644 index 0000000..ae0e217 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.html @@ -0,0 +1,64 @@ + + +CURLOPT_INFILESIZE man page + + + + +

    NAME

    +

    CURLOPT_INFILESIZE - set size of the input file to send off

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE, long filesize);

    DESCRIPTION

    +

    When uploading a file to a remote site, filesize should be used to tell libcurl what the expected size of the input file is. This value must be passed as a long. See also CURLOPT_INFILESIZE_LARGE for sending files larger than 2GB. +

    For uploading using SCP, this option or CURLOPT_INFILESIZE_LARGE is mandatory. +

    To unset this value again, set it to -1. +

    When sending emails using SMTP, this command can be used to specify the optional SIZE parameter for the MAIL FROM command. +

    This option does not limit how much data libcurl will actually send, as that is controlled entirely by what the read callback returns, but telling one value and sending a different amount may lead to errors.

    DEFAULT

    +

    Unset

    PROTOCOLS

    +

    Many

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    SMTP support added in 7.23.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_INFILESIZE_LARGE, CURLOPT_UPLOAD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.pdf b/docs/libcurl/opts/CURLOPT_INFILESIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39e4d2813ece7f4ec379c2b87ad4cbc9ffb39593 GIT binary patch literal 4254 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_INFILESIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE_LARGE, + curl_off_t filesize); +.SH DESCRIPTION +When uploading a file to a remote site, \fIfilesize\fP should be used to tell +libcurl what the expected size of the input file is. This value must be passed +as a \fBcurl_off_t\fP. + +For uploading using SCP, this option or \fICURLOPT_INFILESIZE(3)\fP is +mandatory. + +To unset this value again, set it to -1. + +When sending emails using SMTP, this command can be used to specify the +optional SIZE parameter for the MAIL FROM command. + +This option does not limit how much data libcurl will actually send, as that +is controlled entirely by what the read callback returns, but telling one +value and sending a different amount may lead to errors. +.SH DEFAULT +Unset +.SH PROTOCOLS +Many +.SH EXAMPLE +TODO +.SH AVAILABILITY +SMTP support added in 7.23.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_INFILESIZE "(3), " CURLOPT_UPLOAD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.html b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.html new file mode 100644 index 0000000..c16aed1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.html @@ -0,0 +1,68 @@ + + +CURLOPT_INFILESIZE_LARGE man page + + + + +

    NAME

    +

    CURLOPT_INFILESIZE_LARGE - set size of the input file to send off

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE_LARGE, +   curl_off_t filesize); +

    +

    DESCRIPTION

    +

    When uploading a file to a remote site, filesize should be used to tell libcurl what the expected size of the input file is. This value must be passed as a curl_off_t. +

    For uploading using SCP, this option or CURLOPT_INFILESIZE is mandatory. +

    To unset this value again, set it to -1. +

    When sending emails using SMTP, this command can be used to specify the optional SIZE parameter for the MAIL FROM command. +

    This option does not limit how much data libcurl will actually send, as that is controlled entirely by what the read callback returns, but telling one value and sending a different amount may lead to errors.

    DEFAULT

    +

    Unset

    PROTOCOLS

    +

    Many

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    SMTP support added in 7.23.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_INFILESIZE, CURLOPT_UPLOAD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.pdf b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..769696ade4b9286b8a7836ad84c0e20218214090 GIT binary patch literal 4224 zcmb_fdsq`!78kWu2dorPDj=OgL$H#}Ox}q}l()2Gq2amma!4j&ATN?h2`E|>wY3#3 zinc1Oh1N=KExsSL)`DOaWwBPRV49?iYy%T~^pxfQ=bNi7riRi&r1KdZRS+^#%Jng5M6TbSvSlcV4k2VP9^Y zYzQ59y-YBxv(0zfyU_NlC*Dq~RYX@$d(iVUcjmL&nYlRZ0^LVcYnMB<2haMA^-^2# zp-ryZ{^Ki`yG@BN`bM|P>Bp*B9$PB(Ga8+#357z}=kB|2t6O`9I{X5QjaB+V8~PMG zKHrq@*FH&kcSb?gj~l3KRql$F#~XW39x9*q%EY#=a^0qHA8Q}pt%xf6k@4&9$|Y~D zs$1G-I@I;*1;55=zx@1L$U;+2{cSthi;jk!hNc(;*vt_D}1t^1&(oNo)MymrI7e?`O;>m1?coyC#k zBY$0}ZqM_G|8$GeV`204!+lrM_Rf{&Cv?=C$CozF?mmk!r=Mc1GI?z6(W=I`Tq*x( z%f`z@*toveBVEhg%DHo9usr_m#oBXt^6p0rtYJaJi_sXA;W2r;PL38fxJ-ZcpDypV z-Z<+Y^~}DM%N^g8?{YOxC_5A8CE8NX?y%%==T+A}e4jirssB>%vs;h(+)DF;?moLMg`TqH5$avTDqVHN11+A#x+kEyt=fDeb?ELTataS%YWIa0S+wT&({a|(F`T7sufo7K~uD_|? zOu93PPdW;Ahw}F&D9FHNAKCWqIjzI<65eq$8s2w3Wi2ayuBvFiC2{NRX4{gOG((mv zV?j-M*Sdg`lEB3+aReNg?sSyLk>$AOlOuh7avG?YU1zFqHEsCGA zF+Qy9XJDsR``nm(M?mFk%amg$E!?&*I9d@s4pZ7vpz;~@~ zsTD=_wO1;71AaB}ztCwGwSL^o%gPJ5^GJ>~!P}=E7c{=PhJQVsT_2(MDQx)n#MX|Q z(0$$?PCebQv*ZqAxwK8R==1)?`~v6RKAlfY_rV1(TiuTz6Cd62WoeZ4;^o%pgxEu0 zbp+`;zi58r`H84EvWw}P$jB4l`Xb`X#pRZwMNW?zs?icliq|Jw58Tj6>t4DFtmLE{ZI-ncvyfyCfi0#OiZ5)U@o;A9jW z^Tm8v#N(twh|)-bHVmVH%S;$3m`nF)Kqf3kt64=@K=+O@8&$Ccm5hM?4kK}djRLqZ z8x;|2hho?OB-{w#7{|T=4IK#qdmzyQ(+`0X0wjlhw2Fa;0Z0P|!gdQSF!CCyw!p~{ zZNCyqg@FVsEpix?R^@n829O~*h3kykK@kq?6$FK=!3m6w)GhqIfFU;^BsxX`V{*B} zNV``KRZ1a5AQqtupEnG6})hC^D!h6u4t1O%!P~z_emK!)T>sOskbtO9VnLE)w!^ zmP*6PU||@cVWHq-i83@?o`?`|g&1d0ooSevztaZ}fI=>a16WBwpHW*?gjvRnh>3zD zGL05$KtC*IqXH)4aQ|sp1#&ZX6hJ~9VUPkIi2{_OCNC6pNjV3__$(A-p`ticEWv~l zzGyCrNl;XZjNk;x2hb2O(}EfIe}E3-90oO-N+L}N7Tad5YBlL_=PbDRWEa%yzDkJp@C2s6F_vs8u(xVpU>sP8rVU@1Yl=Bf(?T-E?*3$0QwuE zVSFK&z(&w`*eDtbd>X~a6_4V>gh2WTc^s58noleMqtFPwBF<=, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_INTERFACE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_INTERFACE \- source interface for outgoing traffic +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERFACE, char *interface); +.SH DESCRIPTION +Pass a char * as parameter. This sets the \fIinterface\fP name to use as +outgoing network interface. The name can be an interface name, an IP address, +or a host name. + +If the parameter starts with "if!" then it is treated as only as interface +name and no attempt will ever be named to do treat it as an IP address or to +do name resolution on it. If the parameter starts with \&"host!" it is +treated as either an IP address or a hostname. Hostnames are resolved +synchronously. Using the if! format is highly recommended when using the +multi interfaces to avoid allowing the code to block. If "if!" is specified +but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED +is returned from the libcurl function used to perform the transfer. +.SH DEFAULT +NULL, use whatever the TCP stack finds suitable +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +The "if!" and "host!" syntax was added in 7.24.0. +.SH RETURN VALUE +Returns CURLE_OK on success or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_TCP_NODELAY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.html b/docs/libcurl/opts/CURLOPT_INTERFACE.html new file mode 100644 index 0000000..4806797 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INTERFACE.html @@ -0,0 +1,61 @@ + + +CURLOPT_INTERFACE man page + + + + +

    NAME

    +

    CURLOPT_INTERFACE - source interface for outgoing traffic

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERFACE, char *interface);

    DESCRIPTION

    +

    Pass a char * as parameter. This sets the interface name to use as outgoing network interface. The name can be an interface name, an IP address, or a host name. +

    If the parameter starts with "if!" then it is treated as only as interface name and no attempt will ever be named to do treat it as an IP address or to do name resolution on it. If the parameter starts with "host!" it is treated as either an IP address or a hostname. Hostnames are resolved synchronously. Using the if! format is highly recommended when using the multi interfaces to avoid allowing the code to block. If "if!" is specified but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED is returned from the libcurl function used to perform the transfer.

    DEFAULT

    +

    NULL, use whatever the TCP stack finds suitable

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    The "if!" and "host!" syntax was added in 7.24.0.

    RETURN VALUE

    +

    Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SOCKOPTFUNCTION, CURLOPT_TCP_NODELAY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.pdf b/docs/libcurl/opts/CURLOPT_INTERFACE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..564e7b2a42f193e225fad433e4a3697133c59f8c GIT binary patch literal 4392 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 IJYU*>0G&ZEqW}N^ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 new file mode 100644 index 0000000..836dfac --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_INTERLEAVEDATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_INTERLEAVEDATA \- custom pointer to RTSP interleave callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void *pointer); +.SH DESCRIPTION +This is the userdata \fIpointer\fP that will be passed to +\fICURLOPT_INTERLEAVEFUNCTION(3)\fP when interleaved RTP data is +received. +.SH DEFAULT +NULL +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_INTERLEAVEFUNCTION "(3), " CURLOPT_RTSP_REQUEST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.html b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.html new file mode 100644 index 0000000..bc98928 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_INTERLEAVEDATA man page + + + + +

    NAME

    +

    CURLOPT_INTERLEAVEDATA - custom pointer to RTSP interleave callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void *pointer);

    DESCRIPTION

    +

    This is the userdata pointer that will be passed to CURLOPT_INTERLEAVEFUNCTION when interleaved RTP data is received.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_INTERLEAVEFUNCTION, CURLOPT_RTSP_REQUEST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.pdf b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b51132c72adac83bed357694d0599e81849b59c0 GIT binary patch literal 3852 zcmb_fc~}!?8ZV02j!?laii&nb*`SilOfHg?gc1UX5WsMVQXU+V2?ml(Ix~@gTUQ>e z77tKbj}obh2ezViy%n)qwLDr^3snKd^*|O&wccB+E9^H(5JYy{eIDl@zP#UiAHVM< zFi{o7#dty}u_hQ)xQL81&shM-_1%7`vgW z6IQZm>xgeQ`5Du^^AFE`(sG6FeB1lP8=sfXJ^MwiJ=Fc`zs3%@did_xefFbr{kdxu z4IV3IBxcrjczTR;+pq~OdtW|xXy+YC!mbVFo*Liwn3kbvn>T*_YF*y3%#NbQ* zHA(J)A;FLRMl9$5u<_eVRb!(4A9&PNHC6Awo#XHM@%lx@&GSA@?WAXpzUfZQeXshQ zu&JwJZ`z*l1(v;qlgfrZqaJ$hv$q`zp0mDXe(1GfQ)85w%N8Ex?Obf|z0#l`GcCx! z@J&tZ)mSik`F|k2^lnimVj1uL8NSF~V`J6-w0wxJ^qQXq^)8|4tCLVrB7tb@g2e;~x8&+B+a& zP*eP`&$4z5X+Ke;TV4YlOm5uz&nM3%wW8@?%{+7OiqAUlh{d^|>|B!NHR`jtB|d+) ze*D--^N0Q9eyZH->Uqo zbkrK$Z`7BR|K`>S2b2FY#_xE`hFRw;kH*!#HD;N7fY0hxtK$l*i@)>@P*n~;ayfXU zlyk$~=VD6yj3GhOGitx(uHJZE8b3T`IJfD^xy~wlSfjMKWaHlLH?~#VTMPW3bS3Ba-f30Hkm_e zcCE=AxV`kOW$nDU-SergQl@N%8-H-4eb}Kia@Ek65d67y`Hv3%@>qJKOJitt~2 zx+~{5oqlQjNH6Q@f;IH`c}F_e-Mjv^hdZvX*u7=+*B|;$zPr2g--Ej@N8cpOIu|a0 z6N@D*g0O!vR3L#|G+__UBf8flotJq-j%F8^2)P8aIb0G-oF>?8A;|_4L33k32nMYq6$nd)kR)ps!&Z)s5xCTy zI97N6DwL#A_XiZPKJ~9aLz-}NZw--V@D3Tw*)ZnF>3?&{aqCjadW&?+Au5AjPk@#J zJ(Lb%Ap*o?Fk9)2o@gAk=`Gq_wVwFX)N$QUB_@x&aUlG5pA8Zb9bh2WQ*Gn-*7G6c!X%j4wALn;ssWw0;?(hReP@hsBH z$T?Q4K_?T3=meNfi*vPleij$Q2t5}CA6F>U>a>_pEEM6QZgZAiZoXs>TmXXtkOy#* z0btNswFD*SL?_0<(X&aKaoUHaJXFj)|;B zMYEN_czixj;I!xvb8&?tY>j$l=XK``x2VBezTOI*D$x(!YOUA$$358?! z!i|jcU^K9^Bs1dXY&plq)e(B!YGgQy6tja{=d6a&pl}`>a!8M^ern|)f!PLSLtY?< z0)k)D_xcp|z$JLxq*$Tt|2ih zI6X8nQW+AZ6bU1ul+q9hhGG(l3Ka>XFpRHMMMzYN-{;6+cQu;9DaKJWfj}yS0s|ux HqM-i(!Ji$S literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 new file mode 100644 index 0000000..b965529 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 @@ -0,0 +1,68 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_INTERLEAVEFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data +.SH SYNOPSIS +.nf +#include + +size_t interleave_callback(void *ptr, size_t size, size_t nmemb, + void *userdata); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEFUNCTION, + interleave_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl as soon as it has received +interleaved RTP data. This function gets called for each $ block and therefore +contains exactly one upper-layer protocol unit (e.g. one RTP packet). Curl +writes the interleaved header as well as the included data for each call. The +first byte is always an ASCII dollar sign. The dollar sign is followed by a +one byte channel identifier and then a 2 byte integer length in network byte +order. See \fIRFC2326 Section 10.12\fP for more information on how RTP +interleaving behaves. If unset or set to NULL, curl will use the default write +function. + +Interleaved RTP poses some challenges for the client application. Since the +stream data is sharing the RTSP control connection, it is critical to service +the RTP in a timely fashion. If the RTP data is not handled quickly, +subsequent response processing may become unreasonably delayed and the +connection may close. The application may use \fICURL_RTSPREQ_RECEIVE\fP to +service RTP data when no requests are desired. If the application makes a +request, (e.g. \fICURL_RTSPREQ_PAUSE\fP) then the response handler will +process any pending RTP data before marking the request as finished. +.SH DEFAULT +NULL +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_INTERLEAVEFUNCTION "(3), " CURLOPT_RTSP_REQUEST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.html b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.html new file mode 100644 index 0000000..d6d82a1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.html @@ -0,0 +1,68 @@ + + +CURLOPT_INTERLEAVEFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_INTERLEAVEFUNCTION - callback function for RTSP interleaved data

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    size_t interleave_callback(void *ptr, size_t size, size_t nmemb, +   void *userdata); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEFUNCTION, +   interleave_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback function gets called by libcurl as soon as it has received interleaved RTP data. This function gets called for each $ block and therefore contains exactly one upper-layer protocol unit (e.g. one RTP packet). Curl writes the interleaved header as well as the included data for each call. The first byte is always an ASCII dollar sign. The dollar sign is followed by a one byte channel identifier and then a 2 byte integer length in network byte order. See RFC 2326 Section 10.12 for more information on how RTP interleaving behaves. If unset or set to NULL, curl will use the default write function. +

    Interleaved RTP poses some challenges for the client application. Since the stream data is sharing the RTSP control connection, it is critical to service the RTP in a timely fashion. If the RTP data is not handled quickly, subsequent response processing may become unreasonably delayed and the connection may close. The application may use CURL_RTSPREQ_RECEIVE to service RTP data when no requests are desired. If the application makes a request, (e.g. CURL_RTSPREQ_PAUSE) then the response handler will process any pending RTP data before marking the request as finished.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_INTERLEAVEFUNCTION, CURLOPT_RTSP_REQUEST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..08f7c69cddeb84b1ec2600a235e0a521ca31f2fa GIT binary patch literal 4939 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_IOCTLDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLDATA, void *pointer); +.SH DESCRIPTION +Pass the \fIpointer\fP that will be untouched by libcurl and passed as the 3rd +argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION(3)\fP. +.SH DEFAULT +By default, the value of this parameter is NULL. +.SH PROTOCOLS +Used with HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.12.3 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_IOCTLFUNCTION "(3), " CURLOPT_SEEKFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.html b/docs/libcurl/opts/CURLOPT_IOCTLDATA.html new file mode 100644 index 0000000..7b4b296 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_IOCTLDATA man page + + + + +

    NAME

    +

    CURLOPT_IOCTLDATA - custom pointer passed to I/O callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLDATA, void *pointer);

    DESCRIPTION

    +

    Pass the pointer that will be untouched by libcurl and passed as the 3rd argument in the ioctl callback set with CURLOPT_IOCTLFUNCTION.

    DEFAULT

    +

    By default, the value of this parameter is NULL.

    PROTOCOLS

    +

    Used with HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.12.3

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_IOCTLFUNCTION, CURLOPT_SEEKFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.pdf b/docs/libcurl/opts/CURLOPT_IOCTLDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a6bb33b8c8236f5402a2e4fa0df56c8d5c57d9f8 GIT binary patch literal 3781 zcmb_fdsq`!7GJCDV_55J7Yg{86*U2x%uFV)iAhiiK`K!UL9vKBNp5f?$%JGg5h;G6 zRa+IStKa&n?xOY8UA6Awv$o<2CpXJ?E+J?C9A3EA0_?zul@FZwHhOT`kjy-bz}RB-jBC@`bn<|mzNwrf9uYYH5*cz z7tTHSh&Z+?d7m#^JRtgOnrofk5XY;@*7p7gLe!tfUTo98ZT_zCm= z<=E4VL%Zr48pp1ChOfynmE%i$>PuqEzxtpGoC&)zt?qHm!m{Ygy3vpJohnvqzHiVC zFqJM=YOMI!rtQsNoUS^gKd~Zf_k%Sxsmu0*V>RdW^(R96Ki7qIuTv!-oLGK#ZjW9= z_ug&T*r#afy|L$oU+?TSVB4B2ag~!YcIoDCh=}@o?4!+l#}#!61vTA86GNwL`d8iB z^2KUZDRFY&%#bJ_=5Vm8=H{UT=~a_%`uY|uxUv07 z-w|c@!|JQi+o2y-n=p_qR;#J=T{c56K;C3zDP#h ze5dHklKM+MKS@lEVCx)Jr;k2sd_2%qWc+Y&j|0^WHY(!@$xfTQ;DgGDuqWx=nog8F z6%zI>XEuS4?iI&GZ&|MS%C!ID>S?v|8B?P!^q-x(affQy)n8NUiljIC^!x2%wdnXD zr0K^ulAfdCJ*)>-#tHw>HLmV@5*YEBXm{*{GOeney7p!bnT*NBR-LE}OEh_Fm4fmP?LWN3oi!`iVtx&z5YS*CletAR%yCgB=Y|{1o7OpZ`nAl}L~zZ59e=CJGU}JY*YDUR7}R1tjBXj<&N|Ef7KL4S=Jq@CGFU zSgpDhuL88XfnXC-3@D-1295N46;x$ZAiSKh6~^yo%PoN;1Rqo*W~2}*a8M%3b`m^C zP+|=20erMD6XO6LQ4(~4vG_xQ@ni%`^_n?8bG(nxq?W+(*quX+VeQsm0KnVSIe?LM z(9X692~PNcFwQKL@W=GOndH9>Lh{yPEpnKSvDpADDOf`p2%#V`2jld5GF!dz=ccV_ zOV(QbPd6mDym166m20)Z+E>TRdT0*^&AG~Sr3AIdZMR6d8x0gDIqIqXi4 z%BK2*A(jguq}ys! z8DZZ90O2ojA{}(c&A2#*b)vjt+RS=6jlk<=tSY&}N)lEJEwb1oW)VRE zn+S)W2-uVgIc)}V+zeXOx!RcdiavM&6_PLx@T7u+!RoaDw?>edl8h$KWIbF!KT3&l zxd02g|GKP#x#>I#FrmRPs3DKa01MYPM+e86R)P~U5l)D3r3t50ghC~wVsS!+<7%uO zCrmyRjfcw;T%LY`XdBKpqO98lOG2CFW^FcfHgJ3ROb}v;L`()W`o)4=YK+fOo9Mjm zc+oC{;eSWW;owV}=Tqrei`N0?b&~G?DVW!tW2@z*!7i`c?(Yt(1p{`#+vb63CZNSu zi^|5j9W<p9FgwrVV>JIkX7+n!eWu)H*KV}pY@Mk!J-5~6&U!q?= z#XdK%Avj9N5Po0Nhsj+|0<1;kkHX~G+fbvhC`n^ z^2y*^*iM#|!40e(P0p_a?PxM-M?9$lt`+V0NU9@ED(Og*QypxE(Qgw2&P_9R;D-Mu zqF5@E2VneAxb3lUp@Nw, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_IOCTLFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_IOCTLFUNCTION \- callback for I/O operations +.SH SYNOPSIS +.nf +#include + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLFUNCTION, ioctl_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl when something special +I/O-related needs to be done that the library can't do by itself. For now, +rewinding the read data stream is the only action it can request. The +rewinding of the read data stream may be necessary when doing a HTTP PUT or +POST with a multi-pass authentication method. + +The callback MUST return \fICURLIOE_UNKNOWNCMD\fP if the input \fIcmd\fP is +not \fICURLIOCMD_RESTARTREAD\fP. + +The \fIclientp\fP argument to the callback is set with the +\fICURLOPT_IOCTLDATA(3)\fP option. + +This option is deprecated! Do not use it. Use \fICURLOPT_SEEKFUNCTION(3)\fP +instead to provide seeking! If \fICURLOPT_SEEKFUNCTION(3)\fP is set, this +parameter will be ignored when seeking. +.SH DEFAULT +By default, this parameter is set to NULL. Not used. +.SH PROTOCOLS +Used with HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.12.3 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_IOCTLDATA "(3), " CURLOPT_SEEKFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.html b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.html new file mode 100644 index 0000000..4280b9f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.html @@ -0,0 +1,79 @@ + + +CURLOPT_IOCTLFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_IOCTLFUNCTION - callback for I/O operations

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    typedef enum { +   CURLIOE_OK, /* I/O operation successful */ +   CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ +   CURLIOE_FAILRESTART, /* failed to restart the read */ +   CURLIOE_LAST /* never use */ + } curlioerr; +

    typedef enum { +   CURLIOCMD_NOP, /* no operation */ +   CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ +   CURLIOCMD_LAST /* never use */ + } curliocmd; +

    curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLFUNCTION, ioctl_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback function gets called by libcurl when something special I/O-related needs to be done that the library can't do by itself. For now, rewinding the read data stream is the only action it can request. The rewinding of the read data stream may be necessary when doing a HTTP PUT or POST with a multi-pass authentication method. +

    The callback MUST return CURLIOE_UNKNOWNCMD if the input cmd is not CURLIOCMD_RESTARTREAD. +

    The clientp argument to the callback is set with the CURLOPT_IOCTLDATA option. +

    This option is deprecated! Do not use it. Use CURLOPT_SEEKFUNCTION instead to provide seeking! If CURLOPT_SEEKFUNCTION is set, this parameter will be ignored when seeking.

    DEFAULT

    +

    By default, this parameter is set to NULL. Not used.

    PROTOCOLS

    +

    Used with HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.12.3

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_IOCTLDATA, CURLOPT_SEEKFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf304e1b7f67dac1de51c3057935d5d05574ed28 GIT binary patch literal 4728 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 new file mode 100644 index 0000000..ad9827a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_IPRESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_IPRESOLVE \- specify which IP protocol version to use +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IPRESOLVE, long resolve); +.SH DESCRIPTION +Allows an application to select what kind of IP addresses to use when +resolving host names. This is only interesting when using host names that +resolve addresses using more than one version of IP. The allowed values are: +.IP CURL_IPRESOLVE_WHATEVER +Default, resolves addresses to all IP versions that your system allows. +.IP CURL_IPRESOLVE_V4 +Resolve to IPv4 addresses. +.IP CURL_IPRESOLVE_V6 +Resolve to IPv6 addresses. +.SH DEFAULT +CURL_IPRESOLVE_WHATEVER +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_HTTP_VERSION "(3), " CURLOPT_SSLVERSION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.html b/docs/libcurl/opts/CURLOPT_IPRESOLVE.html new file mode 100644 index 0000000..283873c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.html @@ -0,0 +1,66 @@ + + +CURLOPT_IPRESOLVE man page + + + + +

    NAME

    +

    CURLOPT_IPRESOLVE - specify which IP protocol version to use

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IPRESOLVE, long resolve);

    DESCRIPTION

    +

    Allows an application to select what kind of IP addresses to use when resolving host names. This is only interesting when using host names that resolve addresses using more than one version of IP. The allowed values are: +

    CURL_IPRESOLVE_WHATEVER +

    Default, resolves addresses to all IP versions that your system allows. +

    CURL_IPRESOLVE_V4 +

    Resolve to IPv4 addresses. +

    CURL_IPRESOLVE_V6 +

    Resolve to IPv6 addresses.

    DEFAULT

    +

    CURL_IPRESOLVE_WHATEVER

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_HTTP_VERSION, CURLOPT_SSLVERSION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.pdf b/docs/libcurl/opts/CURLOPT_IPRESOLVE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79c6dd3adc36b2117136c1e1b5f5d2c0c7d93544 GIT binary patch literal 3784 zcmb_fd0Z1$91fwvOGzpT+k&%Se#3aLFK+z!@(##Nc7}1z@65#`~KYF@#GO+yK;^y|R& zFE99n#?4<+`?T2RdFXUqRe|6e)znTJDcXQtxp+8ZSp6?0r60-vo;dXT#A%Jk#C5!b zUj-?`2W&LJW!bm#oq0{ z-!4PANWEUjc-JiV^ho;WsYg$~y*C#!`sJ2a_voMbWQgu$xt~STr5>-eG!%-eA{%Xo z^WJUhaW=o|T+hkQxJ_HVbJoV^ft*Pj)b5Iz2mg(%un`(Hu)7Mo;ZBQAm8%U9rMp=whq6=-!SHCS=Rn@6<){QE2ejkAGm+`I8Ds^c{7&p z(LCNzx_)`Mq;y5z#&h0R6XR}7ey~vdWsRXvH|@lPYA>HjU6wsc9s5c5Nuh_jWrlk= zrl&? z_omGn$?^HRh~u_xiX#&0`ibJ7)Iq+rzfCpmdpW6Sb57Bns=N<#2hUn`^l9Cy)50t< zVO=|09x>6r%rLClG-0yW_)*vLOR~q#2#@O5a|>OOAzyJtQ?&YXLuK8v#KtlH`MF)w ze5o2*gxPlo*BvY9wZ2j%F3u3_((E|3gt`Eqytz7+pBwh@@S}jn%bT?ie}@D7Hr>3O z^VQQ;UqsBgopZ0GS6bqd5x+c-UOTh1ik^C6#SLR>j~$(BujbVUd|V-!OWyInRAty( zQOs!E zja&Q=98O>TuZn|P$K#>18oE#Yy_0W~)040o+^_+5EYz?7!~SBZSPHpm!d4iHPPY-r zXxu~~TEal$A(Ru2N5Qd3DuM%q`~(QmQ49bj7zJE*!pgt`7O?=Cpecu4PtX9%M%yWU z6v4zJ0PSETns72eF4W0{MY%*VRv{44P(U2RTps}55Eb|a8fln?MI8i4ZvR*l%`geH z0S951hct|gAPqDe53&C1pad9baIh-dh_c$<2-_^F!WrC5nOao1z1I>9ZU84R)=X%% zEqPr*>op)GaIT2yOO5y@nDhMkDY7!|G0NYP6ToIoWc55z%{ z6I>^5;~HHvl!ggfuNbJ(jnoWe8Jsew#byE7hMg9(m6kab9G8d;>{&9xfn6+2ih>iX z9St)SWlkX(n9q~)FfJw-3LEXXg-E09DKN$pbAU>_!6?&#LT^?Gz7(8fhOx;IBrPqC zmnPs*b`ye0rBVdtBYZv=aB%5#D}y_^R{B$5&*cai`%278^ISgh^ppi5V-bvpA}xm0 z;5v5F#*ma1W)0&>l!H-l91hYT6H5#N%%I1)dLuuHi(!P3i-N_K7)9VmjPe6S{1$Vz zHg3LV4;%o40uTqVlYve)IP`>F!3i5Z5)MnIXr|ddEajnM4&uK4+wuzJrsF7pgu25Z z2Rt$@C|qN@8sLzUk76P&igD3^XjCf0Br=iIAH`%SDo5Vn1jz@YD)5E^Z>s-6v<+t) zQOX_-N8Lz0642EjXxc+-5VAdYmnJ z1k@x)DF=rP$(RYHtM`Jl9UmqXfuZ__KCz&k zFPKQ&o=+$R6a5WY5x+f6(t$6MwmvgM$^P-vtE`U7mLA8G&q literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 new file mode 100644 index 0000000..08afb29 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 @@ -0,0 +1,58 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_ISSUERCERT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_ISSUERCERT \- issuer SSL certificate filename +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file); +.SH DESCRIPTION +Pass a char * to a zero terminated string naming a \fIfile\fP holding a CA +certificate in PEM format. If the option is set, an additional check against +the peer certificate is performed to verify the issuer is indeed the one +associated with the certificate provided by the option. This additional check +is useful in multi-level PKI where one needs to enforce that the peer +certificate is from a specific branch of the tree. + +This option makes sense only when used in combination with the +\fICURLOPT_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the check is +not considered as failure. + +A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option, +which is returned if the setup of the SSL/TLS session has failed due to a +mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER(3)\fP +has to be set too for the check to fail). (Added in 7.19.0) +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_CRLFILE "(3), " CURLOPT_SSL_VERIFYPEER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.html b/docs/libcurl/opts/CURLOPT_ISSUERCERT.html new file mode 100644 index 0000000..d1bef9f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.html @@ -0,0 +1,62 @@ + + +CURLOPT_ISSUERCERT man page + + + + +

    NAME

    +

    CURLOPT_ISSUERCERT - issuer SSL certificate filename

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file);

    DESCRIPTION

    +

    Pass a char * to a zero terminated string naming a file holding a CA certificate in PEM format. If the option is set, an additional check against the peer certificate is performed to verify the issuer is indeed the one associated with the certificate provided by the option. This additional check is useful in multi-level PKI where one needs to enforce that the peer certificate is from a specific branch of the tree. +

    This option makes sense only when used in combination with the CURLOPT_SSL_VERIFYPEER option. Otherwise, the result of the check is not considered as failure. +

    A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option, which is returned if the setup of the SSL/TLS session has failed due to a mismatch with the issuer of peer certificate (CURLOPT_SSL_VERIFYPEER has to be set too for the check to fail). (Added in 7.19.0)

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS-based protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_CRLFILE, CURLOPT_SSL_VERIFYPEER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.pdf b/docs/libcurl/opts/CURLOPT_ISSUERCERT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a04ea53fae86c9e7a1f7aab10488f38da9799e45 GIT binary patch literal 4457 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 new file mode 100644 index 0000000..0ed0c87 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_KEYPASSWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_KEYPASSWD \- set passphrase to private key +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It will be used as +the password required to use the \fICURLOPT_SSLKEY(3)\fP or +\fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP private key. You never needed a pass +phrase to load a certificate but you need one to load your private key. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and +CURLOPT_SSLCERTPASSWD up to 7.9.2. +.SH RETURN VALUE +Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLKEY "(3), " CURLOPT_SSH_PRIVATE_KEYFILE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.html b/docs/libcurl/opts/CURLOPT_KEYPASSWD.html new file mode 100644 index 0000000..9c02291 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.html @@ -0,0 +1,60 @@ + + +CURLOPT_KEYPASSWD man page + + + + +

    NAME

    +

    CURLOPT_KEYPASSWD - set passphrase to private key

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. It will be used as the password required to use the CURLOPT_SSLKEY or CURLOPT_SSH_PRIVATE_KEYFILE private key. You never needed a pass phrase to load a certificate but you need one to load your private key.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and CURLOPT_SSLCERTPASSWD up to 7.9.2.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLKEY, CURLOPT_SSH_PRIVATE_KEYFILE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.pdf b/docs/libcurl/opts/CURLOPT_KEYPASSWD.pdf new file mode 100644 index 0000000..db9de05 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.pdf @@ -0,0 +1,112 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ­VݎÚ8¾ç)Ž´7¡7v~½»Z‰N3*m†°ÚͬP<%[&¡Iè¨}†¾Ê¾ã;NB(½[!°¿ó}çǟÁ$LùÑ¿›§Á˅ˁ ŸTm‚þÙ<Á« |¹?ê3<·ˆÏ!~W«EÍãõ»àv>Œÿxñ´‹·‡‡Bü<¸3&Ëå‡×÷†u?„ͱدER~]—¢ÊÕpÌ“˜¦gàŸ4ÏJè¹ü;~;°l‡8¼vzâJ^76 £ˆdƒ@9%ܑXÇ6£Ä²al¹êÐl"MiG¥/K;» äz#3‰mz0¦Ln›5øÎjð/ ~8$eyØI) ÊáP¤ +°DåÈ˘I wõe_’'Ôç¾­7*Ÿt0T£6q)o"_Ûsý ™K‰'ѺÄW–ËÛY4_N—ý ñKšmöÇ­€ß¥ /åÙý!͙ q8ˆ_Ôánr´9Wê^mÁ‹]’m÷bg¼ †®_“3‚Í.)àÅáy{?üMQÒG® 5¨_Ë«ÅtO£Y…‹ÌOIôu¦™Ä5-)–Q–À!O³JR‘¾‰"ü÷”fI%¶PVEš}„¤DíŠäIà–ôh*] d”bJyš{2m6™Üô ·˜Oݞ»¬ªMZ4¬Nt¿‡Ç/Æ«Pó<ä„ûŽåy±…B|>¦Z Þ£L¤Ð”QS0fv}ACCÃýr"ým9t”qŸPî6)”õnëƒt¨§Ÿx{³ž/¦ïµ –§hfijÌ&æIÜŌ%¦W™×Ó0¸€ÄudMùÚR–ˆ®Û:ÕMâ» s?-¤Ô÷•À?֊C¬Î}]+Nm.õr­®ÎÈm‡Ý>=•!=¯Œaô­Ð_„΂Ú+'ì¤z‹ì”‡¶PÄVª®W¾-ð­³îÒu}žHû(ªôû“†LµFË8VðU¡D—y֙ãbq¡íØxìl;g4ÖúöêÙô‰cò^Q_kߎí×­pj·i´R»TF§Ud®ÕT]Ÿt¼&$LÏódW×E0[…á,§½e¾Ð(lË×!2·Éû1ö,œ+2­¢¢öNfÏt›Ü¾ŠÂ³†Š°9â°{J¬õ8\ÂC"«ýPäU¾É÷å¯ð&ŽçË\«ïéÍDþÌ£¹5‚å ®¨6—(= #økr3ƒF-ÿ§í1Žz-I÷Gãu¤év|ÿ°äÒ²½Mªb×!½‡np¢€®C›J†“WÓpßö©‘Õh㏅ éÔyïÒêÏCªó›â§,2û¡MçL¶É~s«g u]=x™ýA¸6à(:5¿ +M%pÕ°mÔÒn*2+ôZ;Q&§õÛ5£ZÕޕXø”²½úTKà±âÕbï‡ÔÂÈ\jLÂU ›úªQ™oê¥d,Du,ô(XGï }TI%²äa/¶#½±š½›)IGÂ-³ò£&ña¶ŽÔD•²¼A=ǼÓA‚­âut½¾ n"U0ŒÔ ú„鲿3nÓ!>ՌÇJRç%”ö»3v¢ &gø @=Ó¬<>*9óŒï›TdìDr€òl¹ð@ ž„yú´ ˜„˨£ÿ,óûIs6 -é¬N5¡F}7x‹Û ¡ŸLC®ç,ÿÂ0dø4àþù<ìãpð¿¥’±…ð­ŒEω[³½Oä ³Îòˆ9SÇá6q |š¼=f€/K[ñf·ŠJWA<ø?ÿòpæ£endstream +endobj +6 0 obj +1333 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:17:59+01:00 +2015-01-08T09:17:59+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001657 00000 n +0000003547 00000 n +0000001598 00000 n +0000001438 00000 n +0000000015 00000 n +0000001418 00000 n +0000001722 00000 n +0000001976 00000 n +0000001911 00000 n +0000001843 00000 n +0000001763 00000 n +0000001793 00000 n +0000002058 00000 n +0000002124 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [<9C282454DD73ABCBA4EAB892D19536F1><9C282454DD73ABCBA4EAB892D19536F1>] +>> +startxref +3701 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 new file mode 100644 index 0000000..571eba3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_KRBLEVEL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_KRBLEVEL \- set FTP kerberos security level +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KRBLEVEL, char *level); +.SH DESCRIPTION +Pass a char * as parameter. Set the kerberos security level for FTP; this also +enables kerberos awareness. This is a string that should match one of the +following: \&'clear', \&'safe', \&'confidential' or \&'private'. If the +string is set but doesn't match one of these, 'private' will be used. Set the +string to NULL to disable kerberos support for FTP. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was known as CURLOPT_KRB4LEVEL up to 7.16.3 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_KRBLEVEL "(3), " CURLOPT_FTP_SSL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.html b/docs/libcurl/opts/CURLOPT_KRBLEVEL.html new file mode 100644 index 0000000..4e503fd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.html @@ -0,0 +1,60 @@ + + +CURLOPT_KRBLEVEL man page + + + + +

    NAME

    +

    CURLOPT_KRBLEVEL - set FTP kerberos security level

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KRBLEVEL, char *level);

    DESCRIPTION

    +

    Pass a char * as parameter. Set the kerberos security level for FTP; this also enables kerberos awareness. This is a string that should match one of the following: 'clear', 'safe', 'confidential' or 'private'. If the string is set but doesn't match one of these, 'private' will be used. Set the string to NULL to disable kerberos support for FTP.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    This option was known as CURLOPT_KRB4LEVEL up to 7.16.3

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_KRBLEVEL, CURLOPT_FTP_SSL (3)

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.pdf b/docs/libcurl/opts/CURLOPT_KRBLEVEL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a583b598ddfcbc1aa56b9cfc0feb36646c1e124 GIT binary patch literal 3969 zcmb_fdsr0Z8n2F_4w528nu-&Ki|Ovn?6OyPmw*LSKoJO$TMaX_%gFA|wlgaWf~Fy0 zDjZWZ71OW~MMG5Jn3q5vF*Gw3LdCnGMR}n*f|s&ymPPP#PUk$2^AF#?-|xMA?;W2= zU5F49`9VI1ekm-0q%aCIDYGE88VRS&1}+tr0ZJ4SLK`{C3L_y#oTGFU!H|?z3$dJ) z!cCC9xG1)@pj9>`yK}~%@A`+;t#KdMexTI%;v3LKUE1#IV%gW8xv`~$G`?}!4-ev+DAzx>)a{#R-?E(#tNEFV`gB!9tx(B~_Y^6Qsj>(>zd z3d);aFWBy$xOdd>mifaU*j(1m%t`PH_l-XC{mHmX%v<(bW0PwQ(L*jxtR}v0kBz04 zj-TY6wm(2LC$4Gw+~HUHHK+bDx9D(1!XyOu z%&ZHCOBz4Q8dO%>6-fnE)x0)mn9rt`F7>D%C%?1SzAbFyGU5fvHkn6P)!>OGrbW^B z+wTPRuYGmT!8094XC>XQ8M`yS?2t?K=UW$7Hc%d=FKw6?qW*Bvxz%4yTvSk%vh)1S zg(=eSi?5#2&kZ{sI!UzA|6)*W^GE_H>G*lk9Xzl_2g5iSCc|Ips35srC@M&;PLD&oyB!=6DGcV_IB%* z0RQazPtX))VEKrHL)^5L9T_WIr!Ai`-F|$9d-Yo*1@M&B4;tL>WBZbG0xsOUKks_> zd)z0{yDH|lOy9KX%DuwUOF6Dp?5$GLt z%LC;3v*YXcnZt|ExX3OX3#Km*czHoaL-waKQMIbo+qmfv{O-B^sKn5)kt>(%y8hwaoR0kmwB*=i z%aWvxg*7Lli$k*AX0N$H`6OU3ve`cR*rr40;A@?J^Upu_(M0pQ_yDC3tYr@>K-S%Xr4ji?6(@!Tx)W2|QYwWAl{mwTgzV0== z{^#|fi6evBS6-}M({_5>msRhsJmppS%|P48`SpiulkeS*dv2$1%P)5#SH`S{E+1#Q z?)7grZBM4mq_fe16W<*9mdO9b#C~$fN%QM%oG}>|3W>xG6cRy^G#<#<;RF<1OO;Ys z;U`XlkSK-&Z4^cU%1W6zSi<*MK&Dv6W+f;Vbl*rTLqt zf`J4ZFR~9SFWos4x;cYz4mUD}9uZFKBPb3h!3~Uc6MA*a9~IF13<#MP83AKjthcn={lw25McfsB!KJl^3p2#L0( zaD1%zR{T*b?Kx_~Iggq!vLeI@jGyZ04w5#c>E8r8Bszx3|g5U$zAh7&_W$=Gs?St&Y%2;DSN@xvMMz4ow zQ&yIb1SS%TMUrlf4mKxBjqow*wWKoQW`jmx7m}17w;4Hs_HDBRO?F4aNNc+f4nCw;)>C5TAc5KjVM88v z4lM*fqwm=X>TQ=`C}{-gd@}^6M>hbz+dI2)PhI;yt*pm^iOg3Ca5!HlzB(0OWGIFz zP$edJ)RzE71po%>@NW>#YVdtpy^MP}LhV*c51}yT2k{N7`-5dtsYD9vVJ8if%E3(M zKiJ$ulSmZcQIFCvDL=R#qe-Ms&`|KECvlP|aF|R2R;S10DfqGe7)|c?Bu*v=>%ikU z^hugR3D%Fta7rmy3VLXq6{n4q75s|}Bhhpw1$+gAjf??H4?n|UWU^V$z`%HZznZLr z6V!5noFhOIsYC|(_ykW2 Gf&Kzk7I^Cb literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3 new file mode 100644 index 0000000..88ca1f8 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_LOCALPORT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_LOCALPORT \- set local port number to use for socket +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORT, long port); +.SH DESCRIPTION +Pass a long. This sets the local port number of the socket used for the +connection. This can be used in combination with \fICURLOPT_INTERFACE(3)\fP +and you are recommended to use \fICURLOPT_LOCALPORTRANGE(3)\fP as well when +this option is set. Valid port numbers are 1 - 65535. +.SH DEFAULT +0, disabled - use whatever the system thinks is fine +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.2 +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_LOCALPORTRANGE "(3), " CURLOPT_INTERFACE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.html b/docs/libcurl/opts/CURLOPT_LOCALPORT.html new file mode 100644 index 0000000..ff86fd5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.html @@ -0,0 +1,60 @@ + + +CURLOPT_LOCALPORT man page + + + + +

    NAME

    +

    CURLOPT_LOCALPORT - set local port number to use for socket

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORT, long port);

    DESCRIPTION

    +

    Pass a long. This sets the local port number of the socket used for the connection. This can be used in combination with CURLOPT_INTERFACE and you are recommended to use CURLOPT_LOCALPORTRANGE as well when this option is set. Valid port numbers are 1 - 65535.

    DEFAULT

    +

    0, disabled - use whatever the system thinks is fine

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.15.2

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_LOCALPORTRANGE, CURLOPT_INTERFACE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.pdf b/docs/libcurl/opts/CURLOPT_LOCALPORT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68e856471bd0a59175fa8b1f34edcd9a5607bf24 GIT binary patch literal 3868 zcmb_fdsq`!7FQHyr|PQ3#YKfFN(Xe4naPucBq#(T3PJ-Sl)`qBOkg0%#AH$ei=x(| zsKr%K7vHeDuK1`Gixoks?-s4ERu@@UNWuu&*ME}GW@-?5K5yR^R694y$8WV~WaP2@{u$*%O*88%N;KiTflGFtNF}#_ z(d?eRsOFph%wAO7oLoI@kmlHyVTT(e-_6>*u)lEA^WbaCQqK&q8zMY?RDV{T=7zpl zMK^wNVrc1;DS6(uvzUj>!xJfWtNEkkviQM-4Xw{6)D*5vlKQrVd|s$>o4>BZ(#-c8 zePi4CU4L&MJ6D{ayPwm(bZ7Pmu>0a1{J(D_JcbOga5IjKI)9(-GcaP^r1p@*mr79v4{7(I@!V8 zf(@!I9INue`4@s`PZN*)IPq3Ox~e9$+)C_QbF#xIqoe}=ox>LsgG{o zq1tiu>f@8cI`Noq=NzdYaaMe4Js~ip_N_WFsTlNH&``>SE%E@0@B6_=N zNXu}~%Wf^HQ#(Ia<@iMB)eKbe%Dx?gWHxROm~MZ6)Tn8NBeTNXqz^oDNAus_7#oyy zAk`=MUx|Z8``_K#yz+zeiKlnV?*$n@{_=vZ{-X+wCKj*ye8*`)M#yy8rolgFls#(l zO)RM$G^O@O z^kJEH@3VjJJAUF+!W`2wP2Q~Ib%ol{kvGRt*t$ot1NV=_=1-V?v!QCY>Yuk3tjw7D z`?%#r^PV0}teH_%@zuh$fu7elhsLk=s=5|(WW)=fnoa)qHcx-NDdn?^(~q9WF8WFT zHCAn&5>R2yTYE1)@%{6I7thE)pp$2%tyF%7e67rrwd4mj`VAQ@yIQ<-b)CthG51(; z?z*;J{N){Iax**3YIt70to>rvi}5Xfh3`!JLo3lh)ikUT zkK3QM_eMjIt~eIbZhk0Q#BmpJ zc;8LFOPX{pf&eR)R9Gru|KgZH47p^2Zo-MrHj`*9kw&7?q>ds&X*-;Zfo-8g2nPvx zDG;ir89+ZU2DB`siGlenHvuterEL~1X$7nmYoWDqB$JE+UW3ti(#`<8a66-lbC}|| z(p-SnR$bLTQ8UHvq6P^$nn=jfANuLbwSGB+8TqWR=*yzVq4Mn`pxPMj|gDHN_A zkcHUIgf^38U=5i@ndC_O!NUkl>Ey^PVKf$P4kOd4sW}!hE@wu(HYZan(IFuUNESkX z)*(4|!pzY-X0R0|ty;NXm^v!Lk5#Zs?MAZ^+#%R*G?=VXyBu+tNWq#FqX_I!VKU`N zVstFb(6k|wVqhLu!o@i_|4*>qLKw*`+L8(5ToD2wEjqna4cf;E2!6?tbcQiYQ8X(n zi<`yg(v~z7mq;Wi#zT2L4$$COvrPteRN_lBla=d;iL0fJD3yrfTnz1U zqy)#YP-cdrO)%@2(9kwUj@WFJPAU@X__$6>aI|`!hJ)jzo`ZppqbKyZMj#SuG<->y zJ9CdPU-1VvfI~jW16WA`Kj>^)(jrGxu~D!powhPg|FDFMi4fFv{5KU9s7>El00niW zK?ZcB(cu2-vz36|6g&(Uaxk2O1;t|$DK3@@C6h2*ieWPJHBC@_U>XMAVBk&m8%%p> z_AsR_@!(1*(k!%I4}U~jtZXH4E|16MJ3TtgTv{@etx=Ecyy<)q=IH4EoiU@4z0$0n zR7q=XMnKz<%KzuWyy+V2v@ZiT+bjl0cj&YzX&~9ytf0&|h*+nU>S>FS0C$@(n*oOs z?3G8sokSEeu*p!2fmAqpZ;F9&E({dgOHu=2N|PgYj*iq5HUonwW||z@I%hQul)|}i z*rDB6ebmY!0=*5&hQ4GD1q8pL@67>q(fyMsmka}E>aEA`rH2dn;3f7No=5^_ z{_8ScZ#G$U3iRzpbVr1{Pzi?aa0Zo@&|)Q9}V7B zpwem>jWp?L7=W;^zDOmUEE9+XxCFz+5{V!@Oe7YB;TS(OLL$N=!bB20RIK=QjTH9D VW@QKq<0u+m0E*`CA086{{Q_UFE_na| literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 new file mode 100644 index 0000000..3a7c701 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_LOCALPORTRANGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_LOCALPORTRANGE \- number of additional local ports to try +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORTRANGE, + long range); +.SH DESCRIPTION +Pass a long. The \fIrange\fP argument is the number of attempts libcurl will +make to find a working local port number. It starts with the given +\fICURLOPT_LOCALPORT(3)\fP and adds one to the number for each retry. Setting +this option to 1 or below will make libcurl do only one try for the exact port +number. Port numbers by nature are scarce resources that will be busy at times +so setting this value to something too low might cause unnecessary connection +setup failures. +.SH DEFAULT +1 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.2 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_LOCALPORT "(3), " CURLOPT_INTERFACE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.html b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.html new file mode 100644 index 0000000..1e6181e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.html @@ -0,0 +1,60 @@ + + +CURLOPT_LOCALPORTRANGE man page + + + + +

    NAME

    +

    CURLOPT_LOCALPORTRANGE - number of additional local ports to try

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORTRANGE,   long range);

    DESCRIPTION

    +

    Pass a long. The range argument is the number of attempts libcurl will make to find a working local port number. It starts with the given CURLOPT_LOCALPORT and adds one to the number for each retry. Setting this option to 1 or below will make libcurl do only one try for the exact port number. Port numbers by nature are scarce resources that will be busy at times so setting this value to something too low might cause unnecessary connection setup failures.

    DEFAULT

    +

    1

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.15.2

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_LOCALPORT, CURLOPT_INTERFACE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.pdf b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cf5a7a607abde6ede4dac415e880d84a5ce9fda3 GIT binary patch literal 4116 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_LOGIN_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_LOGIN_OPTIONS \- set login options +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options); +.SH DESCRIPTION +Pass a char * as parameter, which should be pointing to the zero terminated +\fIoptions\fP string to use for the transfer. + +For more information about the login options please see RFC2384, RFC5092 and +IETF draft draft-earhart-url-smtp-00.txt + +\fBCURLOPT_LOGIN_OPTIONS(3)\fP can be used to set protocol specific login +options, such as the preferred authentication mechanism via "AUTH=NTLM" or +"AUTH=*", and should be used in conjunction with the \fICURLOPT_USERNAME(3)\fP +option. +.SH DEFAULT +NULL +.SH PROTOCOLS +Only IMAP, POP3 and SMTP support login options. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.34.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.html b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.html new file mode 100644 index 0000000..ac84955 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.html @@ -0,0 +1,62 @@ + + +CURLOPT_LOGIN_OPTIONS man page + + + + +

    NAME

    +

    CURLOPT_LOGIN_OPTIONS - set login options

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options);

    DESCRIPTION

    +

    Pass a char * as parameter, which should be pointing to the zero terminated options string to use for the transfer. +

    For more information about the login options please see RFC 2384, RFC5092 and IETF draft draft-earhart-url-smtp-00.txt +

    CURLOPT_LOGIN_OPTIONS can be used to set protocol specific login options, such as the preferred authentication mechanism via "AUTH=NTLM" or "AUTH=*", and should be used in conjunction with the CURLOPT_USERNAME option.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    Only IMAP, POP3 and SMTP support login options.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.34.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERNAME, CURLOPT_PASSWORD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.pdf b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c15e64abf97e5df163d2c390a61761157c97ebc GIT binary patch literal 4083 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 new file mode 100644 index 0000000..893c1b1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_LOW_SPEED_LIMIT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_LIMIT, long speedlimit); +.SH DESCRIPTION +Pass a long as parameter. It contains the average transfer speed in bytes per +second that the transfer should be below during +\fICURLOPT_LOW_SPEED_TIME(3)\fP seconds for libcurl to consider it to be too +slow and abort. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_LOW_SPEED_TIME "(3), " CURLOPT_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.html b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.html new file mode 100644 index 0000000..a10f6e6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.html @@ -0,0 +1,60 @@ + + +CURLOPT_LOW_SPEED_LIMIT man page + + + + +

    NAME

    +

    CURLOPT_LOW_SPEED_LIMIT - set low speed limit in bytes per second

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_LIMIT, long speedlimit);

    DESCRIPTION

    +

    Pass a long as parameter. It contains the average transfer speed in bytes per second that the transfer should be below during CURLOPT_LOW_SPEED_TIME seconds for libcurl to consider it to be too slow and abort.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_LOW_SPEED_TIME, CURLOPT_TIMEOUT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.pdf b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7aaaf5a822bdb2e3314219d5c8b85937fa7226c GIT binary patch literal 3822 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 TaE9{)O(Kyip^%X11OxORV7LXs literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 new file mode 100644 index 0000000..90b19f2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_LOW_SPEED_TIME 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_LOW_SPEED_TIME \- set low speed limit time period +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_TIME, long speedtime); +.SH DESCRIPTION +Pass a long as parameter. It contains the time in number seconds that the +transfer speed should be below the \fICURLOPT_LOW_SPEED_LIMIT(3)\fP for the +library to consider it too slow and abort. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_LOW_SPEED_LIMIT "(3), " CURLOPT_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.html b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.html new file mode 100644 index 0000000..0d097df --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.html @@ -0,0 +1,60 @@ + + +CURLOPT_LOW_SPEED_TIME man page + + + + +

    NAME

    +

    CURLOPT_LOW_SPEED_TIME - set low speed limit time period

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_TIME, long speedtime);

    DESCRIPTION

    +

    Pass a long as parameter. It contains the time in number seconds that the transfer speed should be below the CURLOPT_LOW_SPEED_LIMIT for the library to consider it too slow and abort.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_LOW_SPEED_LIMIT, CURLOPT_TIMEOUT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.pdf b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41f2f3768c8ff5d0e6ca71aee1d5637d59d12cb3 GIT binary patch literal 3763 zcmb^!dsI{BeLJ(VU18$u_$bpWRRh-KKJt!9C=jqY62TC3~A_+A4cItC0kfwsRS<3_y%XJmug>7DnP71V`#f3u7g}K!wS9K2a$nhRQyb=+zL5Me@}Roq@WuM5CG#)4lArwPap}aOnIG+b zdr^aFOJZbm@NDO>{RMwsAsBV9!Zo%d?e~ROE*5M$Sw3~8K3sEQeNESu?&8#0E8>1r zgzu>}cV*@4-;LSyFh1!<)R%PHqUw*8e`pg`&)7QRhxX3BM_^fL&5#=Fe5m``8u|Hu z76dP>nu?f0zN;DAy5^T}oSH%(aXq;;aWk^)))kZZQTW2m9-xONYG&%0`bM#sLuni@r#)aG%{64b1IQjYx*?7Ux>e54S zy|ymz4#JH7O8x7Sf>pXH(gNlop7^w5N&WiV>_Z>oU$36uuqI=WJ_OOP538E8>ss=P z-E4LK_rq-|36;+luT86UPW!T~(UG!a^P3x8C%W%DJE}6)hItxWal`C|?_{YRRgnH4 z8{&4x=u2 z<_)a{xUu~Hn&aEHuR{+FO>YZ56WeanuV@;3VAR1U=49ccrC(I6y*q02@V&cKiJyg( zpRD@m>7a!}QoQwdmut|vX<=DNYxr`jDLLfu)vCP_$*PUD6SfU1yH$PjD|2@Esja)O zMZ7g~X+_&9=fe+Iz`e5I3 z&pouggmzr?R1TdnGI;vUcMJ`Sn>H`aZ!Xh?J5J16H@LYqHgs^u#w_NWg1xTQ#Ro>% z+UB;0RKPo!!UIAA9Z4-@kExTXw;4KKEY8kUbCV6i04!D7C105IuhJgkLugPxMaG8Plbr68c|z=)aja)2(*%gr$PNHNS$ z63+l~4EKG2HiN{1Z@|$F^X3cUWC700d7D+*r%ZzMrKl0H=F|T`WvBC7;y0L zEc=l1q5_@HPZ>*agoCm7un1^xAUVPcUSQ16t5>%CWd^-wKuBVe0mii2fRa9|0-}s^ zh^I65vhkVO^NOJm#yi!B7?qIHe^Ee+eiS@LfFg!)lf1VOGvy@RLOn2nviMwq@L&ir zdD1yPa=eW|r5?xeya#3x!#J!zfdQ}6zzmFxlc4)@h@-){plCac`F#4{RPwzBSn}E; zJ#>hUve`(GQXq#?AWSYsoD}VGr}kRoi%nnBo~ZTOKhKcRGtn@yM5fgSa$g z^NmI~Ou8+a@K|F)d^nHbRe7B*CrBRH>vYg=l~*J1k*L6(2O|R5hr(rQ1oI3@Fvl>C zOp1eXky3;SG4V9m#u834hhZ~eOe7NkmaNsLGJ?ACGX!56K?cXUR0xujlOxIzix}39 zU`nMDL2(4fg#bh7UP5z(S4g|x0`h!{Q1f1p(Qc7XCy|A5BGfzt6QM|tARRD=rCc1v z&@eBUNM}5pM&R*KR+UU4OHY?b2%*J>rwcKRvKTHsOKpG2HBd{v{1kyg3eMlMB3{paC zXBnFf&L&wm9|=r^<07$NqK_m)#K6D}8Mo&=xr2*^o+Rt+9G zigS=!U+qOZIRC{#@wKFK5VTz*@CvP@jqo@)fp!k~NU zAZ*Bs&Y^|i*K}SVquzE2hMPu^!#6{4dwG%I2X~+w_tbU7KxG{XCOcmxz~OwIMCep} zk)ar>K$V!nS6>1Y6#z6)hd+W5sD_Av>Lv2UDE6|X4MJf|3h@oge_)wZDwe`FH~_%2, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAIL_AUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAIL_AUTH \- SMTP authentication address +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. This will be used to +specify the authentication address (identity) of a submitted message that is +being relayed to another server. + +This optional parameter allows co-operating agents in a trusted environment to +communicate the authentication of individual messages and should only be used +by the application program, using libcurl, if the application is itself a mail +server acting in such an environment. If the application is operating as such +and the AUTH address is not known or is invalid, then an empty string should +be used for this parameter. + +Unlike \fICURLOPT_MAIL_FROM(3)\fP and \fICURLOPT_MAIL_RCPT(3)\fP, the address +should not be specified within a pair of angled brackets (<>). However, if an +empty string is used then a pair of brackets will be sent by libcurl as +required by RFC2554. +.SH DEFAULT +NULL +.SH PROTOCOLS +SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.25.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_RCPT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.html b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.html new file mode 100644 index 0000000..3209031 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.html @@ -0,0 +1,62 @@ + + +CURLOPT_MAIL_AUTH man page + + + + +

    NAME

    +

    CURLOPT_MAIL_AUTH - SMTP authentication address

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. This will be used to specify the authentication address (identity) of a submitted message that is being relayed to another server. +

    This optional parameter allows co-operating agents in a trusted environment to communicate the authentication of individual messages and should only be used by the application program, using libcurl, if the application is itself a mail server acting in such an environment. If the application is operating as such and the AUTH address is not known or is invalid, then an empty string should be used for this parameter. +

    Unlike CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT, the address should not be specified within a pair of angled brackets (<>). However, if an empty string is used then a pair of brackets will be sent by libcurl as required by RFC 2554.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SMTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.25.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_MAIL_FROM, CURLOPT_MAIL_RCPT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.pdf b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5afbd9755ba614a0d29c1e6a20e9fd8e1f3f62db GIT binary patch literal 4377 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 b{+=U+8rjSwW+H7tV+&c}ONd{1jEwdluSyaj literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 new file mode 100644 index 0000000..bf7160e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAIL_FROM 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAIL_FROM \- SMTP sender address +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. This should be used +to specify the sender's email address when sending SMTP mail with libcurl. + +An originator email address should be specified with angled brackets (<>) +around it, which if not specified will be added automatically. + +If this parameter is not specified then an empty address will be sent to the +mail server which may cause the email to be rejected. +.SH DEFAULT +blank +.SH PROTOCOLS +SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_MAIL_RCPT "(3), " CURLOPT_MAIL_AUTH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.html b/docs/libcurl/opts/CURLOPT_MAIL_FROM.html new file mode 100644 index 0000000..f34a2fc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.html @@ -0,0 +1,62 @@ + + +CURLOPT_MAIL_FROM man page + + + + +

    NAME

    +

    CURLOPT_MAIL_FROM - SMTP sender address

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. This should be used to specify the sender's email address when sending SMTP mail with libcurl. +

    An originator email address should be specified with angled brackets (<>) around it, which if not specified will be added automatically. +

    If this parameter is not specified then an empty address will be sent to the mail server which may cause the email to be rejected.

    DEFAULT

    +

    blank

    PROTOCOLS

    +

    SMTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_MAIL_RCPT, CURLOPT_MAIL_AUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.pdf b/docs/libcurl/opts/CURLOPT_MAIL_FROM.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d24fcefe41076d7ee8416b828c45658c2190e21 GIT binary patch literal 3879 zcmb_fc~leE8h>u6QSsF(uj-+WCEeV(WL?DY_J++B=bvryKT>m>%Gml2c|VO9vT5$V(c;N>){M={u%?%U zU9tSQ_2Ja!DtG?$^9d38pL~*ArFwF0YF@u}G3Q#M=9@>~y?c7`{)FmVGg``G$_F%! zyLz~!uhiYP)U^FqOHhSR#lcABn2!oKrtrY3@vgRy5u5BXPe96zy6Jte93;?)_WM-|V^JDbqBVary(szuLAD&wM01unVK z|NEu&X&V1tA4V-P%=`SEypo;%bNu*g5Rrdo>ad^BC~kz?Qd>7I7x}g{oR~6X-RymX zH0eL%2Q2fe`fDE4G_Ue$8~RJ8U~zH$MFd>j$1|`EC6As_~go_G@Y-L%nF7*>b?W*x7 zp6X2vIpNxw(7n(>wv>jGBd!T9e?4Gf#iL^U_|sndO1}#@C=1@OA}ad(RYAPm<@FWU z-=1IO_rV(x^zV`q=dtG*lKw`b$&-uY{`ytV$0(|6LA zlKK@}_0q%N6wEtpR0phVSW`5hIKdS-|B&tc!(~e@);KR25-%Mse0pEJdv0CL{`7vK z(&;loi#6p-${zd1zW=7%C-&1`KV-i9abS3eb?~~!`*Mo1LW_&Obt68rcVn*_q+sjR z)?nAjaLX?~*{u%7{Zr3&q*uDOG(ILL* zSnWk8*SGm-Y{-}V#YMA{sz&)d8I>~d;4Sy08CN%^yE4w)Gz^~AzJ5gI6S|lzPrR^v zm4zI5e`8(q?Lqv(V?Vgp7<)^YTY4>W=P80tQ2n}muj`)`_xo?&@YnA$o4+hgKDW@^ zqG}0kx|Fy#C~HOg_{Zmd{_5+zww?LI-B+dqC6Uw`prIosoa~?1{ujS~lo=;YUN{0f7Q$HIV*jJ4SjzFzL|yP^$hPBf3}(S$9d079 z5XucDA>ddn7eg|UAejT}DF%QYga9rYCmBe{A|W8-4$4UzaR8HT&LfJl3V}!%1;kO*^8sKJ)_`xI(E+h=tLFfc*FV-o2mAtUz(L64p#y@W z2$KU!;;{bfImr;v;AB;H6J@n~k-I}ugE5$uvUIBOdauJ7%mhv#w1d!PTl%7cu4{1M znK3#DRja*DdT!-4rI&J8IenKJ&ow(wYuz|4Q4qgal zHF+-Y2^$BFbEYzEuGm`vCptsL>U*^UJ!Qkl?ixZ#@Lmz51wsWLZ~j1|=hUl`H3oOe z!CJy>#z75$q$hDu5dxbD4k{JGHiC3IlDmBJ#I(DH&S-btVzw^2^JPVaB8gh--`my7Qb z@+sN^qjI?%Mg*`xzylmSM>fe|ZXW3v2kdzqA!a`pBOQE?PkbX~gNfNN%17W%Lt1bh zny@njMMA7$ER}LHDz4K>m=qG3BsEne!gxlrAeD!rxS5B5#goeAIF8G4vq_G3nzMIv z^96h002ma4IDnl3G_=WS#Ay{bJSG|nPoo@6hkZ!SMd;Qnt70Au2qW}`>4TBQ! zD0HBH&DmN2M`{6rig^giLu3X-u0Ul91euJW;I9&Xi4!Crh-$!y21d63L9`oZH&Kc< zfRa#KXv%DcvT)kLW&-641bktKMUR-5O9`_%>K2{X9WTtT)BX2|*=%e{vwR9IWpvsA z&PHngpMrVaIW`%eJ8XB-R!?`Bj4*D+S>GHW%_#8LWK@_b+J=GJ#_V=0VZ_*yhe1tp z)k<*45R4U9dwMU}%5-e31lvmrD@IyWTsO~zn=z-A;i}_F54Wi!8&*QyvGK^kUAkV8 zD-Q|uHb@)%968h+=ryg^r>F}q!K0+&x>zs-yB8+_7VW)g+}YPbuWIXw;6-M;1O%Mz zlOU~vZ88K!WQZJy)QVzE#R znISI?70JMx&Mt`TqzMIbaH$t*s7TP0CXn=?A>d9uWCfxge5hCiMyHo-NCiE7K_%jz zd}0|G2VRnupgn0a1dJaq@yR4$DCndyG)7o)8vGE2;5Z@&2eE>{L`H$3hke5#IFd9| z5OAKIuOhWjl2W4;1&4%%1Z#rD(vT3DMkA93%Y-3vfkY%`Pt_31 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 new file mode 100644 index 0000000..95665e7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 @@ -0,0 +1,60 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAIL_RCPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAIL_RCPT \- list of SMTP mail recipients +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT, + struct curl_slist *rcpts); +.SH DESCRIPTION +Pass a pointer to a linked list of recipients to pass to the server in your +SMTP mail request. The linked list should be a fully valid list of \fBstruct +curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to +create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list. + +When performing a mail transfer, each recipient should be specified within a +pair of angled brackets (<>), however, should you not use an angled bracket as +the first character libcurl will assume you provided a single email address +and enclose that address within brackets for you. + +When performing an address verification (VRFY command), each recipient should +be specified as the user name or user name and domain (as per Section 3.5 of +RFC5321). + +When performing a mailing list expand (EXPN command), each recipient should be +specified using the mailing list name, such as "Friends" or "London-Office". +.SH DEFAULT +NULL +.SH PROTOCOLS +SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0. The VRFY and EXPN logic was added in 7.34.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_AUTH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.html b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.html new file mode 100644 index 0000000..a37fcd5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.html @@ -0,0 +1,67 @@ + + +CURLOPT_MAIL_RCPT man page + + + + +

    NAME

    +

    CURLOPT_MAIL_RCPT - list of SMTP mail recipients

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT, +   struct curl_slist *rcpts); +

    +

    DESCRIPTION

    +

    Pass a pointer to a linked list of recipients to pass to the server in your SMTP mail request. The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. +

    When performing a mail transfer, each recipient should be specified within a pair of angled brackets (<>), however, should you not use an angled bracket as the first character libcurl will assume you provided a single email address and enclose that address within brackets for you. +

    When performing an address verification (VRFY command), each recipient should be specified as the user name or user name and domain (as per Section 3.5 of RFC 5321). +

    When performing a mailing list expand (EXPN command), each recipient should be specified using the mailing list name, such as "Friends" or "London-Office".

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SMTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0. The VRFY and EXPN logic was added in 7.34.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAIL_FROM, CURLOPT_MAIL_AUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.pdf b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bc2e86f8a92513e8885a4af2fa7ae330bc9d0a8e GIT binary patch literal 4289 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 new file mode 100644 index 0000000..2a41b37 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 @@ -0,0 +1,59 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAXCONNECTS \- maximum connection cache size +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXCONNECTS, long amount); +.SH DESCRIPTION +Pass a long. The set \fIamount\fP will be the maximum number of simultaneously +open persistent connections that libcurl may cache in the pool associated with +this handle. The default is 5, and there isn't much point in changing this +value unless you are perfectly aware of how this works and changes libcurl's +behaviour. This concerns connections using any of the protocols that support +persistent connections. + +When reaching the maximum limit, curl closes the oldest one in the cache to +prevent increasing the number of open connections. + +If you already have performed transfers with this curl handle, setting a +smaller \fICURLOPT_MAXCONNECTS(3)\fP than before may cause open connections to +get closed unnecessarily. + +If you add this easy handle to a multi handle, this setting is not +acknowledged, and you must instead use \fIcurl_multi_setopt(3)\fP and the +\fICURLMOPT_MAXCONNECTS\fP option. +.SH DEFAULT +5 +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLMOPT_MAXCONNECTS "(3), " CURLOPT_MAXREDIRS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.html b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.html new file mode 100644 index 0000000..3edcfba --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.html @@ -0,0 +1,63 @@ + + +CURLOPT_MAXCONNECTS man page + + + + +

    NAME

    +

    CURLOPT_MAXCONNECTS - maximum connection cache size

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXCONNECTS, long amount);

    DESCRIPTION

    +

    Pass a long. The set amount will be the maximum number of simultaneously open persistent connections that libcurl may cache in the pool associated with this handle. The default is 5, and there isn't much point in changing this value unless you are perfectly aware of how this works and changes libcurl's behaviour. This concerns connections using any of the protocols that support persistent connections. +

    When reaching the maximum limit, curl closes the oldest one in the cache to prevent increasing the number of open connections. +

    If you already have performed transfers with this curl handle, setting a smaller CURLOPT_MAXCONNECTS than before may cause open connections to get closed unnecessarily. +

    If you add this easy handle to a multi handle, this setting is not acknowledged, and you must instead use curl_multi_setopt(3) and the CURLMOPT_MAXCONNECTS option.

    DEFAULT

    +

    5

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLMOPT_MAXCONNECTS, CURLOPT_MAXREDIRS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.pdf b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1cc92dbc59cf8607f49d6467162db9dca5a31557 GIT binary patch literal 4258 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 SS_ntb03!~?&o3-mO8F1jmf1A` literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 new file mode 100644 index 0000000..e0ce066 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 @@ -0,0 +1,52 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAXFILESIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAXFILESIZE \- maximum file size allowed to download +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE, long size); +.SH DESCRIPTION +Pass a long as parameter. This allows you to specify the maximum \fIsize\fP +(in bytes) of a file to download. If the file requested is found larger than +this value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will +be returned. + +The file size is not always known prior to download, and for such files this +option has no effect even if the file transfer ends up being larger than this +given limit. This concerns both FTP and HTTP transfers. + +If you want a limit above 2GB, use \fICURLOPT_MAXFILESIZE_LARGE(3)\fP. +.SH DEFAULT +None +.SH PROTOCOLS +FTP and HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_MAXFILESIZE_LARGE "(3), " CURLOPT_MAX_RECV_SPEED_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.html b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.html new file mode 100644 index 0000000..306cc59 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.html @@ -0,0 +1,62 @@ + + +CURLOPT_MAXFILESIZE man page + + + + +

    NAME

    +

    CURLOPT_MAXFILESIZE - maximum file size allowed to download

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE, long size);

    DESCRIPTION

    +

    Pass a long as parameter. This allows you to specify the maximum size (in bytes) of a file to download. If the file requested is found larger than this value, the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. +

    The file size is not always known prior to download, and for such files this option has no effect even if the file transfer ends up being larger than this given limit. This concerns both FTP and HTTP transfers. +

    If you want a limit above 2GB, use CURLOPT_MAXFILESIZE_LARGE.

    DEFAULT

    +

    None

    PROTOCOLS

    +

    FTP and HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_MAXFILESIZE_LARGE, CURLOPT_MAX_RECV_SPEED_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.pdf b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b434b961829160eb3b0f8d0bd510e5d460c64fa2 GIT binary patch literal 4081 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAXFILESIZE_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE_LARGE, + curl_off_t size); +.SH DESCRIPTION +Pass a curl_off_t as parameter. This allows you to specify the maximum +\fIsize\fP (in bytes) of a file to download. If the file requested is found +larger than this value, the transfer will not start and +\fICURLE_FILESIZE_EXCEEDED\fP will be returned. + +The file size is not always known prior to download, and for such files this +option has no effect even if the file transfer ends up being larger than this +given limit. This concerns both FTP and HTTP transfers. +.SH DEFAULT +None +.SH PROTOCOLS +FTP and HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.11.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAXFILESIZE "(3), " CURLOPT_MAX_RECV_SPEED_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.html b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.html new file mode 100644 index 0000000..fb97d1e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.html @@ -0,0 +1,65 @@ + + +CURLOPT_MAXFILESIZE_LARGE man page + + + + +

    NAME

    +

    CURLOPT_MAXFILESIZE_LARGE - maximum file size allowed to download

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE_LARGE, +   curl_off_t size); +

    +

    DESCRIPTION

    +

    Pass a curl_off_t as parameter. This allows you to specify the maximum size (in bytes) of a file to download. If the file requested is found larger than this value, the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. +

    The file size is not always known prior to download, and for such files this option has no effect even if the file transfer ends up being larger than this given limit. This concerns both FTP and HTTP transfers.

    DEFAULT

    +

    None

    PROTOCOLS

    +

    FTP and HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.11.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAXFILESIZE, CURLOPT_MAX_RECV_SPEED_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.pdf b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ab472129d203c76a883c62db46a2ea18d970c43 GIT binary patch literal 4083 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 new file mode 100644 index 0000000..34608c3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 @@ -0,0 +1,64 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAXREDIRS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAXREDIRS \- maximum number of redirects allowed +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXREDIRS, long amount); +.SH DESCRIPTION +Pass a long. The set number will be the redirection limit \fIamount\fP. If +that many redirections have been followed, the next redirect will cause an +error (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the +\fICURLOPT_FOLLOWLOCATION(3)\fP is used at the same time. + +Setting the limit to 0 will make libcurl refuse any redirect. + +Set it to -1 for an infinite number of redirects. +.SH DEFAULT +-1, unlimited +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/"); + + /* enable redirect following */ + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + /* allow three redirects */ + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FOLLOWLOCATION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.html b/docs/libcurl/opts/CURLOPT_MAXREDIRS.html new file mode 100644 index 0000000..5fe7247 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.html @@ -0,0 +1,75 @@ + + +CURLOPT_MAXREDIRS man page + + + + +

    NAME

    +

    CURLOPT_MAXREDIRS - maximum number of redirects allowed

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXREDIRS, long amount);

    DESCRIPTION

    +

    Pass a long. The set number will be the redirection limit amount. If that many redirections have been followed, the next redirect will cause an error (CURLE_TOO_MANY_REDIRECTS). This option only makes sense if the CURLOPT_FOLLOWLOCATION is used at the same time. +

    Setting the limit to 0 will make libcurl refuse any redirect. +

    Set it to -1 for an infinite number of redirects.

    DEFAULT

    +

    -1, unlimited

    PROTOCOLS

    +

    HTTP(S)

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/"); +

      /* enable redirect following */ +   curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); +

      /* allow three redirects */ +   curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FOLLOWLOCATION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.pdf b/docs/libcurl/opts/CURLOPT_MAXREDIRS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a00bda4a8747ed801832d1780d7b4a9a0fcf8367 GIT binary patch literal 4129 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 new file mode 100644 index 0000000..e73ad22 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_RECV_SPEED_LARGE, + curl_off_t speed); +.SH DESCRIPTION +Pass a curl_off_t as parameter. If a download exceeds this \fIspeed\fP +(counted in bytes per second) on cumulative average during the transfer, the +transfer will pause to keep the average rate less than or equal to the +parameter value. Defaults to unlimited speed. + +This option doesn't affect transfer speeds done with FILE:// URLs. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +All but file:// +.SH EXAMPLE +.SH AVAILABILITY +Added in 7.15.5 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAX_SEND_SPEED_LARGE "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.html b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.html new file mode 100644 index 0000000..aa54256 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.html @@ -0,0 +1,65 @@ + + +CURLOPT_MAX_RECV_SPEED_LARGE man page + + + + +

    NAME

    +

    CURLOPT_MAX_RECV_SPEED_LARGE - rate limit data download speed

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_RECV_SPEED_LARGE, +   curl_off_t speed); +

    +

    DESCRIPTION

    +

    Pass a curl_off_t as parameter. If a download exceeds this speed (counted in bytes per second) on cumulative average during the transfer, the transfer will pause to keep the average rate less than or equal to the parameter value. Defaults to unlimited speed. +

    This option doesn't affect transfer speeds done with FILE:// URLs.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    All but file://

    EXAMPLE

    +

    AVAILABILITY

    +

    Added in 7.15.5

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAX_SEND_SPEED_LARGE, CURLOPT_LOW_SPEED_LIMIT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.pdf b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ffd933ac46568ecd9159c0a2625239c38582f9d5 GIT binary patch literal 3970 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_SEND_SPEED_LARGE, + curl_off_t maxspeed); +.SH DESCRIPTION +Pass a curl_off_t as parameter with the \fImaxspeed\fP. If an upload exceeds +this speed (counted in bytes per second) on cumulative average during the +transfer, the transfer will pause to keep the average rate less than or equal +to the parameter value. Defaults to unlimited speed. + +This option doesn't affect transfer speeds done with FILE:// URLs. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +All except file:// +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.15.5 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAX_RECV_SPEED_LARGE "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.html b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.html new file mode 100644 index 0000000..ed9c19a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.html @@ -0,0 +1,65 @@ + + +CURLOPT_MAX_SEND_SPEED_LARGE man page + + + + +

    NAME

    +

    CURLOPT_MAX_SEND_SPEED_LARGE - rate limit data upload speed

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_SEND_SPEED_LARGE, +   curl_off_t maxspeed); +

    +

    DESCRIPTION

    +

    Pass a curl_off_t as parameter with the maxspeed. If an upload exceeds this speed (counted in bytes per second) on cumulative average during the transfer, the transfer will pause to keep the average rate less than or equal to the parameter value. Defaults to unlimited speed. +

    This option doesn't affect transfer speeds done with FILE:// URLs.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    All except file://

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.15.5

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAX_RECV_SPEED_LARGE, CURLOPT_LOW_SPEED_LIMIT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.pdf b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b43918770b5699e773c114c7cd0656ab59bf214 GIT binary patch literal 4011 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 LP*|8@vJv_Z@l12I literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3 new file mode 100644 index 0000000..9fb13b3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NETRC.3 @@ -0,0 +1,73 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NETRC 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NETRC \- request that .netrc is used +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level); +.SH DESCRIPTION +This parameter controls the preference \fIlevel\fP of libcurl between using +user names and passwords from your \fI~/.netrc\fP file, relative to user names +and passwords in the URL supplied with \fICURLOPT_URL(3)\fP. + +libcurl uses a user name (and supplied or prompted password) supplied with +\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP in preference to any of +the options controlled by this parameter. + +Only machine name, user name and password are taken into account (init macros +and similar things aren't supported). + +libcurl does not verify that the file has the correct properties set (as the +standard Unix ftp client does). It should only be readable by user. + +\fIlevel\fP should be set to one of the values described below. + +.IP CURL_NETRC_OPTIONAL +The use of your \fI~/.netrc\fP file is optional, and information in the URL is +to be preferred. The file will be scanned for the host and user name (to +find the password only) or for the host only, to find the first user name and +password after that \fImachine\fP, which ever information is not specified in +the URL. + +Undefined values of the option will have this effect. +.IP CURL_NETRC_IGNORED +The library will ignore the file and use only the information in the URL. + +This is the default. +.IP CURL_NETRC_REQUIRED +This value tells the library that use of the file is required, to ignore the +information in the URL, and to search the file for the host only. +.SH DEFAULT +CURL_NETRC_IGNORED +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NETRC.html b/docs/libcurl/opts/CURLOPT_NETRC.html new file mode 100644 index 0000000..777f4ff --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NETRC.html @@ -0,0 +1,73 @@ + + +CURLOPT_NETRC man page + + + + +

    NAME

    +

    CURLOPT_NETRC - request that .netrc is used

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level);

    DESCRIPTION

    +

    This parameter controls the preference level of libcurl between using user names and passwords from your ~/.netrc file, relative to user names and passwords in the URL supplied with CURLOPT_URL. +

    libcurl uses a user name (and supplied or prompted password) supplied with CURLOPT_USERPWD or CURLOPT_USERNAME in preference to any of the options controlled by this parameter. +

    Only machine name, user name and password are taken into account (init macros and similar things aren't supported). +

    libcurl does not verify that the file has the correct properties set (as the standard Unix ftp client does). It should only be readable by user. +

    level should be set to one of the values described below. +

    +

    CURL_NETRC_OPTIONAL +

    The use of your ~/.netrc file is optional, and information in the URL is to be preferred. The file will be scanned for the host and user name (to find the password only) or for the host only, to find the first user name and password after that machine, which ever information is not specified in the URL. +

    Undefined values of the option will have this effect. +

    CURL_NETRC_IGNORED +

    The library will ignore the file and use only the information in the URL. +

    This is the default. +

    CURL_NETRC_REQUIRED +

    This value tells the library that use of the file is required, to ignore the information in the URL, and to search the file for the host only.

    DEFAULT

    +

    CURL_NETRC_IGNORED

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_USERPWD, CURLOPT_USERNAME,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NETRC.pdf b/docs/libcurl/opts/CURLOPT_NETRC.pdf new file mode 100644 index 0000000000000000000000000000000000000000..05b8eea13feeb3c8278afeafa41fa31e1018755e GIT binary patch literal 4768 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NETRC_FILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NETRC_FILE \- file name to read .netrc info from +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file); +.SH DESCRIPTION +Pass a char * as parameter, pointing to a zero terminated string containing +the full path name to the \fIfile\fP you want libcurl to use as .netrc +file. If this option is omitted, and \fICURLOPT_NETRC(3)\fP is set, libcurl +will attempt to find a .netrc file in the current user's home +directory. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.9 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_NETRC "(3), " CURLOPT_USERNAME "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.html b/docs/libcurl/opts/CURLOPT_NETRC_FILE.html new file mode 100644 index 0000000..8b05da0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.html @@ -0,0 +1,60 @@ + + +CURLOPT_NETRC_FILE man page + + + + +

    NAME

    +

    CURLOPT_NETRC_FILE - file name to read .netrc info from

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file);

    DESCRIPTION

    +

    Pass a char * as parameter, pointing to a zero terminated string containing the full path name to the file you want libcurl to use as .netrc file. If this option is omitted, and CURLOPT_NETRC is set, libcurl will attempt to find a .netrc file in the current user's home directory.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.9

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_NETRC, CURLOPT_USERNAME,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.pdf b/docs/libcurl/opts/CURLOPT_NETRC_FILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e14615dc1dd4fd2ca84ea0c2f68792efbdd45ee0 GIT binary patch literal 3990 zcmb_fdsGuw8sF}z6bDujr@_@Id3 z17B4mx{6xGN3~V)S*xx`q<8{Sb*Zu*beD?tfyKAz`rJDq2m)<)&+-0~JKz1@-~E2~ zORz?z=3+b{6ny5F9wj1gTU) zHpWWgX2`Lj@Y6i{n%eKxzc;0oy`I_HyEUu+c2k!fnvjzfmSsG{#Hr z`9>|jXmJKVY1;L}-yWX-SZ~oqe6_nNJZH*}_Y2lnZF(@k9NXLI?FG9(9;ZaATd)+HvIHt+i|HhxTY?}A|#o7E~ z&V|HzTdU7n#?LK$Jo*c4qG7rBvA|DWR1|9W?-_P`^RTaeT9LRjbyd=?QP-+R9#0QQ z&|DIwGq(hM=PgEaWBjTCPqlA8eC^uhk6utBD?^eauO>bm%`Fab`2-%WO|@NV@jH0A zwe&RI;DzQ6{6qfzjTiGbk3H>$6+714iXU3j6z%V#P33c~j~5*9U(&DP%i||1y$5Xf z-Y9V_v3BS=Rw-3W!waHYr6JQ*2b4~v?8}SryD(_-r1eJO z*#b2Fr0==#UTca|m7=xv{!jNJgQ`a0twG4^v5l1xGq$HzQo45F>Ks^{qBpnQp8}DEy=-i?h)+VB+fjGu@e*l<6BEdJ%XoFdJ)Ixyd@sBmp2A4n^ za1eHTXoHa$im<`S5bM7dN`Zj}JFBvjC~L}tv~7}+ID?yLW4j8E_i-eH6W|2Ky4se! ztDqwc2uaYy!I)C%anc=?$COqAv2xmu5Zqz5pJFITKYNa7Wst0GBZZ`0Bv=lQL#bPcMaqJ2G*72Fbu_q>-{HIQNd7 zdg!WI7d7W zG;FZqW-^<$X22Lv%mFH`gh8$aZP=y|d?`5T43jBGknHSiUbcWoTa5@NlgSX2kMQ|i zz`?cUSQy;Fwb+IOdu~Ul$#2ChHlEujo}M-%)MNzXp-8(S6$r;lWik|Pfmy?N8f|A3 z9J`$&KgaICT9B4&DjtZcpl8<5{ zE{btcX(B3n-z;RMA8qLEM@1#>{5+O0#@&6|J|M0sKd+{+|o;zH3bA z-#VOWx0>ADLFf_EM6$lwK$$V%F`<_mXsa0qcN@>l1Xzr-R~`X(lA{a*hYZD-NTs{? z#+jJ5jfrA=Np8X|Mg_;gB}fBqH!&P#lEuwUv{l1IDcd$~Iiy2Z54CcWKyQPxA#agG z3Bm7ay+1`Aa0%W@1t*&YL$G^yFk$Ba4;r`k^~j#uIur~FY?pw9vwbpBC1;xq#ZW0K z!=-Dx8uz^1O9S%=7jO?jjLf^jZ4l8MZP#6!MF0>&_?PgNdXIpGevR4efy@ z=uQ($y2Xo0CE!u+VnZebb4)vpvEr18w1WS=FruS!Nsv<*43spO*+BKRFcNJs&@gbG zohYMKaB`TMKQ2NXsg|J, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_DIRECTORY_PERMS, + long mode); +.SH DESCRIPTION +Pass a long as a parameter, containing the value of the permissions that will +be assigned to newly created directories on the remote server. The default value is +\fI0755\fP, but any valid value can be used. The only protocols that can use +this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP. +.SH DEFAULT +0755 +.SH PROTOCOLS +SFTP, SCP and FILE +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_NEW_FILE_PERMS "(3), " CURLOPT_UPLOAD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.html b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.html new file mode 100644 index 0000000..401b885 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.html @@ -0,0 +1,64 @@ + + +CURLOPT_NEW_DIRECTORY_PERMS man page + + + + +

    NAME

    +

    CURLOPT_NEW_DIRECTORY_PERMS - permissions for remotely created directories

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_DIRECTORY_PERMS, +   long mode); +

    +

    DESCRIPTION

    +

    Pass a long as a parameter, containing the value of the permissions that will be assigned to newly created directories on the remote server. The default value is 0755, but any valid value can be used. The only protocols that can use this are sftp://, scp://, and file://.

    DEFAULT

    +

    0755

    PROTOCOLS

    +

    SFTP, SCP and FILE

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_NEW_FILE_PERMS, CURLOPT_UPLOAD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.pdf b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..75aa45ffddfc38b42898b185f084e178fb8e1ca7 GIT binary patch literal 4091 zcmb_fc~}$I7I!T;)D;w@N=Ff+Vlp$?6G;>jK*T5ntRi9=k_kkTnJ}41M5`5X`CMyJ z#9dJYi~3ZQDk_3}3M%ST+}Gz?_x;uPQ0luAf*{b>_rA~jPwt$1_H)ngp7=$mL%0}E z2>De!U6KQdU=*ejCP4uK$Vh@rWRhSpplFd0qlqDC7zr`q4521;l%7y3AuB@@xEZpq znf=`}a+B1fc75K?Ju~9Z?<*?vnmpE@7(a;U-|F0fT^OQBci#pWAO@2S& zkFwD-hFcArEMjPAQmd5K;=GLOTgN^uk6K0*-g~N$_tTz9cmXS-_6|Ad@8|zIbkD4S z)CW}Y%|3%iJZyC-_i*vJQJ%Mj+2K(emeQy04Ds@etXMbqMhMf+ZBlsp!e4^AYLEN= z`<8OhrZ_Dpm)Skcr-){DX%2-%9gDgCByda7L1lh!4Dwn&;*Cen#nBzo#49^46P%g1 zTa`ZF<)2I?Q|oczq2DP!vwm2gF*Vt3FW6?jR=@8?9(>#P?~ijmPPEAxUxq)}2UQR2 zn_oGG&-IP=yI(kXowl>v3ek_k@jGhoF8wL$_Fg3A@}}8cJ$dF(w*^U(p0}_a{*O@T+#q-ElO68MTn8K+Sd^Ck?(n+x>j!(d#qL~iRk`M0 zZ!U^RMeF-vomb}U?uf2w_f4B?rxr|`I^H|^*TPqd@S7KdvE0q>mDf^;tkNv$s>=li z?f&idIdP974=gX!Z@;PCe{;3yWG~kZw@#K++Q|` z?{(caWS;BTBWQY;_Hm=)1H0tK)p(XY)vph_;&cA2=k8+2v#oqX?Bek8`H2M^SM9GZ ziahySLhDsGa|#|+&2T%Kf)$pPRNVb2+CMQV>PqK#bHmZE=cq=;(#WhWFRt5e`OGTf za1WS%_BkZrd>=8RUz^NMdE33V6dtd5Wb(e*>z%9XUQ=a?&_DB8kE{u+d}sEVTWftz zF3SCO#|rD)qnmqF6{r>+H$9U)xzE+_9Q{~zWrF($&C8y-X)hi>X}hg|bnoBa=Vbhl zwxxJS$4hU{yeZwY@0G2j!}*@Rz2D><`#AM_jdE4hcY&SnWz4?aVc@`vp|`{GOfIQ6 zqQ@>TylemI^rPtNTgb%)G4WR)r|WxWp3E$<_Yz(=|EzqPJw;q}e@sRD<&WpZq#;Yv z`h|MATSv-Ve92PHqv}4PUoTGSe&e|z{Y1ocX^p$`W9!;Ob3+MI?}RF_W8sYjHTD<7 zq$0>k6E;9!^b`w$MBs@8q9OD~JczQxu_!ne$waVJ$d7{%EyVyJgi*jn6C?u*Sd;{0 z!b;g_9bpCd89`IJD1wPa0K&pZG+}3eT(F%9jdF-$Se-}+1;jDF;{!k{q5|JQqZMYM zSPKD?(?8Zk9W(=Nz(LsIp%q5Lje08_3$gxdp*R?5u(2u|iL$1gs9qY5olZKUa+=agAXZM>5P~Dj`cn*rFgB@LL@R@2 zbsH%pZ6d*PI3n>;VAMHMfv{wdToSxXMlun`904IwwgiT)BpWku zu|AQG(?;p|B!{St1_J@=2?`hsVL}u!7~>k`SRY$m$Dlb*Q zqv%8glgVTV%18KoF5uu=r;rS8=aN=mV9()*aoi^{(#muA#M4n`#5fMYcqmeDNDacF zjTXj8kuYl*PoQj!f@8B8^>VQc6$)`3&ea+C30w>#3|tf}t{y`rB22&+O2meGbCyPK zer69G0D}UM2e6X^fYIA@1g+qNMvR0*lPD`wXCIdFP%#H_hX19!0<~#53!tFRGz0)1 zxd!y0VTu~SqmqweA})$?QE4ASWh;U4_Wa#$;rBNp8Z)L&q!>fJ^X5DmbYu7=qpB6A3#2IMKMiuLrc$)&s$Wz;+2p zINK)!)N;1TPz;r#GEC~|FAj=w02}DTzu<6o!+@6hW#FeL-A)q*2!$~*!~#~`g2f_{ zKm;3LCk=Q2UPpGpWIYYM7~pmKoQ4TS;6ZOf, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NEW_FILE_PERMS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_FILE_PERMS, + long mode); +.SH DESCRIPTION +Pass a long as a parameter, containing the value of the permissions that will +be assigned to newly created files on the remote server. The default value is +\fI0644\fP, but any valid value can be used. The only protocols that can use +this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP. +.SH DEFAULT +0644 +.SH PROTOCOLS +SFTP, SCP and FILE +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_NEW_DIRECTORY_PERMS "(3), " CURLOPT_UPLOAD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.html b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.html new file mode 100644 index 0000000..da31f73 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.html @@ -0,0 +1,64 @@ + + +CURLOPT_NEW_FILE_PERMS man page + + + + +

    NAME

    +

    CURLOPT_NEW_FILE_PERMS - permissions for remotely created files

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_FILE_PERMS, +   long mode); +

    +

    DESCRIPTION

    +

    Pass a long as a parameter, containing the value of the permissions that will be assigned to newly created files on the remote server. The default value is 0644, but any valid value can be used. The only protocols that can use this are sftp://, scp://, and file://.

    DEFAULT

    +

    0644

    PROTOCOLS

    +

    SFTP, SCP and FILE

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_NEW_DIRECTORY_PERMS, CURLOPT_UPLOAD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.pdf b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4be08714a0e7a390443319f22455b028e74fbb5e GIT binary patch literal 4053 zcmb_fc~}!?8W*dgQ^i|c&ygxYC7GFAB$0##0tgbs016_OVKRY%B$LieB)Ut*TM_SC zRIuw=wBG1i1Vp?mTCYb}6tNy%4sF%0MJ?*O--I9tbi4aJ&Ody4zxO_V-^-{-ZLkm% zNug0^e_F8xlEElUC#6EZzDPJ}N#;^uIiTo~V9Lai42%SuaE{cH1Z^NS8i?f>5;sHk zyakghEf3_qGHy)iRU5edgwfvHMlJ1lNBgn;#(`<^H_a>iE%X?>1d97t7&G^E;Oy;h zD@Fu`mP+FXK3$f#p1s(;XMK;};k{QOZ`PZZE#1EKtJHa$1P^lkuX|h_er`a<;>3A^ zw~L1@lP~nh8F8bg;@PA_GR4{XTWhZuN)Y9=!*Pj*HBf}ejTJ;w8X>2i7v5K7f+r}EmAGqeAugNb|eXHR=h40+O3(J^7jm7MeE?{_ngs5)AIUde^k zx;)>NXgiW8+CnLE;y1fQA8L5(x+2K?#SXWZ6@B;oyHoMC$sRXkS*ykjJ5LuEW_?So znJiu$NSOQA;<*i_kE^`uB>K1wuLAYz&&VsM;#T?pqgok+3^;h;3HC$wvy80rkoqUM zdu~mk|Gv1dwl3dBawbR?s{poEVFVXU=WuxbY z)_Ij2?f$2MGmeT*4$ZtE?{n~Szme4=McZD!QdK3Ud3Va$d7*2?mz}+i?JEB|yu5_$ z;(0F#`kdtwW8BGM<2yb~Mk8Zxxv|Ln5G=i6(l^6%t1h{_3#OONvFy8EJ918Kz#7r& zdu!^F!~b3|!D{bd8gF{EAc^q}O@RDGTrhFTwE=fO%462P3=?Xft{Zp$J)NHJZCn|Hsy-F=m?}>>h z-E*I^lx?K65Sza3Z z#k|vsYk3ze9nDD17x?U3KaI^WyFPj~pz_<^#?9oeMFTAndm{=?^uOyC;k#`p8*$+Lm38xil;$(O ze_5F`j>{@u7fXzpPZRiw2N&}*<_s*%FSop?nO`35Z+PvtZ?;PhVG2T83{La`CmykQ zoZ|mtm=uMaG-)%MMbEU7NF<(2B0ADQ;Q_QAjz__@OeupEQgH%==xGjM8;k-jhO}_7 zgaC6T#%g$iE@ZySffZV4a70A;|D-VBoO=t z8d;b}S3LwsPXBlljc5zB0S94+hb)XtpbRV=5Apu%p#&Icu<R?QxaXRUU%4tgP1MzbD<`5iVHr-+J(Ku(x z*UxUni8PXflgMPsq82eEo1R zf~3%nTZKl)qQJr=OQ<~p_2I!DJcC_jH(Sl17h${EWMNfywZI{w0%x9#2w(>bm!=lP z>LOu|rcG%S2a82Y5hlbW-msCu&15>wq`{a-E&wVSgHfdiW7wz={89^2IL@jY&OcEk}FZE6en;YVH76`F^n_{QSb@HnB0I7WRe72H<`1x zaPvKT-~t$wfINVc3gC>vMv#nJ5E2;m+O(gFd3(AZEj}3&%NHb;}^fqp_0xZV)mPbHO z3N*gplA|~isd3Dnzlm!+m?(ahR3_Y#tQOdX2GWSzOq@UyV{vdB8mnQVG>r#`9MY_- zomx3aV75Wokax(Tf#47HeKBhWMc3*x6-GOwdM0s zf_, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NOBODY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NOBODY \- do the download request without getting the body +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOBODY, long opt); +.SH DESCRIPTION +A long parameter set to 1 tells libcurl to not include the body-part in the +output when doing what would otherwise be a download. For HTTP(S), this makes +libcurl do a HEAD request. For most other protocols it means just not asking +to transfer the body data. + +Enabling this option means asking for a download but without a body. +.SH DEFAULT +0, the body is transferred +.SH PROTOCOLS +Most +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* get us the resource without a body! */ + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_HTTPGET "(3), " CURLOPT_POST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.html b/docs/libcurl/opts/CURLOPT_NOBODY.html new file mode 100644 index 0000000..abca439 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOBODY.html @@ -0,0 +1,72 @@ + + +CURLOPT_NOBODY man page + + + + +

    NAME

    +

    CURLOPT_NOBODY - do the download request without getting the body

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOBODY, long opt);

    DESCRIPTION

    +

    A long parameter set to 1 tells libcurl to not include the body-part in the output when doing what would otherwise be a download. For HTTP(S), this makes libcurl do a HEAD request. For most other protocols it means just not asking to transfer the body data. +

    Enabling this option means asking for a download but without a body.

    DEFAULT

    +

    0, the body is transferred

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* get us the resource without a body! */ +   curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_HTTPGET, CURLOPT_POST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.pdf b/docs/libcurl/opts/CURLOPT_NOBODY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d58164ad9fddac12783d489ef0a19826cbdc66ef GIT binary patch literal 3883 zcmb_fd0Z1$9tXsaFjc^7bv?(6Krxw_TqH3BkpQAbF+>CvWk@C=l4Rn{1R_d>uBZzi zL92pS6Ztd%xrRe&@@u z7-b|E;|ZZ*jt2!LkO)R$GI=H>mm}i{i-Adj#ekwlB8?`7pkO4@gfoPa(2_brp@3+H zB5*TgUz-!xVEI|>mw9ROj)sL}vLo_JcyZ<28$;_$%g5iUKUoqs%`>;Us(uAGs@J}- zo$JfqT^SDi3xEnp^;v)N^TeZnK zr?pBd*prq zGxojCe4A5L>8UxZ*BJZ`h7Xz1^NX0WF6Ye$bg2Od z@>ANX!}EL&?;QRhDB)?ziCBEvLP=8M65jeAfn)g@5@g`kq?VU*98${13!)A0@a$(op?|0`5@(U zXV)yzPs$4H*sm-wuOhxj@z{&9s~Sg;$EdoVV~aB@g*yuJ3NJ|hy2Hx~I`RC+0=Zhvdnob+O^&Ql+DRcdAPwTc%cl4Kh z88)WyQ1a_c>#{9XcVe;^_jSbT#b(p~>@$koiDlu*;hPfHt)_d`y-4A^t#UhKdsJF{ zk#zHZ*Jrxw_|12VS6*~K8ejQam!+m}k9aM8b7}~FQCC2B^(s12iH4;mS~sot8F=Vy zm;Nt)-H`tGifga0J`~__mV5KQx!`ZGPuzB`X_yS2DDs99`R4(KzQaJ)zUUE0s2nnSr5;zw6`gt=xBF=a=s8kLIsPdcHz=^;#D< zzqAK0m&<_ZT? zmoMDYDeioB2OkcvTrt7DDEsOmm26PWwF_G+HJb|Qo0-{B5ByH9q5B*UK9~CR3f!Z< ze#k59-0mlje?`2Sknq#;$CC#CSn$?B$5~mfND3cmJ#y5HWt3GaG>{Z8kN1^)txhZB9?jbBXS7!n{wwtj%jQzzhu>^9_gsq)UGuuia zF}Q(1RD{lmk0R~xR1_SGq#{@%>;}0Sy&KG=!Z2auIeWD%L5Au?m4mBniYZ%=rO2C=w37fkql;JFgl7Bo{u`L~|zw z+5kYh}HlnO{R}*iR496MVL>gLDxX`Nz2G@ZT7;7f9 z+7A9uLF+XjWI~Jz#uN${Naw9wrqsa@E2nN%j{tpAm~#eELeb;jTRf7*b2t!%(kK}Zf=DiuNv1fT`_@BtWdbJ zRUT@$;@VV#fs+Y?(GtRWc%YI48+9R^$s!f1vW62W#?cuR5t}hyqs>UwN_Cu21tbr} zL6Q?(J8tFbonxAY30fO6I9xq0axlwam)Xr$Gl({9H=8W9%pSsVipap8B_kZz$-<FK<50gt2%2qu+E5tNVc`CP!krDt0h+|ISoLx4Re5M%s%F$>LeV&Z8@Gh&QKFdmAu z7*c}kP(~|bBrPy&7*8f`ObEwjGwNhwDJm4=TAZuZ^OLz4M(DXHSX?2d=L>>G;$&RM zZ!u?W1M>rW-~bpD06&183{T-h|@W@mkarLv6pbshdC??{f7#EdjP^k=)$WSZ@#bhWdM?T^N!3Uz@;F$)VZU2L4 z8_qVOB&7iW5bLxuJxQ5yklVP`YBFkZ zHsukJlN^N{95P16L@1oK7iMCbHzp%nOEME~F@$jJTpgjuZ6=1Jm}GHs>zbosGAf!k zPC2Ai*C%4-B!SunVME?`4g~~%ruF$0wYEzzjY2r-Y%>JA4@W=S=3U*mrLF@$Rn~!E z6th(V9M0BBfKtX58H%A2REkNQ^~FI^4qyXy_y-)WY6$pLy#&6Wopy@QLnw?1A+}*P zFIX%R2}H0ScF{1Q6kLE^u%(42;7h@K=0h4L6o4825se?*j)sCewdWJHcMGehA<6G4GLqc9R{%picTVDJfA5y5, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NOPROGRESS 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NOPROGRESS \- switch off the progress meter +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff); +.SH DESCRIPTION +If \fIonoff\fP is to 1, it tells the library to shut off the progress meter +completely for requests done with this \fIhandle\fP. It will also prevent the +\fICURLOPT_PROGRESSFUNCTION(3)\fP from getting called. + +Future versions of libcurl are likely to not have any built-in progress meter +at all. +.SH DEFAULT +1, meaning it normally runs without a progress meter. +.SH RETURN VALUE +Returns CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_PROGRESSFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.html b/docs/libcurl/opts/CURLOPT_NOPROGRESS.html new file mode 100644 index 0000000..79bde0e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.html @@ -0,0 +1,58 @@ + + +CURLOPT_NOPROGRESS man page + + + + +

    NAME

    +

    CURLOPT_NOPROGRESS - switch off the progress meter

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff);

    DESCRIPTION

    +

    If onoff is to 1, it tells the library to shut off the progress meter completely for requests done with this handle. It will also prevent the CURLOPT_PROGRESSFUNCTION from getting called. +

    Future versions of libcurl are likely to not have any built-in progress meter at all.

    DEFAULT

    +

    1, meaning it normally runs without a progress meter.

    RETURN VALUE

    +

    Returns CURLE_OK.

    SEE ALSO

    +

    CURLOPT_PROGRESSFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.pdf b/docs/libcurl/opts/CURLOPT_NOPROGRESS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d832a1ec69eb12bb7c902540a375bb427f573a2 GIT binary patch literal 3733 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3 new file mode 100644 index 0000000..7e2e719 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NOPROXY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NOPROXY \- disable proxy use for specific hosts +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy); +.SH DESCRIPTION +Pass a pointer to a zero terminated string. The string consists of a comma +separated list of host names that do not require a proxy to get reached, even +if one is specified. The only wildcard available is a single * character, +which matches all hosts, and effectively disables the proxy. Each name in this +list is matched as either a domain which contains the hostname, or the +hostname itself. For example, example.com would match example.com, +example.com:80, and www.example.com, but not www.notanexample.com or +example.com.othertld. +.SH DEFAULT +NULL +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYAUTH "(3), " diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.html b/docs/libcurl/opts/CURLOPT_NOPROXY.html new file mode 100644 index 0000000..f8b9794 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOPROXY.html @@ -0,0 +1,60 @@ + + +CURLOPT_NOPROXY man page + + + + +

    NAME

    +

    CURLOPT_NOPROXY - disable proxy use for specific hosts

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string. The string consists of a comma separated list of host names that do not require a proxy to get reached, even if one is specified. The only wildcard available is a single * character, which matches all hosts, and effectively disables the proxy. Each name in this list is matched as either a domain which contains the hostname, or the hostname itself. For example, example.com would match example.com, example.com:80, and www.example.com, but not www.notanexample.com or example.com.othertld.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.pdf b/docs/libcurl/opts/CURLOPT_NOPROXY.pdf new file mode 100644 index 0000000..5301afc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOPROXY.pdf @@ -0,0 +1,111 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ•VÛnÛF}×W ЇR´á.¯Û”DAœÈ¢+Si »je± H…¤ª¤ß_é?vv—WÛmZ°¤½Í™3g.ŸÀ$LùWƇÑó•÷åȄûѧU›PÄxâ_.„»‘¾CÁcàq‹øÂÃÈx¹^-‚«p³ ®Vãð÷ÑÔ$6„ñÈs‰o™òN¸Á¹gÊ jÓâ¾Þð¡„çÑ­qsgXwcˆOEºQùeSŠ*?Vã)sLbRÇÀIž•0°ø[ø¶5iÙ6aß²XÛ©¡2Êå‰ç+ŽNîH?§¶Í e0µ\ua9ë^rˆÃ­ú¡Ë¹\ïøaÃô`ŠWåöÿ!†ç  m[Ìß5™Þ1%aFRFSÇ"ÿüN¥€]^@yqò5†}^V¥†×÷Œ¢gž…ƒ²q}ƒð®/®‡ž ãß%Yœž¶~’y.ÿ‘ýÏ +3z³ÐnÆ9x¸;µÏöQ¶MÅd¶ï[:˜K slLq…?â9ò•ã7ˆû±\ÎûÄ죞e¹"ænüãc,æ×í±ðj~ýruq^Ë:RÔѲx‚‘«¨5Ή_#Gg\¥c£,!‚cžd•( Êñǟ¢È’,ªÄʪH²{á^Ôß!F]'1Èwx!·JqŒ +u!Å-¹#ƒ +Yt%Tû¨RP„:ˆnIÛ²¼‚B|:%…€”JνËQ¼Û ˆ·Ôµ‰å5êûCmZ藫]e>÷m½ykdÉز]Lfìr•„Z¦1mÆÚS’²Ö¤Ø’ñÔáxÇg†t=ÏÒ/pNÒm[ˆšLf‹Êy·ÁÒ§œv8Œ$U9HÎK$¿?S>YŽC8í‚£(¢ƒ 2m¥/Ë%¬Ë·É¹S#žËi[G—ÊJâ=¢ +ÙC‹iªÓl¨p;y›2éA#睈«dȱGÚȵæØ|įÌlu~ËP×I>€îcjØnó™wÐ)qfã¬I†ï MJJø©@ÚU‘˜2N F¾f‹¢ ´ŽD‚Ö $w›"|ã¬@µVøKC“HÀòÓ_€¤*Eº#ðZU îÛ©* ÔU/‰1&±Im×øŽ²TàŠM8wh½B0#à¬B1i=·©žù)U5rjSYú½^&xŽ6 ¼7ÁëÍåü2ãB3!QŸ°¶ Ý$c]Õë@”P:”n LåƒËàúFT"Iåi7fuIø'"«`/¢#6«(¤¦a0:yȹӝæs˜-®ƒŽç"ižáøç"“]N©M¿{mOŽ©¼‘„_'C«T4mýøï†QƒthO×SÖ Ö}QšÝûá›j´ezˆçv,ù8lZ¶CÜ^8Ò䣜Q¦–GÌñ”:·‰cà(þö”ÃV ø·Ûì¦ò½y8úÿþ¥4ëendstream +endobj +6 0 obj +1445 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +12 0 obj +<> +endobj +13 0 obj +<>stream + + + + + +2015-01-08T09:18:02+01:00 +2015-01-08T09:18:02+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 14 +0000000000 65535 f +0000001769 00000 n +0000003580 00000 n +0000001710 00000 n +0000001550 00000 n +0000000015 00000 n +0000001530 00000 n +0000001834 00000 n +0000002009 00000 n +0000001944 00000 n +0000001875 00000 n +0000001905 00000 n +0000002091 00000 n +0000002157 00000 n +trailer +<< /Size 14 /Root 1 0 R /Info 2 0 R +/ID [<2D83AF6D6784F99F64821E4ED344D788><2D83AF6D6784F99F64821E4ED344D788>] +>> +startxref +3734 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 new file mode 100644 index 0000000..27fe158 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 @@ -0,0 +1,55 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_NOSIGNAL 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_NOSIGNAL \- skip all signal handling +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOSIGNAL, long onoff); +.SH DESCRIPTION +If \fIonoff\fP is 1, libcurl will not use any functions that install signal +handlers or any functions that cause signals to be sent to the process. This +option is here to allow multi-threaded unix applications to still set/use all +timeout options etc, without risking getting signals. + +If this option is set and libcurl has been built with the standard name +resolver, timeouts will not occur while the name resolve takes place. +Consider building libcurl with the c-ares or threaded resolver backends to +enable asynchronous DNS lookups, to enable timeouts for name resolves without +the use of signals. + +Setting \fICURLOPT_NOSIGNAL(3)\fP to 1 makes libcurl NOT ask the system to +ignore SIGPIPE signals, which otherwise are sent by the system when trying to +send data to a socket which is closed in the other end. libcurl makes an +effort to never cause such SIGPIPEs to trigger, but some operating systems +have no way to avoid them and even on those that have there are some corner +cases when they may still happen, contrary to our desire. In addition, using +\fICURLAUTH_NTLM_WB\fP authentication could cause a SIGCHLD signal to be +raised. +.SH DEFAULT +0 +.SH AVAILABILITY +Added in 7.10 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.html b/docs/libcurl/opts/CURLOPT_NOSIGNAL.html new file mode 100644 index 0000000..287fbb3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.html @@ -0,0 +1,59 @@ + + +CURLOPT_NOSIGNAL man page + + + + +

    NAME

    +

    CURLOPT_NOSIGNAL - skip all signal handling

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOSIGNAL, long onoff);

    DESCRIPTION

    +

    If onoff is 1, libcurl will not use any functions that install signal handlers or any functions that cause signals to be sent to the process. This option is here to allow multi-threaded unix applications to still set/use all timeout options etc, without risking getting signals. +

    If this option is set and libcurl has been built with the standard name resolver, timeouts will not occur while the name resolve takes place. Consider building libcurl with the c-ares or threaded resolver backends to enable asynchronous DNS lookups, to enable timeouts for name resolves without the use of signals. +

    Setting CURLOPT_NOSIGNAL to 1 makes libcurl NOT ask the system to ignore SIGPIPE signals, which otherwise are sent by the system when trying to send data to a socket which is closed in the other end. libcurl makes an effort to never cause such SIGPIPEs to trigger, but some operating systems have no way to avoid them and even on those that have there are some corner cases when they may still happen, contrary to our desire. In addition, using CURLAUTH_NTLM_WB authentication could cause a SIGCHLD signal to be raised.

    DEFAULT

    +

    0

    AVAILABILITY

    +

    Added in 7.10

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.pdf b/docs/libcurl/opts/CURLOPT_NOSIGNAL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..619b766cbfed4dcb2644c4e203e2298b5c86cf19 GIT binary patch literal 4514 zcmb_gdt6LuA1}6AgU}+kS4YK^Oy``r&!|Z?m2A^xL^rigGiPdQX3m&7Q&UQo;>|sB zDWZ$ZuCV2vYgR&tT^6Ab%H1xp)Z%^4ROIr$yYJ`Y{4>w_J-_?q`95bx28(?es4JT` z^7zBW#WW6tKtyZ;&CLxCz%_AXJj4YQDeS9Mk+=?meN`BVi*Xqt$3-HVp48!(nr2*+ z74}GTmD~UIlTA>W-Ljsm2l)HvmSN-a6{S&^PTFkn$?0Y8@Jr6X2;Inid3Fg;_MYnF zzk9CX>%K!r8B&aoE1F}{eMF;9T*`RNx*8DkoxbIQB&~)0N;pE%uVS%kcEkFz5f?qy zKgdp>0|oXA8noz}T+OJ4SC5`QeL6ZlJi1}bj3~)@4?23>|KWprr6@agO{PHd7#Y;$S&6Lih|5WdHEiUyrP}qFwyGsZ6m$3b@wN~-l!Vb6q879%xfz zZqYi_aQ4o??9E=$uR`b31{BwpZlA#{Ts*=&SCFk$Ss!|}ecyq75!Z&<5xZBF9JH$u zmL^q*JrcLYJjmGl(ude&K4ImumgN>JIAzVbwbOTG#tdfbk|sFyH2i=G=2X*P6saNjf+xy$q6mDlgC>NQvB%Pn%OM90^8 zrPnP8mK{8X{pMFaFmXdo#pp<9U0z9a^qZ`zq^RY2+OYWGP3&idWtZl>+RR*8xB#o3 zU6TJtXhqJMz@kIN8)_6w_>=D1UA5V4x&BYb<-e|5WTS#&y~Y$C8{#^H4C4>BS=z_T zNo>VFImA6MBlE(z=x3-!6|=&{1-Iso@ml*}%1*)NW4^_clO)e2>n4O}DhCO-%O5Na z?6qvzj<0DAjM@v8j#h8yH?EDHeoK=Zx6FJ(i!^un&bm><+WfUk9#z#uIgB;0THtqN zu-2vQ(0ad()&p$6xdQ(??%Yi@ebBbcP%wxE1Ob~ zobYC($Fy~op$qb|-u&F!aL;gdaz$I<$%Pxcxn3A|ru*K~W54-i9Ld{y4EY(lwe~w% zmSz7R5SQTYIagLnZHWgD?@Y@W^k&1%1nHxg2cEWW@;-OGdfY;ONQBA@$DSWuI8Ytz zbb3pIFxW3*b$C;MeNb;%55&GiUtbPE!!K(cN3!Q}{EL01d+hrxO-%b~#bj>qnW7PM zviSGsx2)c2@CwKqmyvCCXSzB`emZ^OptgE*`SAjj^V^D`pxupaQ!|+Xb5k?i77SRB zZC+sL?NnA*GdbLjP= zBfwyFU-eU z5cx$py8{C*?&Mq!86{Nr_N_ZMQ&<-Ab(1Q-*~(qIr#rW4!O-MqRSnN8yG534QJ?YD zo9#MRes@;o{K)V4QJc%X7un2+A0KzV zulTmUsea>=;gjz@y>+yiw<+ef6~D2&Gh!ZfZtUKqty3JVCMQjLtms$da`UhHr&~FF z0t<8O{+!0MsY_WuVCugFyW0-$7e(`(iXN|2%Q;fc#IS`#bv$|VB)3f_Gf9=)O>N&`>EOEa!b8Y0A!3SUc9NN7= zEu?!F>oDTaVlGIs8WsV8U7#yrOXr%Op$5uL_;h|RgTIIaH%tKlGKMtgc{Ry)!?H6wi{ckRrb~{v>nypg~7AqAB9JCbZp(xOv zELg4781&KaqcPQ{t7vD{-p3y<3Fy4Qp)596BHxHv0lO^IL6pP0xHSY8$`w!D0 zrQDq!#*rWrtv4R89G|MgC#D95%2E?$0y*77M04}Nz~&RF60UXG8|=N44Hx%%Ro_F!9c*nh*fapyjTIM;465Y=Cobh{J*8Cb14KH<+qXm+XA$d|_IN6deuZBt~YG0V-;P<*dQ!5h*%r+<+ z{O;rs(V#E%d^tt$k4pez|4r, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_OPENSOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first +argument in the opensocket callback set with \fICURLOPT_OPENSOCKETFUNCTION(3)\fP. +.SH DEFAULT +The default value of this parameter is NULL. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.17.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_OPENSOCKETFUNCTION "(3), " CURLOPT_SOCKOPTFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.html b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.html new file mode 100644 index 0000000..75985aa --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_OPENSOCKETDATA man page + + + + +

    NAME

    +

    CURLOPT_OPENSOCKETDATA - custom pointer passed to open socket callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETDATA, void *pointer);

    DESCRIPTION

    +

    Pass a pointer that will be untouched by libcurl and passed as the first argument in the opensocket callback set with CURLOPT_OPENSOCKETFUNCTION.

    DEFAULT

    +

    The default value of this parameter is NULL.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.17.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_OPENSOCKETFUNCTION, CURLOPT_SOCKOPTFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.pdf b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7bf876d20d3754b922410d9c0cf24a6066081331 GIT binary patch literal 3816 zcmb_fdsGu=7T3B*J)^6ryQ>~p9jQ4{>SSi}o{)qUNDwuG0Sd}u9g<0yCCS8@2}Fuk zN_~PTqHXC~&QY{zQSex;xU?rfKQ6uf(DHcYJ4w9#$DGOtz z^m>TnS&DQ*-i;gHY;rXjgBD#(9(r#1y1WD54f&vTv!VYnTfbw4+omU8J|r1BcQdkg z{k9d>cb`PPv-R1fIrBUm8Z>`uO?|1%erD_=S^SYDZE+oSmxfkVNNQULKxqEi0dJ;7 zcI>@$sA=#3?V=#v@HYFH{ULu9t*C%64=w!rL-}BFqeXr1#AkP}pIPJj>RdIMh{!lWLq_2>%H)! zm2GGAtLslWKS=Y&cZO7Vj^F)gdt3doN!y4N>lnA@#_~4kyB#gJ zrKT#$tcQ=w-k7TRB-z;P&eFD4qJOr3x@b?!mnZ)@!+U;L=lrMfs_c{b?#kV|;rpK6 zvS~hwE_XMdTy|=%Vzj#S=<=mhLaBTG>Z-CEK^H}1ojY%gTr>SbKW6R6?lUW{EvSw= z-rhL6a{rR*cKOnZ-!(XkHx&GF*t46#TiV565%9sC6I()7CB62}j~%bI)UBj8{8ab> zTjCg!!c@-KSvp;s5otJ}E-4f>9y!u(oyV<;GK@Lawndg#a5Q1(@w4_PF8vpcJF<$j zmtv}5MAVvVZ2r^Hq!?Mw#nZ;i^QZ}hlrr-d1ydW-xM^?kf&9vCU;KWv%cgrxXS?X> z4BeJmrwX-ZlxmX~Z?3{xq{x+mQ(H$=h}PXN45{K;-yYA5bQ+)FWrO-3xbpdQDe~yl zp8iY$r2T9}SyRS0Ezw^_b%Yp$vf>HzUp~$X{`S4YD`z84JDL4pHTluJ_{S55J-c{y zdF+*aVfW`HE&RHEeq__8feV6_@)>7qb|r5py7lQz`qJK#h;dUgLpHuXr~TS&EH@l7 zHdc&UIIa0y%C%`r>wg$Y6;01tz`pkjSAGBZ*K4ky$8+VSyH>Iv;zO@5mTm8NAJbm!td17YAQ~3hFz)38)&j#RHesq5BTqQzVJ@g{LK3el9+R?cgLJgn$deUxH9V0g}8MJQ5eWDKwt6Q>clu(qts#g;OzbtsoSzS}sk4P&2~= zD1kA+#ZoRFmI*im$P~wTSPR7g1d3-FO9I8Gq5z{{G?DW1K+fRhV-kF#IPMoQGC&-c z`hEaVLZiTMppk25sfwR7mjO45h(9gGW%=LsT#o zz(v1g6v>kg#@?kO;Ju0BNh`R4alfu^+o~58bcX?d7*Mb zjKHO?#0k3lRuRcKtiM5l;8WiU%#4$C_0(W+f#E{C>@e=j>3?&{cN zMu8^<-cTxp%Q4hOL%2$YI%$`OOY08GSE8O8x{BAGh7{Axt}%$qvXs{jaMi3iDP2#!-W1Op#}5h{{YstF4&CA-YId${?6J#YaG z%0M2#Ndxe~>akF)P8<_I6OPGXINom`CM1|rj0VDgRbGMG^qmDz&_EirfJb8j@7K04 z8lanAis1?b!x2oKh!GlGt-+*kV7Lauv}i9*P<$X71@2dI4eUi(^ZS_~fLF@eopB&n)tB+dwNT9bt z+0f_6p@-mC^u0Po-EawJoKBoAfFU@&xK9Z4JAlSreLbnKww??IywD{e;X=+R2m6`L2WQ72ts9)D+z-vQvd55X~N3J@g&RpiYAjO MWspc@h%-X}0sq(-^#A|> literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 new file mode 100644 index 0000000..d5f461d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 @@ -0,0 +1,90 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_OPENSOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets +.SH SYNOPSIS +.nf +#include + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; + struct sockaddr addr; +}; + +curl_socket_t opensocket_callback(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETFUNCTION, opensocket_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl instead of the \fIsocket(2)\fP +call. The callback's \fIpurpose\fP argument identifies the exact purpose for +this particular socket: \fICURLSOCKTYPE_IPCXN\fP is for IP based connections +and \fICURLSOCKTYPE_ACCEPT\fP is for sockets created after accept() - such as +when doing active FTP. Future versions of libcurl may support more +purposes. + +The \fIclientp\fP pointer contains whatever user-defined value set using the +\fICURLOPT_OPENSOCKETDATA(3)\fP function. + +The callback gets the resolved peer address as the \fIaddress\fP argument and +is allowed to modify the address or refuse to connect completely. The callback +function should return the newly created socket or \fICURL_SOCKET_BAD\fP in +case no connection could be established or another error was detected. Any +additional \fIsetsockopt(2)\fP calls can of course be done on the socket at +the user's discretion. A \fICURL_SOCKET_BAD\fP return value from the callback +function will signal an unrecoverable error to libcurl and it will return +\fICURLE_COULDNT_CONNECT\fP from the function that triggered this callback. +This return code can be used for IP address blacklisting. + +If you want to pass in a socket with an already established connection, pass +the socket back with this callback and then use +\fICURLOPT_SOCKOPTFUNCTION(3)\fP to signal that it already is connected. +.SH DEFAULT +The default behavior is the equivalent of this: +.nf + return socket(addr->family, addr->socktype, addr->protocol); +.fi +.SH PROTOCOLS +All +.SH EXAMPLE +.SH AVAILABILITY +Added in 7.17.1. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_OPENSOCKETDATA "(3), " CURLOPT_SOCKOPTFUNCTION "(3), " +.BR CURLOPT_CLOSESOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.html b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.html new file mode 100644 index 0000000..b72dedb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.html @@ -0,0 +1,86 @@ + + +CURLOPT_OPENSOCKETFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_OPENSOCKETFUNCTION - set callback for opening sockets

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    typedef enum { +   CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ +   CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ +   CURLSOCKTYPE_LAST /* never use */ + } curlsocktype; +

    struct curl_sockaddr { +   int family; +   int socktype; +   int protocol; +   unsigned int addrlen; +   struct sockaddr addr; + }; +

    curl_socket_t opensocket_callback(void *clientp, +   curlsocktype purpose, +   struct curl_sockaddr *address); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETFUNCTION, opensocket_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback function gets called by libcurl instead of the socket(2) call. The callback's purpose argument identifies the exact purpose for this particular socket: CURLSOCKTYPE_IPCXN is for IP based connections and CURLSOCKTYPE_ACCEPT is for sockets created after accept() - such as when doing active FTP. Future versions of libcurl may support more purposes. +

    The clientp pointer contains whatever user-defined value set using the CURLOPT_OPENSOCKETDATA function. +

    The callback gets the resolved peer address as the address argument and is allowed to modify the address or refuse to connect completely. The callback function should return the newly created socket or CURL_SOCKET_BAD in case no connection could be established or another error was detected. Any additional setsockopt(2) calls can of course be done on the socket at the user's discretion. A CURL_SOCKET_BAD return value from the callback function will signal an unrecoverable error to libcurl and it will return CURLE_COULDNT_CONNECT from the function that triggered this callback. This return code can be used for IP address blacklisting. +

    If you want to pass in a socket with an already established connection, pass the socket back with this callback and then use CURLOPT_SOCKOPTFUNCTION to signal that it already is connected.

    DEFAULT

    +

    The default behavior is the equivalent of this:

    +

      return socket(addr->family, addr->socktype, addr->protocol); +

    + +

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    AVAILABILITY

    +

    Added in 7.17.1.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_OPENSOCKETDATA, CURLOPT_SOCKOPTFUNCTION, CURLOPT_CLOSESOCKETFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..335e93ece888ca9fe39cd43f6922415277a5cd2c GIT binary patch literal 6058 zcmcgwdpuO@*Dohs<{UXmNl9C1gt7NrTxKwGzcud4C1uR)(J&Wg#$7oI6%s{>a3oT6 z6@^GCIhCjsa*K4RkaQ8DchAI0NAK_a-p}WJ-u=%!d+l}ouC<-AVurzL5Kzju z`wtvPX#x46(zj<;YtpoLHzKr<#w0P_IQj71f|CNPalhsk6VU%-Q@Y*g^E z6qi;`TkVn^O`8dc3;6RW=_7YZ(C;bmhE=9%E`-GBWecTSa;WzdZeO*KRUck3nKDkZ z`4HU`AH5=S&Z6$z&yA-XPo5s#-_l0an&`VW`mtx=_G$d(SYQgd?W_iOkONNgj_w=}=O=A# z?`U)HnAr8g*j;~bVXJ}QI5%*@>*ai{%LBDH3}DBgezcnUWYT2d#Y?5HJ$vPZ;;x7Hk9AsF4p>RQHXkW+r&6AWc4%8>M3K(E4t;67YnSfUk>SSxgYOaur!JtDl_Is?C~)fdJ`Vn+Ld(V zW~gg^*?Y2LSeDAtzEqyK)LZor+{4W;Nx7ZJ zUk}Pi5iuv5oy+d8a_YU1-hS7;UvTKLsq+2FJx4O?6m=K+ydCr&eA_iV*!}2n>|tW! zivpXAcg&V3%Nh0!za%-mJ8Rf&a(66dAU!)Hq}A^39Wo6}$910PJo?4?dWq|Sh_U^4 zxI{tslN%C+N7CQ}`?229x8H@!M=fyn`r@LvrRJHq{DEJpA%^WHi?a3QYwRzeT?(%j zqAFF_tY2bBZHg=OtV@GbxdE)_AGdCNeD34CH!(z45BZ>)riEZ$nNTJ!o7x5`NL zRTX9I4a-q;joMcvJx{iQ+xND%cc*6w`9|~!QbT!V!L5)+8L_oaXboQ(oA`tKjb1aG zjRs@+;C1<&((5raOHbEl`-aQ==udje6s`tdk_v4|vYk{j7VjI#Z5g>aq2c=(x8`)A zvwnil{EmKE1;f&7a^mxF)y-P*S#Py zI#4cEx^k7Bzxjs5A*Eq2<2HZ%!y2q+4pHUmtI|Iy`|qSW$^}O%FUt?JDal)#R-B>y zdcL&Plk9Mly4V=Tydih_CwpG+R_(mBZSZAqrub(aS%dc}R}_;4#eTKRx_=E&lzF$P zAcAl!Ty89TS${~^r_(QDOAe`L6E+sJiu64P11YUV>_-VT&8MPM@Ht}QZQRU`)bf1> zsIA1o2cF^wjSRH>ODkVps$nNKl8w*ol4}TRc44dP^yXhMo3wQ+s2k zBwdCTDjjo-suwoiOLX3y_)~j>ePAt=yfDu~q3-5lh7tMFu;fY-VZEV}9)S^*DgS;4 z-&x}Pf-MRW*;{9zjkEGjDsOM%QFnGO#)nX5vq&50CK_PaDVVn%iK;V}IWFL5$Uh zZOv0@3R~3r8_O-%t0_n!vbkXn_;X5Rv6p^T;!sJZ_S>NH0u%6bg#d4X*@UNWOh1~3 zvz~K*jy;Q@iT3YDmsJ#tIXha1`#h^o-gEfWBlA?LWv{G@*ThAvw2>l$ulF*Nt4s9; zKkuQv-Tknk`dp)4y@A}@#rOkTxSI?sdGA&}yKdHg@8p{;yCR}0f_8j#Nok*de!JVb zRZ$Od4@y40G2QRJBzC*orT|x!+&S6A8(sZZwM=`Lgek1E)`d{bw$<}utM}EpZL&|k zle?o~bv?tyDAoD)eO8X?yg`=>6ZQsyr<7`#Bfj`_IX&*h-`ag8TB50AHCbZEhLT6^ z9x@sEe~4Xo`FW+G>x0H!nyS6D-PX?t_b+Wwk=fu=w3WO-zvT3pYI!3|DSG#cD;`*X z>0y;c9~{P*RpDRVjNoI%@(Phot1NRs^ismEe_blP|C^iADlE(VRLm^!4o)}*%6qI2!D^j9W)9I29@nDC((>%0=^C0(Z& zc4$-=nnhHeqQ{AIRMZ!~DWzVk-(8iS#G7gzkQD?2iOwObZ0tRZe+ z#`)8UR4>%6@$sG*g+=V0F=P3w(L?Z;Dnp$A#$~R(S&vK8t~{aK%y?!pUcDS|g%G ztzHiviQ7e~fR6cX-;wZ>y1H0t<>vOzW4|AHvnYRTvEPt?O~Q6;aZ`(2ltIW_nYhC^ zdrW8gqmQzyMt;xs9qkA=2%boN9raP&yug-ZT6xkZQ7Sat$IF5n3H+cRD zmyF-lz3Kiq)~C3N7wdSvG2zTRt5r)E#=U4^8hM={)Mt?dB(2iZLv&_-ziXH$orCYf5yR z!w=d;Rl-zptc>=!h7#|^{F&~(Gs8v=yAX5aO{&%AK9@TeRjI|1D@rHMs}b#c+%3rm zAb(9h=>bFQkFKZB4fm>c6Y3acSGRRHVri&-yl23Ix_T68kEgS7Mdv_? zEya0j)j(c}8|V~vK5)(Y zDdza)hozk@^um_qkIQy=oibW-VfUMX^sUFVm&=tVu70L$fA$<&T2l)_rX>;$r zJF{uo@e_Kx3MS^ydrsA*tPs~f`SFP@n@>fQ;?{gmCd-jsU<5OAaB!d~N`b2J?}L z-;T$nIl=;W5V;copc5P{K;%q=1?G+-Q7rbWh#40V$KpgU$Rz+YM&1#Pd_YviD1Te`(3(l-1MVmx!VW0xSFAh$ zB-8*TcH9gNLQH0ah_FxvR2J8JTGJHF6j(r|BVPb4aoVjZkc4i|Q1A_J6liNl0kCB9 zG@3I^IcTFq;myEWn2#wv4p<0<6=vT7bReQc20;fMl#Y-xLt=V!LNfmYeKY*}PfCPl zrpy{q`LGar(22>0`4~$C2PRDft0*HV&@sSEAgog%(nws>Wg>L&$104tEc$<;Kp5DM z6*zF&RL)EdrX1wz%H((hSP>fkn@ggvQz}K3J1qyAFc}OOX&|Iy+)-Ep1TvT?tTrBG zGdTf#k8eSV@;p<+bOn5a!G*GM`jU;s6ST~Ni1cKQt4xbdPj~0oLkhPEuq5%<$z*isbLa_q`TrSI(iIlqrQ3H#? z;?)5LkIIIFxIA9~tD%KPRPyKyk^{0?d{v0N>7%y`1b!qC3FJBFc9)!v=J(#4Z#eErZa8MZ-$%S*+V`c z2Jr|E$clvQhV%d$%+p7k+ie8Qw{!V|ul50=2Bd`sr^5fYyh3vGV-%2tPQjpu@Q^4- z{W3yKkiDFYgRq(y2#bMqoFF0zt3!ftY7mwLL3-fdIFaNdqQ=O-HORj=|Apub&KaUy zo)c0MWN#jq!2kkb9$%OVtOgFJf&XezBsRsR2MTjE1D$^xFRCAf@}Ci7vxOxsH4g728AfteP>G}5*ecLXPgHj(IB-{*<)%Sz=jMH(tuT_53 z*6WdRM%X0?;KDvpF(C5D}{*>Mt||p%FHu5C4H&NK~SKn8;EX?Q#iIn@6~gCJyz`JM(LG5wu} z!xNDs@q0czK@%AR{zlW*LC*ZY(`M_#YY}G45`JJq6F1u~R%@2eID+s{{@yN*s56TX zucPY2+X#y{A(#?PjSbDrOto, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PASSWORD \- password to use in authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd); +.SH DESCRIPTION +Pass a char * as parameter, which should be pointing to the zero terminated +password to use for the transfer. + +The \fICURLOPT_PASSWORD(3)\fP option should be used in conjunction with the +\fICURLOPT_USERNAME(3)\fP option. +.SH DEFAULT +blank +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), " +.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)" + diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.html b/docs/libcurl/opts/CURLOPT_PASSWORD.html new file mode 100644 index 0000000..b2da86d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PASSWORD.html @@ -0,0 +1,62 @@ + + +CURLOPT_PASSWORD man page + + + + +

    NAME

    +

    CURLOPT_PASSWORD - password to use in authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd);

    DESCRIPTION

    +

    Pass a char * as parameter, which should be pointing to the zero terminated password to use for the transfer. +

    The CURLOPT_PASSWORD option should be used in conjunction with the CURLOPT_USERNAME option.

    DEFAULT

    +

    blank

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERPWD, CURLOPT_USERNAME, CURLOPT_HTTPAUTH, CURLOPT_PROXYAUTH, +

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.pdf b/docs/libcurl/opts/CURLOPT_PASSWORD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..760f360e5ad895267a34d1354d26482b519f00ae GIT binary patch literal 3952 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 Lke^>@lnVL-o7-3= literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3 new file mode 100644 index 0000000..5fd19c7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PORT.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PORT \- set remote port number to work with +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PORT, long number); +.SH DESCRIPTION +This option sets \fInumber\fP to be the remote port number to connect to, +instead of the one specified in the URL or the default port for the used +protocol. + +Usually, you just let the URL decide which port to use but this allows the +application to override that. + +While this option accepts a 'long', a port number is usually a 16 bit number +and therefore using a port number over 65535 will cause a run-time error. +.SH DEFAULT +By default this is 0 which makes it not used. +.SH PROTOCOLS +Used for all protocols that speak to a port number. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PORT.html b/docs/libcurl/opts/CURLOPT_PORT.html new file mode 100644 index 0000000..4154014 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PORT.html @@ -0,0 +1,62 @@ + + +CURLOPT_PORT man page + + + + +

    NAME

    +

    CURLOPT_PORT - set remote port number to work with

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PORT, long number);

    DESCRIPTION

    +

    This option sets number to be the remote port number to connect to, instead of the one specified in the URL or the default port for the used protocol. +

    Usually, you just let the URL decide which port to use but this allows the application to override that. +

    While this option accepts a 'long', a port number is usually a 16 bit number and therefore using a port number over 65535 will cause a run-time error.

    DEFAULT

    +

    By default this is 0 which makes it not used.

    PROTOCOLS

    +

    Used for all protocols that speak to a port number.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PORT.pdf b/docs/libcurl/opts/CURLOPT_PORT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a9bb46e09e0922a9bbe8e735b05b2e7069e3f25 GIT binary patch literal 3981 zcmb_fd0Z2B7O$-b3?5jkRBdq(A)qF6Boi_*L?I!RLJ$HfG=(}OlQ5EG(#b>u3SPC^ zc0I}hWtA4uwrcGvDr~K+2a5Ez)uL!^wW8Znd(g#OQTI0?2#UMyem>4W{PKS9`n}`( z9$_h3ofwnIpsNl1!0d}e6kR*AG@ z=)AH$=Y}FBlUtsCs_~U)f{UYqFH9O=F@C)I#*~w*PXB%WCBq88!qG)fr;^Jr&Ds&) zGCawzaYp7_y#0&6}9Z~fN zQR@dCEJjn0mYxh)7w~z39StrwFZri$I^SlFRB07S;xZcp2 z5HdB484<8#cJwEwoJBj=h&P;U{cWDgKRkGbvHd8txeGiFdk_c|)dyh>&y5QQVrt{L(hVU{h z$-XhP`e`qzr* zjJ}kpJ%5rVC(l~5*pvtzfWB;LsLJ?CTGsxWpZLaMo2klUM|Nd?{^jlnr)64er^nIw z$%u~vOOC#||5?k7%8S=#yi~mU{X2wte`u%c#*5^zQ;q#KS<}BMtlia|z2ekT`Da5G z2L!<*r1jsuw6Oz{zgzVc@1#DgwU60({ZgU4Dz0kTH`5@S$WN*I`u#)imwY?0^U14< zelyPe<@9^(*nK~5nR_gx`PFR)a(C|5R3){QRTMN=9FD3k?^rCKlpXa>ahBh>pnX}p zsAS@WWg%-0x4c&TP3E2}t;YBd&dwp4`(>LdXU@O=C>~rs{EMxjMQ6%(57~A|zwi3x zTR;4!JDsPIH*c>AnxB^c=#WQm4$h{Y3Yzzxxm^9q+OgM9T){9=v%6nuUdp(lT+TfF z!pE)2Z}1bJU3#P~|61pu3x&%d+F|w~5;zGcCSaHF7sKSJa4Vc;JqVXx;G~fh%1R@8 z+RRX~tOqut;F=%_SRuo+AjH7(0PkQFaB;MQhou4-0y6Dl-JFSb0hmnTSW_C!8xa7c zFp^Gtcpw+&;p5Z1q8QdCqGN$LhI@Yiy|^bjKxBOk^(hkgfJP3SQrS4k|K7-;dW*9Jj$D*-Ws}- z*As>eeNy+V#-uX2TJ7rr)l`p@GUd@coI_g~N3^KDexC?t%+aD*gdWv9HFPfXOd&_7 z6(*;f3iC{)Su|A*sisn(O=z))a*8e9q3?oemnnL@#*m~NFEDtN9=p>HY6$k&Z4Q^x z6D{(JD8X4EBO=(#!skVcGW01h&$6~WhKF$pDZ#{;bTVw=C_A0ca(OT&k&A#z&TLT{ zK>Ktl1izw1xjgSwB1nFIz9e5NVL2;;ktB(rID+G1z#(=OIC#ntDblM>*A*=?e^Xi&4Z%=66yYvBIKx7bRKrR zD5qZkzawV13neY^DYdN0Z3nQOp#6Ue=3(d9Y`W{P)6Lnu-C;H%w2c;gbAdEtz+G!#uU;ZelS@2Sg==tOdDV%!C_(HuB{D8(85L)Dwkp;fnzc<7DM9*nOuQt6og!^ iL2(74(c4OQ%;-! literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3 new file mode 100644 index 0000000..cd6b6d4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POST.3 @@ -0,0 +1,77 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POST \- request a HTTP POST +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post); +.SH DESCRIPTION +A parameter set to 1 tells libcurl to do a regular HTTP post. This will also +make the library use a "Content-Type: application/x-www-form-urlencoded" +header. (This is by far the most commonly used POST method). + +Use one of \fICURLOPT_POSTFIELDS(3)\fP or \fICURLOPT_COPYPOSTFIELDS(3)\fP +options to specify what data to post and \fICURLOPT_POSTFIELDSIZE(3)\fP or +\fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP to set the data size. + +Optionally, you can provide data to POST using the +\fICURLOPT_READFUNCTION(3)\fP and \fICURLOPT_READDATA(3)\fP options but then +you must make sure to not set \fICURLOPT_POSTFIELDS(3)\fP to anything but +NULL. When providing data with a callback, you must transmit it using chunked +transfer-encoding or you must set the size of the data with the +\fICURLOPT_POSTFIELDSIZE(3)\fP or \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP +options. To enable chunked encoding, you simply pass in the appropriate +Transfer-Encoding header, see the post-callback.c example. + +You can override the default POST Content-Type: header by setting your own +with \fICURLOPT_HTTPHEADER(3)\fP. + +Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. +You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual. + +If you use POST to a HTTP 1.1 server, you can send data without knowing the +size before starting the POST if you use chunked encoding. You enable this by +adding a header like "Transfer-Encoding: chunked" with +\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you +must specify the size in the request. + +When setting \fICURLOPT_POST(3)\fP to 1, it will automatically set +\fICURLOPT_NOBODY(3)\fP to 0. + +If you issue a POST request and then want to make a HEAD or GET using the same +re-used handle, you must explicitly set the new request type using +\fICURLOPT_NOBODY(3)\fP or \fICURLOPT_HTTPGET(3)\fP or similar. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_HTTPPOST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POST.html b/docs/libcurl/opts/CURLOPT_POST.html new file mode 100644 index 0000000..bc7dcd1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POST.html @@ -0,0 +1,67 @@ + + +CURLOPT_POST man page + + + + +

    NAME

    +

    CURLOPT_POST - request a HTTP POST

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post);

    DESCRIPTION

    +

    A parameter set to 1 tells libcurl to do a regular HTTP post. This will also make the library use a "Content-Type: application/x-www-form-urlencoded" header. (This is by far the most commonly used POST method). +

    Use one of CURLOPT_POSTFIELDS or CURLOPT_COPYPOSTFIELDS options to specify what data to post and CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE to set the data size. +

    Optionally, you can provide data to POST using the CURLOPT_READFUNCTION and CURLOPT_READDATA options but then you must make sure to not set CURLOPT_POSTFIELDS to anything but NULL. When providing data with a callback, you must transmit it using chunked transfer-encoding or you must set the size of the data with the CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE options. To enable chunked encoding, you simply pass in the appropriate Transfer-Encoding header, see the post-callback.c example. +

    You can override the default POST Content-Type: header by setting your own with CURLOPT_HTTPHEADER. +

    Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. +

    If you use POST to a HTTP 1.1 server, you can send data without knowing the size before starting the POST if you use chunked encoding. You enable this by adding a header like "Transfer-Encoding: chunked" with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size in the request. +

    When setting CURLOPT_POST to 1, it will automatically set CURLOPT_NOBODY to 0. +

    If you issue a POST request and then want to make a HEAD or GET using the same re-used handle, you must explicitly set the new request type using CURLOPT_NOBODY or CURLOPT_HTTPGET or similar.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_POSTFIELDS, CURLOPT_HTTPPOST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POST.pdf b/docs/libcurl/opts/CURLOPT_POST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8e0e966c6ebd6b7dba938ffd1781396a1eab11ed GIT binary patch literal 5251 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 yli-LWd60>23, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POSTFIELDS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POSTFIELDS \- specify data to POST to server +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata); +.SH DESCRIPTION +Pass a char * as parameter, pointing to the full data to send in a HTTP POST +operation. You must make sure that the data is formatted the way you want the +server to receive it. libcurl will not convert or encode it for you in any +way. For example, the web server may assume that this data is url-encoded. + +The data pointed to is NOT copied by the library: as a consequence, it must be +preserved by the calling application until the associated transfer finishes. +This behaviour can be changed (so libcurl does copy the data) by setting the +\fICURLOPT_COPYPOSTFIELDS(3)\fP option. + +This POST is a normal application/x-www-form-urlencoded kind (and libcurl will +set that Content-Type by default when this option is used), which is commonly +used by HTML forms. Change Content-Type with \fICURLOPT_HTTPHEADER(3)\fP. + +Using \fICURLOPT_POSTFIELDS(3)\fP implies \fICURLOPT_POST(3)\fP. + +If you want to do a zero-byte POST, you need to set +\fICURLOPT_POSTFIELDSIZE(3)\fP explicitly to zero, as simply setting +\fICURLOPT_POSTFIELDS(3)\fP to NULL or "" just effectively disables the +sending of the specified string. libcurl will instead assume that you'll send +the POST data using the read callback! + +Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. +You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual. + +To make multipart/formdata posts (aka RFC2388-posts), check out the +\fICURLOPT_HTTPPOST(3)\fP option combined with \fIcurl_formadd(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + const char *data = "data to send"; + + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* size of the POST data */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L); + + /* pass in a pointer to the data - libcurl will not copy */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDSIZE "(3), " CURLOPT_READFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.html b/docs/libcurl/opts/CURLOPT_POSTFIELDS.html new file mode 100644 index 0000000..3b998ef --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.html @@ -0,0 +1,79 @@ + + +CURLOPT_POSTFIELDS man page + + + + +

    NAME

    +

    CURLOPT_POSTFIELDS - specify data to POST to server

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata);

    DESCRIPTION

    +

    Pass a char * as parameter, pointing to the full data to send in a HTTP POST operation. You must make sure that the data is formatted the way you want the server to receive it. libcurl will not convert or encode it for you in any way. For example, the web server may assume that this data is url-encoded. +

    The data pointed to is NOT copied by the library: as a consequence, it must be preserved by the calling application until the associated transfer finishes. This behaviour can be changed (so libcurl does copy the data) by setting the CURLOPT_COPYPOSTFIELDS option. +

    This POST is a normal application/x-www-form-urlencoded kind (and libcurl will set that Content-Type by default when this option is used), which is commonly used by HTML forms. Change Content-Type with CURLOPT_HTTPHEADER. +

    Using CURLOPT_POSTFIELDS implies CURLOPT_POST. +

    If you want to do a zero-byte POST, you need to set CURLOPT_POSTFIELDSIZE explicitly to zero, as simply setting CURLOPT_POSTFIELDS to NULL or "" just effectively disables the sending of the specified string. libcurl will instead assume that you'll send the POST data using the read callback! +

    Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. +

    To make multipart/formdata posts (aka RFC 2388-posts), check out the CURLOPT_HTTPPOST option combined with curl_formadd(3).

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   const char *data = "data to send"; +

      curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* size of the POST data */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L); +

      /* pass in a pointer to the data - libcurl will not copy */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_POSTFIELDSIZE, CURLOPT_READFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.pdf b/docs/libcurl/opts/CURLOPT_POSTFIELDS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..879a67715e5f5e6fc7710a61525c45dc39460104 GIT binary patch literal 5674 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 sD&2, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POSTFIELDSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POSTFIELDSIZE \- size of POST data pointed to +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size); +.SH DESCRIPTION +If you want to post data to the server without having libcurl do a strlen() to +measure the data size, this option must be used. When this option is used you +can post fully binary data, which otherwise is likely to fail. If this size is +set to -1, the library will use strlen() to get the size. + +If you post more than 2GB, use \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP. +.SH DEFAULT +-1 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + const char *data = "data to send"; + + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* size of the POST data */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data)); + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POSTFIELDSIZE_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.html b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.html new file mode 100644 index 0000000..ac4732b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.html @@ -0,0 +1,73 @@ + + +CURLOPT_POSTFIELDSIZE man page + + + + +

    NAME

    +

    CURLOPT_POSTFIELDSIZE - size of POST data pointed to

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size);

    DESCRIPTION

    +

    If you want to post data to the server without having libcurl do a strlen() to measure the data size, this option must be used. When this option is used you can post fully binary data, which otherwise is likely to fail. If this size is set to -1, the library will use strlen() to get the size. +

    If you post more than 2GB, use CURLOPT_POSTFIELDSIZE_LARGE.

    DEFAULT

    +

    -1

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   const char *data = "data to send"; +

      curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* size of the POST data */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data)); +

      curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_POSTFIELDS, CURLOPT_POSTFIELDSIZE_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.pdf b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.pdf new file mode 100644 index 0000000..98043aa --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.pdf @@ -0,0 +1,116 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœUms›FþίØq?4âÄñ*ê¦3rBR%D¨NšZ F'‹ÂKT·ÓŸÔÿؽ,K¶ëŒfŒaowŸÝ}ö¹/  +ÿµÏx+ fܔ’7Ò‰ +#´x !òáZj|(8:8®A†.„[ɴȐB¸—®ä——3?˜†Ëi0_=ÿÕ|ü›·…q]¤K•·Ë’Uù®RTÝ҈¦92¾$yVÂÓÎÊïá[IՈN1aŒx\ÄC\‹C2l}IžŒ”ï±´R‹X®0Õ$¿÷”ðó½t˜š*Õ¹Y㨠ÿB™üÅ _ÿ«¨Š`—'YÅVPåMÔ{0TÄ¡R› EÚù§I0çÇÉÅ‘Xþ.Éâ´^1ø‘÷eÀÿÍOü¸nŠz8¨8ǧ}[ô6Q¶JYÿñ®õ!ͳQÁB9ÇÎüÖWÞüål< ÇÁä)¸”šÝLx¼†Û¼†½âwHmWŽ² +û­)«¦IøRm”¬øªPOé®Ì +Ø'Õ&¯+ØD +E_×±å¯ bL“k^"¬rˆ ¬Š”e ù‚a¶Xv]0N„æõôñ5)#88_҈e[\Ø»j¹ÛÑ\3¨K¶"ðqÃ2á­ÿãQIe øu¦·pdQq+Òõa¿Iâ 䘿Ø'%ã~iò‡‚Ô¨iË Ï#ZrRN>yu³˜ÓY‹Á4$¨n;mTh–+&„ÜeÔ±Íî$åeàŸì5‚vÅÆÏa8}ˆ÷ëèýÔ÷žÚ¸ƒ2AO¬Ç‹{BdIÅ qνåd½¹ ò7rϺC£¨Vo¢zb}^ÀY·¡%ËVgç½á»óPiø—ƒÂà£g›ªÚý00„£2ä?£í.e$ηgßyлSOÎփ‚ö±ÙÛgó(ÚB暆UvÁ.”FßZÕüö}hܹó=·+Öy±í:Ê­ê¡£ÿ´µ†Ã÷ÐÑx9M1Âш¤ۢݾýÑÅ؇ŸNË"†‰ Ž˜0zÎ5ž'ו<óÂËÙ>(Ô@¶©<ò/=1šÇȆçYUíì-ƒw¬E!Põn—xíõ¯œöÈåäÝ$PŒ–'Ë@\ Ü/Ë+Ò¦zú~ô<ùóàPÇÉýøp`'MÂP´ÛH¡NýãXh·mí¤í$®cN³ïÅU S'E‘Õ-b7=ë..‡Ñ•Z–kK¦¼­QqñŠm0ï”Cˆ“J¿àï?„ïˆÒendstream +endobj +6 0 obj +1105 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:02+01:00 +2015-01-08T09:18:02+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001429 00000 n +0000003312 00000 n +0000001370 00000 n +0000001210 00000 n +0000000015 00000 n +0000001190 00000 n +0000001494 00000 n +0000001748 00000 n +0000001683 00000 n +0000001615 00000 n +0000001535 00000 n +0000001565 00000 n +0000001830 00000 n +0000001889 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [] +>> +startxref +3466 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 new file mode 100644 index 0000000..50fc351 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 @@ -0,0 +1,64 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE_LARGE, + curl_off_t size); +.SH DESCRIPTION +If you want to post data to the server without having libcurl do a strlen() to +measure the data size, this option must be used. When this option is used you +can post fully binary data, which otherwise is likely to fail. If this size is +set to -1, the library will use strlen() to get the size. +.SH DEFAULT +-1 +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + const char *data = large_chunk; + curl_off_t length_of_data; /* set somehow */ + + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* size of the POST data */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, length_of_data); + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_COPYPOSTFIELDS "(3), " +.BR CURLOPT_POSTFIELDSIZE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.html b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.html new file mode 100644 index 0000000..322ee47 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.html @@ -0,0 +1,77 @@ + + +CURLOPT_POSTFIELDSIZE_LARGE man page + + + + +

    NAME

    +

    CURLOPT_POSTFIELDSIZE_LARGE - size of POST data pointed to

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE_LARGE, +   curl_off_t size); +

    +

    DESCRIPTION

    +

    If you want to post data to the server without having libcurl do a strlen() to measure the data size, this option must be used. When this option is used you can post fully binary data, which otherwise is likely to fail. If this size is set to -1, the library will use strlen() to get the size.

    DEFAULT

    +

    -1

    PROTOCOLS

    +

    HTTP(S)

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   const char *data = large_chunk; +   curl_off_t length_of_data; /* set somehow */ +

      curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* size of the POST data */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, length_of_data); +

      curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_POSTFIELDS, CURLOPT_COPYPOSTFIELDS, CURLOPT_POSTFIELDSIZE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.pdf b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53bb6bd3eae53c155975e2bbcdadd21947c70ba7 GIT binary patch literal 3880 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POSTQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTQUOTE, struct curl_slist *cmds); +.SH DESCRIPTION +Pass a pointer to a linked list of FTP or SFTP commands to pass to the server +after your FTP transfer request. The commands will only be run if no error +occurred. The linked list should be a fully valid list of struct curl_slist +structs properly filled in as described for \fICURLOPT_QUOTE(3)\fP. + +Disable this operation again by setting a NULL to this option. +.SH DEFAULT +NULL +.SH PROTOCOLS +SFTP and FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +If support for the protocols are built-in. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_QUOTE "(3), " CURLOPT_PREQUOTE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.html b/docs/libcurl/opts/CURLOPT_POSTQUOTE.html new file mode 100644 index 0000000..ba8a206 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.html @@ -0,0 +1,61 @@ + + +CURLOPT_POSTQUOTE man page + + + + +

    NAME

    +

    CURLOPT_POSTQUOTE - (S)FTP commands to run after the transfer

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTQUOTE, struct curl_slist *cmds);

    DESCRIPTION

    +

    Pass a pointer to a linked list of FTP or SFTP commands to pass to the server after your FTP transfer request. The commands will only be run if no error occurred. The linked list should be a fully valid list of struct curl_slist structs properly filled in as described for CURLOPT_QUOTE. +

    Disable this operation again by setting a NULL to this option.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SFTP and FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If support for the protocols are built-in.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_QUOTE, CURLOPT_PREQUOTE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.pdf b/docs/libcurl/opts/CURLOPT_POSTQUOTE.pdf new file mode 100644 index 0000000..7ee5b9b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.pdf @@ -0,0 +1,114 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ…Uo›Hýߟb¤û£…-Ëòku§“Ü„Jn©qlÜ^Ÿ"ŒqÂ6 ­òúUî;Þì.¶e·‘eɘ™}3ïÍãlBÁ–¿þšoo§<Š ƒçU/¡¿äx—b@(¤ëÎ¡8pFBéfpoÜ̧q2I&É,½39áÜñCcž˜§Ü'ÔçóÒÕÀ§$ ýŽIi´0Ø„¼kª‡"/¢hë]kZŽg›zޔõVÀiyY“1F8Õ%ïåA®Ìpý}QdÙÄ¡ˆ0Ç86@¸'{°\†Á!X̗éÆxh¦ÿ`÷G=âq¦ËŸ"ùüØ»c×À¢Ž|më&^í\ò8‚ÿ`aÌæûty½Ùdە€¶†¦ÛB¶n‹Ú§Ú&ۊuÑ(ä§x§E}*T³¯ãd2ÍN±©…Ëø­ÜæU·*à9Ø·ò<ý)ÃÒx^iÔy1ç³_¨Wpõ„ «âúlòÔ>õ5ˆ¶éòV—U)Z¸Ê7+±0¿ÔÇm4»™Ž&é(KlÈõ4U¿èi’(â$ô4A”¸N/%! ƒ]]nÕ4k¼©Êí¿ˆW#-V °Õk$Ô ÌÎÉØeB]%¢h¾™ÔE.mÇÀ‚š¤—ºkTú S–³×ñl®5ÅsWˆ–@Š}/« +êmõËBñ_®a[CÑ4ˆ©ÎqŒM±Ò9Ǹwh@<Õ]µ’ɬ» +ë|3 Ô£FV•‡64‰)Ö:5~æI?°kê]Ñ`¥U…Ç”¨I«BäM¹Äûuݘojï·À ‰Íö›·×ǝ‚jìµ]<Ҋ¶Áû%#Š|æPÂqµ¤BeÙÛRdË +—â© ñeÒ {4±ÙÐcž‘!Ðå RÕ¶åöÇ1žÇ±&P¥ÈxrYƒï{íyn(Ņ+ΩÛûŠ1œ«·T6Ö»ƒã³ §M›“2‚€¹éJ\zW_…1™ö(\¦P ôVc9Äö”¨Œ$…äp¦ÃH`û{¯ºIâ3G°äD™ëžø•¡tR”B¾€*úkøiGûå _]ÎôŠ2¹ÅÒmÒOÏ Ã_x0—‘‡Óä]…pøŽ~Œ|øí'aŒâá»Q5†ñ<:“÷q0_´]Ó¿¢‡ä£\w DËP¨=Äbu­XсóñÇqb¢È¿ŒåÚ'ڋ‚žE ãYr¤öÒ+ ‹»zÖGÈ¥™í×T-òõiY<Õ÷mçÜ +&ÓèbqjcuúSmüðSâ«/3'¾.[•KéZÛ´¨çq—x ਃN£Š»‡] ²T”îð÷?#dL€endstream +endobj +6 0 obj +1052 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:03+01:00 +2015-01-08T09:18:03+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001376 00000 n +0000003266 00000 n +0000001317 00000 n +0000001157 00000 n +0000000015 00000 n +0000001137 00000 n +0000001441 00000 n +0000001695 00000 n +0000001630 00000 n +0000001562 00000 n +0000001482 00000 n +0000001512 00000 n +0000001777 00000 n +0000001843 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [<6D18367D1B659C0775060C32CB00322E><6D18367D1B659C0775060C32CB00322E>] +>> +startxref +3420 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3 new file mode 100644 index 0000000..aa36bd0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3 @@ -0,0 +1,73 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_POSTREDIR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_POSTREDIR \- how to act on a HTTP POST redirect +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTREDIR, + long bitmask); +.SH DESCRIPTION +Pass a bitmask to control how libcurl acts on redirects after POSTs that get a +301, 302 or 303 response back. A parameter with bit 0 set (value +\fBCURL_REDIR_POST_301\fP) tells the library to respect RFC2616/10.3.2 and not +convert POST requests into GET requests when following a 301 redirection. +Setting bit 1 (value \fBCURL_REDIR_POST_302\fP) makes libcurl maintain the +request method after a 302 redirect whilst setting bit 2 (value +\fBCURL_REDIR_POST_303\fP) makes libcurl maintain the request method after a +303 redirect. The value \fBCURL_REDIR_POST_ALL\fP is a convenience define that +sets all three bits. + +The non-RFC behaviour is ubiquitous in web browsers, so the library does the +conversion by default to maintain consistency. However, a server may require a +POST to remain a POST after such a redirection. This option is meaningful only +when setting \fICURLOPT_FOLLOWLOCATION(3)\fP. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP(S) +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* a silly POST example */ + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true"); + + /* example.com is redirected, so we tell libcurl to send POST on 301, 302 and + 303 HTTP response codes */ + curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.17.1. This option was known as CURLOPT_POST301 up to 7.19.0 as it +only supported the 301 then. CURL_REDIR_POST_303 was added in 7.26.0. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FOLLOWLOCATION "(3), " CURLOPT_POSTFIELDS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.html b/docs/libcurl/opts/CURLOPT_POSTREDIR.html new file mode 100644 index 0000000..f4b8ffe --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.html @@ -0,0 +1,78 @@ + + +CURLOPT_POSTREDIR man page + + + + +

    NAME

    +

    CURLOPT_POSTREDIR - how to act on a HTTP POST redirect

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTREDIR, +   long bitmask); +

    +

    DESCRIPTION

    +

    Pass a bitmask to control how libcurl acts on redirects after POSTs that get a 301, 302 or 303 response back. A parameter with bit 0 set (value CURL_REDIR_POST_301) tells the library to respect RFC 2616/10.3.2 and not convert POST requests into GET requests when following a 301 redirection. Setting bit 1 (value CURL_REDIR_POST_302) makes libcurl maintain the request method after a 302 redirect whilst setting bit 2 (value CURL_REDIR_POST_303) makes libcurl maintain the request method after a 303 redirect. The value CURL_REDIR_POST_ALL is a convenience define that sets all three bits. +

    The non-RFC behaviour is ubiquitous in web browsers, so the library does the conversion by default to maintain consistency. However, a server may require a POST to remain a POST after such a redirection. This option is meaningful only when setting CURLOPT_FOLLOWLOCATION.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP(S)

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* a silly POST example */ +   curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true"); +

      /* example.com is redirected, so we tell libcurl to send POST on 301, 302 and +   303 HTTP response codes */ +   curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Added in 7.17.1. This option was known as CURLOPT_POST301 up to 7.19.0 as it only supported the 301 then. CURL_REDIR_POST_303 was added in 7.26.0.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FOLLOWLOCATION, CURLOPT_POSTFIELDS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.pdf b/docs/libcurl/opts/CURLOPT_POSTREDIR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..513682a6e5600f3e4c35b23e94dd7c628345a826 GIT binary patch literal 4682 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3 new file mode 100644 index 0000000..e4163e8 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PREQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PREQUOTE \- commands to run before FTP or SFTP transfer +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE, char *cmds); +.SH DESCRIPTION +Pass a pointer to a linked list of FTP or SFTP commands to pass to the server +after the transfer type is set. The linked list should be a fully valid list +of struct curl_slist structs properly filled in as described for +\fICURLOPT_QUOTE(3)\fP. Disable this operation again by setting a NULL to this +option. +.SH DEFAULT +NULL +.SH PROTOCOLS +FTP and SFTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with the protocol support +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_QUOTE "(3), " CURLOPT_POSTQUOTE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.html b/docs/libcurl/opts/CURLOPT_PREQUOTE.html new file mode 100644 index 0000000..f74c660 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.html @@ -0,0 +1,60 @@ + + +CURLOPT_PREQUOTE man page + + + + +

    NAME

    +

    CURLOPT_PREQUOTE - commands to run before FTP or SFTP transfer

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE, char *cmds);

    DESCRIPTION

    +

    Pass a pointer to a linked list of FTP or SFTP commands to pass to the server after the transfer type is set. The linked list should be a fully valid list of struct curl_slist structs properly filled in as described for CURLOPT_QUOTE. Disable this operation again by setting a NULL to this option.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    FTP and SFTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with the protocol support

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_QUOTE, CURLOPT_POSTQUOTE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.pdf b/docs/libcurl/opts/CURLOPT_PREQUOTE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..60ae8e458bd34aa2fdca8f9e45f1389a1793a9c4 GIT binary patch literal 3868 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 SHpW>rfe;kU+dDKm4Ehi1q%m6n literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3 new file mode 100644 index 0000000..bdb11cf --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PRIVATE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PRIVATE \- store a private pointer +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRIVATE, void *pointer); +.SH DESCRIPTION +Pass a void * as parameter, pointing to data that should be associated with +this curl handle. The pointer can subsequently be retrieved using +\fIcurl_easy_getinfo(3)\fP with the CURLINFO_PRIVATE option. libcurl itself +never does nothing with this data. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.3 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_STDERR "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.html b/docs/libcurl/opts/CURLOPT_PRIVATE.html new file mode 100644 index 0000000..165f333 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PRIVATE.html @@ -0,0 +1,60 @@ + + +CURLOPT_PRIVATE man page + + + + +

    NAME

    +

    CURLOPT_PRIVATE - store a private pointer

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRIVATE, void *pointer);

    DESCRIPTION

    +

    Pass a void * as parameter, pointing to data that should be associated with this curl handle. The pointer can subsequently be retrieved using curl_easy_getinfo(3) with the CURLINFO_PRIVATE option. libcurl itself never does nothing with this data.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.3

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_VERBOSE, CURLOPT_STDERR,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.pdf b/docs/libcurl/opts/CURLOPT_PRIVATE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d0c6d4633678e1604a94bebb2be9bf6f5b2f83c GIT binary patch literal 3895 zcmb_fc~}!?8ZTIjJCC~B3Izl@Vj-X=Gm|?piAX}gN&o|R0mUJiKp@G)WFi4{1x0JM zlv-uAYVn9xtk#PjC>HIuh}M(!z;bx3S8-9c0$!EcZ;~L0?za0p&Ody4zxVpye@;-K|C0R$&74BB0*vaQzn%K^8rPTDD?)4u)v7YfK!Bm(2!a}CWEY$ zg}{xFeO=j9oOB3>b(g2(t+H`D{2LDYesG6UH||x>`RSw4n{&6{-nOZTzfK)9pf!8` z+286$jvQb7Wx=^{^`=<`x{GTCrzE2mga_Ys%%4{3==dS}uP2slc(4AVPkr{mre>cR9o=7tH|94rYU&oLJSs28 z&zLsEfAiz<-4||Z18(JycARu%huq!QJiGkW!q>f0Jp-!)e0=>m@qw#Vk75Ek3R@%A z%O4(K92s>XMCP9u&3uCB0*x{M@8T_48H+1;X)#uJvdlFgIV~6-&TwXY^VR(6^ zyzrI8m|M3NeI3!Xe@A0R11?+~KTuJ4@560gh96s&A(i%;)vU$#qM(IctM<+`-pecc z+lt%cSEbv#t36+9DG{@$@(e;_d&$hm_J$c{TTm#=1At=DxpUM^HkF zLz2TeyR*`V_wW3JN9zM)9Qs?ypL`YdVNKa>|Gyto{!%L5yGMFsWyZw7v1xC07EYb9 zWh->{&aXR*#ty7_J>|r2JHyNGMV&L%98*+pYALHNL`LmKs)paKoT**?<0~JJyBV|e zVU5?AZywx88gM~eJ0(Lh$R1jQw%n=hoHe=BEWy1aj?Qa2VQ(;>5naI#FLF3?-hsAM zwYJG0TN1*T9AjLJpuC1L95e63sclud{bdCHWqA9DUx=m=YYWPXi#CWR?9NG+d%kzI zad?F)Bjyro!uj`S6$ce4(zq3$Z|s0qy!)z}`QZBHf&h+ZkX17DEh@R$yK%8+`vf{qc{92Yd&zi@#})U11cPdcJEIIrbItzxYi+oRE{6wKOI%#wT3@uu6IsN)v#Tu z)8^&Z9(idq_I0L{nQoX2fBX0*$lZgs6u-jw(e2=C}?Za-6~qWM+>FxA!W7!nNQA z#$393Z3~`N(EAJsiBC|$m`vt&()lX4DYXEi<Ad%}JgoOPh zXb!hTByJ_>Xdy{@BVlDu0#DFuoS{HyGK3`BGAKH8^c#UoJ%OWjzgR^iY0&-&1+-5u zR-h)0xT&v(C=(c2dQ&EhIb-_YTyoyJRnp!fJ#vUbuhS8rq(BX&K$w7o81*KbHLdqG z&fN4B?a5m2`=_g7d!{PJ;qqlNckxRm*v+^mhoImLB2#aYGTN&TGGM({%9zGep(?YS z$kNB;TZqK`xFk(}jz*+qOprm62{`B(f@#OiOr3K)TVcYgkp|1vvC3eY!7jEN%|=i> zu-#}dS;clK!zm&LXPS&KU?&TeBV|liCBPI(8gld$%w~yL7!%`+gLM|%NaT{192jHq z89=2)s}rk1-?$WlUs6UEMVZA2lAD{$%H^;~OD2MeL?Q%bBWyMka4@ZTCJMJRP1e!C zp3@Qi^rvDbE6eEIF538oF>8KjMpGHf=zR?NpaJb^%i zGc`JP1{1>w9TNo~6Bn_$0zxYk>4X_Q=FENEe8wKQ00ucA4&WpPz@W8h2#b^voe&F0 zXOULQWgix?P(A~3KmTQU1#0MmHqeKE zz~SzOuov}9_|s8rw-7oAg)tsP1D5N9`8*zn2kT%r4dbF<&7eQn)I;O2g<#-4OQXlg zb2Lo&91R6;dY+H}93RFNfWh9+hJX#$j(#*g4@~cVG@c0TGyQ4w;?bYReV!&npZ7(` z@8dIN!Sx2h0{$_Dkwkqy0pbUPZI1*C709$2MkbkbBlD^b2O slE>vMV!Z literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 new file mode 100644 index 0000000..c4785dc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 @@ -0,0 +1,44 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROGRESSDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first +argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION(3)\fP. +.SH DEFAULT +The default value of this parameter is NULL. +.SH PROTOCOLS +All +.SH EXAMPLE +http://curl.haxx.se/libcurl/c/progressfunc.html +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_PROGRESSFUNCTION "(3), " CURLOPT_XFERINFOFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.html b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.html new file mode 100644 index 0000000..cd73126 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_PROGRESSDATA man page + + + + +

    NAME

    +

    CURLOPT_PROGRESSDATA - custom pointer passed to the progress callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer);

    DESCRIPTION

    +

    Pass a pointer that will be untouched by libcurl and passed as the first argument in the progress callback set with CURLOPT_PROGRESSFUNCTION.

    DEFAULT

    +

    The default value of this parameter is NULL.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    http://curl.haxx.se/libcurl/c/progressfunc.html

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_PROGRESSFUNCTION, CURLOPT_XFERINFOFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.pdf b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..efd9226651a8734e4c67456e8cde3a99222ff187 GIT binary patch literal 3809 zcmb_fdsGuw8n;!8j?Y@KpjEFZ9knDglXoJCYZ4w&PzZ>)EL|tbB#b1PFquHWYCR(2 zYF9ukZhfw(N4JQ&zNvOmkJ43H7qu+52NiYevleT$TEx0{k|2oewtJ5A4>#ZaUiW+a zzK@7ReT;w*N|1;zzAdgmqyPtuX$}$ksRWY;5k+uln_he>9&tIBU^-eA!6r#*_H5Mg7J+mOi-t!-4B9 zXAd1M0a`G{!Ukmv#rmn9xNokUJ`x&>%Qj6K+au&^_%z&M3e}|)HibP}>|wOVyL*Zx z!uLll-CLKtMY%a1jE>Y@+Wv#%HTBp}Mf)6gDj8<)#Q&%KjW zzH^mpOV}a#hbr{M3ge%h#VZe7YI}EWU4;Q}7!rOsslN9@Yj(}9kwj`_|!uIoH)qH`xP7M}-Z8b` z-|ua5YJ>XB*|z-JwvhSJMDeui{y?T~B5pH~TPWV+9-_FgT%9N%Vm@KfkIV^8QPJVv~KM1mPEnVW2o6 z^8J8lgz4aKsL>606f+`_6!4EX;YT&74LS&X9=ZWGmA1G+I>P&JL^1%>;Newv66H+= z0MRe0BRSH}*xFSDyicGw(gJS);n&q+TmGVgj%Og)^uz=}Xfy#QeXk0bGRhHN&e);G z_ssTN0!Iiws7B1FM3nx60#S64;5h;kTGCDN(ZW(_2jvzR;1g)GFBBM0MzCa$iQ_ZJ zzY)6B9ynfi_bRlE-SR6G@IG~~z{ogAXJ-x3PB>L)rwtIknEp4He76CWyti1p9HytO zRtlCBtf6#-kl>h=MhLkWbI?wYJEP-Kz7%!V(4M@GFr+2Kx6eO9ERkt6ffk6GZ4%ZpuW5Rg`ugdFiIbaO|ufy(itGsH|C!&I9o{XWu$HHZ)(X@m_z%h(H zi{^kxs1y3Y_jS(4Nl`I_^B%gT-T}ST!1(7!P7I88_#*50pY&hGK!|zbda_Zn}>GOlTksQIJQK0PEM9 zr-$gK5#fYXfD-~-k%B8#ghGXj-@^$Njz?i#IAQXks17btaIyLoqMbN9i85>oED4Q` zWvo_^L$Pi?6NFGC5{ms6ePRKwD2&fhr|7)uc#*Dzg#R5ehl4L^o=>G`%pM1XZG-;* zDVSHCV~hE@!!8eN_jQNGj8S%q_stE{OhAtVQi)0}7e}N;=4dc4&m+{XhvX`Z-2o4A-!ULB712U;pECp5&pb=tz zGV>pBw$sES{3RM8lESg}A|HV(U!vjgO)vAw;a1T_RxF1bLKm7$4A+$|G^q?OY+Yy) zC7jD$X+$?P$;&i3KY+W)%H?oTXs2;3N!uwF{tF4PWICUM@dI$_W8hu|Gi?Nz!D(fH ze`~`GdXOHa)hTpxNwiKR)+@zQokXtJi9}+VOd%z73XwEg^UE9={L1F$NS5;@O)Qqm Mkcf!r=`qNE0A^VV{r~^~ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 new file mode 100644 index 0000000..d8e7a66 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 @@ -0,0 +1,84 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROGRESSFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROGRESSFUNCTION \- callback to progress meter function +.SH SYNOPSIS +#include + +int progress_callback(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION, progress_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +We encourage users to use the newer \fICURLOPT_XFERINFOFUNCTION(3)\fP instead, +if you can. + +This function gets called by libcurl instead of its internal equivalent with a +frequent interval. While data is being transferred it will be called very +frequently, and during slow periods like when nothing is being transferred it +can slow down to about one call per second. + +\fIclientp\fP is the pointer set with \fICURLOPT_PROGRESSDATA(3)\fP, it is not +used by libcurl but is only passed along from the application to the callback. + +The callback gets told how much data libcurl will transfer and has +transferred, in number of bytes. \fIdltotal\fP is the total number of bytes +libcurl expects to download in this transfer. \fIdlnow\fP is the number of +bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl +expects to upload in this transfer. \fIulnow\fP is the number of bytes +uploaded so far. + +Unknown/unused argument values passed to the callback will be set to zero +(like if you only download data, the upload size will remain 0). Many times +the callback will be called one or more times first, before it knows the data +sizes so a program must be made to handle that. + +Returning a non-zero value from this callback will cause libcurl to abort the +transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. + +If you transfer data with the multi interface, this function will not be +called during periods of idleness unless you call the appropriate libcurl +function that performs transfers. + +\fICURLOPT_NOPROGRESS(3)\fP must be set to 0 to make this function actually +get called. +.SH DEFAULT +By default, libcurl has an internal progress meter. That's rarely wanted by +users. +.SH PROTOCOLS +All +.SH EXAMPLE +http://curl.haxx.se/libcurl/c/progressfunc.html +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_NOPROGRESS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.html b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.html new file mode 100644 index 0000000..489cd70 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.html @@ -0,0 +1,69 @@ + + +CURLOPT_PROGRESSFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_PROGRESSFUNCTION - callback to progress meter function

    SYNOPSIS

    +

    #include <curl/curl.h> +

    int progress_callback(void *clientp,   double dltotal,   double dlnow,   double ultotal,   double ulnow); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION, progress_callback);

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    We encourage users to use the newer CURLOPT_XFERINFOFUNCTION instead, if you can. +

    This function gets called by libcurl instead of its internal equivalent with a frequent interval. While data is being transferred it will be called very frequently, and during slow periods like when nothing is being transferred it can slow down to about one call per second. +

    clientp is the pointer set with CURLOPT_PROGRESSDATA, it is not used by libcurl but is only passed along from the application to the callback. +

    The callback gets told how much data libcurl will transfer and has transferred, in number of bytes. dltotal is the total number of bytes libcurl expects to download in this transfer. dlnow is the number of bytes downloaded so far. ultotal is the total number of bytes libcurl expects to upload in this transfer. ulnow is the number of bytes uploaded so far. +

    Unknown/unused argument values passed to the callback will be set to zero (like if you only download data, the upload size will remain 0). Many times the callback will be called one or more times first, before it knows the data sizes so a program must be made to handle that. +

    Returning a non-zero value from this callback will cause libcurl to abort the transfer and return CURLE_ABORTED_BY_CALLBACK. +

    If you transfer data with the multi interface, this function will not be called during periods of idleness unless you call the appropriate libcurl function that performs transfers. +

    CURLOPT_NOPROGRESS must be set to 0 to make this function actually get called.

    DEFAULT

    +

    By default, libcurl has an internal progress meter. That's rarely wanted by users.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    http://curl.haxx.se/libcurl/c/progressfunc.html

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK.

    SEE ALSO

    +

    CURLOPT_VERBOSE, CURLOPT_NOPROGRESS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc418fee659eb48796240d893d60ab26833ce944 GIT binary patch literal 5873 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 new file mode 100644 index 0000000..958eeeb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 @@ -0,0 +1,92 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROTOCOLS \- set allowed protocols +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROTOCOLS, long bitmask); +.SH DESCRIPTION +Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask +limits what protocols libcurl may use in the transfer. This allows you to have +a libcurl built to support a wide range of protocols but still limit specific +transfers to only be allowed to use a subset of them. By default libcurl will +accept all protocols it supports (\fICURLPROTO_ALL\fP). See also +\fICURLOPT_REDIR_PROTOCOLS(3)\fP. + +These are the available protocol defines: +.nf +CURLPROTO_DICT +CURLPROTO_FILE +CURLPROTO_FTP +CURLPROTO_FTPS +CURLPROTO_GOPHER +CURLPROTO_HTTP +CURLPROTO_HTTPS +CURLPROTO_IMAP +CURLPROTO_IMAPS +CURLPROTO_LDAP +CURLPROTO_LDAPS +CURLPROTO_POP3 +CURLPROTO_POP3S +CURLPROTO_RTMP +CURLPROTO_RTMPE +CURLPROTO_RTMPS +CURLPROTO_RTMPT +CURLPROTO_RTMPTE +CURLPROTO_RTMPTS +CURLPROTO_RTSP +CURLPROTO_SCP +CURLPROTO_SFTP +CURLPROTO_SMB +CURLPROTO_SMTP +CURLPROTO_SMTPS +CURLPROTO_TELNET +CURLPROTO_TFTP +.fi +.SH DEFAULT +All protocols built-in +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + /* pass in the URL from an external source */ + curl_easy_setopt(curl, CURLOPT_URL, argv[1]); + + /* only allow HTTP, TFTP and SFTP */ + curl_easy_setopt(curl, CURLOPT_PROTOCOLS, + CURLPROTO_HTTP | CURLPROTO_TFTP | CURLPROTO_SFTP); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.19.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_REDIR_PROTOCOLS "(3), " CURLOPT_URL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.html b/docs/libcurl/opts/CURLOPT_PROTOCOLS.html new file mode 100644 index 0000000..b2eae23 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.html @@ -0,0 +1,104 @@ + + +CURLOPT_PROTOCOLS man page + + + + +

    NAME

    +

    CURLOPT_PROTOCOLS - set allowed protocols

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROTOCOLS, long bitmask);

    DESCRIPTION

    +

    Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask limits what protocols libcurl may use in the transfer. This allows you to have a libcurl built to support a wide range of protocols but still limit specific transfers to only be allowed to use a subset of them. By default libcurl will accept all protocols it supports (CURLPROTO_ALL). See also CURLOPT_REDIR_PROTOCOLS. +

    These are the available protocol defines:

    +

    CURLPROTO_DICT + CURLPROTO_FILE + CURLPROTO_FTP + CURLPROTO_FTPS + CURLPROTO_GOPHER + CURLPROTO_HTTP + CURLPROTO_HTTPS + CURLPROTO_IMAP + CURLPROTO_IMAPS + CURLPROTO_LDAP + CURLPROTO_LDAPS + CURLPROTO_POP3 + CURLPROTO_POP3S + CURLPROTO_RTMP + CURLPROTO_RTMPE + CURLPROTO_RTMPS + CURLPROTO_RTMPT + CURLPROTO_RTMPTE + CURLPROTO_RTMPTS + CURLPROTO_RTSP + CURLPROTO_SCP + CURLPROTO_SFTP + CURLPROTO_SMB + CURLPROTO_SMTP + CURLPROTO_SMTPS + CURLPROTO_TELNET + CURLPROTO_TFTP +

    + +

    DEFAULT

    +

    All protocols built-in

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   /* pass in the URL from an external source */ +   curl_easy_setopt(curl, CURLOPT_URL, argv[1]); +

      /* only allow HTTP, TFTP and SFTP */ +   curl_easy_setopt(curl, CURLOPT_PROTOCOLS, +   CURLPROTO_HTTP | CURLPROTO_TFTP | CURLPROTO_SFTP); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Added in 7.19.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_REDIR_PROTOCOLS, CURLOPT_URL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.pdf b/docs/libcurl/opts/CURLOPT_PROTOCOLS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45587f3d7aa806166dd483f43b5db3c800417d54 GIT binary patch literal 5240 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXY \- set proxy to use +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy); +.SH DESCRIPTION +Set the \fIproxy\fP to use for the upcoming request. The parameter should be a +char * to a zero terminated string holding the host name or dotted IP +address. + +To specify port number in this string, append :[port] to the end of the host +name. The proxy's port number may optionally be specified with the separate +option \fICURLOPT_PROXYPORT(3)\fP. If not specified, libcurl will default to +using port 1080 for proxies. + +The proxy string may be prefixed with [scheme]:// to specify which kind of +proxy is used. Use socks4://, socks4a://, socks5:// or socks5h:// (the last +one to enable socks5 and asking the proxy to do the resolving, also known as +\fICURLPROXY_SOCKS5_HOSTNAME\fP type) to request the specific SOCKS version to +be used. No protocol specified, http:// and all others will be treated as HTTP +proxies. + +Without a scheme prefix, \fICURLOPT_PROXYTYPE(3)\fP can be used to specify +which kind of proxy the string identifies. + +When you tell the library to use a HTTP proxy, libcurl will transparently +convert operations to HTTP even if you specify an FTP URL etc. This may have +an impact on what other features of the library you can use, such as +\fICURLOPT_QUOTE(3)\fP and similar FTP specifics that don't work unless you +tunnel through the HTTP proxy. Such tunneling is activated with +\fICURLOPT_HTTPPROXYTUNNEL(3)\fP. + +libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP, +\fBall_proxy\fP etc, if any of those are set. The \fICURLOPT_PROXY(3)\fP +option does however override any possibly set environment variables. + +Setting the proxy string to "" (an empty string) will explicitly disable the +use of a proxy, even if there is an environment variable set for it. + +A proxy host string given in an environment variable can also include protocol +scheme (http://) and embedded user + password. +.SH DEFAULT +Default is NULL, meaning no proxy is used. + +When you set a host name to use, do not assume that there's any particular +single port number used widely for proxies. Specify it! +.SH PROTOCOLS +All except file://. Note that some protocols don't do very well over proxy. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Since 7.14.1 the proxy environment variable names can include the protocol +scheme. + +Since 7.21.7 the proxy string supports the socks protocols as "schemes". +.SH RETURN VALUE +Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PROXYPORT "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), " +.BR CURLOPT_PROXYTYPE "(3)" diff --git a/docs/libcurl/opts/CURLOPT_PROXY.html b/docs/libcurl/opts/CURLOPT_PROXY.html new file mode 100644 index 0000000..d37676a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXY.html @@ -0,0 +1,69 @@ + + +CURLOPT_PROXY man page + + + + +

    NAME

    +

    CURLOPT_PROXY - set proxy to use

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy);

    DESCRIPTION

    +

    Set the proxy to use for the upcoming request. The parameter should be a char * to a zero terminated string holding the host name or dotted IP address. +

    To specify port number in this string, append :[port] to the end of the host name. The proxy's port number may optionally be specified with the separate option CURLOPT_PROXYPORT. If not specified, libcurl will default to using port 1080 for proxies. +

    The proxy string may be prefixed with [scheme]:// to specify which kind of proxy is used. Use socks4://, socks4a://, socks5:// or socks5h:// (the last one to enable socks5 and asking the proxy to do the resolving, also known as CURLPROXY_SOCKS5_HOSTNAME type) to request the specific SOCKS version to be used. No protocol specified, http:// and all others will be treated as HTTP proxies. +

    Without a scheme prefix, CURLOPT_PROXYTYPE can be used to specify which kind of proxy the string identifies. +

    When you tell the library to use a HTTP proxy, libcurl will transparently convert operations to HTTP even if you specify an FTP URL etc. This may have an impact on what other features of the library you can use, such as CURLOPT_QUOTE and similar FTP specifics that don't work unless you tunnel through the HTTP proxy. Such tunneling is activated with CURLOPT_HTTPPROXYTUNNEL. +

    libcurl respects the environment variables http_proxy, ftp_proxy, all_proxy etc, if any of those are set. The CURLOPT_PROXY option does however override any possibly set environment variables. +

    Setting the proxy string to "" (an empty string) will explicitly disable the use of a proxy, even if there is an environment variable set for it. +

    A proxy host string given in an environment variable can also include protocol scheme (http://) and embedded user + password.

    DEFAULT

    +

    Default is NULL, meaning no proxy is used. +

    When you set a host name to use, do not assume that there's any particular single port number used widely for proxies. Specify it!

    PROTOCOLS

    +

    All except file://. Note that some protocols don't do very well over proxy.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Since 7.14.1 the proxy environment variable names can include the protocol scheme. +

    Since 7.21.7 the proxy string supports the socks protocols as "schemes".

    RETURN VALUE

    +

    Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PROXYPORT, CURLOPT_HTTPPROXYTUNNEL, CURLOPT_PROXYTYPE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXY.pdf b/docs/libcurl/opts/CURLOPT_PROXY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76ace305ca6a4864d8c6ff8db61e9b0b059faf69 GIT binary patch literal 6395 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 new file mode 100644 index 0000000..fe742c0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 @@ -0,0 +1,55 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYAUTH, long bitmask); +.SH DESCRIPTION +Pass a long as parameter, which is set to a bitmask, to tell libcurl which +HTTP authentication method(s) you want it to use for your proxy +authentication. If more than one bit is set, libcurl will first query the +site to see what authentication methods it supports and then pick the best one +you allow it to use. For some methods, this will induce an extra network +round-trip. Set the actual name and password with the +\fICURLOPT_PROXYUSERPWD(3)\fP option. + +The bitmask can be constructed by or'ing together the bits fully listed and +described in the \fICURLOPT_HTTPAUTH(3)\fP man page. +.SH DEFAULT +CURLAUTH_BASIC +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.10.7 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication +methods. +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " +.BR CURLOPT_PROXYUSERPWD "(3), " CURLOPT_PROXYPORT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.html b/docs/libcurl/opts/CURLOPT_PROXYAUTH.html new file mode 100644 index 0000000..e7d050e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.html @@ -0,0 +1,61 @@ + + +CURLOPT_PROXYAUTH man page + + + + +

    NAME

    +

    CURLOPT_PROXYAUTH - set HTTP proxy authentication methods to try

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYAUTH, long bitmask);

    DESCRIPTION

    +

    Pass a long as parameter, which is set to a bitmask, to tell libcurl which HTTP authentication method(s) you want it to use for your proxy authentication. If more than one bit is set, libcurl will first query the site to see what authentication methods it supports and then pick the best one you allow it to use. For some methods, this will induce an extra network round-trip. Set the actual name and password with the CURLOPT_PROXYUSERPWD option. +

    The bitmask can be constructed by or'ing together the bits fully listed and described in the CURLOPT_HTTPAUTH man page.

    DEFAULT

    +

    CURLAUTH_BASIC

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.10.7

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication methods.

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYTYPE, CURLOPT_PROXYUSERPWD, CURLOPT_PROXYPORT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.pdf b/docs/libcurl/opts/CURLOPT_PROXYAUTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..377a5c48ae6c1397dd19bc3640927bfc718211a5 GIT binary patch literal 4289 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYHEADER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYHEADER, + struct curl_slist *headers); +.SH DESCRIPTION +Pass a pointer to a linked list of HTTP headers to pass in your HTTP request +sent to a proxy. The rules for this list is identical to the +\fICURLOPT_HTTPHEADER(3)\fP option's. + +The headers set with this option is only ever used in requests sent to a proxy +- when there's also a request sent to a host. + +The first line in a request (containing the method, usually a GET or POST) is +NOT a header and cannot be replaced using this option. Only the lines +following the request-line are headers. Adding this method line in this list +of headers will only cause your request to send an invalid header. + +Pass a NULL to this to reset back to no custom headers. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.37.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HEADEROPT "(3), " CURLOPT_HTTPHEADER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.html b/docs/libcurl/opts/CURLOPT_PROXYHEADER.html new file mode 100644 index 0000000..8c14363 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.html @@ -0,0 +1,67 @@ + + +CURLOPT_PROXYHEADER man page + + + + +

    NAME

    +

    CURLOPT_PROXYHEADER - custom HTTP headers to pass to proxy

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYHEADER, +   struct curl_slist *headers); +

    +

    DESCRIPTION

    +

    Pass a pointer to a linked list of HTTP headers to pass in your HTTP request sent to a proxy. The rules for this list is identical to the CURLOPT_HTTPHEADER option's. +

    The headers set with this option is only ever used in requests sent to a proxy - when there's also a request sent to a host. +

    The first line in a request (containing the method, usually a GET or POST) is NOT a header and cannot be replaced using this option. Only the lines following the request-line are headers. Adding this method line in this list of headers will only cause your request to send an invalid header. +

    Pass a NULL to this to reset back to no custom headers.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.37.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HEADEROPT, CURLOPT_HTTPHEADER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.pdf b/docs/libcurl/opts/CURLOPT_PROXYHEADER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07ff613e2e4b4f05f8926337271f69861d48f1de GIT binary patch literal 4117 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYPASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYPASSWORD \- password to use with proxy authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd); +.SH DESCRIPTION +Pass a char * as parameter, which should be pointing to the zero terminated +password to use for authentication with the proxy. + +The \fICURLOPT_PROXYPASSWORD(3)\fP option should be used in conjunction with +the \fICURLOPT_PROXYUSERNAME(3)\fP option. +.SH DEFAULT +blank +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PASSWORD "(3), " CURLOPT_PROXYUSERNAME "(3), " +.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)" diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.html b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.html new file mode 100644 index 0000000..f41b4f0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.html @@ -0,0 +1,61 @@ + + +CURLOPT_PROXYPASSWORD man page + + + + +

    NAME

    +

    CURLOPT_PROXYPASSWORD - password to use with proxy authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd);

    DESCRIPTION

    +

    Pass a char * as parameter, which should be pointing to the zero terminated password to use for authentication with the proxy. +

    The CURLOPT_PROXYPASSWORD option should be used in conjunction with the CURLOPT_PROXYUSERNAME option.

    DEFAULT

    +

    blank

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PASSWORD, CURLOPT_PROXYUSERNAME, CURLOPT_HTTPAUTH, CURLOPT_PROXYAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.pdf b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..025758f6f6ca5cec2a9729baea6ee37a8b0517b0 GIT binary patch literal 4050 zcmb_fdsq`!7FQ9qqq0;j54Ck{jX@=unYlM71#MTf+b7KU)ZNW2ASh&aMP z83~mNq8SH)TOs$BopUbOF2n~eY)cP6^Tyjt_jXJ`RtNcy+Z?@N=Jx5SiKFTQb64%( zbfP3C$$pl)Qhj?;MBTxp!XJk%9hANI;|TMqW_ew9V8ghlyDJtY+&%R1C(FB5Js0gd zgeZ3fr*_XckWlS6!v1A&gSGmfv2Qi5dqG~vfw~qPz3))nF*oE%q{~kq8r(3%KlQX} zQ(fz8_g-liK1j*?d%6E~^kVmsjRkTc=d;#lT0{6jlTJo0b1C_II3s4n%8s2=H~2OE zd~0?7^6brFic1&LCI)4vs}G(oTtL@{FMDd=sC(ScTZcGbtQecGZ{AZYIl)(w9#J$m=CfkuewHN@4z z4TY`S0x~joOi`!4vq)9alDhG7^FO|w<K8j!=I0^t4NJs*YN^^p)QgPus5E zKINh;fO@^D_WbKtx31ljyX~B8ZdGk2x#|3@w9`xQoQ?0_@Vg{U3_TXGCx5;2?lJD1 zp|zYr9)%nrHQKi}byt3s-10%^TMQC-ZuZurmjiiqiYbM$^{ell*ug_*xH$!bk;YSl zZ0jd<$$j3gdIx#3I{9E;^*SSAu=L5PlGK+%Lzz~vxp z3@l_TDj*Xy<#ZSb8q`{?gEGt}m`nszV;IpBZU)Gy-Aux4k0^$DMdB$SjtM*)P=1kE zum^}V%$98(1V}#nSQXwf4$y#su*X6gMqVO~G@J>s_UoW57$7)V$UdU1DqjciO2*<0 zZlTOQ5I*ZQ1cMvF35G3($KF2uaauU`(a*8R@x|PnAvzv2waz7|%6(PB9e1 zSf}a`og9*T7cxlJPlDy}NyOkZ!FmhPlU9P}C4wuE29GNcmJA`YojD8}Irfggq#nny z*aJhvP!{8#0AOtz7(ho^aa&&mwGFgU(q@J+k57NkB+sc2lC>7;kwfB0lZgON3cR6A z2os@*iG(nz5V4XrC!N)MDNl&{BJ>2W*9{q(%9jI?QEoeK$R`*$hcJ^i zCHH#WVJ=J>mE3f(2G!VOiCl7Kk%O3BG)r$N$~VZ3+$a?k8HIz?A$V@w&NF!?2O1`5 zgYx-UU2^>MEQ4F&w%V=W4Z&`!#YQXKO0Gvl0oE)T;ldskCSS?T&}dy6Futeea!rgK5zgO3V|QM zN&)JF(P>v=3(=QOcnQPeNsOP$m;x zNH}OV5*S|~;0wJPJz_qtNQ8}1AMZSAf8lnG=6`$4YGt1^%cqE=3{ER3+lg`i&x3i= zF*X_=8EkhtES~Hz8W6%lu(r`4%owoPXi%6ahZP5J8@Jm*4aM0fkAOGHRYihBhGZ;+ z%9DH17RI}ZV>A@p>2W@`W%ZMlV4%15qsgSenf+-fm?Zkqq(acx z`_Uxg0cf(vX>##nwg^xGm^FIv7za*T2nYDj3?sA2A_Dji216eO<|+_r9gHN}Ocd;$ z+K|LJI5Sc#kw~Qifm*DN7R5`{v1)ak1dEYLFsVc+l#63kf6S4^j%+l8I~Y&UgkrfA L;&9X{@z8$(vY&g^ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3 new file mode 100644 index 0000000..d8a1bb1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYPORT \- port number the proxy listens on +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPORT, long port); +.SH DESCRIPTION +Pass a long with this option to set the proxy port to connect to unless it is +specified in the proxy string \fICURLOPT_PROXY(3)\fP or uses the default one. + +While this accepts a 'long', the port number is 16 bit so it can't be larger +than 65535. +.SH DEFAULT +0, not specified which makes it use the default port +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.html b/docs/libcurl/opts/CURLOPT_PROXYPORT.html new file mode 100644 index 0000000..e065f33 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.html @@ -0,0 +1,61 @@ + + +CURLOPT_PROXYPORT man page + + + + +

    NAME

    +

    CURLOPT_PROXYPORT - port number the proxy listens on

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPORT, long port);

    DESCRIPTION

    +

    Pass a long with this option to set the proxy port to connect to unless it is specified in the proxy string CURLOPT_PROXY or uses the default one. +

    While this accepts a 'long', the port number is 16 bit so it can't be larger than 65535.

    DEFAULT

    +

    0, not specified which makes it use the default port

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYTYPE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.pdf b/docs/libcurl/opts/CURLOPT_PROXYPORT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d660795196571f723b5db1a68f8184ef45d56d1 GIT binary patch literal 3853 zcmb_fdsq`!7S~-79UrTH*!u1igy18YnY!Ye_B&;t-Tm{SL0M(x z34fbj+CHtJRPw&1<>`u+BXL{*6m~3Z>Zmt2LijPCv1|*1K_gq54p6)wxkT zQ~A&MAC7+6bbaFjzpQ0hn+~PpvLQ8C{373iFSbFey+Ru|I@5A9#K*^%+&vWe=tkV* zr3+6J<^ogW;aX=sVeH+$XR^H0B}_0@|s$&KZuKYf}1ep$$^dewLVFRuNYTl4yR z?K?WK(RCnqO8hyzDxrLmvru+>_1`DW%zOG|UCEHcf7A?j*8co*#c;<-m*(Q|iiZsb z-naSjfBkq@>YW#(h}>rNiO^dC+T+nkl- z;)GCdwCLQ2VTS{i`wXo|=3L#`u|iTY=IaqR${=Mmeu_+eR5Pl5@sa8}QqjbDRvL0M zt7K(IQm{QD3mFsL)HX0wsv*tGf|A!SBG#vPpME%S=E(u4#v~LdQR?iPy=}&K<}82E zAh;FRR=iA@^cUOcXPJKIojV`T^GV6kH@}=RMY7?G0f!CM6F-&x=7W<>WKKI-U{0K{ zd3)~kwUrvZuQa~tr@%JOf*q3|Y@J%2ov)mWN9%_$d4=&2KC$WF)K=O#ERK#6J@!sH%x>-@PL(?5pNSTPCla zhVBhqov||@J$mAu>bfT0s<;y;i*m2VmU#Dzxj8PfteTg%V%J7RPEM*;-G*NLT|shs zagjAH<`dJY)R`sa>0!;Gm!kI$9eiQz!PxCSLmL~?D;9mYzmlH6t^plzPc$G@V*2!c zVtnMg@o3_~Ij7!P>YY$uT#%os8%|mIn#2X^AuVO$rNbHybfku#-4z87who7l?=9a= zmptCOM%(IpZ|cf6Cvq&f?nwP&Y+2@>^YTH_7i$An`H!qUdIH+T@$>SH9}zKrjWXhr zzkzi1Th?uP_N3yDHcD! zV3cPGHqWWL70$8OC|bVHsY^K!5PWGt^U87*r4TE;6H zOApoEACf2U<{hpDdhE1Na9hOikui~v?Fi?H0m z{>4xMAM(hA-3$|(X(x~<+)N-k!bsx5lnYKm!L~>yf~7+KdnFi8j?G8l;^Tnw-aaWSDWZc_~FG|^JP9OJux0Omr};5R^Y zz%1kGAt3U^$GYfbK!64UgxwK3U}P3)bihdv8^0c!4+8`z3)#bzb>$(?PD?e;;1uQaM=-b%?7&zjR=01->j2%yfRM;29gL||o*><)^0?AVAl6Rb4dXs$*Di*F^t1bj zUIxiJ7g9+2h6StPu?WT;1e+}+mb4NMZa6psX>g|kVZ{&<<4k7Q%CTnzA$28=#qJv- zn6emu1ppgU-vD~birac3gxJ6fMB2k~va57;gZA#9g z;}sm3G%7jqA|0x;tBDjcEQ=;$vgX7ZveFDPBWI=xQq06b>kwQQZs(fZkFEnI90sMY zT0dLs%PP3!F00)N?hx#IJLy;~=8gLw%v@;}SgIULTGUa5H z9H)~s%Eh>WKnWqvHJJFxTnr;jToim^;JK%^%nR4h0|&U?m6q zV00P?TFD8Gnhl4hP!6WkKP=;+Vh-Xt{@aQQ)TZw&fP#9`pa42@9k{=yObuW+6(7Y! zTomJ?(pXd`$E0#pI1R<*D5^l-&;-Q?rfM*Bfg$WynD)@@VM@`l;7X{>G-Wcu=>+Xy zD}nL&e4e1wqub1*r9jvk^~lcK&KGXi>Hc@dtXB3)vwCt3WpG*nZHH_Ap9}N0Yiu;U z3fS(XE$;3x8W6%lu(3HnnK2Nt(I7Wbv=s+;8@Jm5hvMv&N5Gxrs1#t6AsGvya`#@4 zh3Q;aNVb>c7Tji5a$H;^VZxmjhNFtJxwVa*)v%DN&V}0!>Bj1#R&EjKZBRDk6?3Q{ z_$_^J52%|i!5gRKWUyoiR<92f?ECFuh3QNigJJ&=)+&o@N`39U;Q%W)r;(+2@{0Em#D1`? zOD5n8d&w}q47}*C>tUFnmkb4G>aBK%)e51#BUJchp83{Erdq6vg33i, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYTYPE \- proxy protocol type +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type); +.SH DESCRIPTION +Pass a long with this option to set type of the proxy. Available options for +this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_HTTP_1_0\fP +\fICURLPROXY_SOCKS4\fP, \fICURLPROXY_SOCKS5\fP, \fICURLPROXY_SOCKS4A\fP and +\fICURLPROXY_SOCKS5_HOSTNAME\fP. The HTTP type is default. + +If you set \fBCURLOPT_PROXYTYPE(3)\fP to \fICURLPROXY_HTTP_1_0\fP, it will +only affect how libcurl speaks to a proxy when CONNECT is used. The HTTP +version used for "regular" HTTP requests is instead controlled with +\fICURLOPT_HTTP_VERSION(3)\fP. + +Often it is more convenient to specify the proxy type with the scheme part of +the \fICURLOPT_PROXY(3)\fP string. +.SH DEFAULT +CURLPROXY_HTTP +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYPORT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.html b/docs/libcurl/opts/CURLOPT_PROXYTYPE.html new file mode 100644 index 0000000..2f45432 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.html @@ -0,0 +1,62 @@ + + +CURLOPT_PROXYTYPE man page + + + + +

    NAME

    +

    CURLOPT_PROXYTYPE - proxy protocol type

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type);

    DESCRIPTION

    +

    Pass a long with this option to set type of the proxy. Available options for this are CURLPROXY_HTTP, CURLPROXY_HTTP_1_0 CURLPROXY_SOCKS4, CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5_HOSTNAME. The HTTP type is default. +

    If you set CURLOPT_PROXYTYPE to CURLPROXY_HTTP_1_0, it will only affect how libcurl speaks to a proxy when CONNECT is used. The HTTP version used for "regular" HTTP requests is instead controlled with CURLOPT_HTTP_VERSION. +

    Often it is more convenient to specify the proxy type with the scheme part of the CURLOPT_PROXY string.

    DEFAULT

    +

    CURLPROXY_HTTP

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYPORT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.pdf b/docs/libcurl/opts/CURLOPT_PROXYTYPE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c5a8e405d27981253ff10b948356bea13c3272c5 GIT binary patch literal 4194 zcmb^!c~}!yzFNG-wrUl@lM!VDN-{IKNMaHe2q0n<0u?Nv9g;~HNHTFUfq-H;yjJVc ziqciQPys~|DpstmJrJ#m6)U#hh+7X-sw|d@eAayvg5a^+?)Ulr$(!H%-FLhqR3Ti9 zCxpC?-CI=%iC`3_5|bgh9GOO#4NMX&1`rJrLK+!@hLI2>&JZd>OX&!u60$Nhftw(E zK~2mh^QDl%nLo$){Z5cKLpBsx)74tM)Db@i{)8ceGD=zshb!d0ZJjCdWK^^W#haNp;*cDsB@{>*81*+ELm7|`VX&Q2`FzHN-`_1gPt}Up%Cut0| zh1B=5VU6dqLn}ffAJ!dAEh{WNe(h+ZUqa=1)7kWQ-8#}g&TG%S(2NC)eq>l<=#$*u zp~#4v{7Zp$hP-j_jhenEOQH|_Q2g#EM>Hk!c|0pdlpIq$sjF&;9U42uyy7d5l7><9 z-4_PVug?uV*J8~Y2Mrs_eLU(4)%tbYokO*5>B~+$$xM_V$Suml^K;V%^}E=1FM0HI zef0%=_39|sYlAizKmK*yfXB1OEhszu;IW%+V?fFHHQ#zJ8FleIWgYz$3WV*lX{gvYS+460LeWdw^H%Rmo)ftzD~QN0)cZlUEa`SI32-#nzm$mp*x;$p`be zfeu8jp1NG^n`O(J+P>D;rHWHOPdWeM{zp&a4?PKL2uupR5WeMP=#6d4;dQ3Xao^mP zwYP7u3}11m_Siyu_Sq#1N@V=%P|fy*+S|)#dPHj1^^SLKSUTd(Eokt-@zTNH@Mqb4 z=3Y;DKk@ASowpKW3OC(}47VJuDs30WZ_PX$m0^0kguCqFPUE)=3Vo_K7Fm{jbt1)Y zR|Zp=)orZ4I?qWNV}%B0In$>ZnK zxS_-7%UOrRqVfz)V{1xzQH$eG&+=OS?jGxt-Ty9*+c@aLqku(cgDxIDertDP!_74# z-DT>0m-D3t&q^}6e$Hi1%jQMNL=#Cuo&mf+J~Wup{3 zjqQK?Ll;+K-m|H0Pir4Wo!nY=Wk*ZfqKXQ&^8P1hy^-n>;h!ry0=v=@E)}6+^xZwe_r#Xje%ziJSuQJ}?}ycA?(#mc;ofln+0es<)bN}+ zdp_*t@^jRP2?+!Den{3Wo_^z!Vr8%SZA|^c?K4MbRoXMZ!MRftldo_2a%NGhtTJgiEU8Ec-zK`NcCBF^{L!!8crn6%M%^-^I`Zi` zi}0hel`ef!az+W`n~LA74H;l7PHyA5%f2hkFUV|hhZ;)*POb0XoV5O(!jnzznYT5+ zCN@PD`+p%EdVhlW?Dos1=8h8|j6FQBck6`@vL0`nWtV*Ue%mJO;5z}W=fYR*9$W{> zCqIM&(%%kgXm%Gb3X?R`CAqr8L&s>(sm{Cf+M7{cRFZ~xRv30~*KdN|*On(U^P>CT zUjJQo+tbwiaeXtdezf!bzR~|2soL0Zt#yzav?`J?>zv&d+}IAy_GR`L6G%|V2@`gA z@91<3fkfa20#Oq>5)Y*8a2yJrMN$zg5%LotL_;y4m%}K)q6sqt3)n^vz=V~u(OSX^ zMnD8jX`=`x4go^~MxqHj1L%V7OlXvY6vH}6LMT9v@f{yvDj-4N8*sG3>@?9p0OZt< z7123e05_l@?9k8(BjKdZ3dcdL{u(F&1{`cG%O0exDCc16qzu9t+(;R^SU9y;6AZ2c zFEG~0t6R3;^9;JpfRGsxY8X>0ok}{aa*ERUK`fo7n~lTFu2&3&FxIIWL?eZyofiot zd4Yn(a8d-~R)X~w5>1*2D>n?7Kx!SXKv*z@MA;GOn1_3fH8+p|C>sVS0_tWTcnE)QIUE*0a6O&P#lE$2@n%$wpkOp zt#QPrCuvvIy6uluPwQGhFo964R63Ji?r*o?+7yC;6A1%pR&eeg`kDiiIt3?2q(;@2 zAR>vJl0g$u8PlV+87W$+j^nR{uaEnK~0ld-~tRjcp}(o75SWD)E#yUAh# z$phO>Mzd9BS8yC8GH_?X2nTkcFewU7tU3Z_D9V^ZGBBSf$JM)8Nn~ z%F1-ghowAJ%t4&yzb>snY+mgJ5KyNZ~FoGze_6V6*)Tq&+ZukWzFsNC~BZru2F^m7uL`BrqPI&l7Y?bdWi* zoC>-lQ6G4#yagYg)KJP=%@~z79orT ztD6;s83P*Yv@$(Kn{bfZxWxjRC(fok0&H;QF{SKrt@MX*;-E78-xvc);W|A{F=_|W7OR)!EjS> z(%5DQZqIKL?BI5GC{#anu(FML7Ts)Zw3C zIIF??RrTWYY!usRLJy%ZCW6?8)p=mCNF)%!de{lW{7^9J*#n!qU;>c@jP2)Pm{$xAR4*z_`<_+^-%7)<5o`SDRcn3>PRFsTR(-xpvKDOd_#gt4o{i!k9!Fg}L9 zqzfMy*Gq>f6V_S) literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 new file mode 100644 index 0000000..c342ec4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 @@ -0,0 +1,53 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYUSERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERNAME, + char *username); +.SH DESCRIPTION +Pass a char * as parameter, which should be pointing to the zero terminated +user name to use for the transfer. + +\fBCURLOPT_PROXYUSERNAME(3)\fP sets the user name to be used in protocol +authentication with the proxy. + +To specify the proxy password use the \fICURLOPT_PROXYPASSWORD(3)\fP. +.SH DEFAULT +blank +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PROXYPASSWORD "(3), " CURLOPT_USERNAME "(3), " +.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)" diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.html b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.html new file mode 100644 index 0000000..04e8263 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.html @@ -0,0 +1,66 @@ + + +CURLOPT_PROXYUSERNAME man page + + + + +

    NAME

    +

    CURLOPT_PROXYUSERNAME - user name to use for proxy authentication

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERNAME, +   char *username); +

    +

    DESCRIPTION

    +

    Pass a char * as parameter, which should be pointing to the zero terminated user name to use for the transfer. +

    CURLOPT_PROXYUSERNAME sets the user name to be used in protocol authentication with the proxy. +

    To specify the proxy password use the CURLOPT_PROXYPASSWORD.

    DEFAULT

    +

    blank

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PROXYPASSWORD, CURLOPT_USERNAME, CURLOPT_HTTPAUTH, CURLOPT_PROXYAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.pdf b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03f7611f0b19262c2a2a18b6723681f6bbb4b3be GIT binary patch literal 4059 zcmb_fc~}!?8W*aqOm)4e)`~I(F{mUnlZzyVP#^@U1R+F06x$)0;Fx3LWFjHZYCTXC zrJ^97TaQ-2dK7i7VvA@6b=6iWkEke=iuOS2qOMC1+i#K}sO+};JkCFSdB6Alz1R01 z1SKd{T#P4#f@<3ewnHKqg{kzpkX(+$5ta;Q4lD)~4Wc4V3_-()%7in7lF(6lLZN_c z3{Bu>$g%mu>DMgRRD<8SoE-AivcmTc-J*|7;idW}m|jc_SXr(N!rCG~7=Jc>;#w%S zdS2DGs!I#n+IUD|KrQ*Q*U>w~1*yQ6`}Z|VeJXD5ew6R;yqz@S`ueb!uRl~gT%M|Y z5cBK8*~|7_peXrmAgHl7q6Zcv{7?RJva(6_61LhnrQ zYx}fx>XDZTME1F;Zq`u?#HRmt2_%*8*>`2?-8@zJNP;G0+ zOR25>t`6^9&+)xeZZDih`o&iJeio%!($KJN;cDH~Q(Myt7N0RmCXMylJjy$K=Zs@l zxWn!rICuU?&dDF&x;cMTX}<8JWZA&lBbC#pd{-|!TfFI}DLgxT{t;UrpU%u9lj^bp z7vTkm-uTw8{UBN6S9X3+=h}~$<2M4bzeaw$a*C1oEUW(X!a)4!fcVpBUh14kRlU!N zb=mw_)r{@^$-co8E{Z4gi7N7alhbx4&HBEsea65m2WnS;ylTVk6;6ChjZwSz-gQG> z`_O~ulTOc>j~p0yC3?ZQemSu#mI+su>$8sf-K;5JUQw~HbVvaD`s|apYEry}H3N<% z2Ndp~$B)^pi&!GrF!tSbulFA-zvcIjlwGA0_fH9#=^s!sbkA%}5!B(ee$s>Nyi0M@ zGmC0FZZ{pQ={SFCMggg3-_ zb@gk#Ke}cdRn)p;{LQ6}f{w_%eJ#e~FXo1zO|q5c$MJIpKkd=+<`_Uxj;{mcoQ z(l58H8u3=&9f5%_Gq1L`Sl9y%U_%y zOCsA%J7V$Cr;K;K?13-R$48c(8Flhv^8>4Jz`j9eA|{l6dnnEPy|H-8bwNV^!9QG^ zMdg?IU)ZI)Up?0MwWY&!=*C}SMD>Zc?tHOzT>akCn2M_YH+C=|z7}0DcU^I5qxo=_ z*Wc{Zsf`6q1urD!4khxYmZ``x9N!@ua)Y#=OpPk#d^ zwkNWkko}AC1ro?Z6L$AYZI+cl67UQHQ4@L+kE9&%OcY#;q#{@%j)cYx(PI;OCp$=2x!YNq9q&*kc)OOF-a~_40DU9C?JmUT|Yn{ zMxwxPfM|o+{;h!k$zva@!rjjS8ZZ!cS!jciDWu*8&xBa}HBcH15bP{u4^dW?XB4<4 zqi_Z{Q5jtj9_!TvgX_T!jJdJ8b%#C)(Cr37Pvs_T%kZ%GK3`A(-}5%tdGE? zuE4R_y+cG&CjDOkU~TFhKtq{vOHYJo3z(;*B?HD>G5v2Qxo$m>thGp&9HJx*1_C@O z@P=kWm=Hw_B!qze$SKqyuyJT)K>cUWZE#3xB`-gDn4Xzc! z1`{@2SU{8}P8Gm1IAjj9)ePPc>@b@wHkl)g;}Vg9GfPG|u#1H;hH+BV2{1!ZCL_tf ze4dntaWO#%Y@l&7kx9`;7~_dK0Fu@lWExODZb0xWj5CK}tTF`2%*^Cv3V0NqfnZXp z6hZk2pU(vxTw9if!5v(SEfDB)8A7H!7PHuRE}M8d%8ZaH2*yK^E=5Y<4ozAalCr?8 zVmzI)GhrONoz%<3xQ;*xABMe*=d|bU4LvgXlAVCd8mpW??GoR20E`UM- zhyysuK!4ENbp##8iAjiqW9Cpc#;qTg@=!4c@worItOB{|JqjS9o-oJ(k4z2TuOUkb zx|@QJVj?bzaZ!mDmC7)Q3>8j9F&T==k*7F8@_}d+SRuhm`4>ccaP|s+F=Xu8qx2o0uJ7Q)t`=nVunUd1k&7f_^D*vAc z^SpDc*F84aYNt)E>d@;D!bGsP*+7~xV6k2&Gf=b{2X7mQp5z0gH_KVu6Y<%30`3y-03(nQeUpJy0JBAo, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXYUSERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERPWD, char *userpwd); +.SH DESCRIPTION +Pass a char * as parameter, which should be [user name]:[password] to use for +the connection to the HTTP proxy. Both the name and the password will be URL +decoded before use, so to include for example a colon in the user name you +should encode it as %3A. (This is different to how \fICURLOPT_USERPWD(3)\fP is +used - beware.) + +Use \fICURLOPT_PROXYAUTH(3)\fP to specify the authentication method. +.SH DEFAULT +This is NULL by default. +.SH PROTOCOLS +Used with all protocols that can use a proxy +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.html b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.html new file mode 100644 index 0000000..ecd301c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.html @@ -0,0 +1,61 @@ + + +CURLOPT_PROXYUSERPWD man page + + + + +

    NAME

    +

    CURLOPT_PROXYUSERPWD - user name and password to use for proxy authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERPWD, char *userpwd);

    DESCRIPTION

    +

    Pass a char * as parameter, which should be [user name]:[password] to use for the connection to the HTTP proxy. Both the name and the password will be URL decoded before use, so to include for example a colon in the user name you should encode it as %3A. (This is different to how CURLOPT_USERPWD is used - beware.) +

    Use CURLOPT_PROXYAUTH to specify the authentication method.

    DEFAULT

    +

    This is NULL by default.

    PROTOCOLS

    +

    Used with all protocols that can use a proxy

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYTYPE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.pdf b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c99bf94380d95ef2403cd3d59e869e34974cc86f GIT binary patch literal 4166 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 bYmTMN%4Vc-18oT!-wWllTwMI;2eAGFYKg$7 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 new file mode 100644 index 0000000..ae5ede7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PROXY_TRANSFER_MODE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TRANSFER_MODE, long enabled); +.SH DESCRIPTION +Pass a long. If the value is set to 1 (one), it tells libcurl to set the +transfer mode (binary or ASCII) for FTP transfers done via a HTTP proxy, by +appending ;type=a or ;type=i to the URL. Without this setting, or it being set +to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT(3)\fP has no effect when +doing FTP via a proxy. Beware that not all proxies support this feature. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +FTP over proxy +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.18.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the +enabled value is not supported. +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.html b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.html new file mode 100644 index 0000000..ae3f30a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.html @@ -0,0 +1,60 @@ + + +CURLOPT_PROXY_TRANSFER_MODE man page + + + + +

    NAME

    +

    CURLOPT_PROXY_TRANSFER_MODE - append FTP transfer mode to URL for proxy

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TRANSFER_MODE, long enabled);

    DESCRIPTION

    +

    Pass a long. If the value is set to 1 (one), it tells libcurl to set the transfer mode (binary or ASCII) for FTP transfers done via a HTTP proxy, by appending ;type=a or ;type=i to the URL. Without this setting, or it being set to 0 (zero, the default), CURLOPT_TRANSFERTEXT has no effect when doing FTP via a proxy. Beware that not all proxies support this feature.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    FTP over proxy

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.18.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the enabled value is not supported.

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_HTTPPROXYTUNNEL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.pdf b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d21dcf7168803059c1c2ceee35e8e4d69afeb3c5 GIT binary patch literal 4042 zcmb_fc~}!?8doc#Q@YTCx@sFo)E%Ik%uGT~NmwDEfPokSQjy0Ul1UgzGBKH$pjfs_ zy$b6py0%K~BGM|h9!14l@hGL<2x2S6inXm3ixjQ37U(xg5JYy{eIDl@zP#UiAHVNq zqFNct#d+b-#Ojunn;;>K!F1*vC?W!#Mp}$a7Ayi34H`?C7}5r#u_l5cm86c=lL`f7 zXKW;4hFryEsdp^Ru|XZ@lV@#>oD;^s{Z88zjyZj~>QLCh!6A}IC1p{6@~axY>owEr z_gm|nE${BC9YzD8c|Tm{-p<%KU8qZ-+8V_Vh_cXKKe6ZI|ZJ&Dxab3*rxV)oU|vE1@qtd`6CYG3vO_ zgR||WuP@jMNB#Iqx1k z3GMM+<2Jl^f8LS|zir?A`@k>z8GFUxNYiT5o)ozx^ZKJyvHz+IU7t?&-#q)<3oIczj?WN%5LlQzhz

    %sQRjT;MIGnMP=*G@^U-1pYFGB zFw}GoQ`dC1*s!;qh26HN8!x#WhG5N7mQClpIux(v})O|vAUD~8IuNlU8ovgF*USp;j6Vi zCk8j%uNyz18V^d#TVF4qPZg~hdLUnaQ25yg(5=Xpc@K|V&irWgk2`04{jf1#kt*G| zzET)`>5c~3uzBODt4Hx|+DS)aPvmmyww>7b#^<%$e9@tUnl#Nn{eA5S!UqwrAwb{sEk`Ed_oV}7>Vr#iN$_!^7E=MTMHQrHhdvn`5pQ0mc zzpO9!b#>H@p<`R8Ea9wqEB{Qze$KKL`729LU1<#X>Ci7rs+fl5i-)0G=s;gx6Lx1* za3VGJc|qO_%SH~lbMi_>$f8cG$Wr<4@{U6B(6LLWANlpNZtljdBfcB?3RNa-Ynb%W zivQ$ZBaJ0n=~b7SYqM1k3TxZWW(B>FG|)9}*wxC7BL*~G(QJ5e`KpsUT8P$~f7~5# zHoxJ`W97%IX6$h;^?N%(t{bsq6kWb@Mf15GKevlZ%MWfMEqX7iffI{_EdH^7aXw!H zd1>K2D5=e{lBk+6lBkN*Q$!T)g3~c@EtCpjNjN_PLNzo4FcZcAmyNVAuz&?rKql?9 z!=@wc0BY4XT9-^R=_mkW7}b(42FS&@m?_C_Q5^S(#L_?<=evIZ^hKk=Z=lf*v#70s z0LkkgYr=!#KpSunc6(@t(F96whtna}e+`rY0}T#VWiL_Il=lJfNJbM3VWN%QD!ksS zNQTgZ8yNTK>ai_;QbA7`5SpY`!MH-N< zdqz(*?%MPg?XFr+{AsFb-48u32p1_7-sX>pbXf^qHp#%5q>-}7k=BDp5t!1;kr_f2 zrm{wpS=7||HZpmBqEYF#-kAYk|S9RW0j$()9K_n1w7hjL~*H9ieh|}&*uUTu06-X5H7C8 zJ|5U}J3^&B7PHuSZl8EM+Kf_ZD9*#sZbM2Cj*YT16m5Z7!$cIiVsAi!Nv$S$Uh+3i?f#~ZPS95P#A5r!2r)AZFaU2IFHZg2|O0v zVqUHYl&w*(>^$py5muGze`m~WW?P!&lPPJP!wm2`PWk^d%(JesUia8xtHWk;PlsNI zk|vV%%?`?p1CRAOnSr*M3DDbw)e69qU|SvqJ&7nHz$HU5CQ{*^y~!rVb1+ftEXhoS z#VAKyTs>(Z93}=)q*&bCdQUY>l)`gx%b`8G`l*$h1ZEqQ4SkFp3J88i-?LNH1DD`& zlOs+R48iHiO@e*6y=dG$*CG9lbtrh**(m`DXXhkDDPxBW!!Zda#U<|fLNE*gY+w$5 zhr>G!A^puu=;No@Wg`s`2IE4A1uV}8i-baf5H`SG8ZH!q0N4+`6XcAb5&~fta4=V_&;IvLYO;27PD}G1yc3(lD^9^`VIc;6d&~6AAmFNuH)jg-`hc z>d-3(jE$g7qz(M945P`^d=lgj2HPGD7AjC_4UEQF3^eRn*U&g6oE{M^h>5}ke1Qm8 v#$bYIX-rJGK+NakF-lw*CBdT, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_PUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_PUT \- make a HTTP PUT request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PUT, long put); +.SH DESCRIPTION +A parameter set to 1 tells the library to use HTTP PUT to transfer data. The +data should be set with \fICURLOPT_READDATA(3)\fP and +\fICURLOPT_INFILESIZE(3)\fP. + +This option is \fBdeprecated\fP since version 7.12.1. Use +\fICURLOPT_UPLOAD(3)\fP! +.SH DEFAULT +0, disabled +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Deprecated since 7.12.1. Do not use. +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_UPLOAD "(3), " CURLOPT_HTTPGET "(3), " diff --git a/docs/libcurl/opts/CURLOPT_PUT.html b/docs/libcurl/opts/CURLOPT_PUT.html new file mode 100644 index 0000000..1000cc7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_PUT.html @@ -0,0 +1,61 @@ + + +CURLOPT_PUT man page + + + + +

    NAME

    +

    CURLOPT_PUT - make a HTTP PUT request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PUT, long put);

    DESCRIPTION

    +

    A parameter set to 1 tells the library to use HTTP PUT to transfer data. The data should be set with CURLOPT_READDATA and CURLOPT_INFILESIZE. +

    This option is deprecated since version 7.12.1. Use CURLOPT_UPLOAD!

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Deprecated since 7.12.1. Do not use.

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_UPLOAD, CURLOPT_HTTPGET,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_PUT.pdf b/docs/libcurl/opts/CURLOPT_PUT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d5f4626a8637d101bf426853ae978e0862922795 GIT binary patch literal 3830 zcmb_fdsGuw8earoqavW_itFOIn1 z@tbt8@o3qw@%iP)k1@)!KtWq&ra(>%WQk&bG2)aNhI7>AF?f_V%3g zbEQsuoeN^~yr<0m6qj-6%Jt4_syFla%J+$P>yS#Q|4 z;rxb09Y=FU*M5C^x%@!UVgKYA-ss~|x%k}OLq=n-g)yA6x|R>UH3wEFHkyCA+)D1f z8(w@PpfmgMDt?vX{QNb^6Q6|6zY=KmXgpHZx%5y+?!ux_5jVSht?0uS|1fCWhI;HR zQc7DU-Lw0*wM^O-PlxVao13$)y+tqI@!cGG$@5{IXA+UxPdEPj#Z8{?xrMV^Hf}t( zPnUTze(xo>#E{GxYql;e=N2pqxM_a;Z2Fs`NxPwe)P&CVj6B2ZCb#qR67xoFwkN$A z{7r}DcFEo3ysX`lpUxCrNOkwDY%a_Uc;I(?#**>&1g~H(!`-k;r1yyI2iyNFshye? zwsw-Z?sMafPjqFhsV=z9`*E3kT9ycBL0i;`;t9VcYXHPO-p87+^+ia+tLdK zjQ8M5dF@qFfi&a~IGDaBy6)tB!(F#~hHH%r18g-W-{&7gk=!y(agE}nPvvGy?lIqj z8EyVAf6(92WEKW^c!XdBo`u#Ia#fEuhyAi_ehnvL>HXTZe_Jt6Xw0n|7&|-di$+Dp zSIy~T9$(r?JzAF@yM1U?c}<$HbVq*tzK9$9m@K2ow&QrGv03Z?fye6Ros}W4OK*?4 z)j6*?dB(q&6y!yvp}W$m(29mZe!$tM-tVFExtQjS3gv({l2Nr z+8#Wksj+C}mZ>FmXnXzYtz6G_ht@Rsts{#kjBC23pICrAd2o8iwgy2((I&4G6@Klq zH1ELKMGbp&Q-f`buKc}uXnN(T?1wd%HpgX_wBLI2r`M_jx$dthH*+yL{patotmAo~ zE_;?Y*5}zN?TLAVD~?=>Pd;1JG_zx(cx3&6bD91z)%PcdOIKFSDLGP8-Bx{|l{Rr3 zI&2lQu57%XzW(#;d;fX6Fwt9;Q}eIpQI%>&B$!zINPXTjd-I+ZSMx6nPk1BeY`=+YgQq*aFULqMsp+__AiEFV#q}kb|XqcriDP_a07uv z6FL$PrR;DL3a&*m5iAw*7ek1KVgSCtDBz+AGXo1)@Bw7PO4(>FVFj=hM^oB(f=NOE zaKT6dVP}BcOgj@E?-0c>r$`tD#4*0(2S6%B1%3mKR+vRN4FpIo|5y`F!~@!ZgRsLx zD~v>vIxCz6vHokI#W2udV^#JLWlg!j(kZFJ8Qe%2x>UHlk0uyg2X0`@sjJ(zr%;ji*(5$YErK!KuduhN`f$n05Oqfn{{z_G>+Qz6z!^7cl-;Y zqq>$NCJ>61N>}qMg6$Sun?^8j3Sl74L7cYovmBVz1##w!qS0uJiby4AEvJe2uaEnK~0yINtwstuZ=(nN(#VHxalyUAh#%>&y_Mzd9J58^mP zv-hN6sVBm?t#G9Jdo1k+(Xjhl!JicW(uo|pqv(mK6d1Lnr5 z5c~?_q%w>}jvyHs8N3VukD?6-CX>k!l#lTFT)@G#W||q?&NW*<0`?q^kPF_5nXNpB zPdqJULdXRO#zT=VLuwEXO>*0g37{pE2Ab0A;bjDEWh;U4_G8@(Acjj#2?G8Imy)O2_Pl7#ZimNV2meH{xbP5Xa8d5qjKaWH`#X zW(T*1p-Xez*g5T5k{uFh?C0K4joD3EW!Rg(X1iQFh zXxuf|e*KO0G_cv(DFF#*=fqDfXNL^MP$??Iq>lOGpeP5hfjRsg4%amJ^*1lm-mYRh zP3R#M#zYVcSk4a?i$nqutcP7RupYpIWk1;5MHBG(V0XPs!}wD0hUi7Z_G)Z5YMA+9CDTw~9K8D6gBSC}zD`6y_ zTuy-e!Qiz=fd>_+v<5~Z%z6rTKG%>4HJqftLPAinN*0Q$MKURdp?r}lOrn~}SBceP f8DESlf1hJ9`&P3uIL$bUCJ;y@kdM#I*f8inRmvon literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3 new file mode 100644 index 0000000..8bf3c14 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_QUOTE.3 @@ -0,0 +1,86 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_QUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_QUOTE \- (S)FTP commands to run before transfer +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_QUOTE, struct curl_slist *cmds); +.SH DESCRIPTION +Pass a pointer to a linked list of FTP or SFTP commands to pass to the server +prior to your request. This will be done before any other commands are issued +(even before the CWD command for FTP). The linked list should be a fully valid +list of 'struct curl_slist' structs properly filled in with text strings. Use +\fIcurl_slist_append(3)\fP to append strings (commands) to the list, and clear +the entire list afterwards with \fIcurl_slist_free_all(3)\fP. Disable this +operation again by setting a NULL to this option. When speaking to a FTP +server, prefix the command with an asterisk (*) to make libcurl continue even +if the command fails as by default libcurl will stop at first failure. + +The set of valid FTP commands depends on the server (see RFC959 for a list of +mandatory commands). + +The valid SFTP commands are: +.RS +.IP "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 +.SH DEFAULT +NULL +.SH PROTOCOLS +SFTP and FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +SFTP support added in 7.16.3. *-prefix for SFTP added in 7.24.0 +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_POSTQUOTE "(3), " CURLOPT_PREQUOTE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.html b/docs/libcurl/opts/CURLOPT_QUOTE.html new file mode 100644 index 0000000..91549af --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_QUOTE.html @@ -0,0 +1,84 @@ + + +CURLOPT_QUOTE man page + + + + +

    NAME

    +

    CURLOPT_QUOTE - (S)FTP commands to run before transfer

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_QUOTE, struct curl_slist *cmds);

    DESCRIPTION

    +

    Pass a pointer to a linked list of FTP or SFTP commands to pass to the server prior to your request. This will be done before any other commands are issued (even before the CWD command for FTP). The linked list should be a fully valid list of 'struct curl_slist' structs properly filled in with text strings. Use curl_slist_append(3) to append strings (commands) to the list, and clear the entire list afterwards with curl_slist_free_all(3). Disable this operation again by setting a NULL to this option. When speaking to a FTP server, prefix the command with an asterisk (*) to make libcurl continue even if the command fails as by default libcurl will stop at first failure. +

    The set of valid FTP commands depends on the server (see RFC 959 for a list of mandatory commands). +

    The valid SFTP commands are: +

    +

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

    chmod mode file +

    The chmod command modifies the file mode bits of the specified file. The mode operand is an octal integer mode number. +

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

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

    mkdir directory_name +

    The mkdir command creates the directory named by the directory_name operand. +

    pwd +

    The pwd command returns the absolute pathname of the current working directory. +

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

    rm file +

    The rm command removes the file specified by the file operand. +

    rmdir directory +

    The rmdir command removes the directory entry specified by the directory operand, provided it is empty. +

    symlink source_file target_file +

    See ln. +

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SFTP and FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    SFTP support added in 7.16.3. *-prefix for SFTP added in 7.24.0

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_POSTQUOTE, CURLOPT_PREQUOTE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.pdf b/docs/libcurl/opts/CURLOPT_QUOTE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76550af183c5eaf64e4581776cb33d177a9a504d GIT binary patch literal 5637 zcmcgwdt6Lw_m2`LijZ_+yJUo!z4zRj88y{3rBo!9(uHYePmSi*%${!KNOB3MTq4&a zl1q7YK{zEzxrIs&DW^CgjwD1bhxeJOj>zvl@9*>RdG|l_%-ZYreAimfTF8!QWWhyFuCJAyC@Q@Q1q9TsE8(G)2+gBcI z9#@#0DQg|8mw-MOul2Q6&-Tr0Id&mqJ+o85c@@|3hm^Oc`O5e?*~g}3g&4ouc)NMq zNRtbl(7mI_hfdt+zVE{RNN!DB$D-YhjUmB}nJFdpgFTIH)*t;4@uB3&vFtU~Ype#} z$t<60c=++A*Q18iq?li=zcZ=Lx#JS`-J2<~x5u)VwCWqG{TG#P%a=~t9<<*cUUPW# z;%K8&Yg4lSQYa3Y9JPE(aoDQ+LT~xaNe<5<8WYRWfJ9xSkn>q`@N?oJzNJBUYRuiE z9rZJpa>}2vYojORi^ylAa2?`AzeOwb&ZXL4t~gVF=a(AuO@->+^rT6_?!3lSQsapg zn`a9*G(=`Va6NXn124C9n*Rhi1 z`w#xO_pbG!XI$)GV88pw}&2&-i9Q~_Y z$M)cD`i_*;`zyE^p-%1aTj|14uCrXC;(d!Zj(&J4L4DWA%+#~s$S&cBQp2SqsrkQK zH5g4EXw_0X_LR=C#v_ClYx9>2qL$P|?o5cZ==^P*C7HaF=ytidd9w3%fwAo9#vyJt zt?lWShDFx+jDXr8i|R$qMrMJRXmK7~j4Bzlc&HgSg}Qy!*&BnDyXM=DcsfRY#=B+y zqV59Br2OrVwBZsHO)vhbUs>?Y;4`ybL zo|hG~h2==u5@Hd-ci%3ZR=M5VIMcqȁG+NmEH%M*s(&sEc-Z%p>S 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 new file mode 100644 index 0000000..0c2d688 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RANDOM_FILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RANDOM_FILE \- specify a source for random data +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path); +.SH DESCRIPTION +Pass a char * to a zero terminated file name. The file will be used to read +from to seed the random engine for SSL and more. +.SH DEFAULT +NULL, not used +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK on success or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_EGDSOCKET "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.html b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.html new file mode 100644 index 0000000..2b81b5e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.html @@ -0,0 +1,60 @@ + + +CURLOPT_RANDOM_FILE man page + + + + +

    NAME

    +

    CURLOPT_RANDOM_FILE - specify a source for random data

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);

    DESCRIPTION

    +

    Pass a char * to a zero terminated file name. The file will be used to read from to seed the random engine for SSL and more.

    DEFAULT

    +

    NULL, not used

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_EGDSOCKET,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.pdf b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f8a5ac3341170301c0d39dfb6bcff7d4915f232 GIT binary patch literal 3574 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 Dr&zQi literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3 new file mode 100644 index 0000000..f5dd555 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RANGE.3 @@ -0,0 +1,66 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RANGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RANGE \- set byte range to request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANGE, char *range); +.SH DESCRIPTION +Pass a char * as parameter, which should contain the specified range you want +to retrieve. It should be in the format "X-Y", where either X or Y may be left +out and X and Y are byte indexes. + +HTTP transfers also support several intervals, separated with commas as in +\fI"X-Y,N-M"\fP. Using this kind of multiple intervals will cause the HTTP +server to send the response document in pieces (using standard MIME separation +techniques). For RTSP, the formatting of a range should follow RFC2326 Section +12.29. For RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges should +be given in npt, utc, or smpte formats. + +Pass a NULL to this option to disable the use of ranges. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP, FTP, FILE, RTSP and SFTP. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* get the first 200 bytes */ + curl_easy_setopt(curl, CURLOPT_RANGE, "0-199"); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +FILE since 7.18.0, RTSP since 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK on success or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_RESUME_FROM "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RANGE.html b/docs/libcurl/opts/CURLOPT_RANGE.html new file mode 100644 index 0000000..c256da8 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RANGE.html @@ -0,0 +1,73 @@ + + +CURLOPT_RANGE man page + + + + +

    NAME

    +

    CURLOPT_RANGE - set byte range to request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANGE, char *range);

    DESCRIPTION

    +

    Pass a char * as parameter, which should contain the specified range you want to retrieve. It should be in the format "X-Y", where either X or Y may be left out and X and Y are byte indexes. +

    HTTP transfers also support several intervals, separated with commas as in "X-Y,N-M". Using this kind of multiple intervals will cause the HTTP server to send the response document in pieces (using standard MIME separation techniques). For RTSP, the formatting of a range should follow RFC 2326 Section 12.29. For RTSP, byte ranges are not permitted. Instead, ranges should be given in npt, utc, or smpte formats. +

    Pass a NULL to this option to disable the use of ranges.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP, FTP, FILE, RTSP and SFTP.

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* get the first 200 bytes */ +   curl_easy_setopt(curl, CURLOPT_RANGE, "0-199"); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    FILE since 7.18.0, RTSP since 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_RESUME_FROM,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RANGE.pdf b/docs/libcurl/opts/CURLOPT_RANGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..196f75d61e5faaae3af1c7405e075c6eb0b670a6 GIT binary patch literal 4492 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_READDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_READDATA \- custom pointer passed to the read callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer); +.SH DESCRIPTION +Data \fIpointer\fP to pass to the file read function. If you use the +\fICURLOPT_READFUNCTION(3)\fP option, this is the pointer you'll get as +input in the 4th argument to the callback. + +If you don't specify a read callback but instead rely on the default internal +read function, this data must be a valid readable FILE * (cast to 'void *'). + +If you're using libcurl as a win32 DLL, you MUST use a +\fICURLOPT_READFUNCTION(3)\fP if you set this option. +.SH DEFAULT +By default, this is a FILE * to stdin. +.SH PROTOCOLS +This is used for all protocols when sending data. +.SH EXAMPLE +TODO +.SH AVAILABILITY +This option was once known by the older name \fICURLOPT_INFILE\fP, the name +\fICURLOPT_READDATA\fP was introduced in 7.9.7. +.SH RETURN VALUE +This will return CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_READFUNCTION "(3), " CURLOPT_WRITEDATA "(3), " diff --git a/docs/libcurl/opts/CURLOPT_READDATA.html b/docs/libcurl/opts/CURLOPT_READDATA.html new file mode 100644 index 0000000..cb372fc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_READDATA.html @@ -0,0 +1,62 @@ + + +CURLOPT_READDATA man page + + + + +

    NAME

    +

    CURLOPT_READDATA - custom pointer passed to the read callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);

    DESCRIPTION

    +

    Data pointer to pass to the file read function. If you use the CURLOPT_READFUNCTION option, this is the pointer you'll get as input in the 4th argument to the callback. +

    If you don't specify a read callback but instead rely on the default internal read function, this data must be a valid readable FILE * (cast to 'void *'). +

    If you're using libcurl as a win32 DLL, you MUST use a CURLOPT_READFUNCTION if you set this option.

    DEFAULT

    +

    By default, this is a FILE * to stdin.

    PROTOCOLS

    +

    This is used for all protocols when sending data.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    This option was once known by the older name CURLOPT_INFILE, the name CURLOPT_READDATA was introduced in 7.9.7.

    RETURN VALUE

    +

    This will return CURLE_OK.

    SEE ALSO

    +

    CURLOPT_READFUNCTION, CURLOPT_WRITEDATA,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_READDATA.pdf b/docs/libcurl/opts/CURLOPT_READDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c23376d42e6fd094b79148ba8b2ac93068b53caf GIT binary patch literal 4177 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3 new file mode 100644 index 0000000..79139ad --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3 @@ -0,0 +1,78 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_READFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_READFUNCTION \- read callback for data uploads +.SH SYNOPSIS +#include + +size_t read_callback(char *buffer, size_t size, size_t nitems, void *instream); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback); + +.SH DESCRIPTION +Pass a pointer to your callback function, as the prototype shows above. + +This callback function gets called by libcurl as soon as it needs to read data +in order to send it to the peer. The data area pointed at by the pointer +\fIbuffer\fP should be filled up with at most \fIsize\fP multiplied with +\fInmemb\fP number of bytes by your function. + +Your function must then return the actual number of bytes that it stored in +that memory area. Returning 0 will signal end-of-file to the library and cause +it to stop the current transfer. + +If you stop the current transfer by returning 0 "pre-maturely" (i.e before the +server expected it, like when you've said you will upload N bytes and you +upload less than N bytes), you may experience that the server "hangs" waiting +for the rest of the data that won't come. + +The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current +operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error +code from the transfer. + +The callback can return \fICURL_READFUNC_PAUSE\fP to cause reading from this +connection to pause. See \fIcurl_easy_pause(3)\fP for further details. + +\fBBugs\fP: when doing TFTP uploads, you must return the exact amount of data +that the callback wants, or it will be considered the final packet by the +server end and the transfer will end there. + +If you set this callback pointer to NULL, or don't set it at all, the default +internal read function will be used. It is doing an fread() on the FILE * +userdata set with \fICURLOPT_READDATA(3)\fP. +.SH DEFAULT +The default internal read callback is fread(). +.SH PROTOCOLS +This is used for all protocols when doing uploads. +.SH EXAMPLE +Here's an example setting a read callback for reading that to upload to an FTP +site: http://curl.haxx.se/libcurl/c/ftpupload.html +.SH AVAILABILITY +CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT +was added in 7.12.1. +.SH RETURN VALUE +This will return CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_READDATA "(3), " CURLOPT_WRITEFUNCTION "(3), " +.BR CURLOPT_SEEKFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.html b/docs/libcurl/opts/CURLOPT_READFUNCTION.html new file mode 100644 index 0000000..e1e88dd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.html @@ -0,0 +1,69 @@ + + +CURLOPT_READFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_READFUNCTION - read callback for data uploads

    SYNOPSIS

    +

    #include <curl/curl.h> +

    size_t read_callback(char *buffer, size_t size, size_t nitems, void *instream); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback); +

    DESCRIPTION

    +

    Pass a pointer to your callback function, as the prototype shows above. +

    This callback function gets called by libcurl as soon as it needs to read data in order to send it to the peer. The data area pointed at by the pointer buffer should be filled up with at most size multiplied with nmemb number of bytes by your function. +

    Your function must then return the actual number of bytes that it stored in that memory area. Returning 0 will signal end-of-file to the library and cause it to stop the current transfer. +

    If you stop the current transfer by returning 0 "pre-maturely" (i.e before the server expected it, like when you've said you will upload N bytes and you upload less than N bytes), you may experience that the server "hangs" waiting for the rest of the data that won't come. +

    The read callback may return CURL_READFUNC_ABORT to stop the current operation immediately, resulting in a CURLE_ABORTED_BY_CALLBACK error code from the transfer. +

    The callback can return CURL_READFUNC_PAUSE to cause reading from this connection to pause. See curl_easy_pause(3) for further details. +

    Bugs: when doing TFTP uploads, you must return the exact amount of data that the callback wants, or it will be considered the final packet by the server end and the transfer will end there. +

    If you set this callback pointer to NULL, or don't set it at all, the default internal read function will be used. It is doing an fread() on the FILE * userdata set with CURLOPT_READDATA.

    DEFAULT

    +

    The default internal read callback is fread().

    PROTOCOLS

    +

    This is used for all protocols when doing uploads.

    EXAMPLE

    +

    Here's an example setting a read callback for reading that to upload to an FTP site: http://curl.haxx.se/libcurl/c/ftpupload.html

    AVAILABILITY

    +

    CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT was added in 7.12.1.

    RETURN VALUE

    +

    This will return CURLE_OK.

    SEE ALSO

    +

    CURLOPT_READDATA, CURLOPT_WRITEFUNCTION, CURLOPT_SEEKFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_READFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7926845c1eb3520e519181a6914fdf24b1d4285d GIT binary patch literal 5073 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_REDIR_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REDIR_PROTOCOLS, long bitmask); +.SH DESCRIPTION +Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask +limits what protocols libcurl may use in a transfer that it follows to in a +redirect when \fICURLOPT_FOLLOWLOCATION(3)\fP is enabled. This allows you to +limit specific transfers to only be allowed to use a subset of protocols in +redirections. By default libcurl will allow all protocols except for FILE and +SCP. + +These are the available protocol defines: +.nf +CURLPROTO_DICT +CURLPROTO_FILE +CURLPROTO_FTP +CURLPROTO_FTPS +CURLPROTO_GOPHER +CURLPROTO_HTTP +CURLPROTO_HTTPS +CURLPROTO_IMAP +CURLPROTO_IMAPS +CURLPROTO_LDAP +CURLPROTO_LDAPS +CURLPROTO_POP3 +CURLPROTO_POP3S +CURLPROTO_RTMP +CURLPROTO_RTMPE +CURLPROTO_RTMPS +CURLPROTO_RTMPT +CURLPROTO_RTMPTE +CURLPROTO_RTMPTS +CURLPROTO_RTSP +CURLPROTO_SCP +CURLPROTO_SFTP +CURLPROTO_SMB +CURLPROTO_SMTP +CURLPROTO_SMTPS +CURLPROTO_TELNET +CURLPROTO_TFTP +.fi +.SH DEFAULT +All protocols except for FILE, SCP and SMB. +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +curl = curl_easy_init(); +if(curl) { + /* pass in the URL from an external source */ + curl_easy_setopt(curl, CURLOPT_URL, argv[1]); + + /* only allow redirects to HTTP and HTTPS URLs */ + curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, + CURLPROTO_HTTP | CURLPROTO_HTTPS); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.19.4, before then it would follow all protocols. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_PROTOCOLS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.html b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.html new file mode 100644 index 0000000..58f8e28 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.html @@ -0,0 +1,104 @@ + + +CURLOPT_REDIR_PROTOCOLS man page + + + + +

    NAME

    +

    CURLOPT_REDIR_PROTOCOLS - set protocols allowed to redirect to

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REDIR_PROTOCOLS, long bitmask);

    DESCRIPTION

    +

    Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask limits what protocols libcurl may use in a transfer that it follows to in a redirect when CURLOPT_FOLLOWLOCATION is enabled. This allows you to limit specific transfers to only be allowed to use a subset of protocols in redirections. By default libcurl will allow all protocols except for FILE and SCP. +

    These are the available protocol defines:

    +

    CURLPROTO_DICT + CURLPROTO_FILE + CURLPROTO_FTP + CURLPROTO_FTPS + CURLPROTO_GOPHER + CURLPROTO_HTTP + CURLPROTO_HTTPS + CURLPROTO_IMAP + CURLPROTO_IMAPS + CURLPROTO_LDAP + CURLPROTO_LDAPS + CURLPROTO_POP3 + CURLPROTO_POP3S + CURLPROTO_RTMP + CURLPROTO_RTMPE + CURLPROTO_RTMPS + CURLPROTO_RTMPT + CURLPROTO_RTMPTE + CURLPROTO_RTMPTS + CURLPROTO_RTSP + CURLPROTO_SCP + CURLPROTO_SFTP + CURLPROTO_SMB + CURLPROTO_SMTP + CURLPROTO_SMTPS + CURLPROTO_TELNET + CURLPROTO_TFTP +

    + +

    DEFAULT

    +

    All protocols except for FILE, SCP and SMB.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    curl = curl_easy_init(); + if(curl) { +   /* pass in the URL from an external source */ +   curl_easy_setopt(curl, CURLOPT_URL, argv[1]); +

      /* only allow redirects to HTTP and HTTPS URLs */ +   curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, +   CURLPROTO_HTTP | CURLPROTO_HTTPS); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Added in 7.19.4, before then it would follow all protocols.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_PROTOCOLS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.pdf b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f5e35275a1b9f2f049980aa4d2bb99d5b489e288 GIT binary patch literal 5208 zcmcgwd0Z2B7VlE6G$82WDixGL#i%vROfHfXVj&Tsl7a~+6i`Dl!Dud$i3D#%LcM8=RYVZ+0I{I3zX?!L-0kk?<7ele%)EKm@4fFkCJsJ) zcM9rACplC;+MZ5gKnSD`Sx$0xhP^OVD83A00*VlJmn(2g3&HLRF^=&uiCT(rxg;H~ z#l%XIA+^w7slMwzruXu9*4cKK<0>wkD#~kc`gTli<)x*{#@F=wM~2XVw2aKM1>*EqM${$ubr=tynPHit85j;R>$}R zEetH_xN`QeO>gGmYZ}c6R@%iN%U8w& zTzlTH_vFt_HTv>71qFGQ5-P1~^Xi&bL)wY4C1mR0({*<2k)-C&DeMWRuHHWm=kFCl7Hns?xSQB}>op#jNn>`4@Xgi!++cdPg2IeH<=N%e~5qg5pHM z{vNwD1-z2Y&e6doaVr~VRkkM_sVgZ_QnzMb`l2Surna|avbQYirrh=_|NN8SoyYFJ z=4`T?xnM#^Ov7uhCX?T-bD%{tCpv$9&yBk={}dEZ+4x5t{Y-XZb4b(6>cknI@u{i2 z)ak_24Y}~lx*OBZyho2@t9%q0Ws*Zb$Y9~#|3xF+m7wHaNdS-sDard+uYjfuD+KNuL z$`<>1b6CN)XXX|oGG~n|Ek%NwSPMV1?k>RKuTYh@r7xn!l%NR)mbC1}N z`{K6dPHW2^#t+RU6AycK9-Z}|<@*yOtz_|IC_>k7DrA{ioS&9X;$?k8O8jlQ#dY&F z>GSn*+rH4a{$zL6rF{1z*Ohj;>G07lAAc5*e9ls1m6NoI4_U^Eo_uK&c0Ou3ZwhsT zVm)tCte=k)MaUmf=qDtR9TrC?Rb?b@FTekB)9MTz&+J8*1(sv6z}C)Qd}2+h!ydoi zu2|@AYR#%E$2dGFIq`{AOR9&)tF7J7;2rQw`R(%KmN)W|Rsnvw^g?}Pb(=+g-uA5a zuu*-EhpfZxcbP7(uJd(!xO94T%^I!>ikp|_mpMCgtMAe+6}^i&ErvaTwJvN=@02S1 zW^rnF^-@&txwKws zJuN~p?p{!!#dmm}==nz#Ny?tDE{ASgb$wUj({qYlOP<}Jmx=bpF*)$-1;4*aW3`v% zbjk9&Zk*~n`OA{s6Z;sYdl`ZBTM6qjY}%3oexKu(e+8?vNQt@evOW4&yTx5LX{=XM zoQ`x~$p5OV@N7h&p_sC$<#T$|Li^(dk4OEnQzRIlun_k;V&HTfZEF>$&=Y=VWp*wT zwsC0!?d{ccL0a96Z1*3pIIMQxmF96Zd14)>q^`&54e*uUA({qSe9k-UdY{!>7yn{gf@zZ4o`3Q04%&hMj~}8f z`VO=d&Yz%byKDY9%4>^Ba=It1Uiol*DQEJf=bGIkQ0c>U#iYhZZq(-emkN(0q&%({ z+Q1K3>8*DT7iijEJWpLeO(A5?cpW$9P*J@0u3+Z$+4T$VWYwR`b@a@i+-A0q+&Okz z5cRzFMY;#o?VI{CPm@E3di#9lbe-IE>IVPUCpn&{ZG9$IKWiSn;I?)wmdlNX1mrfldnUi0(`DT;dm{(dncC z8cHA5no*)#|7CAZ5?xWHAmi3{ExJ>@H>c#rjSYoI3V7de#!>I$$;qDe{DM4VyNGrZt|vb0Bv1rkL>&Pc}>*TNs0Uzssh?cjB16 zcFUu?Cz9-=e7dJ49AKI*xs*R`UygI^oUQq5lG!bzv@R8{lz8)R?JjyO$~Gz8$se0V z-Xt2C9U1Wn&mlf?r_1JtCMu-(=A71|2Sn9+BXr~`wG**7QV+m(<#xPM&FE`|MA~P-*Q=DH@V?#^V~0-KSbzyiPW-0V}U0v1so`c3k#vUYg2?8m^=^UKo& zzg;-UyKr*V8`jP{L@>% zv~Acan$S5?c4l6TZguSCo(|Ini=cyQmFAwh@QhP@-HUGfr?#W5609P#H?_VVzh_?Q zzNAsLj?_BGh0XcvdOsT5F?+`_02`5ML^4Vn1n?02`bKCl*hd_S!2(Pw7rUtqP#^-Z z%wRJh7M&VQf`w`vEE*63xU`rGhiC-S0U6V&^;!w01N(`ORxJ@>cpwZm7zp;o3^52cCgO9b_yX5+Ds07-3^z_xZm#XxywwaKD32!yPnM zyl{wzZyW^Y1tEltG1Niue7RHy1(Jve3qjK`{scqdsCsaA>JSY?Ookj0u!wQ7LLEA& zX&}r33>Qnm8wh0&x-}3a!p$KH-o%>(d;16=l*=8A<`7dtCzA1aLt;(jV?d7(MMx-- zeIYDllZ*yoA&bN!C_^L$dm_mEd-M(Q>pv+W%nX=y6YDS{^suj7iRmbwAP#bgF|5Xn zkYJHM1SfDxL>ioH5GI6!?^ofbR!IK~1;oMLuRy3)id923%vFI!TdoR)P-8UyolC~I z11gQk9h8Ila+wSR1q3Q4kc83^SSBZ-PBd64SLt=ZZw_V5^H2?g2zV0)e}UKFCjl5s zOfGj|WI4|mZAx&2fb8Ins~$cq>PM4;he%j6!bw3uks*S?ZfDCnI*H2^p3uvE3c+CD7?c_%03u{iDpWd-!G&xT;edOB z43i-v3%@VoLJr{W$aX|2C~Y<*(~6Z?xLUgcLLHf8pi(Q9afF~*^eY5U zF63o6uHnFNczC#DIL%S54TVuQn++pWm`bGp4vH>9g^LXom2N7qXLLmF|EHKr=V+pX25Ze)9 zlHq~le<-g&Zr&dSkkElJI0GJz0N_^^!3VvZOGQuy1wknY%NJpDP!j>rV+NToW``Yjs82DqGIB1c1_ z^P%G<)(8auIbupB0cnDd!&gi6N-(56`Tq-GK6H+yl0O~R=(P%Cbx0*Jroaf_bRf+r z@K`G0$kbY;7+_nh(SRN*CLj+3Op>|I;3Y1{6&Tl8d#(z+|3)DvYKfx|t3qAK28tAu ziS-Jc%=J?lxuyNtP{_IcH%2-5jjs3P%18pW4blex**Ul*=mT9JPSKlo2?nJLIh<&Q z;O_1Hf5>zktm_%?E9;qHogu0O1e~ao8GH^=WC)6|5H`v())yH;$bb#h;a_kJRKtw- z)yvF3$GSm_$w&x9MMy-$>c1c+gF$0JGH8HCWzfL^hzn8;(&)gecWG3*6Bz1m^HEU- z*kazMA>d5!(oi}T4C1%>s7wT`0q@Y*G%)kup|P05^iiGI!)2LtFm~UOWjYO~(TGj$ zZ9bGvAMPKRoA2^bov6e0IWdOOXb7>wzHNhs4D|)qiscGS3;wx-V3B+k266;}HChdp zUt*JjU{94y4H3u!d$cDX3Uo#oOm~!qu-#d6T~RP{*lY%k$zw2BbLTRd?rfC%*Brsb WZmGk?THFW>IzR%+!C|hqJLz9uMtE2N literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3 new file mode 100644 index 0000000..d00019b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_REFERER.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_REFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_REFERER \- set the HTTP referer header +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It will be used to +set the Referer: header in the http request sent to the remote server. This +can be used to fool servers or scripts. You can also set any custom header +with \fICURLOPT_HTTPHEADER(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built with HTTP support +.SH RETURN VALUE +Returns CURLE_OK if HTTP support is enabled, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERAGENT "(3), " CURLOPT_HTTPHEADER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_REFERER.html b/docs/libcurl/opts/CURLOPT_REFERER.html new file mode 100644 index 0000000..d9dcbc6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_REFERER.html @@ -0,0 +1,60 @@ + + +CURLOPT_REFERER man page + + + + +

    NAME

    +

    CURLOPT_REFERER - set the HTTP referer header

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. It will be used to set the Referer: header in the http request sent to the remote server. This can be used to fool servers or scripts. You can also set any custom header with CURLOPT_HTTPHEADER.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built with HTTP support

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP support is enabled, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERAGENT, CURLOPT_HTTPHEADER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_REFERER.pdf b/docs/libcurl/opts/CURLOPT_REFERER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c8989263f40f66eaef86c9f47b7eb931436798a6 GIT binary patch literal 3916 zcmb_fdvpx<9;e!a5eJP>qSqiYl--%x_paS>B%6&#R$`MS6;YGj*<@sQXU)#aMyN-q z(5g$4dZrY&gj-4x;{6I?QBpxyiN_Un5)!Tu)w;jg-AF|4ZSOhepZxaw`@SEa?=Su1 zv^oJUltBGYRxMr!Nns3TQYJ%cH5x`@@ZU3^Tiqt*!DLuDLKae}8-L6Co}v@#;oUUA{1V6x!?XqTT0z z9QW&xx^vi-?YY%ZX*ZAOK;_q2=L(|N&TXB)_>c3uvx~NO=yZ10(PI@;4*%5m-XUv; zhwopjDD6}_`NsmXf_2RJ+)adeXAjD0TUu68zGwAGQljrRrH07Kes=Er2QjDWo>-P_ zJi9C^x9HMV>HGZP``#)Rjitm>!EBE);pImMLF^6}kt_JoP+vZ-IAn z=LO+g9LJQ#jLGe<|FewUTZ*1rP&~_8P+oJFUX=FG(|gI6FOOt~c!alWB|V~pSA_1R z)~&A#@suSz7<1?O@!$`4K(@qEACTkuhyH_u%@ruFg@Yt_a|@8+|$@xL!q zd-lNH%ASNKckFgEVZp`x`~TiMF|2g9s3hm)^z!aS!k(utK2p{hjke;jP06Pxe6~Gw z)8w=r#aDK9oE@4=_8SaP~AZ4*Qz&PVN zy&v$!TSC=$<}Mtq81v4BK1fkq+<~Qw&J0kmdbgc7x>q#3w3unt{?p#cvB%avEqrQR z6CT~m)3@z66QfpQH#5cie893wLq6O ze1Ycj#qaQmM-G%uzm+8u*PZy*SbX1-{=<#x&Bey||4_9l()9{^?0#pB-g5PL#&R60 zoJ~Ag+HQVaRqn{YRaPG?FBOB2_k#*`H!7pDiQW4m4W?S#wm;R%IX*`?sI=4kcxXYzRq?n=g1mue$FNgpds zW~U#^T`;}=T5Ztk6;W5K#)TKRJG7@{=*NAKuH(73XN70kM^IMKHgc5u(6TwLbTA@b5}-&&t-y1tUK{wR7KuZX!DGk-nrk*G1m+tUbfDwR!ySp z<^Z686AwZ>^zeUiOeuu|G)W^sC1g4%G>%NAP(5X)$q2>`Ct=`Ps+7VCi6|LD4Gah1 z3dR5zOW8SC%wriKQ%=UknkXkgxj2?F#Zz1o3UClc6DT(aUPPQZ$p`IRX+9q?6*ag(lE8$|)EDLZD5)RG>T=LgQU29A7y; zM&MFI;&|OHtB7E%=D(nT_o-zC2F6C(n`(%%g9S$0Q(@ef)Bom@?>3;4_ZDrCL$$QU zLV=b7J(L9D5)8G_5H1&^HrnoTCN~DpS+$y)tVFNt`yKPpxQ{~nmJ`oi-^JEl(eJotM21(S%!5qU_ z(`gPC36(-zfQtvi7M8S884Q~a<3bq%RI+A^$^gd4uMqswAZZ-uP@!l>Musp$EM(YJ z6jv&hC?-NhA_3qKI5X`W=@!_X{eV56BXr^`F}qXf^GRr8Y$%2>)$)1!~iB7C=D*X;1?ml^*o3 zB~uH~jSykDRDj_EOp$;oRk%WhNe5xL3d7WBGfq%^AQ}nYY~T&|7et$IHW6jm1ke&h zD$7_b@KlO*@|D1aB9Tz+x9AfKaH&zgMoqHww(~_g^!opuF`JEVX`WA|WlSy`fb9|5 z|EFQzc8$%ZR}MQ|tkpLiW)n(TDc(0HC^HT`Hk(uyhP9EPw@HTsU?|DAJPLXeA=KcK zqd6-@_-1dImGd90G(Sr!D``*FAZ~$~vXCw-hY&`)kK638hLtA#2cI0;sH=rq`AA^4 zLD|q($U#8xTl(IfqDHs`J5GaS@L&i|uRkdG{T)E#hPfWl(pV1!3!a}6kZ^uZ2543M zkYPBcz?8VcH(v;bA%G3c;h%5>reQ!!^D^+&Ms~B51;Sul3h{vD|6rL^Dwe_)I6%WC zI9QVW2iqHHVlnmx4HwJ6K7O4K7XhheGz`SloQ8w&-k?bo;HA+_pIi*~Z8Mro4%TUN z8uq3Qsi*~-^i7&V^rkNg1$Y%U*x*=_wo)wkZxu%4>1h80=PMf6 N*, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RESOLVE \- provide custom host name to IP address resolves +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVE, + struct curl_slist *hosts); +.SH DESCRIPTION +Pass a pointer to a linked list of strings with host name resolve information +to use for requests with this handle. The linked list should be a fully valid +list of \fBstruct curl_slist\fP structs properly filled in. Use +\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP +to clean up an entire list. + +Each single name resolve string should be written using the format +HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve, PORT is +the port number of the service where libcurl wants to connect to the HOST and +ADDRESS is the numerical IP address. If libcurl is built to support IPv6, +ADDRESS can of course be either IPv4 or IPv6 style addressing. + +This option effectively pre-populates the DNS cache with entries for the +host+port pair so redirects and everything that operations against the +HOST+PORT will instead use your provided ADDRESS. Addresses to set with +\fICURL_RESOLVE\fP will not time-out from the DNS cache like ordinary +entries. + +You can remove names from the DNS cache again, to stop providing these fake +resolves, by including a string in the linked list that uses the format +\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name +and port number must exactly match what was already added previously. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +CURL *curl; +struct curl_slist *host = NULL; +host = curl_slist_append(NULL, "example.com:80:127.0.0.1"); + +curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_RESOLVE, host); + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + res = curl_easy_perform(curl); + + /* always cleanup */ + curl_easy_cleanup(curl); +} + +curl_slist_free_all(host); +.fi +.SH AVAILABILITY +Added in 7.21.3 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_IPRESOLVE "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.html b/docs/libcurl/opts/CURLOPT_RESOLVE.html new file mode 100644 index 0000000..f3bd342 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RESOLVE.html @@ -0,0 +1,82 @@ + + +CURLOPT_RESOLVE man page + + + + +

    NAME

    +

    CURLOPT_RESOLVE - provide custom host name to IP address resolves

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVE, +   struct curl_slist *hosts); +

    +

    DESCRIPTION

    +

    Pass a pointer to a linked list of strings with host name resolve information to use for requests with this handle. The linked list should be a fully valid list of struct curl_slist structs properly filled in. Use curl_slist_append(3) to create the list and curl_slist_free_all(3) to clean up an entire list. +

    Each single name resolve string should be written using the format HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve, PORT is the port number of the service where libcurl wants to connect to the HOST and ADDRESS is the numerical IP address. If libcurl is built to support IPv6, ADDRESS can of course be either IPv4 or IPv6 style addressing. +

    This option effectively pre-populates the DNS cache with entries for the host+port pair so redirects and everything that operations against the HOST+PORT will instead use your provided ADDRESS. Addresses to set with CURL_RESOLVE will not time-out from the DNS cache like ordinary entries. +

    You can remove names from the DNS cache again, to stop providing these fake resolves, by including a string in the linked list that uses the format "-HOST:PORT". The host name must be prefixed with a dash, and the host name and port number must exactly match what was already added previously.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    CURL *curl; + struct curl_slist *host = NULL; + host = curl_slist_append(NULL, "example.com:80:127.0.0.1"); +

    curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_RESOLVE, host); +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +   res = curl_easy_perform(curl); +

      /* always cleanup */ +   curl_easy_cleanup(curl); + } +

    curl_slist_free_all(host); +

    + +

    AVAILABILITY

    +

    Added in 7.21.3

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_IPRESOLVE, CURLOPT_DNS_CACHE_TIMEOUT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.pdf b/docs/libcurl/opts/CURLOPT_RESOLVE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ee832c9cfaaaf84b4564a351b67952358cca329e GIT binary patch literal 4987 zcmb_gdt6L;|7Tn28IoKUOLZtsE;HwxxzA`OnsiyEOi^hoXJ*c1YA!W%re;dSW2szn zYlSV>Nb43V*9s*(OP;VOenLemQHeyJ?@YDq^84-cd%c{0=6gQh&+YrUecxv$`nkDN zP%48ovAij57l{cWkXjr`a(0Hjaa9Dd5Mlv}2zHk%2wVff?h1^+-EfIoiVFlJEuq0N zB}xCwPeIM9>PsWvAKo{5kBcjQ5M3EAbX4|N?h@z!8g$5KpC#+3bDocr$NmuDd1dXK zcFT^rZ`bnUWS*&-f~EbZ?4>?goSE=^%OZ?A>bGpWu9H=3uN`*i3P}60L*9-%v~T`x z@qvP-@)71J-?PQN-saq%a_OTs4%QG`d#32*{HgGb>R<1^(x9`Kj4fN1P&DgeL%f5K z8vGV{d&|J?s(E8~QK8F84N1S1R+t}oC6S(`-`QAWXE^!m-51A~WV@uj^Nb#|?M9XG z($&(stmzh0+%h27tmPwW9V`|NX<Pss7RX@|}s(tXq+n&0gw=_A|cMw1%1=Sk|_Q z&08~8{@ddA%zjP9itu!aHScxj{PCHmCKW3Df48j0L&~;pxC#dsgazgv8nZaPjDNt| ze<(Nicdn(q`<~&}FN4Z;@4LkY1HahTeV-2@y|%seelDk^ZTtQWPuf?hyML$;E2%7V zO2i(8rSnc6-&y5T5Hjl7>clDM=r-aJv9^tSc?Z7N&I_&eY#)#vvSf5IZH_J3 zKBps;rIy`3e7Jsd!y*Hg;OKhes9GAkMR)KA{kW~}|9Ecx58Z_sOnL#_7P@cf-K=K>sJ%vfuJ18;sgNCKQu8BFh zdj9C=&#y#ovldTUCp#l{3XoI|}82l0z@`4sxGxfgH##!e# zI*bS#6@PY;RoT|W0MCx+ek0PF!q^_Ag3U`KcI`A1X2#5`4ZW5ak#l9n`RuV(TNYJa zAAe_0MdHJFv&UPf7YB}XeRI}nXn4`%roHp(eI8Z?l8eU1jEU9OwhL6p-iI~+e*axZ z_w}L^_JjF`A-Sh=1Abrd3!z*$EK>Jq@XYARPYN&ag#% zU*z~w6Ym<Co%`e}xk=mLT zkWfT8Fn|n6| z<(fTQn_nkCCQ!^xKYa92aszkU16>yOI%f5nN2w0P5W`O216Bz(Z{M{Fcu{GL$4%BT zV`~rh6G-zXTa8>eV7ebPT$)<=&Aew77K=J8N`os(2HLq4Ho+W6Kf6uKmShC~>V5wl z^sS{AHl^X-_=-g(mt9-^9GYLhewMuYtSxQG=mp{XFBjdjBMr{ke`(vQsDkr|(}l#0 ztjXnprK#=AInS+lorymO9&lWA01Ypl5_?FV*@!sqFoVClKR-i%uX5X|h(y2hPiEX( zZ;s2}2J)BbUzIMHmz+nlpL*2yaS}OiQ_9A=X)nC0YwYGP5R0?3g4SEup2DV0vpQR0 zacd+69ah!gkbdwLN$>WrOCY9lQ&9S!6dZFHX8?{d(b%!s=T&IiBLN?HQK#+;wx}cOLC)vsTD@L0U$+lEr1`m7Ug{ZqG! zt2LhSnltvt2i?-uM-@btV9Bs3k6Emq$;+AIyI8NS3G1 zEgp#dSg;jB5TWH6&nm~ILHDnFHsV))&h)jas$5f*P}x}bsFu3y$nesC52R62TT0Qc zC+*FEcCpSXM6Px`?h?Lb{qDpLkIhycque`-&xh?El$O|TneR0(qG`*sJ(q4PPOp3# zmR`L%uS=xgu)Fg|=iSw-!_4B-BAIuya$vtsYWb^_16hT6b#ZpbZB+Rm_7147m*hXK z`Jb7--8DtodDW-(DT-dR1nVmI$~)kSisJO(&8z=8fPU$lLF?TM*L2M#kNc%YMzb{IEt~6u~ zZ$Hmj9RI|{e5_CU$o!U|C7tE{+_A#bPgXUgwUs$1x-55?+%WLvt3wTj}xsr)|q`y{>|R#-Ea2q z8TxjfA}Y5fDB^&j}C87L z&GZ6r5-bGoK%*8i;wupekb3KpSunGI^+l;8}91778I5{TGo!A)rBLRQZXh z(Nr%~>yZ><1g20&^r`6e-UlZzDcFI~9$g=8v;VB%<1t9Eub&Tu3Ix4QnoiYgO2j4^ z^Sd2wdt5oKg3eRk*4Z(*Ht%(Wfsf5UG`z>QfCfRRHhGRS^(sis}F6l4-YB zrO{isPY!mI%VanxDNsWpB$R=`GC2ul(_y7trPGFfJd`O#pK9n!-p4Qm`FQssbCk|t z2?V`8;OwH0#w1ZV0g3Slxr$G2IbBSK{Z!jmo8>6qG&{l4&p{9;ensK`50)1}ZgD8BYY-r$-@p zL^KbEdKL00!wG4q(Lt^FgYU;2J*J!_OP?Sg6(#J@z3k6=9L#-s68Q zuRw0T90icj-Y_@=9-a@VUzx!TOg8}yL75Z;r68ODgv&!YJcKy~L3s$`4F81_Bp-+h z!6zR0X$$H?>5k1Y_IF?f+9SUpvQA$sZ0!>of{ecSt2LuE34HX+fG%;IUM~ zlc_aI4AeFj9SvqEW-NIa)FfHp3^oZlp}+;E-kYHydKL<~v6pxXOclW=>nT!PhUpXp zSuj^+;+FPgLm?OREKG9nM_pgYm5Bs;8>9{XV{!;c&{ulCo}!QA65Mfoa-4A(g4Le^ zh4KFGoyL8A?ewL#o&+v(NoPVbsFy}#aKSxmd>~aHjX~#pMx!z4080Fsk49sE zMnk}vKIdb8#z$i^Kj#CH_)M0~0Epx-c3EtI;{HNoazCfBXrI$K+|PaCG67oY(?@79 zxdPXKKer&*UmlNx_(1^lsR6D6nHE8?mrACFdQcne#F@VCr2haRsCX&> literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 new file mode 100644 index 0000000..c25c646 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 @@ -0,0 +1,72 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RESUME_FROM 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RESUME_FROM \- set a point to resume transfer from +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM, long from); +.SH DESCRIPTION +Pass a long as parameter. It contains the offset in number of bytes that you +want the transfer to start from. Set this option to 0 to make the transfer +start from the beginning (effectively disabling resume). For FTP, set this +option to -1 to make the transfer start from the end of the target file +(useful to continue an interrupted upload). + +When doing uploads with FTP, the resume position is where in the local/source +file libcurl should try to resume the upload from and it will then append the +source file to the remote target file. + +If you need to resume a transfer beyond the 2GB limit, use +\fICURLOPT_RESUME_FROM_LARGE(3)\fP instead. +.SH DEFAULT +0, not used +.SH PROTOCOLS +HTTP, FTP, SFTP, FILE +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com"); + + /* resume upload at byte index 200 */ + curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 200L); + + /* ask for upload */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* set total data amount to expect */ + curl_easy_setopt(curl, CURLOPT_INFILESIZE, size_of_file); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_RESUME_FROM_LARGE "(3), " CURLOPT_RANGE "(3), " +.BR CURLOPT_INFILESIZE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.html b/docs/libcurl/opts/CURLOPT_RESUME_FROM.html new file mode 100644 index 0000000..223d95a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.html @@ -0,0 +1,77 @@ + + +CURLOPT_RESUME_FROM man page + + + + +

    NAME

    +

    CURLOPT_RESUME_FROM - set a point to resume transfer from

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM, long from);

    DESCRIPTION

    +

    Pass a long as parameter. It contains the offset in number of bytes that you want the transfer to start from. Set this option to 0 to make the transfer start from the beginning (effectively disabling resume). For FTP, set this option to -1 to make the transfer start from the end of the target file (useful to continue an interrupted upload). +

    When doing uploads with FTP, the resume position is where in the local/source file libcurl should try to resume the upload from and it will then append the source file to the remote target file. +

    If you need to resume a transfer beyond the 2GB limit, use CURLOPT_RESUME_FROM_LARGE instead.

    DEFAULT

    +

    0, not used

    PROTOCOLS

    +

    HTTP, FTP, SFTP, FILE

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com"); +

      /* resume upload at byte index 200 */ +   curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 200L); +

      /* ask for upload */ +   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); +

      /* set total data amount to expect */ +   curl_easy_setopt(curl, CURLOPT_INFILESIZE, size_of_file); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_RESUME_FROM_LARGE, CURLOPT_RANGE, CURLOPT_INFILESIZE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.pdf b/docs/libcurl/opts/CURLOPT_RESUME_FROM.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2cae610ad42b59164466c40671495251a1be5027 GIT binary patch literal 4411 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 Z5k-z{Izp@^j74K`m~6, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RESUME_FROM_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM_LARGE, + curl_off_t from); +.SH DESCRIPTION +Pass a curl_off_t as parameter. It contains the offset in number of bytes that +you want the transfer to start from. Set this option to 0 to make the transfer +start from the beginning (effectively disabling resume). For FTP, set this +option to -1 to make the transfer start from the end of the target file +(useful to continue an interrupted upload). + +When doing uploads with FTP, the resume position is where in the local/source +file libcurl should try to resume the upload from and it will then append the +source file to the remote target file. +.SH DEFAULT +0, not used +.SH PROTOCOLS +HTTP, FTP, SFTP, FILE +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_off_t resume_position = GET_IT_SOMEHOW; + curl_off_t file_size = GET_IT_SOMEHOW_AS_WELL; + + curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com"); + + /* resuming upload at this position, possibly beyond 2GB */ + curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, resume_position); + + /* ask for upload */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* set total data amount to expect */ + curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_size); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.11.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_RESUME_FROM "(3), " CURLOPT_RANGE "(3), " +.BR CURLOPT_INFILESIZE_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.html b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.html new file mode 100644 index 0000000..122520b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.html @@ -0,0 +1,82 @@ + + +CURLOPT_RESUME_FROM_LARGE man page + + + + +

    NAME

    +

    CURLOPT_RESUME_FROM_LARGE - set a point to resume transfer from

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM_LARGE, +   curl_off_t from); +

    +

    DESCRIPTION

    +

    Pass a curl_off_t as parameter. It contains the offset in number of bytes that you want the transfer to start from. Set this option to 0 to make the transfer start from the beginning (effectively disabling resume). For FTP, set this option to -1 to make the transfer start from the end of the target file (useful to continue an interrupted upload). +

    When doing uploads with FTP, the resume position is where in the local/source file libcurl should try to resume the upload from and it will then append the source file to the remote target file.

    DEFAULT

    +

    0, not used

    PROTOCOLS

    +

    HTTP, FTP, SFTP, FILE

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_off_t resume_position = GET_IT_SOMEHOW; +   curl_off_t file_size = GET_IT_SOMEHOW_AS_WELL; +

      curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com"); +

      /* resuming upload at this position, possibly beyond 2GB */ +   curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, resume_position); +

      /* ask for upload */ +   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); +

      /* set total data amount to expect */ +   curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_size); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Added in 7.11.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_RESUME_FROM, CURLOPT_RANGE, CURLOPT_INFILESIZE_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.pdf b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2c7eb2d32052b632e59c0d8e0d6d0b2603e55885 GIT binary patch literal 4323 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 F{sX7nEW!W) literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 new file mode 100644 index 0000000..c951016 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_CLIENT_CSEQ, long cseq); +.SH DESCRIPTION +Pass a long to set the the CSEQ number to issue for the next RTSP +request. Useful if the application is resuming a previously broken +connection. The CSEQ will increment from this new number henceforth. +.SH DEFAULT +0 +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_SERVER_CSEQ "(3), " CURLOPT_RTSP_REQUEST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.html b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.html new file mode 100644 index 0000000..b1f53ca --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.html @@ -0,0 +1,60 @@ + + +CURLOPT_RTSP_CLIENT_CSEQ man page + + + + +

    NAME

    +

    CURLOPT_RTSP_CLIENT_CSEQ - set the RTSP client CSEQ number

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_CLIENT_CSEQ, long cseq);

    DESCRIPTION

    +

    Pass a long to set the the CSEQ number to issue for the next RTSP request. Useful if the application is resuming a previously broken connection. The CSEQ will increment from this new number henceforth.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_RTSP_SERVER_CSEQ, CURLOPT_RTSP_REQUEST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.pdf b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3a6b03395fd1539f2fd903f02c036ca6d0e3c0c6 GIT binary patch literal 3654 zcmb_fdsq`!7T*;u?$~Ozh%IQnYH_rh%uL>iNl^0;3b7bKu}F22Ovp%*iIa&0m92_) ztrd$@6h*XJtF5-5pIY(J^@;eX54zg2Rf={$QCm@|MYf8HduIrOVz;~B=lv&l&OPUM z&OOhYm?WcFM2KZb%+c!~tV84g2aIhhqSa!FlsA)e0R^O3F*EJvC>CI5H_1^(%FZ|_ zy&my%EJb>d;HvqlHx{2aM?9$CxXb#m*tH_4l{P1Beq-LQUhn0-r*lV9!w#<`r)9aT z`k%Y9wrO$cE75;HU>?@_xhqW<{5N<1cBkj?c?YdqnpfV;-?_D0j~(Q}yj!j*xm_Q` z)Rd19hiMzbFGkhqUY-;^X$`0h-={qJv!wgST_#ryYTkLUZ|#c-U4G3crH&KD=%te5 zA686_Iz3lC+4A9!4W;on%>`wt`+C(i9o-aZ$#I$OB@;K?FDx>>V7RdVPI%swMGLAg z=Mp8G^koJ4R7J|%f5*6LrSoSd_U%#ow|&|AaZ8pVhn^?a+*ZeSx%P0*=biymcjHIO zG-aBou)$XbUEEodFyxp1apG^TcV1O7a%JW^*T|z0H=5s0Sy>e`c4FnI)z2-RRXXN< z$Ff!BX9h$S-c1<4KIf~Rzm!a^O>dkteg9@(Nv9q!G;au7wM=ql+ds3Lx?Z?mRWZ1a zvU1OjwB_r)0DC_?F6&lM+0-cip+3(MRT()e^3+TVUiVtgoN`;PwS3I0bzdInIwE6# zT~t-ZtqofF_`Pcy$MvHEHOTkNiuA(|$Gwp?QA|Aa%;={z@916>ben2GT9vK(N`a?Q zR98Nr^30Bv+7*e(eX~YhZJMyo``e0n+ut?Bm=!lVH?J=8ls=q&Z`1wE^`>lXazw#0 z(*SEx#Ghl={q<{hVp-g;K z*Nsb%S$7(O~&H}Tx!>a+c-kJ-+vPA)KTue)BVee3iza^tw-+wrTq zsb0R@>*Vagua2}wll877=eAu(;`fSee~P}ZzWZg@yi2l~v87J^lnP^h?u5&^-)1k( zxv)b$ZnA0hrq7NfpUP#sCVKga&ViY# zW9K4Dq6?g7!^KzoU;W1dyy3*G-t_h)Wh9mNc4GyY9baq=Tapl$x4h?$yAfH2gib$q zJ`;%tPF91e)6)-jJ8^V*?j+HJl-=qr14pSAf4A9}`sw!K)Zq=+))dxA;_gsA=PpUu zvT)H~ihA9{H$)o7E|0CeS;Qn-?C{7T<2W&2w0e(Y7Kj52^6@jFXeY}d6CI!);fk3d(53mH<;RopmZ@(4E01zR- zL$(v;(L?>MMbbcWq?^fXg$P-1p*Ye3PXN(EXw$8H9H8wQ2=-=@1rU0D$VlNFP5LR`Ls$y!q5PuJjN2hxUT_g_M)wBZZkj4lGr+U2&qh=*N2i-8yobI_AH76HY$_$>d^YH_M?Dy=+Fsr z3vTflC>I?!gQb#Zj7_o6$g-;)XsjO5#*#3{DN&I0iJZa&^8?Cn*9|mS6U_s8hM*?s z@p)jhLD1v&`ZYlvDu`&{o+o1{5Lmb@9hzoI0vyA*vuF-T#A-1iBBaBClO;V=Hp6BC zLaaa`BLPfNy^R+YcF@5j=DwIM$z?}wGvLj%pSRFbhDG`iu zF@CN^KTwNt1&W2P|E#Qnv3a@|U_e7|&_W)K1tzXD#|Zn7UV;;H5l)D3RSK@w5GoBW zABGbe9M@t`aKhk2Q3HIzz!%N`AliNW{_>je=N+ zON;R_YUiD2?Jv@2vHW+Bc|3ed^L!d3V-I*>gN---KMC`!W9+a$GT0Yj-9mLZ>=@;y zc-#Ci%mlR9Vb?er)m)G-4qM| zrvWUPoyG269OcaNC+e*#`LBc`46ZJ*cku- literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 new file mode 100644 index 0000000..9ab175d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 @@ -0,0 +1,101 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_REQUEST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_REQUEST \- specify RTSP request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_REQUEST, long request); +.SH DESCRIPTION +Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP +enum values as a long in the \fIrequest\fP argument. Unless noted otherwise, +commands require the Session ID to be initialized. +.IP CURL_RTSPREQ_OPTIONS +Used to retrieve the available methods of the server. The application is +responsible for parsing and obeying the response. \fB(The session ID is not +needed for this method.)\fP +.IP CURL_RTSPREQ_DESCRIBE +Used to get the low level description of a stream. The application should note +what formats it understands in the \fI'Accept:'\fP header. Unless set +manually, libcurl will automatically fill in \fI'Accept: +application/sdp'\fP. Time-condition headers will be added to Describe requests +if the \fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is +not needed for this method)\fP +.IP CURL_RTSPREQ_ANNOUNCE +When sent by a client, this method changes the description of the session. For +example, if a client is using the server to record a meeting, the client can +use Announce to inform the server of all the meta-information about the +session. ANNOUNCE acts like a HTTP PUT or POST just like +\fICURL_RTSPREQ_SET_PARAMETER\fP +.IP CURL_RTSPREQ_SETUP +Setup is used to initialize the transport layer for the session. The +application must set the desired Transport options for a session by using the +\fICURLOPT_RTSP_TRANSPORT(3)\fP option prior to calling setup. If no session +ID is currently set with \fICURLOPT_RTSP_SESSION_ID(3)\fP, libcurl will +extract and use the session ID in the response to this request. \fB(The +session ID is not needed for this method).\fP +.IP CURL_RTSPREQ_PLAY +Send a Play command to the server. Use the \fICURLOPT_RANGE(3)\fP option to +modify the playback time (e.g. 'npt=10-15'). +.IP CURL_RTSPREQ_PAUSE +Send a Pause command to the server. Use the \fICURLOPT_RANGE(3)\fP option with +a single value to indicate when the stream should be halted. (e.g. npt='25') +.IP CURL_RTSPREQ_TEARDOWN +This command terminates an RTSP session. Simply closing a connection does not +terminate the RTSP session since it is valid to control an RTSP session over +different connections. +.IP CURL_RTSPREQ_GET_PARAMETER +Retrieve a parameter from the server. By default, libcurl will automatically +include a \fIContent-Type: text/parameters\fP header on all non-empty requests +unless a custom one is set. GET_PARAMETER acts just like a HTTP PUT or POST +(see \fICURL_RTSPREQ_SET_PARAMETER\fP). +Applications wishing to send a heartbeat message (e.g. in the presence of a +server-specified timeout) should send use an empty GET_PARAMETER request. +.IP CURL_RTSPREQ_SET_PARAMETER +Set a parameter on the server. By default, libcurl will automatically include +a \fIContent-Type: text/parameters\fP header unless a custom one is set. The +interaction with SET_PARAMETER is much like a HTTP PUT or POST. An application +may either use \fICURLOPT_UPLOAD(3)\fP with \fICURLOPT_READDATA(3)\fP like a +HTTP PUT, or it may use \fICURLOPT_POSTFIELDS(3)\fP like a HTTP POST. No +chunked transfers are allowed, so the application must set the +\fICURLOPT_INFILESIZE(3)\fP in the former and \fICURLOPT_POSTFIELDSIZE(3)\fP +in the latter. Also, there is no use of multi-part POSTs within RTSP. +.IP CURL_RTSPREQ_RECORD +Used to tell the server to record a session. Use the \fICURLOPT_RANGE(3)\fP +option to modify the record time. +.IP CURL_RTSPREQ_RECEIVE +This is a special request because it does not send any data to the server. The +application may call this function in order to receive interleaved RTP +data. It will return after processing one read buffer of data in order to give +the application a chance to run. +.SH DEFAULT +.SH PROTOCOLS +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_SESSION_ID "(3), " CURLOPT_RTSP_STREAM_URI "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.html b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.html new file mode 100644 index 0000000..87592b5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.html @@ -0,0 +1,82 @@ + + +CURLOPT_RTSP_REQUEST man page + + + + +

    NAME

    +

    CURLOPT_RTSP_REQUEST - specify RTSP request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_REQUEST, long request);

    DESCRIPTION

    +

    Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP enum values as a long in the request argument. Unless noted otherwise, commands require the Session ID to be initialized. +

    CURL_RTSPREQ_OPTIONS +

    Used to retrieve the available methods of the server. The application is responsible for parsing and obeying the response. (The session ID is not needed for this method.) +

    CURL_RTSPREQ_DESCRIBE +

    Used to get the low level description of a stream. The application should note what formats it understands in the 'Accept:' header. Unless set manually, libcurl will automatically fill in 'Accept: application/sdp'. Time-condition headers will be added to Describe requests if the CURLOPT_TIMECONDITION option is active. (The session ID is not needed for this method) +

    CURL_RTSPREQ_ANNOUNCE +

    When sent by a client, this method changes the description of the session. For example, if a client is using the server to record a meeting, the client can use Announce to inform the server of all the meta-information about the session. ANNOUNCE acts like a HTTP PUT or POST just like CURL_RTSPREQ_SET_PARAMETER +

    CURL_RTSPREQ_SETUP +

    Setup is used to initialize the transport layer for the session. The application must set the desired Transport options for a session by using the CURLOPT_RTSP_TRANSPORT option prior to calling setup. If no session ID is currently set with CURLOPT_RTSP_SESSION_ID, libcurl will extract and use the session ID in the response to this request. (The session ID is not needed for this method). +

    CURL_RTSPREQ_PLAY +

    Send a Play command to the server. Use the CURLOPT_RANGE option to modify the playback time (e.g. 'npt=10-15'). +

    CURL_RTSPREQ_PAUSE +

    Send a Pause command to the server. Use the CURLOPT_RANGE option with a single value to indicate when the stream should be halted. (e.g. npt='25') +

    CURL_RTSPREQ_TEARDOWN +

    This command terminates an RTSP session. Simply closing a connection does not terminate the RTSP session since it is valid to control an RTSP session over different connections. +

    CURL_RTSPREQ_GET_PARAMETER +

    Retrieve a parameter from the server. By default, libcurl will automatically include a Content-Type: text/parameters header on all non-empty requests unless a custom one is set. GET_PARAMETER acts just like a HTTP PUT or POST (see CURL_RTSPREQ_SET_PARAMETER). Applications wishing to send a heartbeat message (e.g. in the presence of a server-specified timeout) should send use an empty GET_PARAMETER request. +

    CURL_RTSPREQ_SET_PARAMETER +

    Set a parameter on the server. By default, libcurl will automatically include a Content-Type: text/parameters header unless a custom one is set. The interaction with SET_PARAMETER is much like a HTTP PUT or POST. An application may either use CURLOPT_UPLOAD with CURLOPT_READDATA like a HTTP PUT, or it may use CURLOPT_POSTFIELDS like a HTTP POST. No chunked transfers are allowed, so the application must set the CURLOPT_INFILESIZE in the former and CURLOPT_POSTFIELDSIZE in the latter. Also, there is no use of multi-part POSTs within RTSP. +

    CURL_RTSPREQ_RECORD +

    Used to tell the server to record a session. Use the CURLOPT_RANGE option to modify the record time. +

    CURL_RTSPREQ_RECEIVE +

    This is a special request because it does not send any data to the server. The application may call this function in order to receive interleaved RTP data. It will return after processing one read buffer of data in order to give the application a chance to run.

    DEFAULT

    +

    PROTOCOLS

    +

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_RTSP_SESSION_ID, CURLOPT_RTSP_STREAM_URI,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.pdf b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..baec9cb276916a113fe09b4e5a85ceff5b4668c0 GIT binary patch literal 7519 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 vu`ofSkvKRGgTq, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_SERVER_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SERVER_CSEQ, long cseq); +.SH DESCRIPTION +Pass a long to set the CSEQ number to expect for the next RTSP Server->Client +request. \fBNOTE\fP: this feature (listening for Server requests) is +unimplemented. +.SH DEFAULT +0 +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_CLIENT_CSEQ "(3), " CURLOPT_RTSP_STREAM_URI "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.html b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.html new file mode 100644 index 0000000..e90ff59 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.html @@ -0,0 +1,60 @@ + + +CURLOPT_RTSP_SERVER_CSEQ man page + + + + +

    NAME

    +

    CURLOPT_RTSP_SERVER_CSEQ - set the RTSP server CSEQ number

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SERVER_CSEQ, long cseq);

    DESCRIPTION

    +

    Pass a long to set the CSEQ number to expect for the next RTSP Server->Client request. NOTE: this feature (listening for Server requests) is unimplemented.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_RTSP_CLIENT_CSEQ, CURLOPT_RTSP_STREAM_URI,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.pdf b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.pdf new file mode 100644 index 0000000..c64018d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.pdf @@ -0,0 +1,110 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ…UmoÛ6þ®_A`_¤"fE‰/â:p] p«X®D§+âÁHm&Ñ`ˎ%oݏÚܑ’¥ØNˆêx÷¼Üž òͯ}.7ÎÛL ‡Êñуóäûµå}P™uï4w2đDjãܺ£Y–¤SµÈ<&±”pU>]äqæý©>9’c +·ÔÊ B"õܸ‰³Å(¿ÌÝpî¡åa¿^è»êßE¥ëí®öó±ï þ)¶e…ú +&cÀ%æ¤ÉyÛՊ̝æ¶ñ°.Š*X2ÃfrŽ}‚ài2¹“¡§þ Ž0ÌdØTp¯csÞ«ø˜ú H`^û £Ÿk`q‰°Ã…þC@Տe÷Mìÿö ¨O(wõÙ¸ò°ù®÷–Á9n(ÎqdÑåß&é4ç§mˆÅçþR”Ëõa¥ÑoFç·æ~|oŠTâ¨7 úåbݘÛWèÍã]¹Zë«gF4È_dx…ÖÛò-+ý4÷Þ½Fàcœ²ñTÓ‰fÖxõ™é]ç‘Äk?kl¨*t×T¯·ÌÏÔ4ÇÚ#ˈQ÷ÇN/kt¿ÝÛ°R[ “5:1åÆ Û{‚bÑÖ§ ‡Àölð~´.tY£½~:èªÆ1²å"BèE?86ï$õ(7¹AŸ3êÀ2”Q›û׺caFhÔ–ûXTè^ß ¬€Ô'8 +ÙYƒÖ‡½Fsw]Tµ. ÈÐΏ}gHƒ:-æ +†2Êb³[ë °Ñ+üº¿·þ1ˆ0'’ÐvNÝá̾%¦V;bEû6Q³ž¼i!DH;ûý^Ì1L³ -0:à¢U{`ŸI£†›*”va- Ÿ§}”&y›„ŸÁ!X˜Mփ&&‘äšO/qÒ¨‰èÁÆ ¯§I|lúè§M¯z¬$4ÓÑTù˜¶Š²(º\nTšÈ®šžZîÃÔ/:ðˆ3rìÝq2ü0NÆêÛé2«B +5ž7”;\­ô +%’¼bÌ­›Åj–MЍGB>NÜa2‹Û–º¤ ñ¶Ýüñ"ýŒŠ{;¤ÍÁtguØí¶{èÌ+Ë© œM>ÃH…Ìý:Y¤v§˜‹å¶~µ}ó8FÃ$OOÇõ9¤~÷…°"Jì%ãx¢ìÞ;£CÅü(­ý]&‡Úœ÷»à,?ì'»`U¯³l|‘š†_¤„L` +c{€aÞ¤^ßÍf¯B^ c’bæÂWñÓ¡D|wlvڍ1¹bå|ßÿߨuendstream +endobj +6 0 obj +962 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +12 0 obj +<> +endobj +13 0 obj +<>stream + + + + + +2015-01-08T09:18:05+01:00 +2015-01-08T09:18:05+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 14 +0000000000 65535 f +0000001285 00000 n +0000003089 00000 n +0000001226 00000 n +0000001066 00000 n +0000000015 00000 n +0000001047 00000 n +0000001350 00000 n +0000001525 00000 n +0000001460 00000 n +0000001391 00000 n +0000001421 00000 n +0000001607 00000 n +0000001666 00000 n +trailer +<< /Size 14 /Root 1 0 R /Info 2 0 R +/ID [] +>> +startxref +3243 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 new file mode 100644 index 0000000..ec3d387 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_SESSION_ID 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_SESSION_ID \- set RTSP session ID +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SESSION_ID, char *id); +.SH DESCRIPTION +Pass a char * as a parameter to set the value of the current RTSP Session ID +for the handle. Useful for resuming an in-progress session. Once this value is +set to any non-NULL value, libcurl will return \fICURLE_RTSP_SESSION_ERROR\fP +if ID received from the server does not match. If unset (or set to NULL), +libcurl will automatically set the ID the first time the server sets it in a +response. +.SH DEFAULT +NULL +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_STREAM_URI "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.html b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.html new file mode 100644 index 0000000..d3cf458 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.html @@ -0,0 +1,60 @@ + + +CURLOPT_RTSP_SESSION_ID man page + + + + +

    NAME

    +

    CURLOPT_RTSP_SESSION_ID - set RTSP session ID

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SESSION_ID, char *id);

    DESCRIPTION

    +

    Pass a char * as a parameter to set the value of the current RTSP Session ID for the handle. Useful for resuming an in-progress session. Once this value is set to any non-NULL value, libcurl will return CURLE_RTSP_SESSION_ERROR if ID received from the server does not match. If unset (or set to NULL), libcurl will automatically set the ID the first time the server sets it in a response.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_RTSP_REQUEST, CURLOPT_RTSP_STREAM_URI,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.pdf b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3b58f7cbe1552cb4b9268271ec88c60b6068e069 GIT binary patch literal 4028 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_STREAM_URI 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_STREAM_URI, char *URI); +.SH DESCRIPTION +Set the stream \fIURI\fP to operate on by passing a char * . For example, a +single session may be controlling \fIrtsp://foo/twister/audio\fP and +\fIrtsp://foo/twister/video\fP and the application can switch to the +appropriate stream using this option. If unset, libcurl will default to +operating on generic server options by passing '*' in the place of the RTSP +Stream URI. This option is distinct from \fICURLOPT_URL(3)\fP. When working +with RTSP, the \fICURLOPT_STREAM_URI(3)\fP indicates what URL to send to the +server in the request header while the \fICURLOPT_URL(3)\fP indicates where to +make the connection to. (e.g. the \fICURLOPT_URL(3)\fP for the above examples +might be set to \fIrtsp://foo/twister\fP +.SH DEFAULT +'*' +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_TRANSPORT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.html b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.html new file mode 100644 index 0000000..c35879b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.html @@ -0,0 +1,60 @@ + + +CURLOPT_RTSP_STREAM_URI man page + + + + +

    NAME

    +

    CURLOPT_RTSP_STREAM_URI - set RTSP stream URI

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_STREAM_URI, char *URI);

    DESCRIPTION

    +

    Set the stream URI to operate on by passing a char * . For example, a single session may be controlling rtsp://foo/twister/audio and rtsp://foo/twister/video and the application can switch to the appropriate stream using this option. If unset, libcurl will default to operating on generic server options by passing '*' in the place of the RTSP Stream URI. This option is distinct from CURLOPT_URL. When working with RTSP, the CURLOPT_STREAM_URI(3) indicates what URL to send to the server in the request header while the CURLOPT_URL indicates where to make the connection to. (e.g. the CURLOPT_URL for the above examples might be set to rtsp://foo/twister

    DEFAULT

    +

    '*'

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_RTSP_REQUEST, CURLOPT_RTSP_TRANSPORT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.pdf b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79bbdc9c6c94f1681d74fa0a2f60be1e61bf7f5c GIT binary patch literal 4313 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 V6NQtMHE0|@4~5*^CQg+=e*rmW3+Mm< literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 new file mode 100644 index 0000000..4d0a4c0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_RTSP_TRANSPORT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_TRANSPORT, + char *transport); +.SH DESCRIPTION +Pass a char * to tell libcurl what to pass for the Transport: header for this +RTSP session. This is mainly a convenience method to avoid needing to set a +custom Transport: header for every SETUP request. The application must set a +Transport: header before issuing a SETUP request. +.SH DEFAULT +NULL +.SH PROTOCOLS +RTSP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.20.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_SESSION_ID "(3), " diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.html b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.html new file mode 100644 index 0000000..f79c01f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.html @@ -0,0 +1,64 @@ + + +CURLOPT_RTSP_TRANSPORT man page + + + + +

    NAME

    +

    CURLOPT_RTSP_TRANSPORT - set RTSP Transport: header

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_TRANSPORT, +   char *transport); +

    +

    DESCRIPTION

    +

    Pass a char * to tell libcurl what to pass for the Transport: header for this RTSP session. This is mainly a convenience method to avoid needing to set a custom Transport: header for every SETUP request. The application must set a Transport: header before issuing a SETUP request.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    RTSP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.20.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_RTSP_REQUEST, CURLOPT_RTSP_SESSION_ID,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.pdf b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d05ea247c0592a94fc7734261f6cb747d2b0e548 GIT binary patch literal 3874 zcmb_fd0Z1$9*{~E)jEJ73Sb~8OJ%zJ`mN3&6LZgA4EJNTn z$i48N1AnqF*9W|~w<>5&6f{6pGk9A?Y6QKv@1=+Xt*_aZuh^WXn!JW`w7C>{@4G>F zdOd2>{J{P@l}td5tRzcWQqgRH?h? zALPC})*W<5HBlptik-N==>=Jbx!lhb2qr_JVd9O7x5rc`m%jkTtWKW zr;fCB`l)zz^wrLZMI*;wToBo-R@QIcK%}PcsT&)l)icNQj!A!v8xq*@ZkL&|L$=xx z=gwbjf7pJs?v&H4u0$i+4{MPyYUnsmMoDMU={<*a=9`gG2PjifRCJ3?;nGS^+4H~2 z#^zs|(tGS=|LT?}@4pX%`RTKvP4p3sNNfRW!kTk3cjVD z=PV99x#7a;sHGJNgP6-h+idS}tg0Zoxb36hZP#-HkCc+a>mUA*5qhBAh!R`do|8up zIO|^Z;>yE~hZZv3_Lgk>F6G~!P(ygNyG9fWPLbv34%U>iic{PFUfh08&r4GswWW#0 zHOoVl&#wn%R3<*Yz3dnFM?} zTkxiwv&xRCg~k=;-mb~Rwx3;Mc#%4J%%aoe`p{pDoAM(cuO3o!Z^c^4w>?*^96GyD zeJPwNJhNiQj8y-X(@T<0-QQ|>V0tiaep+>#NxeoRN$G8}$89)OzGN!>YeCqVnkE&3Q|3m#t$;p$Qu1%ah(C8<29uZXT0FN`_yndX>-LoRB?CPZgGwD8wxqfe&o=us zbAS1|c29GAwWzuM>7lUsPnK^j3l2Vsuj-M$L6EV$s`kX^!j4nv0oS&k6%L!QLYY4E zVMLFI(gA(09Lx?u_6z^mw6m3c=$M!83)cPnX6E(#T`F5+>)g)e99$EJb_oojDk=&z z`O*ctJ8nHxx_))rcAwqIcfFXkr`y`p%ReVo^bK5@j+b@3@s=deq_3*@61)b zr)u`y3e&vEPbTaZ9}MmPv03C|)B17RWY7}^bIpx{`d zkic@WFcU(IGz)MJMgbQ?*jZS_fgm6gPTIwo2`7NZB!)I86Kn+Ryf+XmZUHASR!?ZOEqh%-<24|pf06;lG#a0i z-dp)h8D$VBXKYmCy=KFy0#b0Nh*1v7UuWa!KCT$tNpKNDQb-%&g*dQd? zWn#Hpakm0aG=z%N_ihD7+J@VkYS7uis3PrIFedbR^B**NPkkymV@QJ>q9v_X0@MIV zdIp4vQN&6@m`sG&NW06K+31rurcE_8M7!}8X@-P`p^AybQjNw}w5lk#12^XoENmjO zNV}SMZ^v#POj^{uK@tOMaKsYXWS@M7NX}18G3V!)6&7BU22w@gpwkgrcfvl zREP+Le89nXjd5HbzH1SryANDHpRkPeol?J#E; zH_m!Kit0NeOUVHtl5V?ZXNID&--*>%T9rKyKb01&~l*7*v2qX#n+W9iatq zq!FT+gpXo;RGxw=l$czJN_(Q15=B+W8=N5dKr|M-&cJK!e-LfL*+i6PQb0*)vKZQG zg>wnU$z=i)2!#Ssy+yB>k4uGcIcgG}_Z=_XVKDsnh}mphNppNkEp2w$0M5p1|DS?+ z-#NCJUpee>F_gDEEM|nD2+lVrNHYdJwwRSxnz7-awsD7pBF#8g@(8F&o<;=@S(2p) zjkourDYkw?kz6k+Dcqi==DGP6!iu{nmZwRzd$}$3*`P>G{l+VYH0pXsuDm4B+aPVo zE9B5X@OxVCPf;UWf}y15<#AvLcCWtxIJEbnaYJ86zN@XfgNe*_2?#jXCy`nu*JLP$ z%25R-_x2YLMR|Y?^x, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SASL_IR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SASL_IR \- enable sending initial response in first packet +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_IR, long enable); +.SH DESCRIPTION +Pass a long. If the value is 1, curl will send the initial response to the +server in the first authentication packet in order to reduce the number of +ping pong requests. Only applicable to the following supporting SASL +authentication mechanisms: + +* Login +* Plain +* GSSAPI +* NTLM +* OAuth 2.0 + +Note: Whilst IMAP supports this option there is no need to explicitly set it, +as libcurl can determine the feature itself when the server supports the +SASL-IR CAPABILITY. +.SH DEFAULT +0 +.SH PROTOCOLS +IMAP, POP3 and SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.31.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAIL_AUTH "(3), " CURLOPT_MAIL_FROM "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.html b/docs/libcurl/opts/CURLOPT_SASL_IR.html new file mode 100644 index 0000000..a703b49 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SASL_IR.html @@ -0,0 +1,62 @@ + + +CURLOPT_SASL_IR man page + + + + +

    NAME

    +

    CURLOPT_SASL_IR - enable sending initial response in first packet

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_IR, long enable);

    DESCRIPTION

    +

    Pass a long. If the value is 1, curl will send the initial response to the server in the first authentication packet in order to reduce the number of ping pong requests. Only applicable to the following supporting SASL authentication mechanisms: +

    * Login * Plain * GSSAPI * NTLM * OAuth 2.0 +

    Note: Whilst IMAP supports this option there is no need to explicitly set it, as libcurl can determine the feature itself when the server supports the SASL-IR CAPABILITY.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    IMAP, POP3 and SMTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.31.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAIL_AUTH, CURLOPT_MAIL_FROM,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.pdf b/docs/libcurl/opts/CURLOPT_SASL_IR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..841d3a9fc9d64019f035f51eb4519c1650ce14d9 GIT binary patch literal 3862 zcmb_fc~}!?8edl}I;&z)d3;u@qm~BIWR6@UOM*ZMpaw92h{)8^=F-_v8Bnf-OqC4WX3}@tHD>ywKC_n} zB%4KW+^(o4#%_r#XP#00R9jl&mKS;U$ma5fwda}+blrC)dj7=c=p;>qPzhd#M{o6@-c=NI43+c@%ze?$ElaKgP_6Vv`-kK3n6xw-yL@dCVxg zI$XQh{m1nQ=MTxMU+Y!%2RwK8zd3fD;GQIN^MtkgJ#-J#JdcFstV>)P|M`%+Sp_Gm zTNhNG$tb#9zp%D-_})QM#~_ua{&Shs*JZZHu2Kp;fD|jM(xdJH>u@Q{kQw`)GLC@t)mMlAC>J#q?h0$glH` zI}joow1JFs_v=rM3|sjkf5**B57R1Br+S^ASDkGh?9rHitf(a~C&ZNNLCq}Nc5V2X z%yQ+Cz6h0zUfVRFX1-F_tzlZv*>vu`{841$59#|39qU0<#lBcq-R;t>G)B zXCz@)`~JG;*7bje-jtP1sqDHdl^ZbN;^h36vm*F|N$55cY9 z=_{j-jm!I5k#;$CDOD2aHdr%6N;ms|JuG(1s?642VpGH8e-P>Sc93oh3c0~qtFyEh zN_Rd?==Gp1YZ~5j&YD$*mi6;u;_|v|>Te(F@yA8JC8|Z|7kc{*`g8WxpuQpf10RQ6 zs(g}gxv6{1(FeoOj6L@&vh!AMTGeGS5?V;V+~essCw|F^)i3KJZd>tQ-cL%q`lu$( zJ*ay8lDc5C9QbuvRIpgJ^HGj2lpLG$Dx_t}{d-JZRzi5s)e;j}QyI}du7q2Q$ zH?^LMC6A}=n~uFe`>D3iS|c2xcztAH%#DM|Ee5=c|M&uO*iSk0`q7PUbv3cyPD}e_ zbj_{PjT@3r27I3Oa!JJ8#PI9t#XFYmZ*K58Upjw)ZvElnp1)VRe>a~zd?@bd!0=*G z13Ec!u-lPyMO0dku@$d}Ha{6KaMhSk`R`2(ON5(It& zjW(D^S3LwsF8_EFZDX5Wx{9 zCaGP8%X=Ng5e9GrV{L>E+w!*+bc6vR5s^9=Q>$H0I-_!#(#s)UPT!%%8D{&f0#fj| zh~5|SeVdJ^ySM@g8^vb`iKfkzO&G|S49?)4X@ig`dm_izijN97(Vi+^--i|G88cz& ztRdI}))Q?>f-&6b&41A7ymhJMjUnxFh=w*ADbNF;=TO+{iYVvXQFcLHhC9;XH#w=`dT(py;r} zY_iyt4wb+uq6BB2j0j*S3zwo2OwvWd9K)DWXb#3j3K1s6#G_#&OPHxthE0JnkxT$o zvIe745Bj}LA^4>dBy*fqi6E(|siIV|h+&fuOrcO9D30K`5O4@>X%>!f2rae|z@F0) zdeR#)i%sP8NklScgr0<8A{1#iqygcuw3VY73(OlP5*a(E64>puK`Bc#8pVkcLP#3% zL?MPzMj;A5At6@aC?-dZghbwM&f3Y%x9ounU{DP508UCU&;~n6u_{4GJnzWLKm_m7, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SEEKDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SEEKDATA \- custom pointer passed to the seek callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, void *pointer); +.SH DESCRIPTION +Data \fIpointer\fP to pass to the seek callback function. If you use the +\fICURLOPT_SEEKFUNCTION(3)\fP option, this is the pointer you'll get as +input. +.SH DEFAULT +If you don't set this, NULL is passed to the callback. +.SH PROTOCOLS +HTTP, FTP, SFTP +.SH EXAMPLE +.SH AVAILABILITY +Added in 7.18.0 +.SH RETURN VALUE +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.html b/docs/libcurl/opts/CURLOPT_SEEKDATA.html new file mode 100644 index 0000000..bd688d1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_SEEKDATA man page + + + + +

    NAME

    +

    CURLOPT_SEEKDATA - custom pointer passed to the seek callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, void *pointer);

    DESCRIPTION

    +

    Data pointer to pass to the seek callback function. If you use the CURLOPT_SEEKFUNCTION option, this is the pointer you'll get as input.

    DEFAULT

    +

    If you don't set this, NULL is passed to the callback.

    PROTOCOLS

    +

    HTTP, FTP, SFTP

    EXAMPLE

    +

    AVAILABILITY

    +

    Added in 7.18.0

    RETURN VALUE

    +

    SEE ALSO

    +

    CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.pdf b/docs/libcurl/opts/CURLOPT_SEEKDATA.pdf new file mode 100644 index 0000000..9cbfdea --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.pdf @@ -0,0 +1,112 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœUkoÚXýî_1R?ÄTøæ¾ü¸ÚÕJ$8-­ ¬¹T[%«ˆ'aKpZ›®ú£ö?î\¿M©ð;3çÌ9ÃW „5¯ú;y´Îcîs‹Â½õÕbå!Ô_É#\h Ì}gUwø|%H @?Zöå:ŽK}» +Ã÷ӑþÇra tbœˆ€š[zkžr|ú¯eO4LL51, .£¼Šñ¾‰¹¶olq3‚äøm›nò·yZdOÅÈáRì²CÃêëw]y!<¢ä¯W¯j–(F+p+O”kð;Òõˆà¯ŒŸ÷¹ÄU¢Îó!4Ï;Þ8%’úà0^ÿ"am§œ¸æ3B»^ÿKºÚÐÞ¢%Èc^dð”íEú ž6yžn¡È xH!OÓ/löûϛäKÕh#sQ¦Ye¥Õ§ùb¹š­†˜‚Ï«Ý!Ù·)ünÆun>ÈÃeçtTN2 8çMy¯6‡í>Ÿ ó¬#†{¦›&Yó3œåø{ˏj®VÜd»-¼®©¹ýöœ!ʲÓpuϖz¶˜¿HÂtSlªCF›±#‘¼ÑD]ðä>FÞtG\ÉËqPfd?܉‘>ÙüȎpÌSö¬8Ò¢6úÄ^­ç—J«öžÁ…Od{©²Ø¸T¨¤Âx©FK+»ðmšl´†µ÷{¸O Ø`ÀáéXÒš'<{Ž¯jç¹2(GŽqL¶^X×F¡h¤ÊoÜÃ]QFºvS1ß÷EÛµ]¶Íg=ÝHI‚N7EÞÓ óTË‚1xÇ0_G‘A=tU3ò\OÙX´/¨e\c•¢ÄÊ$¢ñëJ'ÔU¥m;\Ÿzž.щ#ã[!;¸oµ^ö÷nì@?®ºýœ{-ƒ;ãñê…;WÕ¥!lňëSуþ5ù°ŒÂz’nPaçfG˜ÉÊÊÕÑÕg5dJ<—5UfÑäbÍô§Ѻ¸“1W_›öd»ÅÙìàÜ ô'&ï‰ïڎC½ŽçðqĄ$Êcö$Z‡¥dm´ L¢Õ{ª2œ¿µ–ž†q> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:06+01:00 +2015-01-08T09:18:06+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001228 00000 n +0000003111 00000 n +0000001169 00000 n +0000001009 00000 n +0000000015 00000 n +0000000990 00000 n +0000001293 00000 n +0000001547 00000 n +0000001482 00000 n +0000001414 00000 n +0000001334 00000 n +0000001364 00000 n +0000001629 00000 n +0000001688 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [] +>> +startxref +3265 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 new file mode 100644 index 0000000..8747a17 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 @@ -0,0 +1,73 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SEEKFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream +.SH SYNOPSIS +.nf +#include + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ + +int seek_callback(void *userp, curl_off_t offset, int origin); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This function gets called by libcurl to seek to a certain position in the +input stream and can be used to fast forward a file in a resumed upload +(instead of reading all uploaded bytes with the normal read +function/callback). It is also called to rewind a stream when doing a HTTP PUT +or POST with a multi-pass authentication method. The function shall work like +fseek(3) or lseek(3) and it gets SEEK_SET, SEEK_CUR or SEEK_END as argument +for \fIorigin\fP, although libcurl currently only passes SEEK_SET. + +\fIuserp\fP is the pointer you set with \fICURLOPT_SEEKDATA(3)\fP. + +The callback function must return \fICURL_SEEKFUNC_OK\fP on success, +\fICURL_SEEKFUNC_FAIL\fP to cause the upload operation to fail or +\fICURL_SEEKFUNC_CANTSEEK\fP to indicate that while the seek failed, libcurl +is free to work around the problem if possible. The latter can sometimes be +done by instead reading from the input or similar. + +If you forward the input arguments directly to fseek(3) or lseek(3), note that +the data type for \fIoffset\fP is not the same as defined for curl_off_t on +many systems! +.SH DEFAULT +By default, this is NULL and unused. +.SH PROTOCOLS +HTTP, FTP, SFTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.18.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SEEKDATA "(3), " CURLOPT_IOCTLFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.html b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.html new file mode 100644 index 0000000..6010e49 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.html @@ -0,0 +1,73 @@ + + +CURLOPT_SEEKFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_SEEKFUNCTION - user callback for seeking in input stream

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    /* These are the return codes for the seek callbacks */ + #define CURL_SEEKFUNC_OK 0 + #define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ + #define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so +   libcurl might try other means instead */ +

    int seek_callback(void *userp, curl_off_t offset, int origin); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This function gets called by libcurl to seek to a certain position in the input stream and can be used to fast forward a file in a resumed upload (instead of reading all uploaded bytes with the normal read function/callback). It is also called to rewind a stream when doing a HTTP PUT or POST with a multi-pass authentication method. The function shall work like fseek(3) or lseek(3) and it gets SEEK_SET, SEEK_CUR or SEEK_END as argument for origin, although libcurl currently only passes SEEK_SET. +

    userp is the pointer you set with CURLOPT_SEEKDATA. +

    The callback function must return CURL_SEEKFUNC_OK on success, CURL_SEEKFUNC_FAIL to cause the upload operation to fail or CURL_SEEKFUNC_CANTSEEK to indicate that while the seek failed, libcurl is free to work around the problem if possible. The latter can sometimes be done by instead reading from the input or similar. +

    If you forward the input arguments directly to fseek(3) or lseek(3), note that the data type for offset is not the same as defined for curl_off_t on many systems!

    DEFAULT

    +

    By default, this is NULL and unused.

    PROTOCOLS

    +

    HTTP, FTP, SFTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.18.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SEEKDATA, CURLOPT_IOCTLFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..712417b4534d5498802878ce9a4f507e63b50c0b GIT binary patch literal 4883 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 BL=^x4 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3 new file mode 100644 index 0000000..a483540 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SHARE.3 @@ -0,0 +1,59 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SHARE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SHARE \- specify share handle to use +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SHARE, CURLSH *share); +.SH DESCRIPTION +Pass a \fIshare\fP handle as a parameter. The share handle must have been +created by a previous call to \fIcurl_share_init(3)\fP. Setting this option, +will make this curl handle use the data from the shared handle instead of +keeping the data to itself. This enables several curl handles to share +data. If the curl handles are used simultaneously in multiple threads, you +\fBMUST\fP use the locking methods in the share handle. See +\fIcurl_share_setopt(3)\fP for details. + +If you add a share that is set to share cookies, your easy handle will use +that cookie cache and get the cookie engine enabled. If you unshare an object +that was using cookies (or change to another object that doesn't share +cookies), the easy handle will get its cookie engine disabled. + +Data that the share object is not set to share will be dealt with the usual +way, as if no share was used. + +Set this option to NULL again to stop using that share object. +.SH DEFAULT +NULL +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_COOKIE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SHARE.html b/docs/libcurl/opts/CURLOPT_SHARE.html new file mode 100644 index 0000000..ae2082e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SHARE.html @@ -0,0 +1,63 @@ + + +CURLOPT_SHARE man page + + + + +

    NAME

    +

    CURLOPT_SHARE - specify share handle to use

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SHARE, CURLSH *share);

    DESCRIPTION

    +

    Pass a share handle as a parameter. The share handle must have been created by a previous call to curl_share_init(3). Setting this option, will make this curl handle use the data from the shared handle instead of keeping the data to itself. This enables several curl handles to share data. If the curl handles are used simultaneously in multiple threads, you MUST use the locking methods in the share handle. See curl_share_setopt(3) for details. +

    If you add a share that is set to share cookies, your easy handle will use that cookie cache and get the cookie engine enabled. If you unshare an object that was using cookies (or change to another object that doesn't share cookies), the easy handle will get its cookie engine disabled. +

    Data that the share object is not set to share will be dealt with the usual way, as if no share was used. +

    Set this option to NULL again to stop using that share object.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_COOKIE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SHARE.pdf b/docs/libcurl/opts/CURLOPT_SHARE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8453bebbfa9c6315f8329c6b3568ef8d55e82a4c GIT binary patch literal 4248 zcmb^!cUV)`zDVVjTX9fpl}GIrjS(f>kwFqekQIo6&;(G5R5NbKg{&qw5W!LFKxK#v z_ny_~0F+im#oB^pR7CWNpta(nqC7#V>wUg+Ll7MAweR~p|K!}?`RyG>bclq7`Enpe zdCQWm5En*aqcRy1iI51wkVI)=9)QRY38|w9GmJ=d3W^9JR7N!+7DE=wOepk_ZTJJ8IlNzL?m9#_~ppd=Y5^F^uH7J$Lu3RO4cw<2V9&Q`<>{wd%EkDlQ&(i-qPm%{#o0F z(v4g4&~SWWZJ)MkI7eCr&-R>>aeGpGa|?blvE;Mra=)P`A1IDA#C<2*y(@vyaBIt> zOdlw`|A?XD6_NX{JsI|*_4(;(gZoRcQun5$!JE`e7nG{b>~d~Z-Z&X_=5fAcLv@5_f-4^09k)&7;`-w2^t?**qxX|p#qJlk`i^$hJC9}TE1G*J zxKF@#Od5IUr&U??HNY17qihQd{ftnBJ~UHH&86TT_zovpcm) z7Iih>THi6Vzx&XFCLN>C`Sm*{=7*mBdTCx^u9JqL%nxkHf8>AYu58Y|qimbcfNPQ& zMdq|&qj(<$wRlz*r$tCt)Kt0V&f=Ju{8UJ|DtcjDX>xp$=pI7(EOo?y zR+q5&y>W|st^IgLd%9Slx9q~=ar=jz`JypaHfNb(+NCLMs{iNZ z*E2=Clk%1Emp>5-xox^oYj{}mxZ=&!!>8_9)#n|nIogDKvZpBzmtjy@B&Vx^a4 zcoMtLZ3p-I7X8Nq2i4CV1+|RMI+U0-X#9rr#ZjjV$rCGUlMnayXC&TSGrHLQnjj_f z_;(?&Q6SRB# z{=Tv-zO3(0{&h`d0c^pnkqdX`Z0J?~ewHkL!ANhB*H<@W=6lE4ZaZB&V$VC3>)_>0 z*{jjCJMzU4*Sq1c;5+%)mK|X&)1pK}3O@}UdTmwBzJ=`H)=hXXM--bn^?2;PqW*`g zOC)QyNxnf#WAhmIx4Z3^=k?BR7^s!(d{OWZQ~IOzgGN4kwr1D4sZ%0%!T0|i{_8k? zdk8rzZt~ScJjW&TxpdNlfcpKjsl6j1`SPek4Xp!=6meDdX~D4r2Un+MmyjpVKiyfo z+(+tuqIG;!)2!ccv!FG4UgPG?!^)&buMfeuPFlHtb9~>TnGt1D_aE4~o6E3-N5mxDv@Y+NyLNF<>q6+uQDoPdI7u7C^kId~$3$cz-205A%$%!Gl0+4Oh-V8UXwnpK1a4322C zQ6(p+1O$v07>OZl6rc;WQDJgBDTZ~DNQ{6S!|fknmLS348*sG1^bC?g0OZh*7STDA z05_l@Y}e2NBNIrq1x|oy{bf)h3^-V6mOV&mQI2ueNg1r56gp#47Ym2>kp!hsgBKX< z+4#SSIyRyjn;{2-c6*3HIlX4fl*LKy8-86p!vg3b#c;=e{g zV>l>+6c&Q^77|112@6XKOdwTuS0FSPLgZE@MMsXd5vbJVIGXp{Sp*q%>c7B%*6HmG zWJbNh(33-`0qg{%AqmFpKK*Yh*E}%IwXYDXb6x}Acqnl%#V%eNrTmr*lmqH zHa$tZqSkHyX&7*%?TN}y&2h#^sc0@Mt_vMEd~jeY;Iz=TER?-eYIka*DuHla;#(u3rI zZF-%-BDDE4?Ic2Qr@;slwxduf{>;gd(J*B+>QYDw#(f387z<mDKO^C zV*-|DwMHldb<@cZeEBoA6lD@3NLpH&ZyMXzXih>ffk1$uID+FWfWfj%H&6;2%U~G} zDAVR0}4mxpTjTs}|LCC=1C%~#}s2Oy9Q`~Yr3&=}NK6=C*ghDArf zVOpbw>XZ))d{G_~ahU(Ev;whtyB9z}9c~Z-9AP9#T+Q?l(ALB_ig8&e#zOfqs6dGE zg(zvVYbkbz*dAoh=Tco zP(L0Q4GF>dJRTm1, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SOCKOPTDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTDATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first +argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION(3)\fP. +.SH DEFAULT +The default value of this parameter is NULL. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0 +.SH RETURN VALUE +Returns \fICURLE_OK\fP if the option is supported, and \fICURLE_UNKNOWN_OPTION\fP if not. +.SH "SEE ALSO" +.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.html b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.html new file mode 100644 index 0000000..692af0e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_SOCKOPTDATA man page + + + + +

    NAME

    +

    CURLOPT_SOCKOPTDATA - custom pointer to pass to sockopt callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTDATA, void *pointer);

    DESCRIPTION

    +

    Pass a pointer that will be untouched by libcurl and passed as the first argument in the sockopt callback set with CURLOPT_SOCKOPTFUNCTION.

    DEFAULT

    +

    The default value of this parameter is NULL.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SOCKOPTFUNCTION, CURLOPT_OPENSOCKETFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.pdf b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.pdf new file mode 100644 index 0000000..5e4622f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.pdf @@ -0,0 +1,116 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœVën£Fþ里 Š'seµªäMXÉÖ¸6Þvµ©,b“Ø-¯öú*}Ǟ ÆqªªŠÇÃá\¾Ë™|ESDÌOó¹Ú nf +=ç‚ž_´zˆšÕ½ !À5áÓ ~‡"ŐÒ»…»Áëv1óƒi¸œ·÷6ÓXk¦,8¸³? †SŠÂäfؐ \›C‡/k¢‘þõMˆ‹%„Õ1BW/¾@…‹?ØhU’eåߗy\dûÂ2I0!ʂ/Û,ÍQ¯Sœi‚µªóÕ-A©¶#&±jËý—–êFª¢µ ¸™i€ki +é`.(r§zar’Ib©y“è£gÎ;hÁ‚(4¤Ì<þ_˜¶}3,«é(&]篺F À%´~@j„˼ÈvhŸmÓ"> "Cû(ÏÍgž­þ´a>B…cpF«(I#84ô‡§ŠaÆa»UÑùçI0çýYšfNë‡mºJÊuŒ~2äޘ_xós5„@¡?¯j(VĜóÿP=BW›(]'ñuŸ}N.ÀÅ\…‰óß n}Ư¿µ¸i˜ªÃÌʶktÕ ö`ÿXÏx +—suǝ7¿§á8˜4¢²–Ðh¦ÑiaÙTÆL³ª:°Õ%)9ÚSa—ð†W«éì zŠ—è.Yc°bèe›$è1FeZdåj¯Ñãw”l î0®4§c£¿y¢ƒ eµ>—»8-Ð6­žVºݺ’ËžnW³"5æ\´¿l‹ÍÙDà +Ö*õÌÂ$Ô°ü~1¹5 Öî¬uÙî,)€Îüš$*Ý#é}CŽn%ˆ¥â˜b´hVìÆÕÌáÇã‡-i] †g¥T7jã¹`ZÇO•»ˆâVT&úf3iEI£ì €Üæ€ú!ÚÅƖðe²ð}|Áz•pŽ#LgÍ‚WP=ªãžc˜H]i(QÐöË8VÄ9î§ÛÀ?s-Œ¬a†Ž¯Q’\ÐüiÞo£Sß;jÝ}Sëa×åÆuwAƒµtÝ «V›È¶š¡DÔ~þt²¿=GÒ£›ÇþèÝ؇Ÿû³‰\@S~¬Ñz b9+ 5È¿ÏúŚyáb6AŸlÊÖµFþÂ;ãÉȳ¸(i~&xαÓí£woÜ÷›•vX³}ªìV߀F!y¹ßg‡"^_Ϟ¯¸´8õ“·\Lî'-þ:Yõ†:ó\BŒwEÓ¬¸à&®àßqzxùó  íãðöMw4õ+?Kìö®ãë~n(í8=Mö`êML¯ËÛW€‚×ÜWi‡Ü•À> +"±S7|܈ +–;ÈbiØ1„}(SÄবz­™¨I元_àç.¾KÝendstream +endobj +6 0 obj +1045 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:06+01:00 +2015-01-08T09:18:06+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001369 00000 n +0000003259 00000 n +0000001310 00000 n +0000001150 00000 n +0000000015 00000 n +0000001130 00000 n +0000001434 00000 n +0000001688 00000 n +0000001623 00000 n +0000001555 00000 n +0000001475 00000 n +0000001505 00000 n +0000001770 00000 n +0000001836 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [<548B7B107771A11F62E135259C369E68><548B7B107771A11F62E135259C369E68>] +>> +startxref +3413 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 new file mode 100644 index 0000000..e99fb79 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 @@ -0,0 +1,88 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SOCKOPTFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options +.SH SYNOPSIS +.nf +#include + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +int sockopt_callback(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTFUNCTION, sockopt_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +When set, this callback function gets called by libcurl when the socket has +been created, but before the connect call to allow applications to change +specific socket options. The callback's \fIpurpose\fP argument identifies the +exact purpose for this particular socket: + +\fICURLSOCKTYPE_IPCXN\fP for actively created connections or since 7.28.0 +\fICURLSOCKTYPE_ACCEPT\fP for FTP when the connection was setup with PORT/EPSV +(in earlier versions these sockets weren't passed to this callback). + +Future versions of libcurl may support more purposes. libcurl passes the newly +created socket descriptor to the callback in the \fIcurlfd\fP parameter so +additional setsockopt() calls can be done at the user's discretion. + +The \fIclientp\fP pointer contains whatever user-defined value set using the +\fICURLOPT_SOCKOPTDATA(3)\fP function. + +Return \fICURL_SOCKOPT_OK\fP from the callback on success. Return +\fICURL_SOCKOPT_ERROR\fP from the callback function to signal an unrecoverable +error to the library and it will close the socket and return +\fICURLE_COULDNT_CONNECT\fP. +Alternatively, the callback function can return +\fICURL_SOCKOPT_ALREADY_CONNECTED\fP, to tell libcurl that the socket is +already connected and then libcurl will not attempt to connect it. This allows +an application to pass in an already connected socket with +\fICURLOPT_OPENSOCKETFUNCTION(3)\fP and then have this function make libcurl +not attempt to connect (again). +.SH DEFAULT +By default, this callback is NULL and unused. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0. The \fICURL_SOCKOPT_ALREADY_CONNECTED\fP return code was +added in 7.21.5. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SOCKOPTDATA "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.html b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.html new file mode 100644 index 0000000..07186d2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.html @@ -0,0 +1,80 @@ + + +CURLOPT_SOCKOPTFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_SOCKOPTFUNCTION - set callback for setting socket options

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    typedef enum { +   CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ +   CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ +   CURLSOCKTYPE_LAST /* never use */ + } curlsocktype; +

    #define CURL_SOCKOPT_OK 0 + #define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return +   CURLE_ABORTED_BY_CALLBACK */ + #define CURL_SOCKOPT_ALREADY_CONNECTED 2 +

    int sockopt_callback(void *clientp, +   curl_socket_t curlfd, +   curlsocktype purpose); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTFUNCTION, sockopt_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    When set, this callback function gets called by libcurl when the socket has been created, but before the connect call to allow applications to change specific socket options. The callback's purpose argument identifies the exact purpose for this particular socket: +

    CURLSOCKTYPE_IPCXN for actively created connections or since 7.28.0 CURLSOCKTYPE_ACCEPT for FTP when the connection was setup with PORT/EPSV (in earlier versions these sockets weren't passed to this callback). +

    Future versions of libcurl may support more purposes. libcurl passes the newly created socket descriptor to the callback in the curlfd parameter so additional setsockopt() calls can be done at the user's discretion. +

    The clientp pointer contains whatever user-defined value set using the CURLOPT_SOCKOPTDATA function. +

    Return CURL_SOCKOPT_OK from the callback on success. Return CURL_SOCKOPT_ERROR from the callback function to signal an unrecoverable error to the library and it will close the socket and return CURLE_COULDNT_CONNECT. Alternatively, the callback function can return CURL_SOCKOPT_ALREADY_CONNECTED, to tell libcurl that the socket is already connected and then libcurl will not attempt to connect it. This allows an application to pass in an already connected socket with CURLOPT_OPENSOCKETFUNCTION and then have this function make libcurl not attempt to connect (again).

    DEFAULT

    +

    By default, this callback is NULL and unused.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.0. The CURL_SOCKOPT_ALREADY_CONNECTED return code was added in 7.21.5.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SOCKOPTDATA, CURLOPT_OPENSOCKETFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47958b9fa46a19a19e89487bcd816b33ed65b06f GIT binary patch literal 6183 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 new file mode 100644 index 0000000..cb318fc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_NEC, long nec); +.SH DESCRIPTION +Pass a long set to 1 to enable or 0 to disable. As part of the gssapi +negotiation a protection mode is negotiated. The RFC1961 says in section +4.3/4.4 it should be protected, but the NEC reference implementation does not. +If enabled, this option allows the unprotected exchange of the protection mode +negotiation. +.SH DEFAULT +? +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SOCKS5_GSSAPI_SERVICE "(3), " CURLOPT_PROXY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.html b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.html new file mode 100644 index 0000000..41a462e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.html @@ -0,0 +1,60 @@ + + +CURLOPT_SOCKS5_GSSAPI_NEC man page + + + + +

    NAME

    +

    CURLOPT_SOCKS5_GSSAPI_NEC - set socks proxy gssapi negotiation protection

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_NEC, long nec);

    DESCRIPTION

    +

    Pass a long set to 1 to enable or 0 to disable. As part of the gssapi negotiation a protection mode is negotiated. The RFC 1961 says in section 4.3/4.4 it should be protected, but the NEC reference implementation does not. If enabled, this option allows the unprotected exchange of the protection mode negotiation.

    DEFAULT

    +

    ?

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPT_PROXY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.pdf b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.pdf new file mode 100644 index 0000000000000000000000000000000000000000..42a15abf93a7df1f437f6ae1de81790f993d1316 GIT binary patch literal 3684 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 KhwG-tL;nUxao`pJ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 new file mode 100644 index 0000000..d18ea9f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SOCKS5_GSSAPI_SERVICE \- proxy socks gssapi service name +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_SERVICE, char *name); +.SH DESCRIPTION +Pass a char * as parameter to a string holding the \fIname\fP of the +service. The default service name for a SOCKS5 server is +rcmd/server-fqdn. This option allows you to change it. +.SH DEFAULT +See above +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.html b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.html new file mode 100644 index 0000000..32c43d3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.html @@ -0,0 +1,60 @@ + + +CURLOPT_SOCKS5_GSSAPI_SERVICE man page + + + + +

    NAME

    +

    CURLOPT_SOCKS5_GSSAPI_SERVICE - proxy socks gssapi service name

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_SERVICE, char *name);

    DESCRIPTION

    +

    Pass a char * as parameter to a string holding the name of the service. The default service name for a SOCKS5 server is rcmd/server-fqdn. This option allows you to change it.

    DEFAULT

    +

    See above

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_PROXY, CURLOPT_PROXYTYPE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74b6ccd29a536cb6a6a5731afe29d88561f4607c GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 new file mode 100644 index 0000000..966f746 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 @@ -0,0 +1,50 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_AUTH_TYPES 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_AUTH_TYPES, long bitmask); +.SH DESCRIPTION +Pass a long set to a bitmask consisting of one or more of +CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, +CURLSSH_AUTH_KEYBOARD and CURLSSH_AUTH_AGENT. + +Set \fICURLSSH_AUTH_ANY\fP to let libcurl pick a suitable one. Currently +CURLSSH_AUTH_HOST has no effect. If CURLSSH_AUTH_AGENT is used, libcurl +attempts to connect to ssh-agent or pageant and let the agent attempt the +authentication. +.SH DEFAULT +None +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +CURLSSH_AUTH_HOST was added in 7.16.1, CURLSSH_AUTH_AGENT was added in 7.28.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 "(3), " CURLOPT_SSH_PUBLIC_KEYFILE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.html b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.html new file mode 100644 index 0000000..6b28744 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSH_AUTH_TYPES man page + + + + +

    NAME

    +

    CURLOPT_SSH_AUTH_TYPES - set desired auth types for SFTP and SCP

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_AUTH_TYPES, long bitmask);

    DESCRIPTION

    +

    Pass a long set to a bitmask consisting of one or more of CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD and CURLSSH_AUTH_AGENT. +

    Set CURLSSH_AUTH_ANY to let libcurl pick a suitable one. Currently CURLSSH_AUTH_HOST has no effect. If CURLSSH_AUTH_AGENT is used, libcurl attempts to connect to ssh-agent or pageant and let the agent attempt the authentication.

    DEFAULT

    +

    None

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    CURLSSH_AUTH_HOST was added in 7.16.1, CURLSSH_AUTH_AGENT was added in 7.28.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPT_SSH_PUBLIC_KEYFILE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.pdf b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a719b923f9df8b87e7d106351884225a4fbf84fb GIT binary patch literal 4003 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 F{RbiRc{Kn4 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 new file mode 100644 index 0000000..12e7720 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, + char *md5); +.SH DESCRIPTION +Pass a char * pointing to a string containing 32 hexadecimal digits. The +string should be the 128 bit MD5 checksum of the remote host's public key, and +libcurl will reject the connection to the host unless the md5sums match. +.SH DEFAULT +NULL +.SH PROTOCOLS +SCP and SFTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.17.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSH_PUBLIC_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html new file mode 100644 index 0000000..0bcbfdd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html @@ -0,0 +1,64 @@ + + +CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 man page + + + + +

    NAME

    +

    CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 - checksum of SSH server public key

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, +   char *md5); +

    +

    DESCRIPTION

    +

    Pass a char * pointing to a string containing 32 hexadecimal digits. The string should be the 128 bit MD5 checksum of the remote host's public key, and libcurl will reject the connection to the host unless the md5sums match.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SCP and SFTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.17.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPT_SSH_AUTH_TYPES,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e04a2f8ea6931b195c924ea50e7345c685fd6e5c GIT binary patch literal 3812 zcmb_fc~}!?8edn$I%-8k>h21RS_~GGIg*fr5CoDSN)!Qwg24`%35+C}?94=hSF0jR zJ@BlyqHPfsbUhvyMG-BcB3h5GT1CX8-mZ$}(dV(=?l&O_9=qLr9_Jsvyx)6$@9}$I zf)jKGF(#2g!S#0+tcK(;3Nx7#A&mx!r|emLHXH^hiHL!=@)Qdr1}ni+I?BwDlvWFI zJWCNa$hC6*xR-3P!RN(<(Oad@2Q6GAIp3*keE6zGHqE$svj--mEx16SE5*Lu{AS#~ z5%A=bY4vw&OM*tF<;p5sw(fY^yyMcnC*Awy&m0hWJ3PJD#bW`k4PCu8J%8wt{nYp8 zl*)pNem%$M`9yxWE8MTYcTtva!z@?CKaYR(0A5)a=VuB|A^b!Yb)TZD(VL$)UAwXG zhlZn5Oba4=mgn@ITQW--l-+2r9-&M7+&J+>amcsxkq0rGkHX6??=8e1Ke;FG*V2m| zxoFzv+??{jPMf~>Z;EuzBNFE3WOgsUuz$m$Un*Y2KFe6Ww$h7O(f_ZZK3DDpo~M1+ z?O$`ckiAm5>_oF{rGCjRKiQ4)KjcLAr7F)||Ks#U$u&!A4&6_oj}I-JRn)LCde-u_ zJDCZ!O;p;AP%J+M54z2GpTAgtY}vp3FK*_ZX1uKGoV&8CylBbJmeL20N&nIN)^GT% z{&258E7nf2Yp$FNFnf>lxstVUv?&HMInE~Q8~v{Lk@XEcb8MV8Yi#2h{g5D|_sEi@ zxvoHNTg}PwWS!a+m7(ctG{PBkUX0tbanj%W2YSg|!@ud?OW*nHNhx*yUq%n_mb=rd zG$1r8qiK%w^arWqoDU3xXUtr>tbAC3xK=#&`DAY4y0{+4Pv>nZHqZGww#VNp`dqks zVOM_fw@uXnfrX`h=}}c*Iac}GzuCXRwGjW}X6E+jo!{xsY&*1Qo9}m9rNPVZ>jrnK zW`h?xo>h0zn?}WZl@_9DTS7Xm`M$t;jvRS^kKehIflD3hPgaO`9P8Cwe)_jM*NM6T z-j!rS)x6@O$$vQzYdRGgi(gk3(al|CCa>C1)WXf)ho}36^gb9+cfYWAX;QKOL7#hO ze2LQg*PDm(`t8mhk>5Pv!#hjAy*1VQ>}NivgB2+Wk82h%mKm2CE%)0oqP z&gsj~R+xT!dLlFLBpYO0Y~B7reb8kzbZg-Gb$c!ju6<q)_&YC7v<*%P!eahZ_Rb#=!v)dZNpO9DoG)G$+v)eDd(@(oZWj?vvw;2}S zzEFDn=kZU%Lv@Y6tQnz5U{1#S==UEU=3K} zwYh$Jw;kz|T(|qguorLgyWo2Dh95cG$n*m#aZ|$|lztSvW?9_B=4mZOnR~0qBewZ3 zz4)T1jn{lm4JgpAu5AAFz!^tl&84sQI%+D9Z<^Mta^QojwOyZ0?F?l^cBSm32TQ<7 zz#jp1gufW7LLm=L){afdc@7FmAhIaLNRc!V&A8xn6kN+ya#$(DO%RgE@Bpb`6mYSW zork3Yi~%ymF;3P@aRA^FSjL=0@#zSFKp07;Ts)A|yZG27wP{s|^pu@h(m4#I8^IT#s9lN_853H~QSCKzaN3MxB@3feue+bS7D z@Pw7gYE$9y-bnET32tDlmC$Zm@w$TcXF$m41S5=TwH_zkukx5mR6v4UV!ImmGuv)e zkV?2k5|xnhbvA+S;ff|WN{A4WOxq|<9L-os_v77RgODU=CNJblcolG>EmVTOcPmI_ zY=pg|2E82&8`_=)W4PO!|De%*>rp8fL)zpJ9c{5tpawwF(;-ZTA{H9L6jH=S+nt=L z-6wZUJ8Ec)cKa(*jqz<`5tGWov|3NmY9d_@!kk0#a3+;S+apB3R@aDNnv4*o$c?Dc z5kqCu!zZ&;(&SOe=E*r`6)B3;LYhbd)H)@05e~7%JzqJP;>-~PV-n*H0|f?`+GTUt zK+<8C&1&b=t_YD^L=DaY84#Nr%D~matK|44VUE zk}wfa$&wazBB=LPh2U3&D4XXUY6Qv6&6VUzB@CN|U@DagL2(4f#ehT1<=J_{CAM>e zfIYV(bm}WHJ124bBr!8Kgib{;35v8C(t+o&w1cM^J1iI`G8rcyA#yrtQXOViDM-vr zh|Lx}Q;cDhMT~+^Ok~PXijrDXDzl=^oTG!Auh|0^z@QYw0i4vJp-HEiVk1Pc3Gr}j zHpB6)_F1{KLzu?b4;3FIqYz$Q8&+D|dT`4j?YiEPD>n)BHb@)t3OTe8{GPt|r>Gq+!BC12 zy zG@d1BE5(BUB4H$no=kyQ!C)g}z|teka2ScRTNv0q&mkmE2d8UvVbM`&6mGzyqNTWA qA0;;^K=M#!46ZQ9q!_OKeGZebPjNiK^6mslr3w`k9IPL0fc^~#-Xq-r literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 new file mode 100644 index 0000000..45e7d7a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 @@ -0,0 +1,44 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_KEYDATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYDATA, void *pointer); +.SH DESCRIPTION +Pass a void * as parameter. This \fIpointer\fP will be passed along verbatim +to the callback set with \fICURLOPT_SSH_KEYFUNCTION(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.6 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSH_KEYDATA "(3), " CURLOPT_SSH_KNOWNHOSTS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.html b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.html new file mode 100644 index 0000000..9257ac7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSH_KEYDATA man page + + + + +

    NAME

    +

    CURLOPT_SSH_KEYDATA - pointer to pass to the SSH key callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYDATA, void *pointer);

    DESCRIPTION

    +

    Pass a void * as parameter. This pointer will be passed along verbatim to the callback set with CURLOPT_SSH_KEYFUNCTION.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.6

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSH_KEYDATA, CURLOPT_SSH_KNOWNHOSTS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.pdf b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c2b7dba294555fe988533a7d5da2763af13eb97 GIT binary patch literal 3792 zcmb_fc~}!?8gFZ9bv#=|E25pH#Q`OmnS`91M1drT5}^SUL~4i03`|KfVP+x$rMik% zTa`d++1- zy@Vzj%@SN1356cMS+W6Az!=PCz7OeiXguZ260%_>pjc5eV;3k6M$L9Ypo|pB+9-no z;suT(9FS-AqDhU58^#SNygGV(!-tBKCr%C7gEpKQUvxXn7QCu<#uKIcgKCTzuS50ooL^tpXvUMo>k_LsQFg{9@S(gg;{H=! zjSI>6?0DHb<&;#w^SP!9sa$3 zP?Cf^A9dsyIO5oc_d;R^j=H-m8I&^iaMFFCMyJrUbFGs=0p7MDf`JOL6VHII~ts8 z2aJ?2yume&yI&Hwq^e}_>YUy$e%JGO+V+U3JukR)=XFi7DKkPHBi#$mv?QiqZ;Znd zTmE&cF(~aNiK}wO)bX_u=~a8qe0^qAoMJ)Kmb?sl#H|bKnrYLELL)yRxbX~|>V(7g zI~pgEF=YRd``YH@R1PjanYs}(EqrP3kEK<;ujK~kIIq=W^S?M&7qIthD=HMhzK zEi38mRVnK}uv_e>4=mlaDW;}vdUOBF59Mb=7c)n5t=Y4-kIkcpjjhYbe3Vy}MBc1j zmixk+)$!|>Na&VF3(NmjkS04+UQ2BI`E7Ra`KWt)TV}W?N0r8WP=9Op!;p-rD`rmq z)3S@wp4HJo>*l1TPVBWScc)~*vAbJ>mRyaxQ1bW9pU4B>{U&S6&MkXUqyF_PSI*UM zIAyxO=KRvhGu!6i}Xl;vplcr^66Bn z;0z~*CjE*)FZLqxM4I2{Am3XK9*N6IoF)XE9~IbaNMagNP`o4#gusyARG=amLX+H?f>=2*M&MF=;zZru ztB7Xpw%?&Z^r?FVR@Ol{J8LjG!CS&OvtZnt)Bom@_tvjc^cHQGLyZhgQ=p|l52Zu6 zN{%`hr<>2{h{ju+&Z6yA>xe(q65syZ;qpkO!Qk(G-58IHAaf`I&ZM#!rylvax(0z6 zn;x00uwWKf43*7{E8wW4f{DpwK@O?0A!7`XZVUlNhLU&)mxT7dn>g89_czXj}h9brtMmYBYvxF-(Vc;RMA8qA_4^0(;c&5bea-NtET1K}#62IF_d2=@iF{mB6JknN;qx z=oRyG=}@soowD=1^F_EUmj9hGheK>>kxy%6Nw)*wb)514X_)6-V;lLzVV9e;d#A%j zqLiHyed9ryap19y)Y2^HAV6;uE*Ah#LTq^y^dw@?flGlA?3BSfdr@}5cd#?!ENSh8 zGfR(nBsPjB+;#ymq&U6YHeWUDjKO#C%Ap;)x~Y|y1ZEqQ4Sj+f1_*vm-}6({0hi!$ z(<6Bz7=qK&i-h=a`_Z_4uEV+;>u~V0i&Fv;F3w4qQ7aA^hGS|>gR8ysgzD;R)a1yr3~yTU1$mg*wnhvBGuqQ?n=YDp~;`6sjz2! z##PErIS@F4u~QuQj}b, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_KEYFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic +.SH SYNOPSIS +.nf +#include + +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 */ +}; + +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ +}; + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with + base64 if len is zero, otherwise to the "raw" + data */ + size_t len; + enum curl_khtype keytype; +}; + +int ssh_keycallback(CURL *easy, + const struct curl_khkey *knownkey, + const struct curl_khkey *foundkey, + enum curl_khmatch, + void *clientp); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYFUNCTION, + ssh_keycallback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +It gets called when the known_host matching has been done, to allow the +application to act and decide for libcurl how to proceed. The callback will +only be called if \fICURLOPT_SSH_KNOWNHOSTS(3)\fP is also set. + +This callback function gets passed the CURL handle, the key from the +known_hosts file \fIknownkey\fP, the key from the remote site \fIfoundkey\fP, +info from libcurl on the matching status and a custom pointer (set with +\fICURLOPT_SSH_KEYDATA(3)\fP). It MUST return one of the following return +codes to tell libcurl how to act: + +.IP CURLKHSTAT_FINE_ADD_TO_FILE +The host+key is accepted and libcurl will append it to the known_hosts file +before continuing with the connection. This will also add the host+key combo +to the known_host pool kept in memory if it wasn't already present there. The +adding of data to the file is done by completely replacing the file with a new +copy, so the permissions of the file must allow this. +.IP CURLKHSTAT_FINE +The host+key is accepted libcurl will continue with the connection. This will +also add the host+key combo to the known_host pool kept in memory if it wasn't +already present there. +.IP CURLKHSTAT_REJECT +The host+key is rejected. libcurl will deny the connection to continue and it +will be closed. +.IP CURLKHSTAT_DEFER +The host+key is rejected, but the SSH connection is asked to be kept alive. +This feature could be used when the app wants to somehow return back and act +on the host+key situation and then retry without needing the overhead of +setting it up from scratch again. +.SH DEFAULT +NULL +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.6 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSH_KEYDATA "(3), " CURLOPT_SSH_KNOWNHOSTS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.html b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.html new file mode 100644 index 0000000..bfc1920 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.html @@ -0,0 +1,101 @@ + + +CURLOPT_SSH_KEYFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_SSH_KEYFUNCTION - callback for known host matching logic

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    enum curl_khstat { +   CURLKHSTAT_FINE_ADD_TO_FILE, +   CURLKHSTAT_FINE, +   CURLKHSTAT_REJECT, /* reject the connection, return an error */ +   CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right +   now so this causes a CURLE_DEFER error but +   otherwise the connection will be left intact +   etc */ + }; +

    enum curl_khmatch { +   CURLKHMATCH_OK, /* match */ +   CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ +   CURLKHMATCH_MISSING, /* no matching host/key found */ + }; +

    struct curl_khkey { +   const char *key; /* points to a zero-terminated string encoded with +   base64 if len is zero, otherwise to the "raw" +   data */ +   size_t len; +   enum curl_khtype keytype; + }; +

    int ssh_keycallback(CURL *easy, +   const struct curl_khkey *knownkey, +   const struct curl_khkey *foundkey, +   enum curl_khmatch, +   void *clientp); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYFUNCTION, +   ssh_keycallback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    It gets called when the known_host matching has been done, to allow the application to act and decide for libcurl how to proceed. The callback will only be called if CURLOPT_SSH_KNOWNHOSTS is also set. +

    This callback function gets passed the CURL handle, the key from the known_hosts file knownkey, the key from the remote site foundkey, info from libcurl on the matching status and a custom pointer (set with CURLOPT_SSH_KEYDATA). It MUST return one of the following return codes to tell libcurl how to act: +

    +

    CURLKHSTAT_FINE_ADD_TO_FILE +

    The host+key is accepted and libcurl will append it to the known_hosts file before continuing with the connection. This will also add the host+key combo to the known_host pool kept in memory if it wasn't already present there. The adding of data to the file is done by completely replacing the file with a new copy, so the permissions of the file must allow this. +

    CURLKHSTAT_FINE +

    The host+key is accepted libcurl will continue with the connection. This will also add the host+key combo to the known_host pool kept in memory if it wasn't already present there. +

    CURLKHSTAT_REJECT +

    The host+key is rejected. libcurl will deny the connection to continue and it will be closed. +

    CURLKHSTAT_DEFER +

    The host+key is rejected, but the SSH connection is asked to be kept alive. This feature could be used when the app wants to somehow return back and act on the host+key situation and then retry without needing the overhead of setting it up from scratch again.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.6

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSH_KEYDATA, CURLOPT_SSH_KNOWNHOSTS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdbd6b6d9242cdde43d3e3380ad9e04f298ce3b5 GIT binary patch literal 6709 zcmcgRc{r5o+b69?mWmuLniL}%Gw+xg#xmJunJ|ncS;j0(m>DyJL6k!Z)yb0m$QCK( zM9PVfCCOGQ73rizSyF^V`res1Io0<&zwf%v^}YYh^WN{hZ_oWaqiAhp0teL45XHvf zUvnTBC=$x@*bmXsL0Hn5o;)uo7K9KHCJY}QjRQrP_>g%tBN~N8rQz`qE{{Va`$G5` z7aWI}-6k786&Iw8%pqTzQzS;8sI7l{)BMH0;rqnjm4^@O*=~!)G}xG(`^9;9z_>(>3I5;*Y}v@2+AXQdDr09}yf}z>dLkd||MRi@w>zS& z(35AJ)mo~zI5`ZwSQi;y&{7aKT>GG5KQ%PvxNP=m?h{` zTXmS0tXB-$S^x99TE;^yY3jCfX+8;BJ=BJ!O$~-gD!W!bCGX0$(qBLwdXQ=V{WU+Q8BtdrO!k+#Y`R5YSX2XB~G+BA9uP1%l zATtGZJH_&7yH}saw5G$ayv$9h?T)+3%aV!_#q{R!*w~jIEe0D*FM7JXsGBN{-gEGo zjdsnEdKxN9!OWwaFsca9mFj`92ZiUav zW_IR1WyioDwGP7L{l?u@c)0T~o z^Txtfn|HN{N&Rv&b*Q7JE{Nimwc+K~^B-)SZf$Mma@x(>9_}`^ffbIq$tPGA+By}i zb8lgeer%UK-5dY>T`ct@`{KDZSy@WT`9o#=33||{w)?7g%tlBp9m!YR_3d4_)4qY) z2_E5_ZV%!2wY9>4gwwaW%Q}i0svHToa_<`C5B5Gf_K{3Uymou%L4|G!1~3tk?d)`B z(@gBU7QaLGqeJA48Q2qTh~hBx4b!th(x#!RhhNp(tYA-`Jto&!mo@4zFnw+O$&r!l z0o3vf51D!qAI_H8lafQE$_oc`cUE8e`B`%E&bhmLGd@;@o%vIKCsg9Km4+yP*RdOc zGa~h;SLpbilx#ow>_};nNUfl@s^gU0M9#zZ4MWG zSdcwKT6Z<+^|L_8!#=w<=!=?%@wwU?JEXeQypIq4vSnML8^1>Pn9t;D^McL%rIq9- z6=m;V9V+ZSTBX)y$c}{i%M+SL)}9Gb9RIm2H@Rk7JhUvaZFMnQVX(YEra1U@)cx@& zSG;YP8Mit&JzHg*Rcp!Cv*OZLTq_8=8559SyDOh$&j;?hvzAx&L|GO(nB84Qq5< zBt;%Xe%Scga@fvd&3z>L@Qp-qy~4tmB}$T&7ZbgS*RXdKU)QkHTqO!#6NuTRFIrD2 zTk94^2dSmqRZ4QmMP(NkdBG(750=MtyGA+~9M(^<45-ktSclQMrK&Gi6H&xZTVn9@ zJAX>F!X`-6sT*4>-VVQ^|{l2r>ABw!b3J- z&pZl10>{nk@)SO|2CbteD|P2>faSIA*VspbRct=fttS3nVwJ4Tt`gsfe6yZ=nw{yV zP8%O3MPENFX)D>W=8DU5%7%M-`_k{2SIJ;LBtMuv+izppb4xn(?5&GYVJ!6iV;*tw zE2^YyI|o>sj9QnzcFHonQU<-P9TAXS*wsN~X3Ut!DTVjhW1eEx@;sN=j!-+qR*Vg7 z&FJ0NbMLv>y3{dzlu5w!aIs}Tw@e$RWu*mrQ0mHW(&I%ZUNJ32m%XYhn6BOFCnc@W zsdBOGWR8Nvigv~+QYLNit$x&#jCg`cD;=}a^T_@~p^Dbc^5Zp%8hrh@KGiFQ$y&?! z%d(gnV|vHu^0VZcl-^ZcwaPqDL2_-@wtQb;qW74cdEVyJ%+`9{>TaX#V^KF!m55S9 zcjD#(;xAlFYCx9qY<0@ldWW4?T(6*TiP};4UP__$os)gKO_{H>tB&s;C|}XzXHyG=z132r%fATHjezyT2N7YrTjKz9}io!(c<<$dm`fN4IsW!^-89 zmijn~W4v8MbQG+#=O(T=7i?)irTA~YD#J*$DXWZ!orkT4RMyTax*+~wy6=u}!8+z8 z9ad6vTH8kq@ZtQLcXUK;Agg(u=H=!DJNX+S;vcpW=I-VwB2LOgUXiYRNMG_XE8R-+ zx(~(s)dj1H{C)bR;bk6KrSH*ONu&1cj@Ro~*-Vx8@|KpSZVuqcomZJ4(Y9^r_!Dkq z-LCX0y@F+SqJQo94!wt$-5SqS8RkE8%xdz!C1oI0sGEs;CTg3q{6tlc>@u1JK`%KY(B&`sew_zMIpH zl?okjcy{4F+JL>4A7tkfe85K0At#<5e*w?f8y@=$8Lltj_9_$ZT)6?Slr|(>7WW3=YF3sh^P7Wn%lM`Mo z%Wg#Sv9q^gDh)>ATRzG4?0sTP`4CIAD7aSPYLffv2qr&;D6N>3^+@)R^>WMisyXtu zQF7uU;~t^@>S7b9e#-OOaey``UY9v^)?nCc+ui)LgKnq&H=R_xkC&)df1@$OcI-B4 zmQ5_wY>3Dm4@%)S=AC~ozp_z*?KPg$p0u6g)-3H?y0T%77QGv89#h#i77^(-vEso` zt1|mgHkM>*-;#6Du~$jq&(Wl<8;S;A=>2|0X~t5nWvSLGZ+EGdZiRUHv$1lp70Qgu z@Bqo>=fuQc;t(b+H}q?CW>Sht5|QaD+Y?`U!2*p%XLWLlOd8+#?t5A7 zWh}>pE>UWivY(1v{%C2>YGR1%5r=(OFTxIv;MDdWHD4)gBlY2?!nx;xO3_gwTDHR=Ff`Ol}ie?5Kp0u@s zX4lkvvZ6^wZ}&)N>#1(s$k~;3WX)1_Vq=+Pm&L05wv#)(elI76UCG9T}dNY;I0u+tqHqvLg>8A^T{m zGE;Ytk?ox&Jj2H0E&glXg|WIUN$Usv&;0Jtu!jk`$HoIEq*Jbn$T#<%d~R_0(00A1 zyM`G$-i`HU$77W4$u%h#JQ|YbMt7^&PgIC)`j8XbtE6;Z@)F%ev5*9uDQZs6=RNmm zEO2=p9G(`ld{weVDt$V^#4h8|JD1@lFJYXM8pH#o&El3ab~*~0r}mf0@EXX!$~Su) zIhS{Ah#K*{Anr~?>|?(q3Zbvj_@@Gemc9N+gW^NiKk2t0dMCcA_e0laDU0r2mX&>e zs=Gs-7&k~;q~Q9lk97{D{vi2HJ4bZVF67(F@F9mKSN49Y&0?3chHvg`zub^Q7TK$e zA6SzXh?8rS_xocB7dWk!zH{^1n58wn8RjLGF>lJknqy}U>dVXl(<5OUt^`jP93He* z_Zu*D>*&0g%&p6O+uB7|fmz47V2wH4JA3fCW^UUx?T%;B8`EF+-D`cX^f7qvj$5^x z|J()V#pmDQu*-u|Ry+!=?qp3W9J7y=`>2z%>4ar+SHf!*^!i|DRQ*t=r-r!PE=AYnM+cl_3#>+yGr0id>Wz%B5|_z_sx0 zplbkwCzh6fWU}w3s(D;gj#th5Lv8MCV%JC4sa~||Ax_0n2U&AvtCX3#j^-&#jS=ZjqQbbQ1fd?L@OcaIuez2~8r<%q0F z=jhw%jbkii9FTEDnvygQ^Q!EC{A?S^gXfjSC(=tvM`;Esf`l0FS3ogdL5~1L=(U zJX2dCDFA#SF=2t^0801*o<|Xe;5*2X3l(;42nbr}>;f6{2iyM_1%=0E2;z%^8s94@ z+-iu6H2kU{XfNnOsL+R8D8hn4Td|b%9;QL@c0F9E)qr5fC$Z76di^IR0x|Pq4ai)Y!1V|_hA)i^Hv|2^ zpa|V6j0gl_>+iu6hyR1$ujXDQ6w1v-QggHES`1q4=%GXy{*5p)Iw&`?MCGMN5cm#;<%x(bFwOA`eF0$+>o%k~8m5z6=V zVRE(jx-cP$7PuCG5iqC_h3Bmcb0k#}HJlm%2h?{$=^U~zEs(|Wh5~9> z7|4=CrE3wvX7Pm~_@)c<;_=v82t;6Dpjx218jItJ0B|@Q0*OMPP;d|f&JAMn$b2}H zyA6~lRD|L97a5bQCe%rd!tzBh91(yT60so22sDSoVDlI(CR8Ap?7{Nq>B9W|8B{GS z1*bs;C}cQ=j`Dy50F4euf)AWZ@$djB6o7`o(iX(A7peI-dEf_7pgQOWaHR!yL#jW8 z#?ghDT3bR*y;xk{7x_?}8WIab%$xsjX$8jS$6f#fI`0M@5J!su<}W?S2<+u}6cWI| zkpLX2X@|sV0h(G!4OJwdg+%HgzQF{850V;!7l+_Q;(tN92y+oBi(?0-1m2UwqSK)P zG!9n~2|x{nQd9pTQAjqArGpT}XpwjRZGVy31j2vzn6IxOr3H9eMl6cIFStpW8U0@p z=HHGnmGYOuY=4fAusWy|1kHyg(2Wa*82~k=QnctSjxQO^Z8Dn;_E54Q`!tgra zM;?RcL&FPePv3|4W#PjR)RLADndzwupc#UzzaKmo?T!m|t^A|1-T{s?f+_(W zE~pb_BP~IZApxW&5(j7s>kEcN!ay{z4*vmTz8aK&R4+UJ+Sd6T8Xba!qL2_l!}{_- zu^5ax21eX@J}IH!zUbw=g7V)3-1b3ill?8npXc zJTzJz97O&u1Fen)hly`sDBSn702OYX=BC^$y5z~NUgNkI{2OgantWe!G|89|+O z3{8x1Mn*UTO%t>UprL7Os1F!w7~-%v4Wx+%7KOwAGlq*`w&e229G);SumA=NQB*Xx HGJ*ULgkEUu literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 new file mode 100644 index 0000000..85574ce --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_KNOWNHOSTS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname); +.SH DESCRIPTION +Pass a pointer to a zero terminated string holding the file name of the +known_host file to use. The known_hosts file should use the OpenSSH file +format as supported by libssh2. If this file is specified, libcurl will only +accept connections with hosts that are known and present in that file, with a +matching public key. Use \fICURLOPT_SSH_KEYFUNCTION(3)\fP to alter the default +behavior on host and key (mis)matching. +.SH DEFAULT +NULL +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.6 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSH_AUTH_TYPES "(3), " CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.html b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.html new file mode 100644 index 0000000..b757f22 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSH_KNOWNHOSTS man page + + + + +

    NAME

    +

    CURLOPT_SSH_KNOWNHOSTS - file name holding the SSH known hosts

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string holding the file name of the known_host file to use. The known_hosts file should use the OpenSSH file format as supported by libssh2. If this file is specified, libcurl will only accept connections with hosts that are known and present in that file, with a matching public key. Use CURLOPT_SSH_KEYFUNCTION to alter the default behavior on host and key (mis)matching.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.6

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSH_AUTH_TYPES, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.pdf b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.pdf new file mode 100644 index 0000000..51cf58a --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.pdf @@ -0,0 +1,116 @@ +%PDF-1.4 +%Ç쏢 +5 0 obj +<> +stream +xœ…VÿnâFþßO1Rÿ¨9Ážwý[­*‘ÄQ¸s0sm”TÈ1Kìl›‹ÒgÈ«ô;»^›@®!ÌÎÎ|óÍÌ7þ +¡`ˆúM7ÚÇ© •fÀƒöU£òÔOº³ <ñG¼Òš;\®oχx£éçóiMâÅlvµø<ŽzñߚoF †ÆñRcÁ ñ“v«ÿ1¾ŠfñìN7ïzîwëOªçEÅër[÷Ìò‰ï›:>äeQÁ©ç¿âOšIñÇGîD؁aTŠ˜}ÄL|[ÀX†G +ӑ×ÆCal;jÛ7•»ë@üH—Ä2\P&Ž&…SL¦E|Ï¢-ø^ÖŠdÃ!+×˼x€:ã€æðX”=†æ>sõ§«º’9£E”ê`’ÓìfMf£Ù12i"Qé?åEºÞ/9ü*øü(¾Hö›0gÄ¡h0§%ڜR~'àC–Ë5ï¿!ÜThUr}H³dV"½»Þ/fçÓÑ$EcUj7ÕùN"“¤«ŠO<[õaŽÝ_UÀ¶Ì‹šï .ñá¾+Ÿ6y‘Ô| U½t¿¦½«E¹’Ïm <ÛÂ,D ¤ úÛWœÈ„,Ã!Žj‰8ã¹…9Yv‡U¸Á¿©E\”×ôÐÖm%ýVY¹_/…o>ÚòBt‚8Z•»MRCRAµßn˝ÈàþÖù}UeŒÀH Î7øSmyš¿ðe_âi"·I¨e6$ámQcxÊ×k(‹õ3$iÊ·5¤eQ𴫧¼ÎšîÃÂNcã”0&zû¶;^ñ¢†¼hÌ^D‡È» ò4$o÷÷ɚ€ +(ž„‚HRxìý|(:u‰í±vtù³lQâóTóˆcâ©C2? (Ã4©:¨x3Ôh‰ +Ⱦ:>jßàær>>½×éÃ+%³Q¾ 5ø·ºh§µì+,Ғ¯zB‡˜ãéÉ~]Ã=ϒŠaøžþ-/wȬäOÒô(Ó?¤é¸Ä5T&( ˜” ƒ?ÝþZvLÃlaoòê®'ÈâšÞQ³!ͤAÿƒA»Tf[ž€h}jµ´ çMÓ`® +ÏÓU§aÜá:$òq]×´:ãy¾c2U(,S¢À.eŽ«ÖÀ€Ãö%Q Q“™È—ÓjðyžhÂö‡u¤Ãúì2žHúgç“wP¯'aÐ*÷¿ +@QS”³t)ölÏûÎnñ…eMÜT|ø{ëáØT1¡ÂáÙ(Å7§MIL c%:\.Qp]B}âü8×[}Äóé¾ô¨Ðn‡êÃp(~›²ƒ&pLy½ß©•,¢Ï7‚Ù¬b)@­Jõ•Ñ|Ü­ƒáŠXDRéÅÍ¢¬ûPîd\]¹œÇ‹èrq\GS”Fši¡aV;†79j¡¯jy±!ŽÚ½I¨œq¬§ÃŒVHOµ_u»õ%ͅne<Ù¢l&©ÒõcÚ¨‹lÛ¯7mÀ0œE†¹:^ýÞxW‹_-â›I0;a5™t(%¨ì#;N›Ú‘s±l“ùY8::¶¸¾°OßL(qü7¾¦âƒˆMÛ%NºÝ.1]bôÔ¶}‹Ø:¾'}Ú€ž¬fëu#H…« Ö~ÇÏY*œ…endstream +endobj +6 0 obj +1237 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +11 0 obj +<> +endobj +12 0 obj +<> +endobj +10 0 obj +<> +endobj +9 0 obj +<> +endobj +8 0 obj +<> +endobj +13 0 obj +<> +endobj +14 0 obj +<>stream + + + + + +2015-01-08T09:18:07+01:00 +2015-01-08T09:18:07+01:00 +groff version 1.22.3 + +Untitled + + + + + +endstream +endobj +2 0 obj +<>endobj +xref +0 15 +0000000000 65535 f +0000001561 00000 n +0000003451 00000 n +0000001502 00000 n +0000001342 00000 n +0000000015 00000 n +0000001322 00000 n +0000001626 00000 n +0000001880 00000 n +0000001815 00000 n +0000001747 00000 n +0000001667 00000 n +0000001697 00000 n +0000001962 00000 n +0000002028 00000 n +trailer +<< /Size 15 /Root 1 0 R /Info 2 0 R +/ID [] +>> +startxref +3605 +%%EOF diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 new file mode 100644 index 0000000..f357f2c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PRIVATE_KEYFILE, + char *filename); +.SH DESCRIPTION +Pass a char * pointing to a \fIfilename\fP for your private key. If not used, +libcurl defaults to \fB$HOME/.ssh/id_dsa\fP if the HOME environment variable +is set, and just "id_dsa" in the current directory if HOME is not set. + +If the file is password-protected, set the password with +\fICURLOPT_KEYPASSWD(3)\fP. +.SH DEFAULT +As explained above +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSH_PUBLIC_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.html b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.html new file mode 100644 index 0000000..c425a1b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.html @@ -0,0 +1,65 @@ + + +CURLOPT_SSH_PRIVATE_KEYFILE man page + + + + +

    NAME

    +

    CURLOPT_SSH_PRIVATE_KEYFILE - set private key file for SSH auth

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PRIVATE_KEYFILE, +   char *filename); +

    +

    DESCRIPTION

    +

    Pass a char * pointing to a filename for your private key. If not used, libcurl defaults to $HOME/.ssh/id_dsa if the HOME environment variable is set, and just "id_dsa" in the current directory if HOME is not set. +

    If the file is password-protected, set the password with CURLOPT_KEYPASSWD.

    DEFAULT

    +

    As explained above

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPT_SSH_AUTH_TYPES,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.pdf b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed2ddf901cc387582869803436c63c1bfa3f110a GIT binary patch literal 4210 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PUBLIC_KEYFILE, + char *filename); +.SH DESCRIPTION +Pass a char * pointing to a \fIfilename\fP for your public key. If not used, +libcurl defaults to \fB$HOME/.ssh/id_dsa.pub\fP if the HOME environment +variable is set, and just "id_dsa.pub" in the current directory if HOME is not +set. + +If an empty string is passed, libcurl will pass no public key to libssh2 which +then tries to compute it from the private key, this is known to work when +libssh2 1.4.0+ is linked against OpenSSL. +.SH DEFAULT +As explained above +.SH PROTOCOLS +SFTP and SCP +.SH EXAMPLE +TODO +.SH AVAILABILITY +The "" trick was added in 7.26.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSH_PRIVATE_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.html b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.html new file mode 100644 index 0000000..fc38e72 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.html @@ -0,0 +1,65 @@ + + +CURLOPT_SSH_PUBLIC_KEYFILE man page + + + + +

    NAME

    +

    CURLOPT_SSH_PUBLIC_KEYFILE - set public key file for SSH auth

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PUBLIC_KEYFILE, +   char *filename); +

    +

    DESCRIPTION

    +

    Pass a char * pointing to a filename for your public key. If not used, libcurl defaults to $HOME/.ssh/id_dsa.pub if the HOME environment variable is set, and just "id_dsa.pub" in the current directory if HOME is not set. +

    If an empty string is passed, libcurl will pass no public key to libssh2 which then tries to compute it from the private key, this is known to work when libssh2 1.4.0+ is linked against OpenSSL.

    DEFAULT

    +

    As explained above

    PROTOCOLS

    +

    SFTP and SCP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    The "" trick was added in 7.26.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPT_SSH_AUTH_TYPES,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.pdf b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c588db2ccd0d80e5e991e39e0c9663c323db69e4 GIT binary patch literal 4321 zcmb_gc~}$I7ME(R2C!C9u@xB*3@XXYWFv`55C}mE2m*q#C?T1^K#~c`!~~v|iVIo+ zTYXUbuu>@?xK*heqEg&Y(YjKrfQmj`sut0rrD%P3LQqip`rh|B|8R5e`JMHi<-y}16&^GcMp0{n>dwg)@FY09_k`?v?n}U6sg#}6V%~?vsAvUk!`06PqPCpv< zN&bPG%!>D81AlVy$yxj5m$%pd<5!oO0q%C?&nmp5tFLyRTGUk>&~or;Y28KFi_V*! z_S+&qtua}98j*PV%okIg?o8ORyJ39Qm1Tnc&kLmZ-j&*pqIm_i9#bn?yoiP9M_D@}KkH0Dk zEAX~S3^yaGpFK-Z6(5u?MT`>H?lh%j6+yvJEb)$bIM>GC0k_~G_Ln@tBw1~y;XHvClaqt7p$ z8BN^HTyiCJ^X;5RM-MM7YAxMaHaQvXcGIbGMoEVIlWJsmsm6;#I#>8LZz1;kKU_FAF7!a> z_uJSPpj-9#%bg2n|Gto8=XW)Tm1gL;KI`r`w+5f8ToUMMe{GZVut~a|GxD3%0slG? zIrnUrQ|6!Vc3r*eh-sD9P7F>|_ojL_^%vzJe43TUdDYn?({&geCQriP5KM{7eF-xZ zi-2pcfD7?Ctaut6PLQC_LkQr~V_FhoQ$qldF#}=LD=-5X4`F&j5rL7hFc=^Z9Eq7p zfb%z#0TC7`igrU}1c0L~%MUOyU_bC1NHjpyqzR`1lGQ#+MfcYY2+Nitv>iFe+MbB(A{> zj6mQ5uCRmxrpO?;S}=BTZ4!i99D*Z^i6oUt%4c9=ParL~y~6Pl2TO643Iq8B35=!Q z2CTy4U*RYl`!~gxP%C>I@)wFJ-})C2PH5!X-V$E9VoB>?y7Ky??ZNfu3JvvQ!x~&` zH1u-HlIq^U=y?RRmpW&M1o!MZD4WBRNUXIa@;2+_id2k*60sy)E2g(q*U%wcDW*qr zLy!=iAC`LjaJ((nRLKrrgOiUA-N$8VcR3H$*2n%Mh7=VLeNY|2b zGec{b0Q6Z5!DqjOX$?$^O-u!$f$`Ze%0%EEMN;679@mjLp@k^L@$QcS1E0KYsn2Ldbk0DTTSRADnih7~!9(B52X7*{vTEFcBUdwz~hetOB{|KMEkB)-Z?wk1zz3qAFbqx}=1Kpj-xmG7x?w zA`qf{A;O=6ph5%@!LM?t=vfzmnBYt}G-_+aPW5%g!O8L2v1M zdxBoIOE4?NbQ9GK!Kv?JLhS+8ZroGX9{rW|B(Nw@RRRJ|)rp5xNEI1^B78)E@-6j6 zM-Vz-19kW}9M)>^=&xQTy`1c3J*J`|5Xz%b4XgWucw8=<3#lM04Gb9I0QEuI9vYh` z07I%T4dr=(3H=(4OU>oJGz9qcIt}Fr-rz&M1YpzXi)Ep#H~3fx7tG+kd?<+58#F$< z9~$os8Vf<*@RtRYye^N$@&YSZk6uzQ$JLk~{0jksBk&9i#1sMxB>{Feko|B74%Dg$ zsCy%X1Eo-`NapX$V+*9HkH0@l%0{Fz8Q;s_SL(%)as7FSFJJQa9P!jTXdvZ!(vnCv OpTnoQyZeXAX#WA~PXF)# literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3 new file mode 100644 index 0000000..7ae54f1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3 @@ -0,0 +1,55 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLCERT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLCERT \- set SSL client certificate +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. The string should be +the file name of your client certificate. The default format is "P12" on +Secure Transport and "PEM" on other engines, and can be changed with +\fICURLOPT_SSLCERTTYPE(3)\fP. + +With NSS or Secure Transport, this can also be the nickname of the certificate +you wish to authenticate with as it is named in the security database. If you +want to use a file from the current directory, please precede it with "./" +prefix, in order to avoid confusion with a nickname. + +When using a client certificate, you most likely also need to provide a +private key with \fICURLOPT_SSLKEY(3)\fP. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLCERTTYPE "(3), " CURLOPT_SSLKEY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.html b/docs/libcurl/opts/CURLOPT_SSLCERT.html new file mode 100644 index 0000000..8e3e4bc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLCERT.html @@ -0,0 +1,62 @@ + + +CURLOPT_SSLCERT man page + + + + +

    NAME

    +

    CURLOPT_SSLCERT - set SSL client certificate

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. The string should be the file name of your client certificate. The default format is "P12" on Secure Transport and "PEM" on other engines, and can be changed with CURLOPT_SSLCERTTYPE. +

    With NSS or Secure Transport, this can also be the nickname of the certificate you wish to authenticate with as it is named in the security database. If you want to use a file from the current directory, please precede it with "./" prefix, in order to avoid confusion with a nickname. +

    When using a client certificate, you most likely also need to provide a private key with CURLOPT_SSLKEY.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLCERTTYPE, CURLOPT_SSLKEY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.pdf b/docs/libcurl/opts/CURLOPT_SSLCERT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7466794e41fe65ee1de9297b71c9e07681d3d0f6 GIT binary patch literal 4341 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 new file mode 100644 index 0000000..b19d517 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLCERTTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. The string should be +the format of your certificate. Supported formats are "PEM" and "DER", except +with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport +(on iOS 5 or later, or OS X 10.7 or later) also support "P12" for +PKCS#12-encoded files. +.SH DEFAULT +"PEM" +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. Added in 7.9.3 +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLCERT "(3), " CURLOPT_SSLKEY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.html b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.html new file mode 100644 index 0000000..071eeb7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSLCERTTYPE man page + + + + +

    NAME

    +

    CURLOPT_SSLCERTTYPE - specify type of the client SSL certificate

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. The string should be the format of your certificate. Supported formats are "PEM" and "DER", except with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport (on iOS 5 or later, or OS X 10.7 or later) also support "P12" for PKCS#12-encoded files.

    DEFAULT

    +

    "PEM"

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled. Added in 7.9.3

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLCERT, CURLOPT_SSLKEY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.pdf b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd6660240a8482e5c038ea0702a75bf27df772dc GIT binary patch literal 3933 zcmb_fc~}$I7PqZMI;GZ)ui{ci1P8=qX0j&@u@DwfA~b*^V0B0)VIY}_$wUI;Lwzb@ zt+;;Lf@>A5xU^6KrRZmEMMPVxEsD!)3%DQ^QS0)aR^Oc=2rlpSz3+4W$-U>E^E>CB z?Vk9@hD8W)p#<`;{k>odB!w}UNlk~;YBZXp&1@Ph0~9?PL0MSR4xq(cOm%f^Yi;b!zZfwV3*DJ{1dezPOVgJ`3MsLX~TiRSlR$WDM|HxTerS6z% zExYzcMDK+yo9{JFSXr3m%D8!6W31kvc3Ty7sqPe{fe9_^*=a|R$7ancM zxjM6bV1Jh0sE8YxCnE;kG%yA-C2gQV*x-$Q4#lS>ol59+`d1*lt6A~&LHqJ@kSw^#0HYpaAx{~(% zrdb|RpC5Tq7(cJ^r?X3;b5Ucj-PVrv`e4oSNZfOK`pMZ}8UENY%xBBJ>yH|T#Lrnv zguc@Bao?c5e#6cm`(@yW+%0{gs?w*QPaO2kZcj_o@YFFy;c+3SXD;2TpS9W5-qI03 z9Ev)ebi1_vzBj3zx+5a-P-UoWYsQYpfxq1=W*0WMwb+I`w;xjPZfW{dY?SEbbfPBQjS%_+*xk z?)wPOroR0aJ0_go9$-uR*0xqQ{#3>8b7M-ET<&wJg zEn{I#nE5^>Ss(MwpOTKpjv;=vV*`-9-E-dYIk50XuDPmD`lXSduKcc5|1ZzlkOFA` z{Pt2>?Nc*6=1AR%Kxu$qX3k?vQ^6VAnUZv0)lcUxg_q{9B(tX+^`7_Rgf$5t&M#55 zFKoTvn6#koPO8U<2dm%nvwbf8G$qe;#xddKo6RXD<;$<{mPMvkE!_=I&w#VaZ+Pq* zGPv!|@9D)+%@y#5vp>9ZX=n50%0|(tQAt^WrL%e!FT6YS?#gv(XX-@R2a6V+9>3Oa z!{v)!ciwncR(y%Mr5RYUmv+jAx2-;@jU1|y4?vD$T5+SuwY2c$M$LxJXGuzk7=>j?j;MHP7>- z><(hetL2}6HdB>%q`@GL&OX?52i=#DWguyzyNQ7n*Z8=0$Nl0W9EaRANq19>&$5wd zEMX>59ciS9P{su(W8he-l)?&$Xc~m-85Xoi7z12(l4fBsIMo9(>0q381L**rHP+4; z;z%|b1-%zW<4G3_APY0Yj&L~AtiT;>J^aUX*Q1T<_aYoBTr81k zH14ETk8{}wLk7vhsic{rgOMB62N9Su1|w6XI!tHNl4;cVY&#j3Jt^LhoncTKk#QPG zJ&pjmP6}LvO<>|5b_Yy448guyeRPB`$KX=AtTrnMI_$DqXot!bjPN2Vu;$1p0`n|v zMlh17i-lQ+v1CvzED|b(xBwTAg-v$CN@gX*65CCa6npAp_@11~P7mTE_tWAZY znVFfwOtFx$n^9b;RHB#&6^R6ZL*U4wS;8ft9ixCg-ViGBi5Tq=@-_(#j1{F4QCx_j zU5diMb?lUlr5GCK6cee8lMP0kPRgi~8O4}PAt3|?lPFbyOgYDE0D}|U0LEYDXSyqAAyx0pM zpl&y)0gp-t^4F9V2HKHEgyB*Fh6^x7Jf>9P3KgaZ!f+LasnKURLGXd777TV^(EA@m zdvNv;W$f`FB{XI`V=}?BNV|iJ1TGYbgyK$(yqKFyjdC&S;hmT5FT$qN{dbR9tz1fT ze5x?U;Ix818x{8dB+Sc>vC;6vV4Kr!;j6=FKuHV9+2#OY#(~8~gUZC%tpvzz!e+Bj z27*g@6yzkLQG-L4VlAYGue}fp+qtk%TrH_A1Z@sRTmmC$BAgZ$(In73x3M!C7E05( z;N{S6tQW+JCxO}qVMCvE4h;mqr0?Ycb+=3KC zhQnwSZDL^lJ%`Y!FgRHqB9e=>V!1Y4A=ZXsm?A7BT%=Wm$U`I|TqYGOHGj=9jhm+& UEMaH)0Ewj-2KoDk$3#H?1~ge~$^ZZW literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3 new file mode 100644 index 0000000..a88a5a7 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLENGINE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLENGINE \- set SSL engine identifier +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It will be used as +the identifier for the crypto engine you want to use for your private key. + +If the crypto device cannot be loaded, \fICURLE_SSL_ENGINE_NOTFOUND\fP is +returned. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLENGINE_DEFAULT "(3), " CURLOPT_SSLKEY "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.html b/docs/libcurl/opts/CURLOPT_SSLENGINE.html new file mode 100644 index 0000000..7263f40 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSLENGINE man page + + + + +

    NAME

    +

    CURLOPT_SSLENGINE - set SSL engine identifier

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. It will be used as the identifier for the crypto engine you want to use for your private key. +

    If the crypto device cannot be loaded, CURLE_SSL_ENGINE_NOTFOUND is returned.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLENGINE_DEFAULT, CURLOPT_SSLKEY,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.pdf b/docs/libcurl/opts/CURLOPT_SSLENGINE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9a478e67d579cb6f8c526afa63fa8a1dca4087d GIT binary patch literal 3954 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 Hlp6XEa;RA# literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 new file mode 100644 index 0000000..6570df1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLENGINE_DEFAULT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE_DEFAULT, long val); +.SH DESCRIPTION +Pass a long set to 1 as parameter. Sets the actual crypto engine as the +default for (asymmetric) crypto operations. + +If the crypto device cannot be set, \fICURLE_SSL_ENGINE_SETFAILED\fP is +returned. +.SH DEFAULT +None +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLENGINE "(3), " CURLOPT_SSLCERT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.html b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.html new file mode 100644 index 0000000..75c3bbc --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSLENGINE_DEFAULT man page + + + + +

    NAME

    +

    CURLOPT_SSLENGINE_DEFAULT - make SSL engine default

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE_DEFAULT, long val);

    DESCRIPTION

    +

    Pass a long set to 1 as parameter. Sets the actual crypto engine as the default for (asymmetric) crypto operations. +

    If the crypto device cannot be set, CURLE_SSL_ENGINE_SETFAILED is returned.

    DEFAULT

    +

    None

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLENGINE, CURLOPT_SSLCERT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.pdf b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..506cb92f8ab61c9eae262c2f7a5dc6c0184e3572 GIT binary patch literal 3981 zcmb_f3s@6Z7G811GD?@C6}70N76Yr3naMk85*7&2D6AO3@>GXp5(kn@NG1@dx-C`^ zMM1$=sqc#Q{i;+2Uj=0WUsc-rzz-B_>ua$utJRj?NrIrb+wS*yzmJbQ=brPQbI-Zw zzc)cKDm8+01yE4k-Qo?95XN9SEgh1}(J0blWM;x5Akm^~%EXX17*(4HhE$O{T2CsK zke#uSgc)*vxMOOEWuw~fx0cDcwj=n%yS`OVnk%>7m^9(eTc(tVor<7kk@sbp3y=4G zxZ$0GBNJQp?Ca-!}xaFsHEARLh|7MKwEqgFFzWNKMqyG2jo_f4&R>?ObURM{5nK^i3zh>*sg?-69 z@mbB0hT8jMw?3>io-dnnup_VjwV+|8HKm`(yx&?MH1>PW!|nWqRttvI5C5?p-JN!5 z`0-K&BA&w>UU{lbBgr6Qsy@HiXTeQP!FvPRO9Ij)m0pSQCGUFWRsSP(h7afUyGwbO z79^FK53N>54ZNTWY*H=uxA+wd`!X^$?ALLy=FaS;VM%i?t-m7b(CA8e$7-6?S&v?; z$d_z+H6b8KK6B-6#4AL+W&6F8@p}f4Jna(xVsTYg!1k@y^Vf5S)YAXiU!QdK;+j;S z)t73ql-S4BnoMc^4;%8wkE|I{c_X&%TvODFgdGpsm(7?JQbKMk`FAnxn7Ay|Ecba* z{$9Tfnbl!JYG+1Hi8tvR10aD$za>%A@<5xG}hAHNw$8VRY3gtPcKKg+BNzumE_Wkol zv>=B2VVlQP4lPJ;YdsTMntrxdE>W@NK3X=Te90}e=I7ms+sdajelh3Mu?%o+T$Ilyj_fV$a z8)NndBFe@$zuEiu!*95YL!t^RkJeC3A9(@0uI)4c4*frF>5 zt4>Z8#@=cu?t8SgeMErh9fY*#J&XiqEQ_(+#s0@}5e9i=f-Z)O%dwJZ3}GbEXi`rR z;j|M@#=x>rDug8hUMhrYX$J5ei~%hhX<=YKONKy9+G&SPN7?~R#@J|GEXgFJfJk99 zj&w4>F4D=2k9C>ixZ6Zc19P0``T)#{Mu2aCXop$G)j~kziH~*RW?+B@0)$-=+F^7O zrMJV$5F5W1N`(P}gN5v7%DVE9x7#v;U`E=_*sCiZ9wSc zm}nSRDm_8EcI9!U6+^6@whP9!&CXREgK##fT2w2Ar0$6Xl00X@YIrQd2|LMV3yq`9 zq#e0Lm8d&HXYsny zkPsc!c~|3nfk>(J^ng6nX(e|*_=Byayz%CUgL%~Uij)57PHf2x@%;QSAID+%X!3G;)CbMZ<28?q>8~|z48)RD0 zK5jtprQpnD7^@6Lv$M0g*?cZ-GorXuDn&6K%HttG1F`2=7{ZBI?4yA{S0GfvQ!|U5 z>xzl1qs=IlfZ|*X?R2C9+p$qrhN3Mn>zGKR9gKqGa8P=gNUxI^NF9Ob47@Z1$4LW% zfr0SEe2JbX!O1i|*6GgLEzD>9fd$}@5ApzJGQbadhmN!tqJnW+uSdCahM#p#*#6QE(Kt9x{;_ybYey6H0r^M7*9diKJ&NQXzOIb>cBLf-;dd z@N*YNW2sycV>, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLKEY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. The string should be +the file name of your private key. The default format is "PEM" and can be +changed with \fICURLOPT_SSLKEYTYPE(3)\fP. + +(iOS and Mac OS X only) This option is ignored if curl was built against +Secure Transport. Secure Transport expects the private key to be already +present in the keychain or PKCS#12 file containing the certificate. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLCERT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.html b/docs/libcurl/opts/CURLOPT_SSLKEY.html new file mode 100644 index 0000000..faabcf3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLKEY.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSLKEY man page + + + + +

    NAME

    +

    CURLOPT_SSLKEY - specify private keyfile for TLS and SSL client cert

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. The string should be the file name of your private key. The default format is "PEM" and can be changed with CURLOPT_SSLKEYTYPE. +

    (iOS and Mac OS X only) This option is ignored if curl was built against Secure Transport. Secure Transport expects the private key to be already present in the keychain or PKCS#12 file containing the certificate.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLKEYTYPE, CURLOPT_SSLCERT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.pdf b/docs/libcurl/opts/CURLOPT_SSLKEY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe27c02ba74d9480b0b78b6f5d5ff5e6478116d9 GIT binary patch literal 4171 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLKEYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLKEYTYPE \- set type of the private key file +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. The string should be +the format of your private key. Supported formats are "PEM", "DER" and "ENG". + +The format "ENG" enables you to load the private key from a crypto engine. In +this case \fICURLOPT_SSLKEY(3)\fP is used as an identifier passed to the +engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE(3)\fP. +\&"DER" format key file currently does not work because of a bug in OpenSSL. +.SH DEFAULT +"PEM" +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLKEY "(3), " CURLOPT_SSLCERT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.html b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.html new file mode 100644 index 0000000..be6b2bd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSLKEYTYPE man page + + + + +

    NAME

    +

    CURLOPT_SSLKEYTYPE - set type of the private key file

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. The string should be the format of your private key. Supported formats are "PEM", "DER" and "ENG". +

    The format "ENG" enables you to load the private key from a crypto engine. In this case CURLOPT_SSLKEY is used as an identifier passed to the engine. You have to set the crypto engine with CURLOPT_SSLENGINE. "DER" format key file currently does not work because of a bug in OpenSSL.

    DEFAULT

    +

    "PEM"

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLKEY, CURLOPT_SSLCERT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.pdf b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f5446ae4b802caaac29964a930498d7486764b36 GIT binary patch literal 4186 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSLVERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSLVERSION \- set preferred TLS/SSL version +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version); +.SH DESCRIPTION +Pass a long as parameter to control which version of SSL/TLS to attempt to +use. + +Use one of the available defines for this purpose. The available options are: +.RS +.IP CURL_SSLVERSION_DEFAULT +The default action. This will attempt to figure out the remote SSL protocol +version. +.IP CURL_SSLVERSION_TLSv1 +TLSv1.x +.IP CURL_SSLVERSION_SSLv2 +SSLv2 +.IP CURL_SSLVERSION_SSLv3 +SSLv3 +.IP CURL_SSLVERSION_TLSv1_0 +TLSv1.0 (Added in 7.34.0) +.IP CURL_SSLVERSION_TLSv1_1 +TLSv1.1 (Added in 7.34.0) +.IP CURL_SSLVERSION_TLSv1_2 +TLSv1.2 (Added in 7.34.0) +.RE +.SH DEFAULT +CURL_SSLVERSION_DEFAULT +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); + + /* ask libcurl to use TLS version 1.0 or later */ + curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +SSLv2 is disabled by default since 7.18.1. Other SSL versions availability may +vary depending on which backend libcurl has been built to use. + +SSLv3 is disabled by default since 7.39.0. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_USE_SSL "(3), " CURLOPT_HTTP_VERSION "(3), " +.BR CURLOPT_IPRESOLVE "(3) " diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.html b/docs/libcurl/opts/CURLOPT_SSLVERSION.html new file mode 100644 index 0000000..efbca5b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.html @@ -0,0 +1,89 @@ + + +CURLOPT_SSLVERSION man page + + + + +

    NAME

    +

    CURLOPT_SSLVERSION - set preferred TLS/SSL version

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);

    DESCRIPTION

    +

    Pass a long as parameter to control which version of SSL/TLS to attempt to use. +

    Use one of the available defines for this purpose. The available options are: +

    +

    CURL_SSLVERSION_DEFAULT +

    The default action. This will attempt to figure out the remote SSL protocol version. +

    CURL_SSLVERSION_TLSv1 +

    TLSv1.x +

    CURL_SSLVERSION_SSLv2 +

    SSLv2 +

    CURL_SSLVERSION_SSLv3 +

    SSLv3 +

    CURL_SSLVERSION_TLSv1_0 +

    TLSv1.0 (Added in 7.34.0) +

    CURL_SSLVERSION_TLSv1_1 +

    TLSv1.1 (Added in 7.34.0) +

    CURL_SSLVERSION_TLSv1_2 +

    TLSv1.2 (Added in 7.34.0) +

    DEFAULT

    +

    CURL_SSLVERSION_DEFAULT

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); +

      /* ask libcurl to use TLS version 1.0 or later */ +   curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    SSLv2 is disabled by default since 7.18.1. Other SSL versions availability may vary depending on which backend libcurl has been built to use. +

    SSLv3 is disabled by default since 7.39.0.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_USE_SSL, CURLOPT_HTTP_VERSION, CURLOPT_IPRESOLVE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.pdf b/docs/libcurl/opts/CURLOPT_SSLVERSION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed73b15b16bf89db15d3f4530f6c90936cac3548 GIT binary patch literal 4783 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 QBw#Vv2*uISC&-ubAN>%Om;e9( literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 new file mode 100644 index 0000000..7e05a59 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 @@ -0,0 +1,65 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_CIPHER_LIST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list); +.SH DESCRIPTION +Pass a char *, pointing to a zero terminated string holding the list of +ciphers to use for the SSL connection. The list must be syntactically correct, +it consists of one or more cipher strings separated by colons. Commas or +spaces are also acceptable separators but colons are normally used, \&!, \&- +and \&+ can be used as operators. + +For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA', +\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you +compile OpenSSL. + +You'll find more details about cipher lists on this URL: + + http://www.openssl.org/docs/apps/ciphers.html + +For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5', +\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses +this option then all known ciphers are disabled and only those passed in are +enabled. + +You'll find more details about the NSS cipher lists on this URL: + + http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives +.SH DEFAULT +NULL, use internal default +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_SSLVERSION "(3), " CURLOPT_USE_SSL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.html b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.html new file mode 100644 index 0000000..eab61ca --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.html @@ -0,0 +1,66 @@ + + +CURLOPT_SSL_CIPHER_LIST man page + + + + +

    NAME

    +

    CURLOPT_SSL_CIPHER_LIST - specify ciphers to use for TLS

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list);

    DESCRIPTION

    +

    Pass a char *, pointing to a zero terminated string holding the list of ciphers to use for the SSL connection. The list must be syntactically correct, it consists of one or more cipher strings separated by colons. Commas or spaces are also acceptable separators but colons are normally used, !, - and + can be used as operators. +

    For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA', ´SHA1+DES´, 'TLSv1' and 'DEFAULT'. The default list is normally set when you compile OpenSSL. +

    You'll find more details about cipher lists on this URL: +

     http://www.openssl.org/docs/apps/ciphers.html +

    For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5', ´rsa_aes_128_sha´, etc. With NSS you don't add/remove ciphers. If one uses this option then all known ciphers are disabled and only those passed in are enabled. +

    You'll find more details about the NSS cipher lists on this URL: +

     http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives

    DEFAULT

    +

    NULL, use internal default

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_SSLVERSION, CURLOPT_USE_SSL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.pdf b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b0f4d083c02cafb2699961cae721080b0106220 GIT binary patch literal 4476 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 ChI~r^ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 new file mode 100644 index 0000000..4873cdd --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_CTX_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_DATA, void *pointer); +.SH DESCRIPTION +Data \fIpointer\fP to pass to the ssl context callback set by the option +\fICURLOPT_SSL_CTX_FUNCTION(3)\fP, this is the pointer you'll get as third +parameter. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.11.0. Only used with the OpenSSL backend. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSL_CTX_FUNCTION "(3), " CURLOPT_SSLVERSION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.html b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.html new file mode 100644 index 0000000..7c3995d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSL_CTX_DATA man page + + + + +

    NAME

    +

    CURLOPT_SSL_CTX_DATA - custom pointer passed to ssl_ctx callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_DATA, void *pointer);

    DESCRIPTION

    +

    Data pointer to pass to the ssl context callback set by the option CURLOPT_SSL_CTX_FUNCTION, this is the pointer you'll get as third parameter.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.11.0. Only used with the OpenSSL backend.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSL_CTX_FUNCTION, CURLOPT_SSLVERSION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.pdf b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8e9f8bd2c6b725f480bc2fd38fed5d3054c98762 GIT binary patch literal 3824 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 new file mode 100644 index 0000000..1e8dbe5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 @@ -0,0 +1,70 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_CTX_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_CTX_FUNCTION \- openssl specific callback to do SSL magic +.SH SYNOPSIS +.nf +#include + +CURLcode ssl_ctx_callback(CURL *curl, void *ssl_ctx, void *userptr); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION, + ssl_ctx_callback); +.SH DESCRIPTION +This option only works for libcurl powered by OpenSSL. If libcurl was built +against another SSL library, this functionality is absent. + +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl just before the initialization +of a SSL connection after having processed all other SSL related options to +give a last chance to an application to modify the behaviour of openssl's ssl +initialization. The \fIsslctx\fP parameter is actually a pointer to an openssl +\fISSL_CTX\fP. If an error is returned from the callback, no attempt to +establish a connection is made and the perform operation will return the error +code. Set the \fIuserptr\fP argument with the \fICURLOPT_SSL_CTX_DATA(3)\fP +option. + +This function will get called on all new connections made to a server, during +the SSL negotiation. The SSL_CTX pointer will be a new one every time. + +To use this properly, a non-trivial amount of knowledge of the openssl +libraries is necessary. For example, using this function allows you to use +openssl callbacks to add additional validation code for certificates, and even +to change the actual URI of a HTTPS request (example used in the lib509 test +case). See also the example section for a replacement of the key, certificate +and trust file settings. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.11.0. Only supported when built with OpenSSL. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSL_CTX_DATA "(3), " CURLOPT_SSL_VERIFYPEER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.html b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.html new file mode 100644 index 0000000..2b0f441 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.html @@ -0,0 +1,69 @@ + + +CURLOPT_SSL_CTX_FUNCTION man page + + + + +

    NAME

    +

    CURLOPT_SSL_CTX_FUNCTION - openssl specific callback to do SSL magic

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode ssl_ctx_callback(CURL *curl, void *ssl_ctx, void *userptr); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION, +   ssl_ctx_callback); +

    +

    DESCRIPTION

    +

    This option only works for libcurl powered by OpenSSL. If libcurl was built against another SSL library, this functionality is absent. +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback function gets called by libcurl just before the initialization of a SSL connection after having processed all other SSL related options to give a last chance to an application to modify the behaviour of openssl's ssl initialization. The sslctx parameter is actually a pointer to an openssl SSL_CTX. If an error is returned from the callback, no attempt to establish a connection is made and the perform operation will return the error code. Set the userptr argument with the CURLOPT_SSL_CTX_DATA option. +

    This function will get called on all new connections made to a server, during the SSL negotiation. The SSL_CTX pointer will be a new one every time. +

    To use this properly, a non-trivial amount of knowledge of the openssl libraries is necessary. For example, using this function allows you to use openssl callbacks to add additional validation code for certificates, and even to change the actual URI of a HTTPS request (example used in the lib509 test case). See also the example section for a replacement of the key, certificate and trust file settings.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.11.0. Only supported when built with OpenSSL.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSL_CTX_DATA, CURLOPT_SSL_VERIFYPEER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.pdf b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..af3d9593f059facc96cbcf081ded3b7b2d342d79 GIT binary patch literal 4965 zcmb_gdpwkB`=?TRRAe1W$wM>|o@b6`CdPSC)HKcsjhSZ{=41{TDzY84iCUE+9kkh` z+LjKRV|pthpQyBjU8E$PYqKw{+TT5cYOCMxeSe=%&p+ipO5E({cNlZNC?2Pzh;#fr-OaT%$!W0MI85{8@S5{?)kX&E7LhUu=7m_iR#E*CbwqzI~bbnwjX!oMMaq z{lhaZersTHX>a=QrtfR#x!-R=tzM?CB$~BZGp5eT+MDrL+nVXF$nH~pdk25%>&U3w ztD>J@O(?+aI9zX+_P}p#>QBjmbIjzt)h1_-*RG2$D=TjJ`)%j2WcZJjyk&bYl-eHL zqGg=rJmJBh_5P__D@%vWCybNi`BY!g{`qCf$~AlTynJ4b3NtH0+?Y*uw@qTwzM&6g z?wl0Ws$BAD{L)jdfjRS%YZl#TK5W}iVf{j<4cB46E8{gQOY7IoLnNd5xd)y-$m~@l zf9GvKow_xR=bdkHyI@!^@6DXQ3oFy^$vQ5-=t;`CdwK&|>mf~4!$?4v_82E;L{DwV z6htudPBbh$GtHuOGqbR-v9CTqG~>qW6#u)LvL|$~ z`(WrWnmM4G;u_xh+fvhWZ4tA>NvC)I+7lV_jqPl<$xvQ_|7N62SU>+*Gr4W2alAJ8tDQSspVOZ*w!C@)?g{>09p`UuL+$dk!%>ymLEm!DiW$brtEz zu8qRF7iD{IS!R>` zYr$k^-w-llX2)1xF~I7ov%1dS7Wc5>ghjeC$L)0ZbuDOnU%7M0zNmp~p0akVKfAT^ z)t-~?Ra1w@)ixB`?Jc8OP-_UHW~#9?<>-Q?bDmNi2aL4q^nAjg40C4Tu_)hj*?p|} zq*kP?*YAhz<*Rivg~@X*u1@JcKAbusK6JKWqfX=TEBRCI49)$%q06o5ifXxu&hCXa zv#eL{hIMzBch5XKvA{SYPix>@aER6;Z>gI{<6|>a%kYNH>7L{pwSl4#x95~fUr5ig zIeXE>A9CAYY#d)()!VRY1kT{n-R-eQrx@;ka#eYjrZ+KU zw#TVuCChZDb8@a`HRXtsTcHYi(1QW$l6Nm82aX%?sUJ%zb=NrA%bInd|!efv!lxHT)htE!+4` zo-dJZbWjI2k+0=Oc$BXyvO9huonq7$>fnPFIxKX*1eq_c69)=JXzx&dXJFffL_zKH zPQC3NMRPq|XeX{$wb|SKd`8%;%+yQNY0}xcDSJslK=?t!&>U`3s&0Pk{&BrWe{H>E z3!m@qW!Vjd-&zY-UC5}e%56XVP{QB%#yfm#{-VK!)6VTX8&x~euMF7+tKwV^=(#hs zOb+%1Y_Mb%xcNn7A45G;w(eZ-UYB4mX_@rejEsXl(#Jz}HxFO$NS*4nPvjY_$FS^8 z4ULT6@m9Nzg!#8vRsEchnETC@DEaXs@f#bhl=}Vp0heRzj@Gql>*$5Fc-;QeCO^6? z>Ry-sH9Iu=(3K}wj^uW<7xiwCIX9jp%i~?V)(4jVvQf-TvCvt| z({sPDWO!q7{_DJ!$@1ckoL6y1S^evzR^|+H^?%=Ao<*Z z#_xKLP^0V%`_pLO(stlHZ-vwvUG{A#S#2un3;=w$Cz9wG9b+Z`QehVVyb~; z=Cpf_(W0*FbqgQ2d)(GWYhm4j5Mtf$7lnU1C6!&S_P9$gEF->1!n9%fge?DNF5$Vp zG`;t6;yXU0vf_sJ6J6=K-OPm(qqAZcmn~vB#oSnOwd$QaB=QwsK7Ui6J6yU4DXqrX2s&S!rQS^XScYZ%t_Jw|#bKT?HpTh}_w1{Cm`lnu>^Rzv+gaJ;DiD zG4qBG;aQk=c=FRdF8i|53ah`=Nc;F?-b>zEkGfO6Rf}H- zKj_TQw+e4X7Y{bZqFDr&M8u_fcK4JYd~`jV*cY#IwRd%$cz9qqQRZ6x_VgbAXD44h z`j^U}rd@X5?Zh2M)T=`GH`O~ISDH7`w9hn6A1~jOP;|lS)gPrW#djNDIyR+kYFSTQz?L* zw@Tp?s4>OkM@*O!V2&qfUH~IPJi$9al*4K!#fE@rG(NS95oQI@K!C6&LOF~q7VzY7 z1f-6i4MoBLL8*rP$W-lW#B|islcV4WC9z`=qtORo3Jwo^f$<|)AACFg6X3%(AY>^k z0LC*Iqd{tRHR_7(1gY)VA7C`w9Q%q#A-p=NY=ljNXd??MME%4A|N~oMfd^;??gmI0Y6TTtC6bCj55X#t zP%NjbTyPo_I#{d42oBb$C=y(7VF4^yA(03Z1PYkoNOQzH;EDDyU&aw(NfKECjCZ8q z0Hln^r?bKMi~xc+7hIe|A*CZoQc{v*646m2i$(A>8Vx}S2!Y@LG#uo~Vg*O#AePSs z{xpFI!rq&S<&K(|9Jvw^A_zn9jwmwb$O~*oCXgxw5;3fH%!!dG6)rfXQoy5Actn&! zC2<_Md_s%^9*^-IQ1CeL2s8>GPeTbYG}4$m=|^Gy!yotn91=kuz={se2cD9P$y{(g zEPvQ1P9j%~_=jnZCBbR3qyYi{cg92_bxW)D=w1@8QUs1|Kd=8!!+h-;^SJK= zmMUdJ&2;d%2qwhTvB^Q1@gQOzm(G{SL>$oD9H|tXp&WI~BcLa73}^6BAy5c0hGzEM zg^H1dP@tYAx{xD|b-}3|co?6f6e@6xV6jG9-Hg=Um9y$aKWpm1SDKNC-c4N>LEk% zC>5pQshau1p(qZhfjRsS8l%%N|4Z{?`~F5&$uK^I!gw;IKCng}m_jBK$uJ)tl@Ul3 zaL1`1SUe^p5y_v)2qY9-rvKC<5J;cNP_U=Z^$4Ho5y(VvO@4ysLG79>+j7s@D78=ONdpw1VBM@RT@NX;_2^6GYAb&6*eGM>Wwn~vqq$vvdI-3nL<-E P5*bf`Y;3%jGNJzguIe$U literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 new file mode 100644 index 0000000..6716f72 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_ENABLE_ALPN 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_ENABLE_ALPN \- enable ALPN +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_ALPN, long npn); +.SH DESCRIPTION +Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This +option enables/disables ALPN in the SSL handshake (if the SSL backend libcurl +is built to use supports it), which can be used to negotiate http2. +.SH DEFAULT +1, enabled +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.36.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSL_ENABLE_NPN "(3), " CURLOPT_SSL_OPTIONS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.html b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.html new file mode 100644 index 0000000..69d6df2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSL_ENABLE_ALPN man page + + + + +

    NAME

    +

    CURLOPT_SSL_ENABLE_ALPN - enable ALPN

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_ALPN, long npn);

    DESCRIPTION

    +

    Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This option enables/disables ALPN in the SSL handshake (if the SSL backend libcurl is built to use supports it), which can be used to negotiate http2.

    DEFAULT

    +

    1, enabled

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.36.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSL_ENABLE_NPN, CURLOPT_SSL_OPTIONS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.pdf b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96f158c907914d4d6366bc5304a745fe40d544f4 GIT binary patch literal 3662 zcmb_fdsGuw8mFig2R$od*DlA$AYcScW+pF^Gzo=-pp`%jPm5Y7nMoK(GBKG*P%K(q z)T*GnXOGpoYJGQEi`A;Q=<#S(+A8=!RzX0~ii)URk)yP$?wuhBqTTMEcA@iBoIil}NY-2zEq6sAqNkWz^xkq#@914{wLi0CLAL%Lu@XTup%OPXnd zRI4F3<05f84TRZAPt3xku zst#_98Uvph(0T2f{D6TY{l8zmdh^E7j~&>GKYjUO^{w+!D+jmHiO!KvjBQ!_Jvj?= z{Mzad%Fu0rk`}@jgSAby)L#as_e8z_3pHipb3q2MGyDx+PwB>q_YNJ z5_;;&#Uo30JPHW=K>XFJV!p%{eke|DGLDbOPyD;pq?8`Jd?Ki%f{?Z>J*Pa%Bw-Jo zeqjsJ$K5!vYHZZ0pi^&EE?iU;8hxQtJ)omJu4%xHyDQZr^xt>glC7)Zb=*C!pPYK} zX(S^3rB=H5qoH_AYv8?)B`p^Ryd!VZ2U4kRpQ(4AZVhN|zhJ67Tf9IwZ0_~0QSF+` zYfpxaTxya(>5|;0zwK(W3Df@^exNb9+4y{%J*l?DwS386Hy;WeR^~{LYxrk!v}{|| zqsX#-=Gusd1)^!8!ygx3Xg-|3v|_YjQ`qu#^TW>$yF5V^{N1R=AI>(BRY`f$@@rox zHxAxff3B+an6&&%@W9-inh#s*ceR}wn{f};uUIlDAh03QKd4mlq{F{$=G*Ht(HWVQ zk5&w#{l(r-2fkx9)L%FfV8~l(C~!m<-5#;KwtDR%t2KHFaZW7t3@SJ>dT2|*T6*rDDS=tm*228&pPmtnh}$qE@b=e#@A#%> z{a97|7w(N>2*LbWWe05>~fn&YF^G zslx}JsccZM9eR&BP!6xJnFNoc zR>dAW`QsyTVY02`et5{$DzHR!xn&uldXWzSU_<^qOaB=aaFFoYdDr?)( zlxF`2kt+?K6n2fjx@?W#9l7Xfb7%GjtLWU~^BcwQ2Gwj|T2b~<(Szhc27CLkjPhC$ zwl4l=;l)jK2K+3LbP&Gk1v|Fl**a%`?6ve`}$nBqy}ej8*S}@@L8`X8JqwoFxE}z)gALPK<_mmB*mbIF}2!f zBzG&HDq{@9${BlMxNG*D${{&>iWp^(>}58V?&FHb-6ZQFB#p9@Zhky%Be=_RZiA3i zkBMPp#oh`S(c>x>@AUvi+KxN=A|yCKcc&ay7!z{V{0bs>>VssJAw6=4maviJhJd%M;q?K~0cn>O% z@?eTk@iHZPRPWS~In?BNE;4mqa+-Nwo>@-tV%3l`76&;_^1Zl|Z{a4H8z$Xm)p(6D zNjIKl@G87^ryWEa_S$U@x5BI9aUu$^XUPZ;=2)0K6)#I~fEk*$l)L#V75Vh*=}vq@m4?Ff~HU;-5BQKSXeaZyf&q8%`+7&p-#M#b}Z zC_*76M5t6I#`$K8(8R|u(!xi<;u8d6k_s&tfufQgbxbn6RLVnq*MC!1f!Ms>3m~9AHz)y*LJtzxQlJHWNG(J$2_MDy zs4NYYD=?V?l|`eN0!5WbKTZ&QAgTc`8St|CA4L0b_7SCBX&@!kRu^rtz;j8Ln~ek} z5DEpNZjGFnk4uTLG3w);H|;Onsn`E^kJ;^PO0#?lEp7JLL4%#5{eKeXO~;rpzcAS8 zaoM=)Aj}A9BU#(rAj}xBm@q3Ww9Afz+{T?w8)e4Xlt(~L^3+Oj$WV-pRCBc#XJfiI zHj1q!g$;LDRXi`BAT7AZ#_-hX4vw4Xj)sj=cW*d3q!;TovEoRewn5mC7o9^5!Eb22 zIiTKl38s;Xm(MmsuzPv(vu)njjeF{P;_J#f5{zQDN`S-JI+>_dutkPqs0@{3GOoUO zD9QtDpbme7!&eOxUso@YFJ`CLMOq*f#>5cYu(}s4l}JPq*aG`#m@ozmb9TXw9-0V^ z0dIwuX_%0mSp8_ITMCKkWSCyD{@fc|{wt2BxH zRlU-_HZv}qvXL(Ee+@=bsd*&u6%3wYG!y87XI4m^G4RQ#XqJ^`S@o_S7yhaos ypP-9Nh>O=HUJ*L?oo>p#K2iS>rMQ literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 new file mode 100644 index 0000000..5db9b51 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_ENABLE_NPN 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_ENABLE_NPN \- enable NPN +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn); +.SH DESCRIPTION +Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This +option enables/disables NPN in the SSL handshake (if the SSL backend libcurl +is built to use supports it), which can be used to negotiate http2. +.SH DEFAULT +1, enabled +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.36.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSL_ENABLE_ALPN "(3), " CURLOPT_SSL_OPTIONS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.html b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.html new file mode 100644 index 0000000..3278e95 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.html @@ -0,0 +1,60 @@ + + +CURLOPT_SSL_ENABLE_NPN man page + + + + +

    NAME

    +

    CURLOPT_SSL_ENABLE_NPN - enable NPN

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn);

    DESCRIPTION

    +

    Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This option enables/disables NPN in the SSL handshake (if the SSL backend libcurl is built to use supports it), which can be used to negotiate http2.

    DEFAULT

    +

    1, enabled

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.36.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSL_ENABLE_ALPN, CURLOPT_SSL_OPTIONS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.pdf b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.pdf new file mode 100644 index 0000000000000000000000000000000000000000..49767cbcc1835bf94da81ed540fc3fc6d0bbdef5 GIT binary patch literal 3663 zcmb_fd0Z1$9=D3e4)s8*cD2&MN@LYzW^$245()`dH9|uuAVnQAlQ59X#L0vNs#Vm* zDpeM2YZd*hCtB-T(6vRYt1T|n^{A+LZgD|Y3;HpOitABz-wZ(z-R^MgnNDD)d zIvwQVSQ2+Y-Zj5V#*52hhCDp})vI63bP~SGZzok`Cm;5#-!`oGj{Va{ubo)5YmaQ% z;MW$qTZ>!gUBAAwX7`FKi-^G7&+~l8${GW`ixzA_9vt{Em$rt4E0*_9I6iXmYJJ7L zYqqN7SBJFpZ>?)-SU*HMAXHQm(0;wjQb zJ+;P{BBw*)ddyReaQYJIA{_y(E zs~g0F3dfZc#E(AwSk>AvCcl0D;rVw<_w>J?d2sdZ_lL%7b9el`47%8qxQ;o}FZf#Z z7ZF>bnwI`$JL?h#Y!w%BH+H>yY?;i)f#*x zBhWFhwtW7Ts!L}Ve_gOMV^HBgcZ$!Zr(PW%{>uG18!vDB{`k=7u_b+Po4+9&Mig%F z-5dAu{YQ?Axj)9)PWn_$Bd-NC#;zW|Va4e!ThcPPrWUGlVQuf=3#Sb2nQO*uG7c{c z`4{r$iOu?pWydCdR4xnr;cCAj?Uh8|>wA-fqA#V=rr106e>$}GTJ7tN z`+lw%U9j%6eUsyBzF9$R&}EcXmpdbtO4@@NW!7lU6X$(Bg)O1(1?r*hi zn{TMn4&|<$WBl#qqC4J-Bf1%+@4E|^mWPb`Y5LxCFCROaTTpa+?&`)tu6YS5tIq51 z|79C}_{%9_%kecwcgad};!=uC#c2ncYU2-_`Jld{PhEW4E%B%sS87g1IxoC4^8DoH zlo1<0E`9sMPnkojiu)AI#D2NcZ_LS4nuBK+om(9=JnFuo>Tb{+&-VF^3&LhSY^XDD zS^DX%(K8bbq7k;MC(BZf9(rBK+1HNe(B#35<0Rx^#yYyN{o;nXjZSB7-*AqL87B|#2= zpr=Dvm<(}HwA+=@WsKm=?yQ||?lM2sIJI*EVKTW=r}HOkc!bx9TXIMa&LnLVtrhvc zJs^T9LMuv97*V5BPi9eZ`7D`~Kh12(&#|ZpQG^Z(kHA5WlVUIK6kCN+=7LF=MLSk+ zni?~f2Y5AJhtmO~4SOAS+NJSoMFNWk?0GUGf&~bdqZOqZ6Jd^F>^T$%OC@RvCdOow zU@MC|NDss2z?eiS0wP($sxg5??+^&Sw4yAIb7~O8VrizuVztN>a#C*XROjqw=2QB>0Z=FdegHcSsAR%z zAz7^`HgPH(o5i@e4*jrNf+|Ib|N1Y=DiE9JdjSO0?}l)I(HKGETJsE`59y>RrVyi; z7*&~3wFXmZP}M{f)1YWL(gO*C4_Ni!DFdE1{{w3`WH(lZHG`DU*;vMEg>y;P#YX~@ zNTm{4hemY|4+ia=ok~0Ck8v+ ztX-%M!h(=?lDEwT!i)in35&+cunrvLHtuxVDGSc0JOXl3qzea!9L3p5oltv`cCKS% zr}$dZ*m2sX6?w%3X~o@kPNYkw1vJqS4Lhal*a&<`m#pW+N+5yS24O>IGMUcJ2aWOjO4(h8w4CWrWj)v;iuLLpPYR@hI&q+#F!{DSFDnhXsC z&zYxbn3NwoJ!q)n85#=i^ej#W-V!}{Wil|!d(ag8RO~^M%b&%`!oWc8i9?^IDb&yE zRd%GLb69OcY%1|gYG&&&$`Zq4?, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_OPTIONS \- set SSL behavior options +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask); +.SH DESCRIPTION +Pass a long with a bitmask to tell libcurl about specific SSL behaviors. + +\fICURLSSLOPT_ALLOW_BEAST\fP is the only supported bit and by setting this the +user will tell libcurl to not attempt to use any workarounds for a security +flaw in the SSL3 and TLS1.0 protocols. If this option isn't used or this bit +is set to 0, the SSL layer libcurl uses may use a work-around for this flaw +although it might cause interoperability problems with some (older) SSL +implementations. WARNING: avoiding this work-around lessens the security, and +by setting this option to 1 you ask for exactly that. +.SH DEFAULT +0 +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.25.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSLVERSION "(3), " CURLOPT_SSL_CIPHER_LIST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.html b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.html new file mode 100644 index 0000000..f268c59 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.html @@ -0,0 +1,61 @@ + + +CURLOPT_SSL_OPTIONS man page + + + + +

    NAME

    +

    CURLOPT_SSL_OPTIONS - set SSL behavior options

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);

    DESCRIPTION

    +

    Pass a long with a bitmask to tell libcurl about specific SSL behaviors. +

    CURLSSLOPT_ALLOW_BEAST is the only supported bit and by setting this the user will tell libcurl to not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0, the SSL layer libcurl uses may use a work-around for this flaw although it might cause interoperability problems with some (older) SSL implementations. WARNING: avoiding this work-around lessens the security, and by setting this option to 1 you ask for exactly that.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    All TLS-based protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.25.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSLVERSION, CURLOPT_SSL_CIPHER_LIST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.pdf b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c974eb5fb5b40c28cdd339a8c7b9d393f423faf7 GIT binary patch literal 4100 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 Ju$ke|e*kFasM!Dj literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 new file mode 100644 index 0000000..4baa061 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_SESSIONID_CACHE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_SESSIONID_CACHE, + long enabled); +.SH DESCRIPTION +Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set +this to 1 to enable it. By default all transfers are done using the cache +enabled. While nothing ever should get hurt by attempting to reuse SSL +session-IDs, there seem to be or have been broken SSL implementations in the +wild that may require you to disable this in order for you to succeed. +.SH DEFAULT +1 +.SH PROTOCOLS +All TLS-based +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.16.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_DNS_CACHE_TIMEOUT "(3), " CURLOPT_SSLVERSION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.html b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.html new file mode 100644 index 0000000..0f32572 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.html @@ -0,0 +1,64 @@ + + +CURLOPT_SSL_SESSIONID_CACHE man page + + + + +

    NAME

    +

    CURLOPT_SSL_SESSIONID_CACHE - enable/disable use of the SSL session-ID cache

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_SESSIONID_CACHE, +   long enabled); +

    +

    DESCRIPTION

    +

    Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set this to 1 to enable it. By default all transfers are done using the cache enabled. While nothing ever should get hurt by attempting to reuse SSL session-IDs, there seem to be or have been broken SSL implementations in the wild that may require you to disable this in order for you to succeed.

    DEFAULT

    +

    1

    PROTOCOLS

    +

    All TLS-based

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.16.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_DNS_CACHE_TIMEOUT, CURLOPT_SSLVERSION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.pdf b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..467c624fe8856d8667739f4f53e44ccb6a8f908f GIT binary patch literal 3844 zcmb_f2~ZPR8dlH|+8a?(2W{~PC`otcA{|Lk2p~#?2_Pt9(IlNil5|WuCZKq&*RDFK zs5mQLh=_;L`N`;YH`85S)I zV`CgXG_34jnYoYvMqw&t8Wb3aM3P1gt%ZevqCmoQdYUxDNSL0WNg1i6RHRf2S!gp! z7$AGj!ihD;yTTqBFXOvhUVMJ(x}KpcJ+9==%_=Ccd5@-!B628%NBU7GF0H3D$Z2yRP`*o8~XL>XIgQ;B>(co@9H)U{9STtsBzrh zsiRM|TSb)&c5MnZA5ddp9*b>HmFpQU~6T9GYVbn9gHQU7W7%2)q9SGI96 zJhc93{f0;1yJp)xuk7k^RQB{H^sM`=;cgAYi3K;fm{*b^9KXG4QhfHx_p@t%JydFQ z^@@%{j;t+BJUc7*6Mvbu ztIICs#U<9!9o@U`ZM>jL@11!^IqOVmvSs%9rPcYDJl_@;OR59*zL&3`DII!u>Tg>@ zj*Yl-|Iph5YIkW-rB6*k)`8QS;StC3?J02Q%%_q?@=3Q6f4*V(BfHz<%+)Gwku8st z+c-;jc--X@`M`TgPo@sGuX$n_9-+;u_c*g~!qS*)E9SSKyLz+VbZ=_Z?*XqAmiIRv z&O5R&q9iKfMDY4Ihb2`VX20wxSx}qgmUS|IZ+7389a6k!Y`7-&uRbur?d$*-P1K4V zqk84=d`frIl`|^6?n|fnY`YcT-+dvKlE1zyKW=iBtuT1en)yZkw19|=iOf%*k=v{B zXgQ|-M%dr8V8|p1$Gx}kdHlXJZoQ6XRdpsG)|@VsYHxcCG*jC{eZ}mnRt)&0sM?2@=Yd?K%-qDN~`hx?)cet#LdqoXOP55exsBt$|SF?Ee&BEM>Bjs6r z!>&`fhyJS0wdT3|tHAwf)!vouyB7Q2DL_O~C`Zmwe`B*&MXo4WkRNk92~HD+_oW{Kjt zcb9lx=aU-3mW+-~P9vk$=BDKW2aoOFI z++A@mx)nX#bNgPk=w|P*M)ifU-3ojwdsh*M*G>M_?sbeiB5(h#@JbI`_;h>M#Xrou z(IaQFU(OY~UD!W!6;c+9`CTmYDvR6~Ngn391THImH)nT1x&OHP``o9z^lSL5XH~y% zAFSNa2l3llGVSL1@(L~Xu0vV?efSWRu-f|OY4pV9=O?tQDG}sEN#*$&XEs!1ovxx) zB|YD`rP;WlJ-d`Wdp^1j&-(}e(7Mv}MW(vJC8H}=gmMor%WtUbH)w>5$MsE}$}Yah zQr3G-al2MHhrjZT$Ayv4w^_U|J-?p*q@Rsjzwkl(AOH9Zy!myfF&+a)8&1=%AazYN+F)+n|6Z0R#xH#mb z@mnA)HqAsL(S(LXd*VIMEy`M&IWZC@2GAY^@>G2xgMb zsDUxA!<+x0(Q)cj$rwYLSPAlIn5HOws*Z-a9Gru(F`hrHHWLQYMwwG#j3Z?rz%0;+bHsD}e(u_1=XB#a;fIWvJx`Yp6MhnN`6GurI z5M2U-aZse$kPKYMtTWL%$_O)ti4@98OITK`P9+wqlp-~$B-lzdH-(L1q?(O_#TKLp z`M8Rw6k&X_*_^4Bn;+Q&2f!c?!~yKYpp#WrC25wh!lNVMa4lt_o9x3l2Nkjq=k>po zS0Fc^j{-=jGYo-%M=S@0t4@;v9FlTTOu$AlHY$omaWN(mqxeV^6QgJ#@(CwMJ`fE7 z?=SEk`yWJGakdhr%(0*(q#84&R>Lz$vxUh7#^G`~ye5kdF(+3b!sMt`biQ=F2$Nj? z-y>!)FeT0KiDi`1Y5)KmA^U#{=1b>TrTpNq$!gX+x}(aOCaijzC5}u#<-I1zcw7OPvmeti9uD3EpU}9xHZ&C6sVyJY zh7S{9V5okgPl&hi1ru`H@(BcBqJJVQ5VfTR1hn-<)Y@m-Oz8Ba8T`tGkr-V%31S6< zrx*oZJIwHgkqD!jf*pe#LLy{vVqkEvY)oiy052p=B;?CLEV+CcItCXBWqd(sC>NLh aIY$!nkh0K(nRXe*s##3FzDa;`Z_`Y literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 new file mode 100644 index 0000000..ca39a09 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 @@ -0,0 +1,77 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_VERIFYHOST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYHOST, long verify); +.SH DESCRIPTION +Pass a long as parameter specifying what to \fIverify\fP. + +This option determines whether libcurl verifies that the server cert is for +the server it is known as. + +When negotiating TLS and SSL connections, the server sends a certificate +indicating its identity. + +When \fICURLOPT_SSL_VERIFYHOST(3)\fP is 2, that certificate must indicate that +the server is the server to which you meant to connect, or the connection +fails. Simply put, it means it has to have the same name in the certificate as +is in the URL you operate against. + +Curl considers the server the intended one when the Common Name field or a +Subject Alternate Name field in the certificate matches the host name in the +URL to which you told Curl to connect. + +When the \fIverify\fP value is 1, \fIcurl_easy_setopt\fP will return an error +and the option value will not be changed. It was previously (in 7.28.0 and +earlier) a debug option of some sorts, but it is no longer supported due to +frequently leading to programmer mistakes. Future versions will stop returning +an error for 1 and just treat 1 and 2 the same. + +When the \fIverify\fP value is 0, the connection succeeds regardless of the +names in the certificate. Use that ability with caution! + +The default value for this option is 2. + +This option controls checking the server's certificate's claimed identity. +The server could be lying. To control lying, see +\fICURLOPT_SSL_VERIFYPEER(3)\fP. If libcurl is built against NSS and +\fICURLOPT_SSL_VERIFYPEER(3)\fP is zero, \fICURLOPT_SSL_VERIFYHOST(3)\fP is +also set to zero and cannot be overridden. +.SH DEFAULT +2 +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if TLS is supported, and CURLE_UNKNOWN_OPTION if not. + +If 1 is set as argument, \fICURLE_BAD_FUNCTION_ARGUMENT\fP is returned. +.SH "SEE ALSO" +.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_CAINFO "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.html b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.html new file mode 100644 index 0000000..7de718d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.html @@ -0,0 +1,69 @@ + + +CURLOPT_SSL_VERIFYHOST man page + + + + +

    NAME

    +

    CURLOPT_SSL_VERIFYHOST - verify the certificate's name against host

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYHOST, long verify);

    DESCRIPTION

    +

    Pass a long as parameter specifying what to verify. +

    This option determines whether libcurl verifies that the server cert is for the server it is known as. +

    When negotiating TLS and SSL connections, the server sends a certificate indicating its identity. +

    When CURLOPT_SSL_VERIFYHOST is 2, that certificate must indicate that the server is the server to which you meant to connect, or the connection fails. Simply put, it means it has to have the same name in the certificate as is in the URL you operate against. +

    Curl considers the server the intended one when the Common Name field or a Subject Alternate Name field in the certificate matches the host name in the URL to which you told Curl to connect. +

    When the verify value is 1, curl_easy_setopt will return an error and the option value will not be changed. It was previously (in 7.28.0 and earlier) a debug option of some sorts, but it is no longer supported due to frequently leading to programmer mistakes. Future versions will stop returning an error for 1 and just treat 1 and 2 the same. +

    When the verify value is 0, the connection succeeds regardless of the names in the certificate. Use that ability with caution! +

    The default value for this option is 2. +

    This option controls checking the server's certificate's claimed identity. The server could be lying. To control lying, see CURLOPT_SSL_VERIFYPEER. If libcurl is built against NSS and CURLOPT_SSL_VERIFYPEER is zero, CURLOPT_SSL_VERIFYHOST is also set to zero and cannot be overridden.

    DEFAULT

    +

    2

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if TLS is supported, and CURLE_UNKNOWN_OPTION if not. +

    If 1 is set as argument, CURLE_BAD_FUNCTION_ARGUMENT is returned.

    SEE ALSO

    +

    CURLOPT_SSL_VERIFYPEER, CURLOPT_CAINFO,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.pdf b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ba7cfd0fb202f02a0620b7e67d653b63800dbf1 GIT binary patch literal 4993 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 C?N~Yh literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 new file mode 100644 index 0000000..f2bad74 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 @@ -0,0 +1,71 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_SSL_VERIFYPEER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYPEER, long verify); +.SH DESCRIPTION +Pass a long as parameter to enable or disable. + +This option determines whether curl verifies the authenticity of the peer's +certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't. + +When negotiating a TLS or SSL connection, the server sends a certificate +indicating its identity. Curl verifies whether the certificate is authentic, +i.e. that you can trust that the server is who the certificate says it is. +This trust is based on a chain of digital signatures, rooted in certification +authority (CA) certificates you supply. curl uses a default bundle of CA +certificates (the path for that is determined at build time) and you can +specify alternate certificates with the \fICURLOPT_CAINFO(3)\fP option or the +\fICURLOPT_CAPATH(3)\fP option. + +When \fICURLOPT_SSL_VERIFYPEER(3)\fP is enabled, and the verification fails to +prove that the certificate is authentic, the connection fails. When the +option is zero, the peer certificate verification succeeds regardless. + +Authenticating the certificate is not enough to be sure about the server. You +typically also want to ensure that the server is the server you mean to be +talking to. Use \fICURLOPT_SSL_VERIFYHOST(3)\fP for that. The check that the +host name in the certificate is valid for the host name you're connecting to +is done independently of the \fICURLOPT_SSL_VERIFYPEER(3)\fP option. + +WARNING: disabling verification of the certificate allows bad guys to +man-in-the-middle the communication without you knowing it. Disabling +verification makes the communication insecure. Just having encryption on a +transfer is not enough as you cannot be sure that you are communicating with +the correct end-point. +.SH DEFAULT +By default, curl assumes a value of 1. +.SH PROTOCOLS +All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc. +.SH EXAMPLE +TODO +.SH AVAILABILITY +If built TLS enabled. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSL_VERIFYHOST "(3), " diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.html b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.html new file mode 100644 index 0000000..7b9a56c --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.html @@ -0,0 +1,65 @@ + + +CURLOPT_SSL_VERIFYPEER man page + + + + +

    NAME

    +

    CURLOPT_SSL_VERIFYPEER - verify the peer's SSL certificate

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYPEER, long verify);

    DESCRIPTION

    +

    Pass a long as parameter to enable or disable. +

    This option determines whether curl verifies the authenticity of the peer's certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't. +

    When negotiating a TLS or SSL connection, the server sends a certificate indicating its identity. Curl verifies whether the certificate is authentic, i.e. that you can trust that the server is who the certificate says it is. This trust is based on a chain of digital signatures, rooted in certification authority (CA) certificates you supply. curl uses a default bundle of CA certificates (the path for that is determined at build time) and you can specify alternate certificates with the CURLOPT_CAINFO option or the CURLOPT_CAPATH option. +

    When CURLOPT_SSL_VERIFYPEER is enabled, and the verification fails to prove that the certificate is authentic, the connection fails. When the option is zero, the peer certificate verification succeeds regardless. +

    Authenticating the certificate is not enough to be sure about the server. You typically also want to ensure that the server is the server you mean to be talking to. Use CURLOPT_SSL_VERIFYHOST for that. The check that the host name in the certificate is valid for the host name you're connecting to is done independently of the CURLOPT_SSL_VERIFYPEER option. +

    WARNING: disabling verification of the certificate allows bad guys to man-in-the-middle the communication without you knowing it. Disabling verification makes the communication insecure. Just having encryption on a transfer is not enough as you cannot be sure that you are communicating with the correct end-point.

    DEFAULT

    +

    By default, curl assumes a value of 1.

    PROTOCOLS

    +

    All TLS based protocols: HTTPS, FTPS, IMAPS, POP3, SMTPS etc.

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    If built TLS enabled.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSL_VERIFYHOST,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.pdf b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2bba56302748343e28fa952447ea8f90a6100649 GIT binary patch literal 4932 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

    , et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_STDERR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_STDERR \- redirect stderr to another stream +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STDERR, FILE *stream); +.SH DESCRIPTION +Pass a FILE * as parameter. Tell libcurl to use this \fIstream\fP instead of +stderr when showing the progress meter and displaying \fICURLOPT_VERBOSE(3)\fP +data. +.SH DEFAULT +stderr +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_NOPROGRESS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_STDERR.html b/docs/libcurl/opts/CURLOPT_STDERR.html new file mode 100644 index 0000000..50fcd93 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_STDERR.html @@ -0,0 +1,60 @@ + + +CURLOPT_STDERR man page + + + + +

    NAME

    +

    CURLOPT_STDERR - redirect stderr to another stream

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STDERR, FILE *stream);

    DESCRIPTION

    +

    Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr when showing the progress meter and displaying CURLOPT_VERBOSE data.

    DEFAULT

    +

    stderr

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_VERBOSE, CURLOPT_NOPROGRESS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_STDERR.pdf b/docs/libcurl/opts/CURLOPT_STDERR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..18a1a52aed85f1d83439a262762432312add5c36 GIT binary patch literal 3672 zcmb_f3sh6*9iOYUjd|sc}jA)8?4;!iT5Z%b)AKwBoMxVad*z86UrtTRU}a?Aj?YBZo}h z-oE8nN6zx*dJ~8yEt8@2e%7T+^ODwQP#5wm(>K$H7F@2H(D_u;s|ii7Hyvx-*ic&X zowfbj>#v{sx8>8t?lpH~qw=nYTWewC zTyFoQn+;S=?(DJT%4^#bD-*62<>mgvHK957t^9-0f4o}Is@=<49xS|!YG!VD5A8|a z`t0^Gs}{{_TjQNIX2PZ{&6GV??w#7b>9?bP&#sL*wyxydy3Ox>`bLgh#+F*oGz}SQ zy6yei+_7reh*x4)^Cx8W4XgM62~ ztvlQJW&Y)YsWBC{T_rzhZLiJ!X?*+M@w2;jAPt3r%#suVR2L5^oa>aj5)fiyA<2^EIfUfR(buwsuq$uY3DW7_1iO)RS6qvs+P{ZaxaKR zuDH7I?QKh*IsZc1ulg_7_v%h@*VC$Qe@PmLlwKlN!HyPRc8-nwv{gdu& ztXjYRFI^9X3d3>mRh2RGf;@Kgs67vhp4zD+m%UsYy`mh=PZ;qUVy{KXPkP{mTW>|f zJ8)as(1SY;t(u<5-*|@eZtcp~tr>g%yuG#l?;A%a$9dw+3wE^qm96Le-WL+G%6}K&Yqx0y#Z-QwRb52~mv+S^I^cV5TgMSuP zm-?^3=|P{rQ~u|UE4f9sl%4nLA9M~~=RI77JdOy+@JR%w2uJb1Mnw}5lClT0*%e*{ ztxPe37UW==WG(;-N&HzwtAIu+pGiO)Ctw5v5_9p$BLIa6Z%jr$&d=MC4+G!IbM`DG z6hb^20L(@K0n4QXglSnJQHlzSm^my?$wM!A7C<9@#~OV=oFO&>lOq0!Cc-lXYr_tL zkcU11(^-cP6cVEUHex2g8vLTlUZSF@$T$j18X19camC##BHmk&z&P+1K!tVn*iPuH zpeGChW?C(PG8iIGhN6m?vLz6roUKPqD9rA!6iHBGQf<&i6Lk2XAvBLkh#V1#WX6ZY zY{6{SjeOEH90F?(r2>j%0%rM(1hH~rjM$~_#EH5GR*}rP96vyT=+nRoY@D0%^wyB# z!84up6ay-h)BomD=xao!=q>D)gC^GLM7X7J4;2zrf&#i(kKZ@5Cz?=gdW&{fttb9` zOGfv#Ln)MMgCWxUx}<=Yv6mtN6rp0)qnF&=wO0aIhhCDWvXB<95tXp1K^|oVU(2=! zOYO8nl4KxsNeqSzk_H&B)EThZmd?S&j+^B;+Me6o;FGCSvn zY(Au9Bm}2y8DLro=M%#A0WBld5*P{pNqL29 zGjJAgK_h9HgJ5M@ajMrlM-x+he z#g-QNv?k8(cjI}TX8L~`=1JGsVSnVX*U!5`=y2E}av{+-A1*V6J$Bf&PL6joxVIUv z7Y|QHY8 zL--JqgFU(is8xuBv5m_HA59Je0iMwF~k91%2390)Iy9$m!&9ytjTP%1(k zSm6h#RVsxFI6;I)Q5qb8_yA8gO+l*h>d}`*QF45r^`()tx<3ua)Spj@*NMKelw65d zgU4t%8~tcX1>V#i<5Q^dh5Q&zuIW!xQ2l8tO+TM0wX#6p~Ihsx, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TCP_KEEPALIVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPALIVE, long probe); +.SH DESCRIPTION +Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and +frequency of these probes can be controlled by the +\fICURLOPT_TCP_KEEPIDLE(3)\fP and \fICURLOPT_TCP_KEEPINTVL(3)\fP options, +provided the operating system supports them. Set to 0 (default behavior) to +disable keepalive probes +.SH DEFAULT +0 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.25.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_TCP_KEEPIDLE "(3), " CURLOPT_TCP_KEEPINTVL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.html b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.html new file mode 100644 index 0000000..765594e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.html @@ -0,0 +1,60 @@ + + +CURLOPT_TCP_KEEPALIVE man page + + + + +

    NAME

    +

    CURLOPT_TCP_KEEPALIVE - enable TCP keep-alive probing

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPALIVE, long probe);

    DESCRIPTION

    +

    Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and frequency of these probes can be controlled by the CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL options, provided the operating system supports them. Set to 0 (default behavior) to disable keepalive probes

    DEFAULT

    +

    0

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.25.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_TCP_KEEPIDLE, CURLOPT_TCP_KEEPINTVL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.pdf b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f60961a91653768e6207d74d35d4acfed8cfd99 GIT binary patch literal 3872 zcmb_fc~}!?8n1Xyv4HEYVg*N73`&!k$wd;9AP`^?BQan_k;;%vAd+NaGDrv>>kX|% z77BQQ*QzURElQPEv7klqpu$qoT0DxktV(%wMNx3SNrE7-+wSu?|M2Dg-uw7{FFp!c z7!zZ0A)lHD8+JlG7=_8ig^*Z`%peR&R5Hv56eSX-)lq~AM#6MBMaT#hsV1aS$V{0C zTn|~c=6|RsZ-lvaJz9V%D>we(!NX4;{<~zh59{vq`Aeo9kI0xlRhBUF>uh=Hx6#Wk zbk>~Tzrb>iSCaG2fig~=m{X@JUNL&ug^HHClX;Jqc{Lv}`iez$@0G1nEdQYRmynf% zc08XnSJ>z=EO%AR%GFRVqvqI=P1U;=u_O1ND*Ko3__W+g51%Y(UshB>cFo9|dh&cx z(}v;Y|2*dRD4_JG)`m^RW0A7p!smw{JozRn{^h|lWlpTzuKXpYAud@tvm18B>`B-# z`h4kWr{<}vBR?Zu+r^%)%^^`ko;H+{EB9roq;2{C$Xl9S+q!P1(8n{sUUg-{kI>7Z zlTT(Ux6V=g5^zt~m9wzQ{A};4alZK{8m&!R_P*cr&QA4rQ?g^TO78EFZG8D?&Zwrr zNB(+Rv4&R>-&K0X(=W5;>Y_7QLGC&Ar{tB+;WzImSbuhYy6j5kiytS){r$!6wF_#U zuWj)^*wuKY+4Ii_@+v;J#@`xemhQ>O7}9$2v2Ih#qubkKeh44iAkJ9LOuW=yv`znN z?>*-JVI4KeR-XI%yyMBSb!CYyhxk|8DtxB@t)5JO@?i6~p@YnEMO6tyGv7ZuA-3Gp z`I>sYTi`9;QNbk6_M0X1bEefVo)%Q}jFRP|i@4RIQ%~Zm%H^9+tU7gLZUj6xCANj? zaymW!i^U!3UzM#PwyrKNIf#wszOdZ=?v{tA^&9Vo`22!^c@Ia8+^4&k_~pCtZu6@W zi*ZTQ>R*?7O(ECK6cqmHXRo@m@x^1{?tQ^^%tEZIpZ(Zo1~YI*F4)^?j7yw z=~gn!=V@BOh59k4CrX5TR5N~g#eu!G zT*V6ymwD~$^A2~cpjO3BpHlH*@{>PKs44M?S~#M()OF*!(9L+eV8=3_k7qgUIt({V z($>eeHu_2*`&ED8T0JNCu;XPwJnOtyS=X2&&7@K zYFfB9y6$je<(lsY554d5UW*}%X|E7YTFd!sKA%`)k z)ZwHpDu*ehKSawZd(_y%?7qcNkbe3eQ3@fU{UCq@eI#fOheR-LCg^M-Fv;TZc;8TcleKk!dv=0<;w9p*RTh=OB8mA=Mn;6OFAly+ymL))RlMd`9>4iE+4m zsnpT@;y{ZLSEUdXoJb^T4H8D{(MkraRZAFicyd&33?Y)Wf3cc~XzR=vl{G~rR5Jpl zkT?(rGea;fxRI%`y~AdhFsme9A<7wHUNnP6WYHV-pm|`6US}|iEE0xIL8DYRS z7Ai%;h?Of~iX?R@S_)>fge;7SaXx@GCR|UXk){+FWAPb4rAe(3DZ$*>6@p(9MlwYi zMF^6Xmc~lsut-x9f(eB}1Z5*^HWP3#&FKaTw=fN6Z(z^nh&J}Mn8D1l`NUF@dPEzG zU@R2rHY5Y#n6ySpOB!I>FrG-JQW8dLs#Y!H6MRg_;sXB@woo%pjtL@d$ zX{GjqO%CbNH9)OwBrw~cY{+ZmkV5cV`re+R9=HULn}m@@gCRJ*xk=Cuw*!s4=h}Cm zv7Q26c6v%c!s$8jm5JyfLorl<3Ne9gz8EOV0Bm3me}ls@4ZZ`-%aqqovBgAaAQZ-U z5Di%N59afD93HHJ9W;z100Gb+Z0M$O*nF^hyh+12Z1A4-p<(=fG!(?tpO4#*594yd zYS2fYKMMAgJ~TcDtZIE|JU)1k`_Q<8{xlxepXM*K&6#15@FDguzg)aB4lu!n2&~{oRH93Tk~HQ3 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 new file mode 100644 index 0000000..1724824 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TCP_KEEPIDLE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPIDLE, long delay); +.SH DESCRIPTION +Pass a long. Sets the \fIdelay\fP, in seconds, that the operating system will +wait while the connection is idle before sending keepalive probes. Not all +operating systems support this option. +.SH DEFAULT +? +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.25.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_TCP_KEEPALIVE "(3), " CURLOPT_TCP_KEEPINTVL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.html b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.html new file mode 100644 index 0000000..a575947 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.html @@ -0,0 +1,60 @@ + + +CURLOPT_TCP_KEEPIDLE man page + + + + +

    NAME

    +

    CURLOPT_TCP_KEEPIDLE - set TCP keep-alive idle time wait

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPIDLE, long delay);

    DESCRIPTION

    +

    Pass a long. Sets the delay, in seconds, that the operating system will wait while the connection is idle before sending keepalive probes. Not all operating systems support this option.

    DEFAULT

    +

    ?

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.25.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_TCP_KEEPALIVE, CURLOPT_TCP_KEEPINTVL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.pdf b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdcc1793febbbdd1396e09cbabafc934a0f9fc18 GIT binary patch literal 3761 zcmb^!c~lc;exFpaQy0N@S$65Rqk@4~lbOjR->R#k(pHp~DjtY*ze$21&~5iUzkl-0@B7_% zg5xz>J|+-B!3}qcsvt3p!gR(wNTEPtNoyvX1&0BM9??=}mSkW=YbIDyLmFr!sZ>IC zmLUlXs$|)FjqzTsemA$?SUu`L z52JqL;?!pAM!Uei-_4)|drt?S^ip>5;eZq-*>~w__$mHL8=hIu@n- zPmxX*b!~!6uAblcZu{Dfs}Pj7&+D~fwDezEHn?na!Jd>*=Yw^A`E~cI#LJ5=c0HXs z&Uhu$&+omn_nSfjb#q~I;tHlN@y9i@dJ20d#HreCDpXI^uK2Up%)ji% zr~P=e<;%#wACNr#E@F0a(T>DhJ-1Fh@rzO&&t80INBX3e6(?-vV{1yP50>50UB2-+ z9gERiJW)S-?1YI_%c0BXCZS0due)n*2hBa#Hg2uP{Ao?L@9oiM{rXl%QbkEf)i*V% zdy}2-Y=|kSOEM_X5OlgmS@ZZ@RrQCuvF)c)(_X*5``^u%M$~7ee>`jZwf!M8?!P)? zS9EcT)*GsM=YIqtTCE%4+0Zj$#s|vI2U$ajx9qyX=#-$d~RkbqU)7;~KYc5=Hp@&(0 zpmqg%b#?^Y^bS~=ojk?2?4v)t^;)ah`$1Rf=&|R&*pgo<-j{zk-`^*?adJ-1 zIv=G^3(XjTlD5hVGVh|FzHIE#Q*z} zz?Pu=2>D4L&CK!ZJCsP9X1f2x53ZjK{o`?iIcVFqTtnAt+;IKq5!s@vD}Var{;`qG z0Zlb47j!hdw8|$dy2>YO_T~2Q)u*z2(<_!#9!qO$opGaO&xnd$hc^8F!P91TOHj_j zqo)s6Z|#jDtwvAvf*V)yT%B{jGLaPWfJFVxATifQBJo5fiRefpMMTn0I28rYVwo70 ziiBwpqNiEV8ekM)F{G7+ajtIwFlnb9jDfU+juOw%h6IvLML^GikwntT0=g(CJ1xOQ zieYXNEe*&qq3Z)Q8AJ`f0Y^K`H77j;Kpy=#5$96-v6^7J`3rJ7&~Go9JT!lS*8WCrfOk~gwHk{{hP)2ze8HUNkB7$!)2{ZT@Mw<92IQ$GkY7m=DVljc^ed25b z)O=1JcmM)%;0JJ%gT`QV7)U0ZH!VIEo|Z-1S+{&xCP2e@h{yaFr4@+H@Lm7`^|(O+ zaO66WxTahUXlqI#ii!Cs#z&=zs7#JYI=SBOAu<3OF+hZ0Bm(m=bTtgci z7SOL_H2+V+yyzGk4bK#|IT*96I*bN{G?Sceb`WL^XlyjdO*CU6KyDK@8)%*cm+}b6 zNuE*x9$AVtlS)_ZMVMLl#Y}OvBsUY*%y6EQZzN5G!_4xONmduO(H#vlrF36hbVxt1 zVPfS1f!YRPL!NaGB?P~q^Wqrww@WbG!g)DdGX%Hi7YS}~d%AI7U55-;)}dgsb5#Ny z&echXM$Q!(ilI_ehDlxZ#Y0gZKm&F7D;SHc8Fia=`y8(A#Yaa~9#9;hC55t7q=pF<^#Y12yuxThB4rbvXS{w%(*dUl#28R7$ zm~bdRkr=EMgYa<4P?!iE3Ja4A(HRWc0X|?Ef-;i~_)7>Q2~-{l{0D<=j|K}Bh_oI? zVyq?_=AsVPy%-Igs)&?|G!a;&C{imyr6N2^7AcDmsw2YGLR=P!3o+%dW2AArnw=#W R))h1yN2O43a8#TY`Y&ci32^`b literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 new file mode 100644 index 0000000..e4bcf7f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 @@ -0,0 +1,43 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TCP_KEEPINTVL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPINTVL, long interval); +.SH DESCRIPTION +Pass a long. Sets the interval, in seconds, that the operating system will +wait between sending keepalive probes. Not all operating systems support this +option. (Added in 7.25.0) +.SH DEFAULT +.SH PROTOCOLS +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_TCP_KEEPALIVE "(3), " CURLOPT_TCP_KEEPIDLE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.html b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.html new file mode 100644 index 0000000..b7579fb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.html @@ -0,0 +1,60 @@ + + +CURLOPT_TCP_KEEPINTVL man page + + + + +

    NAME

    +

    CURLOPT_TCP_KEEPINTVL - set TCP keep-alive interval

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPINTVL, long interval);

    DESCRIPTION

    +

    Pass a long. Sets the interval, in seconds, that the operating system will wait between sending keepalive probes. Not all operating systems support this option. (Added in 7.25.0)

    DEFAULT

    +

    PROTOCOLS

    +

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_TCP_KEEPALIVE, CURLOPT_TCP_KEEPIDLE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.pdf b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7982babe08779dea093e162b9ffe13b233750140 GIT binary patch literal 3608 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 ml9)!XOV*H`QMAt7~|4fziyUAbfc literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 new file mode 100644 index 0000000..bd13516 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 @@ -0,0 +1,56 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TCP_NODELAY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay); +.SH DESCRIPTION +Pass a long specifying whether the TCP_NODELAY option is to be set or cleared +(1 = set, 0 = clear). The option is cleared by default. This will have no +effect after the connection has been established. + +Setting this option will disable TCP's Nagle algorithm. The purpose of this +algorithm is to try to minimize the number of small packets on the network +(where "small packets" means TCP segments less than the Maximum Segment Size +(MSS) for the network). + +Maximizing the amount of data sent per TCP segment is good because it +amortizes the overhead of the send. However, in some cases small segments may +need to be sent without delay. This is less efficient than sending larger +amounts of data at a time, and can contribute to congestion on the network if +overdone. +.SH DEFAULT +0 +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_TCP_KEEPALIVE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.html b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.html new file mode 100644 index 0000000..7f2ba49 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.html @@ -0,0 +1,62 @@ + + +CURLOPT_TCP_NODELAY man page + + + + +

    NAME

    +

    CURLOPT_TCP_NODELAY - set the TCP_NODELAY option

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay);

    DESCRIPTION

    +

    Pass a long specifying whether the TCP_NODELAY option is to be set or cleared (1 = set, 0 = clear). The option is cleared by default. This will have no effect after the connection has been established. +

    Setting this option will disable TCP's Nagle algorithm. The purpose of this algorithm is to try to minimize the number of small packets on the network (where "small packets" means TCP segments less than the Maximum Segment Size (MSS) for the network). +

    Maximizing the amount of data sent per TCP segment is good because it amortizes the overhead of the send. However, in some cases small segments may need to be sent without delay. This is less efficient than sending larger amounts of data at a time, and can contribute to congestion on the network if overdone.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_SOCKOPTFUNCTION, CURLOPT_TCP_KEEPALIVE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.pdf b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7277e8e5eeecbfa2d97a8f46b2ac2255829e0a15 GIT binary patch literal 4246 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 b{(FuTYM(NZxRJCch{eNLkgsoOlnnYe(sJuF literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 new file mode 100644 index 0000000..f5a9bc5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TELNETOPTIONS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TELNETOPTIONS \- custom telnet options +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TELNETOPTIONS, + struct curl_slist *cmds); +.SH DESCRIPTION +Provide a pointer to a curl_slist with variables to pass to the telnet +negotiations. The variables should be in the format . libcurl +supports the options 'TTYPE', 'XDISPLOC' and 'NEW_ENV'. See the TELNET +standard for details. +.SH DEFAULT +NULL +.SH PROTOCOLS +TELNET +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with TELNET +.SH RETURN VALUE +Returns CURLE_OK if TELNET is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_QUOTE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.html b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.html new file mode 100644 index 0000000..ac50076 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.html @@ -0,0 +1,60 @@ + + +CURLOPT_TELNETOPTIONS man page + + + + +

    NAME

    +

    CURLOPT_TELNETOPTIONS - custom telnet options

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TELNETOPTIONS,   struct curl_slist *cmds);

    DESCRIPTION

    +

    Provide a pointer to a curl_slist with variables to pass to the telnet negotiations. The variables should be in the format <option=value>. libcurl supports the options 'TTYPE', 'XDISPLOC' and 'NEW_ENV'. See the TELNET standard for details.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    TELNET

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with TELNET

    RETURN VALUE

    +

    Returns CURLE_OK if TELNET is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_HTTPHEADER, CURLOPT_QUOTE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.pdf b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ade0176ad696ba22735bb0c6e0cf601c4560d8ac GIT binary patch literal 3661 zcmb_fd0Z1$9{022HFzKUQSq2caqvjy$Q_eVAbyS)f$|MtJCJ=N{Tkm_7 ziu9w%dVD-k>x!(mcGX2ZD(X@d59+FGZAHAQTk5%Qh9HP`yZib0{>hu)`~HsiJ70q0 z%#ku&u7rXr?=D#jsbCCd(?5j_1~is(WeAzD8c?igB+UpE2cwY;DNtt0#@Z>93E~Bg zBAt+T)uN>O#Vbd5e|{#RTnOnrVhYi=^WbRtvYp@eM*Id$IdEe5l(OWNwYO#-#=Ywd z-yXdAr1K;OSurYwDBHMUf9d{xzd&DLe|}VLx|mvDadlQ@^tuO|^3NCPXa0M~cSiy~ zYcuxc2ZPGL@7ngF-^JZ?Z_lXt^yw3B&@si1o}qo)9qB%eULDmpYJE*+;r2<_%29p# zhV1e^)!Rn3y)Y;LP;|kaXQk0~+_-?if`qWmTW&7dI&%1)j?XrFH>M0l4qfpx`6C63 zgYkYF#s`vvJM}7wsR~?qY37$$*#M8Me+;%FD{%`#0ZPxS~sKLej#rUMU5WvW+FBe|c5P>_Tt#+c`JumxeM}%#*}HkGfpl_@_Q6nZo)Wr%V^1ZKv|WCv3t*6;Fi(7%4ojX1KZ$m7%`b4Dl>=-cPj>Wd7v`5KZ&9V;6KlCRa&F?$o5B;)x zK0nvB$8Mu;zz@?(E^RGd{LorV&_y{yY~`Iuym#f7cTyLvDXQC7n19z>-udX@Vm{KQ zW>abk(?3g744j}De&+b!hmV-@!;a|BSos?#3mi>$8?T(Wxf*PEw?1~nL7 zV*WDZ;w( z9sNJ9sNZY2+iu^vQK?B!wdjIMNA$}jm(iz&?x*tnH0_VZKNz@S$x-U;SK9|i1e&&W zdzNGAu%*Fh@8%qOytJz3N5`hESEd)9dlsx7sVm#HZrc1$PTyFnSx`3g)!q>^+8nz+ zVtN=O#i~$r!xdd1twhch0c-F(&C>}JFIF7X?P(msSS`LgRQeFY@MR;E^Z|Md8V?AGG1>AT+^~ zE{L%bZv~8Ka+N6W-2$wvlXSI|5a9yNopxowI3Zc{D-xwspGZ*|+Qf&NX@`RXIRJv5 z3gH?B>ZDyBKCRgp$(b!#o7~)NezGODY5w2}rP^fjC95IC>n3eklmMqw8MMoY+~5B- z0@HRQGEQZ|EbeeBlO8>pqY@^6oM@YzWz*S_5EEnwAwiB)GB4?tIix|x!xV2b4hgr$ zMh+1HUcJ}pc7kZbUMJ(?^ zM>?romdk>1xf%f?IlDt|1&Q7$5PTVtOhIt#Q8YI>vTF4BT#~n0fdat za|xtZ=Hdf^KFJU|`8Au1mrFLuZLAZelTlobp-qa+;5r=b7HHN5i;Br~)*~1ZkB7GF z)s!07sg$J5<{;8#I8Hfa7+5luDqWjSPznN9;!Wz@EzEpFA2x-FLf?lGrROlc9PH?ua66ExT{=Km*Q-gk`cw$}!`Jscxd zhuwx!3?X^bT(KE~-J6qNZ1cWu+*H@W?<(tIU=)j00vs;ZNw8Tj78!SfsL+3Dpd2ZX`65)vC$^-9G~nGJF4)yXQ(zh}``@JD zgg9$k(J<9pGz{G7ZJYu)sTHpRSkaoM5~qDDoKpEVPN4zMt=2f~ZJJ8=wqA8hn+1-f z8Hxjc*I+b(o=gE>!Qd&zg4d2XykT^V%fZ6ZAcxQ~W;oSg)`V*@r7~0(X2!$RW|dB@ n3JX&y!Zcb!LttRk{x%{_d`R&E$q7<`6a=A#f`TH(MneAq&BfN* literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 new file mode 100644 index 0000000..05bc639 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TFTP_BLKSIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TFTP_BLKSIZE \- TFTP block size +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_BLKSIZE, long blocksize); +.SH DESCRIPTION +Specify \fIblocksize\fP to use for TFTP data transmission. Valid range as per +RFC2348 is 8-65464 bytes. The default of 512 bytes will be used if this option +is not specified. The specified block size will only be used pending support +by the remote server. If the server does not return an option acknowledgement +or returns an option acknowledgement with no blksize, the default of 512 bytes +will be used. +.SH DEFAULT +512 +.SH PROTOCOLS +TFTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAXFILESIZE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.html b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.html new file mode 100644 index 0000000..080d612 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.html @@ -0,0 +1,60 @@ + + +CURLOPT_TFTP_BLKSIZE man page + + + + +

    NAME

    +

    CURLOPT_TFTP_BLKSIZE - TFTP block size

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_BLKSIZE, long blocksize);

    DESCRIPTION

    +

    Specify blocksize to use for TFTP data transmission. Valid range as per RFC 2348 is 8-65464 bytes. The default of 512 bytes will be used if this option is not specified. The specified block size will only be used pending support by the remote server. If the server does not return an option acknowledgement or returns an option acknowledgement with no blksize, the default of 512 bytes will be used.

    DEFAULT

    +

    512

    PROTOCOLS

    +

    TFTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_MAXFILESIZE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.pdf b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef1d0fd723c050f949a5ed92a237e2e338ed4b2e GIT binary patch literal 3830 zcmb_fdsGu=7Vlwgk4|0d>qu3^fr`OLGBXKzngk^eKna8Z3d>?0k_kkTOqiKSKxw6d zRjH`ms_Rx@QMT4s_b7sb6;apna;+S#S|4Dwy4$5I))&PB-EWd057}+^9Ooat-0$As zec$^Lq*rUX7%v10s{ek|E=UNYFqyg>lFN}O!k)&Y!y-U2AXOX5WnOu;Is&e!c+~p2SkMcJ%9b_9bRNGprNgYeAzu62&M%g%*{AyF zJByPgi!gZeyX6_Gwz6A-2dei+1e7PAsT@TIDEz{4Ukj7?e~PcjJn!c}zjZ$P`1kiSkFB(7RPfE< zM{7Um$}i~FFP(WA${Y9P>#B{*CcHrh=jXPBRlerCJ0Z~3Q0Q|%|J&jPwQEwTBxE($Uc`>sk+OYMku{1KaUHUjTa#eW6)%E=5maFEI*AtwDQDYa+=T;>Y zzOt+LlZCf-<{!z(j%_~aciOaJ>o?7NM^1q3=X@t%KZmraTJ2+}79?=R`dtyBs>%O)l{^++$nzHHR%-J!v6MLUwb@7)vV>Sr4T$?(NkhMoRY(aNN-pN`#X7Zt%dST>; zVbp3hoqN5#vn_jkXmVtOOg$yspXzRf$LCH-(cSsfs9LkJg#Q1py*D^*Ao9drKOYJ*WMa4vgCee?6$@{ z?x}iR*pKa%t$(ZtK2f4`{G`9Zl!gC2cGWaR^78r*v87o@e%IU*Sbb^#f}Pg2c9%v} z7tmN!*WP${#v#8e-MNP&F8Ocs%`9oPp3k0mD!7DGA68O*;UxT-wv_ip=8U#CzBHYl z`JMS%JaRSfY5mzB^2#RYZ+~}fLw9uTM!mG2Q&lj|-mpI7_R1g6)Q&L6eRlPs>P+m8 zSqnF|J$N*|s&O_!*iGKn2Pbx1utS3Vi=n6#^3p>3M@f9PgFy6n8iD8tlLZeWU2rlA zu7y$|ED7PKK!|~4z+iz3=iH zed~o}tws9e5Vgf@CO}Dn8cK$+5EL<6AWSSkY!p?E!hH%Yhp+2nJ3i(kylbr{nlZ4s06VBbiipdJjyL9H7^Nmo zs1lNg;-Ga1t_yc?&F<|=!vt+q1gZ>C+CY}UC3D#vHc&&b%VxFHGM9qm7LkE7OGY@b zn}x|xa1wQTm?24PhJ}IoJSh+3VuHD_nZj*E7D;8m7*E6jkd(CPPsk7QK zeud}&&HDVE5X`EgEV8nVv|v3CMg>ZY8!Vr zzzoINl1D&Ia+Gp#$ygXGp>+4&0xRP=SS@TX$*j0NO~G+-O@tYDS{aTq!S3cZd9q=( zC_M+a9MX?9Os?D{(Ayww$n(jegy5I-y*!})aS3*uf|JD#LvR}WpkVj6cN+Kgb?|U) zJqs*&wo5?3***zY%h)DEF;s#|F^RjsI4H^iY@iQ+fy3Jk!Nc{-tmhlqMG zV7CsI#Y937%po+P1iU1M(lD^thtNU, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TIMECONDITION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TIMECONDITION \- select condition for a time request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMECONDITION, long cond); +.SH DESCRIPTION +Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE(3)\fP time +value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP +or \fICURL_TIMECOND_IFUNMODSINCE\fP. + +The last modification time of a file is not always known and in such instances +this feature will have no effect even if the given time condition would not +have been met. \fIcurl_easy_getinfo(3)\fP with the +\fICURLINFO_CONDITION_UNMET\fP option can be used after a transfer to learn if +a zero-byte successful "transfer" was due to this condition not matching. +.SH DEFAULT +CURL_TIMECOND_NONE (0) +.SH PROTOCOLS +HTTP, FTP, RTSP, and FILE +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMEVALUE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.html b/docs/libcurl/opts/CURLOPT_TIMECONDITION.html new file mode 100644 index 0000000..dedeed0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.html @@ -0,0 +1,61 @@ + + +CURLOPT_TIMECONDITION man page + + + + +

    NAME

    +

    CURLOPT_TIMECONDITION - select condition for a time request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMECONDITION, long cond);

    DESCRIPTION

    +

    Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is treated. You can set this parameter to CURL_TIMECOND_IFMODSINCE or CURL_TIMECOND_IFUNMODSINCE. +

    The last modification time of a file is not always known and in such instances this feature will have no effect even if the given time condition would not have been met. curl_easy_getinfo(3) with the CURLINFO_CONDITION_UNMET option can be used after a transfer to learn if a zero-byte successful "transfer" was due to this condition not matching.

    DEFAULT

    +

    CURL_TIMECOND_NONE (0)

    PROTOCOLS

    +

    HTTP, FTP, RTSP, and FILE

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_TIMEVALUE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.pdf b/docs/libcurl/opts/CURLOPT_TIMECONDITION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c4f1b65341f9b5f99196508f7aa50f7a5b316f0 GIT binary patch literal 4165 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TIMEOUT \- set maximum time the request is allowed to take +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout); +.SH DESCRIPTION +Pass a long as parameter containing \fItimeout\fP - the maximum time in +seconds that you allow the libcurl transfer operation to take. Normally, name +lookups can take a considerable time and limiting operations to less than a +few minutes risk aborting perfectly normal operations. This option may cause +libcurl to use the SIGALRM signal to timeout system calls. + +In unix-like systems, this might cause signals to be used unless +\fICURLOPT_NOSIGNAL(3)\fP is set. + +If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the +value set last will be used. + +Since this puts a hard limit for how long time a request is allowed to take, +it has limited use in dynamic use cases with varying transfer times. You are +then advised to explore \fICURLOPT_LOW_SPEED_LIMIT(3)\fP, +\fICURLOPT_LOW_SPEED_TIME(3)\fP or using \fICURLOPT_PROGRESSFUNCTION(3)\fP to +implement your own timeout logic. +.SH DEFAULT +Default timeout is 0 (zero) which means it never times out during transfer. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMEOUT_MS "(3), " +.BR CURLOPT_CONNECTTIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.html b/docs/libcurl/opts/CURLOPT_TIMEOUT.html new file mode 100644 index 0000000..1b1b784 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.html @@ -0,0 +1,63 @@ + + +CURLOPT_TIMEOUT man page + + + + +

    NAME

    +

    CURLOPT_TIMEOUT - set maximum time the request is allowed to take

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);

    DESCRIPTION

    +

    Pass a long as parameter containing timeout - the maximum time in seconds that you allow the libcurl transfer operation to take. Normally, name lookups can take a considerable time and limiting operations to less than a few minutes risk aborting perfectly normal operations. This option may cause libcurl to use the SIGALRM signal to timeout system calls. +

    In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set. +

    If both CURLOPT_TIMEOUT and CURLOPT_TIMEOUT_MS are set, the value set last will be used. +

    Since this puts a hard limit for how long time a request is allowed to take, it has limited use in dynamic use cases with varying transfer times. You are then advised to explore CURLOPT_LOW_SPEED_LIMIT, CURLOPT_LOW_SPEED_TIME or using CURLOPT_PROGRESSFUNCTION to implement your own timeout logic.

    DEFAULT

    +

    Default timeout is 0 (zero) which means it never times out during transfer.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT, CURLOPT_LOW_SPEED_LIMIT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.pdf b/docs/libcurl/opts/CURLOPT_TIMEOUT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..958c7621ea42b2f045b108e88da7d43ff8cc69d6 GIT binary patch literal 4495 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT_MS, long timeout); +.SH DESCRIPTION +Pass a long as parameter containing \fItimeout\fP - the maximum time in +milliseconds that you allow the libcurl transfer operation to take. Normally, +name lookups can take a considerable time and limiting operations to less than +a few minutes risk aborting perfectly normal operations. This option may cause +libcurl to use the SIGALRM signal to timeout system calls. + +If libcurl is built to use the standard system name resolver, that portion of +the transfer will still use full-second resolution for timeouts with a minimum +timeout allowed of one second. + +In unix-like systems, this might cause signals to be used unless +\fICURLOPT_NOSIGNAL(3)\fP is set. + +If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the +value set last will be used. + +Since this puts a hard limit for how long time a request is allowed to take, +it has limited use in dynamic use cases with varying transfer times. You are +then advised to explore \fICURLOPT_LOW_SPEED_LIMIT(3)\fP, +\fICURLOPT_LOW_SPEED_TIME(3)\fP or using \fICURLOPT_PROGRESSFUNCTION(3)\fP to +implement your own timeout logic. +.SH DEFAULT +Default timeout is 0 (zero) which means it never times out during transfer. +.SH PROTOCOLS +All +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMEOUT "(3), " +.BR CURLOPT_CONNECTTIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.html b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.html new file mode 100644 index 0000000..383bff3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.html @@ -0,0 +1,64 @@ + + +CURLOPT_TIMEOUT_MS man page + + + + +

    NAME

    +

    CURLOPT_TIMEOUT_MS - set maximum time the request is allowed to take

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT_MS, long timeout);

    DESCRIPTION

    +

    Pass a long as parameter containing timeout - the maximum time in milliseconds that you allow the libcurl transfer operation to take. Normally, name lookups can take a considerable time and limiting operations to less than a few minutes risk aborting perfectly normal operations. This option may cause libcurl to use the SIGALRM signal to timeout system calls. +

    If libcurl is built to use the standard system name resolver, that portion of the transfer will still use full-second resolution for timeouts with a minimum timeout allowed of one second. +

    In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set. +

    If both CURLOPT_TIMEOUT and CURLOPT_TIMEOUT_MS are set, the value set last will be used. +

    Since this puts a hard limit for how long time a request is allowed to take, it has limited use in dynamic use cases with varying transfer times. You are then advised to explore CURLOPT_LOW_SPEED_LIMIT, CURLOPT_LOW_SPEED_TIME or using CURLOPT_PROGRESSFUNCTION to implement your own timeout logic.

    DEFAULT

    +

    Default timeout is 0 (zero) which means it never times out during transfer.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT, CURLOPT_LOW_SPEED_LIMIT,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.pdf b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f5ced77f40c51f503a40bfe8fe9f55f7b8ce3a4d GIT binary patch literal 4623 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 Yh+R#K3pKbgXdb91LUMHtm>5X<55RPVp8x;= literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 new file mode 100644 index 0000000..43a3871 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 @@ -0,0 +1,45 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TIMEVALUE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TIMEVALUE \- set time value for conditional +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE, long val); +.SH DESCRIPTION +Pass a long \fIval\fP as parameter. This should be the time counted as seconds +since 1 Jan 1970, and the time will be used in a condition as specified with +\fICURLOPT_TIMECONDITION(3)\fP. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP, FTP, RTSP, and FILE +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_TIMECONDITION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.html b/docs/libcurl/opts/CURLOPT_TIMEVALUE.html new file mode 100644 index 0000000..14df2f1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.html @@ -0,0 +1,60 @@ + + +CURLOPT_TIMEVALUE man page + + + + +

    NAME

    +

    CURLOPT_TIMEVALUE - set time value for conditional

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE, long val);

    DESCRIPTION

    +

    Pass a long val as parameter. This should be the time counted as seconds since 1 Jan 1970, and the time will be used in a condition as specified with CURLOPT_TIMECONDITION.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP, FTP, RTSP, and FILE

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_TIMECONDITION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.pdf b/docs/libcurl/opts/CURLOPT_TIMEVALUE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9265a93dd6f06e80a15f5832cbd0ae38ded7f7c1 GIT binary patch literal 3732 zcmb_fdsGu=7We4V#j#ecsMXfx6Oq8tWai6*JemX{A&Mmx0xB(wGGr!UB*|na6BD#R zRaB^YJZrUEs)*JH>uV9zRqJkjY?ZZYeH|ZXvDQ}=w`}zsUGY(MznKI}kg6WuEkEhcfCtnB>k;H~u7#B}-0JpeE zo;K5VmZFVD%*S&y>BfR9=S{leX-e$>w60c@Uv~YVBdszj!S%-FIPAu;di{!o$x74e zucvQGuFpE^IT^UHxn+1@UEvYV5Y=-`PC#GMTJl}>mpw+k`o}#N4Q2N)$zt_qe=|>V zdtsxi|3zup{J^k*%ZgVg%{o5x6?u=L3(SXB*BGAtvlLoyKFXZ<h%Pj=PDXJ)=- z-!!#2b1W74=CAF_8{L_iw$JM>Ixo0W-)t9Oy>dEG`ewyZuwcjbn z-j&{1>H8_)bjMNco;(Sb_ZdFo*@m?vvYU=))m1Gxa3U$Cta?n{;E(sLTBnd;0~f~) z(N#IO4u+YZXCBl5f`9DqTNQCC<3Mx$oYCn&>Ibtfv@9Hy|L_aq>ebN8-&US)XwcNRo-EM#KUuP~pX%Ib^#!hIaPHIfe?MAA+xvZnexTP!`r+D_@oI`#Zr3W&Ns^i+Oo z(*SbI;=U7W=Pand>LFYUnm4XEqI|dtKO9^6ptti#&9%M7A2X3tp1nQ)i?xg9Ii|k( z*7=PCC&&BAt%u{bm#jEdll$Sd){|Rvc1)m-UCLgW-grCiOyyJWjq%Cet(ym**sUw@ zXf&_i{j9p7IOXoHN3(S0u@|Wwk>6s|Vjq>lUfX}rRE~56s+*<{+5KMBqpi1FVrdT*W+qw*Y!)~y{MAA^78WVn ziJo2TrSS~XN#j zp+4#XLOTG4 zu-bjAUj%4B28K_}umWf_hJzGO6?SD)V}hNn9Y#E6+b$$9C?wT}+q9TAw9sIPt}j>! z8exkR(nkx~!m}AS?USaVBQSO`6}TYA@GO4;FH}xABMPZ4aRPSN5GkyS`UL<&OkD%m zSU2hEh>+?*4*}zG0x0J6zl9|3h9QM$@isf$%s3o0x>D#4-4&D1&5*%1T(h zCc2OrKa-=gX1<$kpIKzrQj#PircWXfb7*Oh^hzD#+vfwc&u)k@+0rdBf0S=CI(*c$%0#KGH zL698f(Af}uLV)PYASvW|uMWopfq*Qakg=Q-hgz)`C*-(XE=3wrU$KWLgHn%gB=RQ) z!sI+R^Y~<9Ofoy`#+e)($_Tv8kr^F_W4t`WdVt`VEMWb-LE`r_lrE8Wkn#dMDYZM~ z1yTrUhm=4+DXCU!?9dKLc_Pu~&f6i(7yO|O%Da zMGkVb10w)bVM4iWa^h?iHetEhH3&8u?>&sNXA8T z=)XRIXE8Hrls|xmJ{HYYsM0oor+FMK2u*Exni=Hk)hVWw)MSm;qJ^nSh1qPJ=O(9onu~DN^Ct9%o0FaE_1poj5 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 new file mode 100644 index 0000000..1c8697f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TLSAUTH_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd); +.SH DESCRIPTION +Pass a char * as parameter, which should point to the zero terminated password +to use for the TLS authentication method specified with the +\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the +\fICURLOPT_TLSAUTH_USERNAME(3)\fP option also be set. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_USERNAME "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.html b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.html new file mode 100644 index 0000000..3af10cb --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.html @@ -0,0 +1,60 @@ + + +CURLOPT_TLSAUTH_PASSWORD man page + + + + +

    NAME

    +

    CURLOPT_TLSAUTH_PASSWORD - password to use for TLS authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd);

    DESCRIPTION

    +

    Pass a char * as parameter, which should point to the zero terminated password to use for the TLS authentication method specified with the CURLOPT_TLSAUTH_TYPE option. Requires that the CURLOPT_TLSAUTH_USERNAME option also be set.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS-based protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.21.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_TLSAUTH_TYPE, CURLOPT_TLSAUTH_USERNAME,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.pdf b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..631361aa4b56b05f07c3f287e10d8169aee0fe63 GIT binary patch literal 3940 zcmb_fc~}!?8n3$Q<9O6nt4LiPgBTQ(naQ0Pf)Wlvq8L!Ih&W6pFpy+oW+D-_>n&Ck zS-cNaL=mx7JPTH>qN1o(KwEFc3)gkEhzGSE`%MxAk==Hm$N7gZ@AtmH_xj%7_u(B8 z7%aeq63DysQAQ3Vg;AJ}PlD8HB%HJ)u!*n?Nc2cBWnxJij0Br-mJB2b+CXYF5X0I? z+zdI^&K+}g@uuL;)2n^M%1Vx&d{&`jB6Eh_=sBiFNc`aO#3<=HuEU9BUPjGl%a=_n zc^mc?yV%j==07q?Vra_6d{y3vTByy&iD@IJ>f)BZ%xrbj_xOw_Wd#BEw28<++fPfI zG}G5|Z20EO+9UWaNB>EFX>m(Ko=@)Hx~gAx=@EA8xU~*p-ors}&6;v`aEGKxcE!4{ zE8nL154d1BX2-&Qh}f!I*{Y_uc24>AtRxM!l@0#jr)#Z&PLlm#tn2qJa?`wH#EuPlGoZO3?C;Wqz!YuJM^ zhF=#ZzMfj69dr1bd+CJ6`w%rSwEcMIr?Xkp{vt0h?2b-o^}Ww!;-@dyc7S8Oy|0;G zF695adVg6_ZQlO!#4Z^}3umNB^aXfL7?pMR$Lx^t1y!9=(gah3z8yI1%H1VVm+C}Q zPCeYdbZ^%+wxV+0+R3lymo&;6nX{o+?S`5%wQ6zJy;HmrkE7ZV#xA8h2d^*gID7Z0kW0O9 z-{Mc$-07F(jq*3j{5g`-Il_wg*n=(3znkvxZ}-~L`TDzF$G$HO(P4!hix2EH=iVz` zF(&=loieSgoW3#R4Rlc8CEXWvb<5UG6YKD9>9^-s=4AHGA{JM!?$Lg`^yZA&AuX!j z#r z58^7i53skpbA5yV-PMY)6??DU*prcC@A)Xvc>d@v(d;)>(E-V4{Nh@D-TAq#3ukXCsA%6NZzi_G zoH93d;i4V=4i=t&(aH1l6yDW-k9Zl2ZM;sK>vC@C{y%ggbg2$>IjE17j|% z2H)}z0UFYPkdYBO7}IFnK{~T?yVA=c&Q9L|<4m)D7egV8E2=#eI7@+WVhD+}$Fp4LxEw)9^@ZcGn}-OXO@==Kz{S)&fSxwv zmc|G{7I3jqmIN4c*7U!Hba?v97c1R#)G?L&*fin~XVGz)ka39j))>slL@7P@2`Q>{x}#NQsBU?0;BUTXJC>c{CHY@crcGsaHt$+s~Maj z*kLwV7?s11?=(??H77>+uv3Li_TxwEB4C!LP017si-bxcCcwmlV51E;lPR<<8ODS% zK7h0tj4C}C9~U6_<;PECS*r>`Qc_ZcDPkdQOF%HCQi-454Epv?#sjbK6)sdp3z(y>uimZB{%=NONt?W`Z)Zl???8EM2t@dPd) zjG}k}hLJ`A3O+$Rf#SFX72^^mTJO%m0J3-p~_#qMDa7ZG} zurB|wQi#gtnz^;q z2-l-V)%n!*!mT>p|E`$X%pGY?PZdZLb~B*u(7^xazW=UnjEeU>n zhrj^F!ER#tn$Z@gw!zg66Qyx2oOVb9Rx`bFiok4xwjuACLj%E|==*d)4Ri_aI6r<0 zM}}ba;e&#^zujzHKi59Zjr9OXM zCK7!lLqSd->!Ba%fy}|(+5}H71I272lPSSVqNz*-F7_resiYa1{9~Cy@^LIm?ln@6 z$J%hpMB2cAu`m)zrIMh2FnILQ;9Uhet%s3Ni;;$1uQnt!5ROq}a;+jrF2({tJrn^F rkeW6S8#+{i1`QPjisfR>A8W*NPd0|dZLG6tVu?Zyd3y(q42J##9VuPH literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 new file mode 100644 index 0000000..b5cdd5b --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 @@ -0,0 +1,52 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TLSAUTH_TYPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, long bitmask); +.SH DESCRIPTION +Pass a long as parameter, which is set to a bitmask, to tell libcurl which +authentication method(s) you want it to use for TLS authentication. + +.IP CURL_TLSAUTH_SRP +TLS-SRP authentication. Secure Remote Password authentication for TLS is +defined in RFC5054 and provides mutual authentication if both sides have a +shared secret. To use TLS-SRP, you must also set the +\fICURLOPT_TLSAUTH_USERNAME(3)\fP and \fICURLOPT_TLSAUTH_PASSWORD(3)\fP +options. +.SH DEFAULT +CURL_TLSAUTH_NONE (0) +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this +to work. Added in 7.21.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_TLSAUTH_USERNAME "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.html b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.html new file mode 100644 index 0000000..7a96979 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.html @@ -0,0 +1,63 @@ + + +CURLOPT_TLSAUTH_TYPE man page + + + + +

    NAME

    +

    CURLOPT_TLSAUTH_TYPE - set TLS authentication methods

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, long bitmask);

    DESCRIPTION

    +

    Pass a long as parameter, which is set to a bitmask, to tell libcurl which authentication method(s) you want it to use for TLS authentication. +

    +

    CURL_TLSAUTH_SRP +

    TLS-SRP authentication. Secure Remote Password authentication for TLS is defined in RFC 5054 and provides mutual authentication if both sides have a shared secret. To use TLS-SRP, you must also set the CURLOPT_TLSAUTH_USERNAME and CURLOPT_TLSAUTH_PASSWORD options.

    DEFAULT

    +

    CURL_TLSAUTH_NONE (0)

    PROTOCOLS

    +

    All TLS-based protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this to work. Added in 7.21.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_TLSAUTH_USERNAME, CURLOPT_TLSAUTH_PASSWORD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.pdf b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e8549b0a2dfa3b7b00ce57e98d82165c953941b7 GIT binary patch literal 4117 zcmb_gdsq`!7DrJ_M@2xiP((&u2wIbwNk~Xy5?&FCfKouDU<#9D0z)2?CKD2|Qmt0) zCly;2wDKq5>5KEo*i6P6&cZx83ja{==Pf&-tBm z&$;Ij{Nv@3Y>X2G`Jd=0D1-Pg3RB8#NFqUE2}35G1q%Qr0f{7aG+}~~NF7cSazaI^ z37HHs(BzY#JA@3EWGdg;L3H?-*zJz45b z_Fk&&e&*6p#KYyz1;3LoosvX+WZdB5b>Df@l-UoJ)o;o7T@$={{9g3k{r-z%1K)(t?>N0QqWY)l$U5l5 zvyV4^`Gwbvl-~k6g~fZtGcJ`nWsS8tH>`7B6t?5-pOx+<-uHUUG2=g~5Z+P-XXuaa zi+>anZ*jRUFY&gV*DC|_;o2!L$;zc3J$@r+xpbA*d}cjZaZkUuqGV;Il}IK%R7R)l zNNI=GrMs7#+E~=>wbr#6?nu9@tf#miyq`l?2 zZTW^3;+$IT#nGEqcNP4yYF32N`C-hClaTKxbDW3z)}3l3 zOsxTXRIj74-;Xw)&!@U^8sbCn zpeC-q_}g<0rVRelc_WiY-t(JKb>W6MR&d)tcTTC3>`sL=UH8pKf1lMZ-3JZpJByQS zK3}~NFt+Nw?|;6zvUz#YWzU(_f)&NT6ca&s)g!|apPMrj(v(g7$2Waqy~_HguOA~Q z->@Sk`oS1Nw=O5gWchC0dy1U0=IdPFS4NDxS};3?;1~KIxfQ}M94!~0%1v;aTqyfY zs0z>U(-m7P+kV)-c$6liextXg)v5Bz>Xzn~xD`_>N;clhJN?lcZn zfH=mre}D>(M1XIAXoi`}p8x@p!#+kue^}V?lkBGsNXA-Z zKn{_U8Vv!S6nH~v5Eg_Y8WO^Sd5E4gSj>vSOW8v-6k#BEgKkKPiyfF5FkX;ACUfL~ zB*bRKRa%0El|&|Kkg|TQ|C$ApYAI_GKMsvEMi5!#>$xT(F?W8FDp#u#saYX1ND_jB z)FIe5+{o70hYvGMm{rp05ec!8(-{Vv*rqq?!5e~YdY!>6wnZ(-fuCk~GZah&UJ<1du-cfZ$8Y%A#qb7(uL7 zE62*?P^L@-6Ny9!%0;+bHsD~Jml$Z=#x|H|0DX2t$do5y1~bQQ6Guhq5i$kAI4Clp zNDi)JB8@aj8DK^+uB0rqlx4AyYO#RO;9R8&XR9<^B^$#C4I2fEtr75)nqU==E5HQ< z>Wo9od`cfU01A1)4`3$-^+9b>5hf`sDn1sD%A(A4zkXQ6K?N+tas3x%6^PC7UH}1g zxIqGV#Bt#LYL>`Bb(3*XjL$|fHY!X)MPf`S#<15=OpKxu|SDhEFhz{sqw? zoI^w@QxbR*vP=`D(ZD%`$;?Co<8ZkgUcW}Wn1f4#Ffkh9ofqvd+!z=4zdfecGf$e~ z6U!-;MGwk$wEX{hFfTgBYSj~ijTV#6o*ilxLg)y_HZuq_1}s*q#2U(^$HCjijYd#I zapuV*;7zh*5^zY9w2qM3b1zIs_iuD0lS^V9Zpf6fY-}}12aAqo$rc*y-0J>l=tx=r z#x92pVhs~3I|<}A2pjUGa>yX~1+5ncG*~V{kCU>jOfdwzrw0nAe>bI1EDa+hnRxZ zzhD8M&*Q@y*g?YtT+nBk1seuvJU-K%pQd4a0T?Bop#`DO(NJ)w=lFQS=lC#z@OeHF z4>as&bO?jNMDi>R1ykHJv|#QqH2!lmF3Nq*7A`6T)5-uIZNf<%VFEw9VI+~vC4m26 zF!WJit^$!xfRSi}hJyR2HY8dOr%8fPZX_l^Bjvn^Fp(fUNDvk_HyrGFSTI+_o6DE| bIfsH7*~~O, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TLSAUTH_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user); +.SH DESCRIPTION +Pass a char * as parameter, which should point to the zero terminated username +to use for the TLS authentication method specified with the +\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the +\fICURLOPT_TLSAUTH_PASSWORD(3)\fP option also be set. +.SH DEFAULT +NULL +.SH PROTOCOLS +All TLS-based protocols +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.4 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.html b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.html new file mode 100644 index 0000000..2d8fcf6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.html @@ -0,0 +1,60 @@ + + +CURLOPT_TLSAUTH_USERNAME man page + + + + +

    NAME

    +

    CURLOPT_TLSAUTH_USERNAME - user name to use for TLS authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user);

    DESCRIPTION

    +

    Pass a char * as parameter, which should point to the zero terminated username to use for the TLS authentication method specified with the CURLOPT_TLSAUTH_TYPE option. Requires that the CURLOPT_TLSAUTH_PASSWORD option also be set.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    All TLS-based protocols

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.21.4

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_TLSAUTH_TYPE, CURLOPT_TLSAUTH_PASSWORD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.pdf b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4be60cb05fe8cc3373a262e87fcf76cf1ea8ca3 GIT binary patch literal 3922 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 StTSj}X3L;}fbi)N(0>4_h&w?5 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 new file mode 100644 index 0000000..6e62413 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 @@ -0,0 +1,51 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TRANSFERTEXT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text); +.SH DESCRIPTION +A parameter set to 1 tells the library to use ASCII mode for FTP transfers, +instead of the default binary transfer. For win32 systems it does not set the +stdout to binary mode. This option can be usable when transferring text data +between systems with different views on certain characters, such as newlines +or similar. + +libcurl does not do a complete ASCII conversion when doing ASCII transfers +over FTP. This is a known limitation/flaw that nobody has rectified. libcurl +simply sets the mode to ASCII and performs a standard transfer. +.SH DEFAULT +0, disabled +.SH PROTOCOLS +FTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with FTP +.SH RETURN VALUE +Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_CRLF "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.html b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.html new file mode 100644 index 0000000..7a95187 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.html @@ -0,0 +1,61 @@ + + +CURLOPT_TRANSFERTEXT man page + + + + +

    NAME

    +

    CURLOPT_TRANSFERTEXT - request a text based transfer for FTP

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text);

    DESCRIPTION

    +

    A parameter set to 1 tells the library to use ASCII mode for FTP transfers, instead of the default binary transfer. For win32 systems it does not set the stdout to binary mode. This option can be usable when transferring text data between systems with different views on certain characters, such as newlines or similar. +

    libcurl does not do a complete ASCII conversion when doing ASCII transfers over FTP. This is a known limitation/flaw that nobody has rectified. libcurl simply sets the mode to ASCII and performs a standard transfer.

    DEFAULT

    +

    0, disabled

    PROTOCOLS

    +

    FTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with FTP

    RETURN VALUE

    +

    Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_CRLF,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.pdf b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a7fceec9fcde6ea18c442cf3a03e33e3dcd0fefd GIT binary patch literal 3972 zcmb_feOy!Z8ZQN{lQ$*7x4d~oaU^Z$oV~FvHUhSxH-@myfQ!3*4%^u{a(2$x&SXP{ zt0JHY8f7V3hA&`R5kZDpDxndgl@~A)y`_bkUSF^x#LW9UV+g+7+r6KU=O2E1e$VrL zp5OCMSdv=H#{^<1tm$8?H$xH_g_(@`P*fC>K+rZe6P5ys9?_B%OE_UfOW`b`Cd`b5 zP^lmn>m+bHIFs6!c8{ zrlIqZ@t$ijb;rt;!Slw>+Z6O=QD)VT=Tdfh>sQfR+S!_Yqh8o@9(gBj#p%;$!rPzG zP9AYAdGGNp-x=5~wHtz_7tP$?m3`Bb?n=IVC^O?kVd*Ukk=*!FS-$p)*xGk+o9<{u zS(H6v%qyYm0&4n-*Y@rzc(!I;%)BWxjwCM}XV~4b=Hhl8wdunTRRPzoKi4WQChF0O z%0+hZS1&&I!QwMFDtE3qke}3DG`u?SAlzI0*Q0x@hh08XUIp){-yZq#Qe9dDQD-bj zYzY1QQFn0_{BAVzX;#R+(2em_RD7%{idgzlInv0@=AvuE1Z>9^}FoKT6V?7iEp%jott(t;$bRd!oH$m zCs*ZpOWv^uHRi|mhNf<+wzg!B6Ie(s^^xS~kZY|s4bx2DX02{I(rk*?t={Qr3cOHK z5cBG~w1%HP9#PY^#+Ea8p7L;0QF$Y~Shb-c@j_d9>)yGmr$)?g_&)e>$%zfuN|v50 z_XIzg_)EEAw0zQ=A*rTAWnMw|`)P`kCKE9>JK@k6!=;6JEzj{@A1+zeafAtLDwI4q zzqor{$dQ7+po&ZLKM&X%R$URUi5s7NJd{6rrFVFI_p~wg+DYXzmQ5FYSGpyj+w{fh z`Yui5!p(1`d+L9@{$=??H7RKqua4;!kHcPjBED3jFg7JnQ;$lg8MF8;+%?L$erEPp z=@WZm*3=y=O*ni?)g-I?8;`*H(jNcQjxyc0^`)JYt}g#|L~lUI)pvR{bDwX2HIaN; zlezMjv?U+>S!18uGPTsU$w(B;-iXYM?mjuaa#_i-$9H!%3no6&gznv{ZWOExx{xz_ zb$4Xp{>K8Foh!`l+RLfp9{t8`boBR0ADL!ktbeIC|NFB^BR5RS>I^nyvL*S!jTO!n zojFfQ%Ae}^Y}oSs5v}nZo0o*lQTL3V^C)}#t>rgbD1~igy~9ETCf7ciOJyp65**Isb-z@;*@tvb5!RSf~DH$MG9&7tZUd+tO!_?Mxis zikrk|mz`-$Ei2qoc0@sjoSIW4>+S zKO<6Vkd&UP*(>;(tiGVatcj-_)QPY~(oOr`IBGj~&Om2EwO3b-{iJI5$KJNDu1{^x zS{$NI*%`QKa&n>hNJSr;7gG0)w|T;)TubEsVnT5wi9hAdn>7Mj$%ELgKNE2Tn)9wL~s~Wn!TT zLi7v^+9-?yE+;{=u!!rifK0d;x6@3xK=(~@GG+t8rX!#~!-$daus}}ZVdD)xQH%ow zB3cHBW0>y;Xvjz$_ze(UFxSZS5Fq*O<5cuFc7O&9gnbseVB~qy;)2s5&VD^)f&qe? zgB&8tq5Ee-zhoTF;uK>Wfbd(dBUs!5ZeXmRFsM87PJqE@K**dV9gL||ej|Oa@~hHE zLY$m_5XSe+fm=Bw=WY?b43gc+#?k#;vAB!iJcJlYJK^HTGL*&lc%R!K#Nf_gxma

    D}lrXrXCMFte9!E>CXgC!Xn<`m-@jGI;R z+-}mMkP=p0m|@2GW~(rRk70zBkAjbnN+l8rDw4|yp=dyzV~Ck|=mQr(p$PZ^oD`s@ zEp9X6RPy4J65#ku#>MvQhvfoP%0v9me^6F|*xcU>AfSFXL;)U!4y3Tvs|FoOB}6d^ zAI12n%!tYrm`s6T5h$iW(J16DP7r(`8VB}2un+zZqC+@`h%!ziNC}nA$ylxM0>bIy zB7q5nLV>7XqfgAw6@_py8seP??JwM+)BSgk+3j3Pb9@RlV|Lp?tDUX>e-h?F$Jk=N zZLq`bqJh0``A&%?KXa&S{DPc@hJaa;PML6NHdgHH|_#JW$cd?ZlYAZ*C(&Y^H^PuU?+MJw-iE!U~}, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_TRANSFER_ENCODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long enable); +.SH DESCRIPTION +Pass a long set to 1 to \fIenable\fP or 0 to disable. + +Adds a request for compressed Transfer Encoding in the outgoing HTTP +request. If the server supports this and so desires, it can respond with the +HTTP response sent using a compressed Transfer-Encoding that will be +automatically uncompressed by libcurl on reception. + +Transfer-Encoding differs slightly from the Content-Encoding you ask for with +\fBCURLOPT_ACCEPT_ENCODING(3)\fP in that a Transfer-Encoding is strictly meant +to be for the transfer and thus MUST be decoded before the data arrives in the +client. Traditionally, Transfer-Encoding has been much less used and supported +by both HTTP clients and HTTP servers. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.21.6 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_ACCEPT_ENCODING "(3), " CURLOPT_HTTP_TRANSFER_DECODING "(3), " diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.html b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.html new file mode 100644 index 0000000..5cb1e39 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.html @@ -0,0 +1,62 @@ + + +CURLOPT_TRANSFER_ENCODING man page + + + + +

    NAME

    +

    CURLOPT_TRANSFER_ENCODING - ask for HTTP Transfer Encoding

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long enable);

    DESCRIPTION

    +

    Pass a long set to 1 to enable or 0 to disable. +

    Adds a request for compressed Transfer Encoding in the outgoing HTTP request. If the server supports this and so desires, it can respond with the HTTP response sent using a compressed Transfer-Encoding that will be automatically uncompressed by libcurl on reception. +

    Transfer-Encoding differs slightly from the Content-Encoding you ask for with CURLOPT_ACCEPT_ENCODING in that a Transfer-Encoding is strictly meant to be for the transfer and thus MUST be decoded before the data arrives in the client. Traditionally, Transfer-Encoding has been much less used and supported by both HTTP clients and HTTP servers.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.21.6

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_ACCEPT_ENCODING, CURLOPT_HTTP_TRANSFER_DECODING,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.pdf b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f135e559e776d254684f1886153d40cde4efbe0d GIT binary patch literal 4111 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 QX&gRJ2>JSkMu$QF1wyc`SpWb4 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 new file mode 100644 index 0000000..a659cd2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 @@ -0,0 +1,78 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_UNIX_SOCKET_PATH 3 "09 Oct 2014" "libcurl 7.40.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNIX_SOCKET_PATH, char *path); +.SH DESCRIPTION +Enables the use of Unix domain sockets as connection endpoint and sets the path +to \fIpath\fP. If \fIpath\fP is NULL, then Unix domain sockets are disabled. An +empty string will result in an error at some point, it will not disable use of +Unix domain sockets. + +When enabled, cURL will connect to the Unix domain socket instead of +establishing a TCP connection to a host. Since no TCP connection is created, +cURL does not need to resolve the DNS hostname in the URL. + +The maximum path length on Cygwin, Linux and Solaris is 107. On other platforms +it might be even less. + +Proxy and TCP options such as +.BR CURLOPT_TCP_NODELAY "(3) +are not supported. Proxy options such as +.BR CURLOPT_PROXY "(3) +have no effect either as these are TCP-oriented, and asking a proxy server to +connect to a certain Unix domain socket is not possible. +.SH DEFAULT +Default is NULL, meaning that no Unix domain sockets are used. +.SH PROTOCOLS +All protocols except for file:// and FTP are supported in theory. HTTP, IMAP, +POP3 and SMTP should in particular work (including their SSL/TLS variants). +.SH EXAMPLE +Given that you have an nginx server running, listening on /tmp/nginx.sock, you +can request a HTTP resource with: + +.nf + curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH, "/tmp/nginx.sock"); + curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost/"); +.fi + +If you are on Linux and somehow have a need for paths larger than 107 bytes, you +could use the proc filesystem to bypass the limitation: + +.nf + int dirfd = open(long_directory_path_to_socket, O_DIRECTORY | O_RDONLY); + char path[108]; + snprintf(path, sizeof(path), "/proc/self/fd/%d/nginx.sock", dirfd); + curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH, path); + /* Be sure to keep dirfd valid until you discard the handle */ +.fi +.SH AVAILABILITY +Since 7.40.0. +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_OPENSOCKETFUNCTION "(3), " unix "(7), " diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.html b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.html new file mode 100644 index 0000000..17fcef6 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.html @@ -0,0 +1,79 @@ + + +CURLOPT_UNIX_SOCKET_PATH man page + + + + +

    NAME

    +

    CURLOPT_UNIX_SOCKET_PATH - set Unix domain socket

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNIX_SOCKET_PATH, char *path);

    DESCRIPTION

    +

    Enables the use of Unix domain sockets as connection endpoint and sets the path to path. If path is NULL, then Unix domain sockets are disabled. An empty string will result in an error at some point, it will not disable use of Unix domain sockets. +

    When enabled, cURL will connect to the Unix domain socket instead of establishing a TCP connection to a host. Since no TCP connection is created, cURL does not need to resolve the DNS hostname in the URL. +

    The maximum path length on Cygwin, Linux and Solaris is 107. On other platforms it might be even less. +

    Proxy and TCP options such as CURLOPT_TCP_NODELAY, are not supported. Proxy options such as CURLOPT_PROXY, have no effect either as these are TCP-oriented, and asking a proxy server to connect to a certain Unix domain socket is not possible.

    DEFAULT

    +

    Default is NULL, meaning that no Unix domain sockets are used.

    PROTOCOLS

    +

    All protocols except for file:// and FTP are supported in theory. HTTP, IMAP, POP3 and SMTP should in particular work (including their SSL/TLS variants).

    EXAMPLE

    +

    Given that you have an nginx server running, listening on /tmp/nginx.sock, you can request a HTTP resource with: +

    +

      curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH, "/tmp/nginx.sock"); +   curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost/"); +

    + +

    +

    If you are on Linux and somehow have a need for paths larger than 107 bytes, you could use the proc filesystem to bypass the limitation: +

    +

      int dirfd = open(long_directory_path_to_socket, O_DIRECTORY | O_RDONLY); +   char path[108]; +   snprintf(path, sizeof(path), "/proc/self/fd/%d/nginx.sock", dirfd); +   curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH, path); +   /* Be sure to keep dirfd valid until you discard the handle */ +

    + +

    AVAILABILITY

    +

    Since 7.40.0.

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_OPENSOCKETFUNCTION, unix (7)

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.pdf b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..200b6232f12229c2f460e94ecb6269ff44f0a099 GIT binary patch literal 5029 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 new file mode 100644 index 0000000..68c3860 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 @@ -0,0 +1,48 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_UNRESTRICTED_AUTH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNRESTRICTED_AUTH, + long goahead); +.SH DESCRIPTION +A long parameter set to 1 tells libcurl it can continue to send authentication +(user+password) credentials when following locations, even when hostname +changed. This option is meaningful only when setting +\fICURLOPT_FOLLOWLOCATION(3)\fP. +.SH DEFAULT +0 +.SH PROTOCOLS +HTTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Along with HTTP +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FOLLOWLOCATION "(3), " CURLOPT_USERPWD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.html b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.html new file mode 100644 index 0000000..9d16b0f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.html @@ -0,0 +1,64 @@ + + +CURLOPT_UNRESTRICTED_AUTH man page + + + + +

    NAME

    +

    CURLOPT_UNRESTRICTED_AUTH - send credentials to other hosts too

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNRESTRICTED_AUTH, +   long goahead); +

    +

    DESCRIPTION

    +

    A long parameter set to 1 tells libcurl it can continue to send authentication (user+password) credentials when following locations, even when hostname changed. This option is meaningful only when setting CURLOPT_FOLLOWLOCATION.

    DEFAULT

    +

    0

    PROTOCOLS

    +

    HTTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Along with HTTP

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FOLLOWLOCATION, CURLOPT_USERPWD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.pdf b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56e223b7b3e939cfeeab562e0b71568f59a67101 GIT binary patch literal 3808 zcmb_fc~ld39a3z$yIw`#084{tGBddol29N7Q35d>f&t$S$plA|Oqfheq_}E} z*Sf`{?z(tYWo2E_QfaX$qOR7Wa##wwVs$+#cmU4@>}v7a-y}g0*=_ed=O2Fg{=WC| z`ThvjsWn`TCxn8l+t=-eL@)|dnF}F>0*NDRS$Ymft~}m7U2|{3%yo6V&pr!D4!&Iw62Cg9Q%-IwneltscfbBc z_4Ro_&Uw0Sdj_fsbIH@nu&{Pjcm2^*uATWql0SJSxi-19@r{&^B5)#4^5^;a&p6jk z8rBSnyt;mj=HaLhPb`O-H6tQyqq`UF`1))Tuk~Z$ma|OW^rFhsXEr{cSUY<4_cw!R z5?$pUdaL1)xxVG``;Ap!!r|>T(HlhJDH?^h*Gev1jRQ?$kFF+~IL%gzBS13y0(t~eY z*rf|N64E@RX4%88xbjI?wyr9^^!!N8mevIU;Y5I>?Ww-}_TfDF(#q<)5tAmLXj@iL z5u|7$(hPowmS5ko_zG-FbNy8)(J_XdofY+?%5(A?A6`AaVpemIZ7(r0XPTnLno|Aw zR8?nTb^He-g8$usUbwsOKxoo1djFk$sc)@s)4sXA@Qu<#(J29qr*`EZ30=C(tm)8g zPo5jDd7OEv)-hsSRBXNSId9GPU)>BDH#)t0_O>epGla4|$IxVFSkR)6lyRfS)P?q# z&Wt+{s3?C{Vfg0{^II31Zk=0sWBno7mbT>LiMhkWj=l4sjx=AsX8Kuk|}iH+PIZ7sXu?7%<6?Nq5}^RI(b11 zRo$8TyQ(<9n(Mid>7!;pDC@eH)A;F)mh|I=+mm29$F6`9pay}y&c@V7{5w6avY8Kb`t!-o+4KF+ z&KXwZ{?oSZig%BQXWid0Ho>%`R7qRM6l65aF6nSM4p(*^O-Q&o#+W;PPb1=*8@#h; zPhQpL4t<1T#^=)~c81kAZW^_^tdtPcM}4vD?9fN{y(c2()!iN4QQMTVLHO*%`R7B@ z$5jwElW*9;i3JE27TCWsnF#WcgnihNwAfA{Iy{R&w1kPoBPlm*K*6<0CW56xeg=f- zDFz@3i~=s2uraWJg&9C59F&tb5)J@BI+`*j5{v->5CtPigqs0!(QYOt(IbjsUJ(ri z#4*0-2f!pG3j78d9WaY!dI*qw{;?*!*aox#2Vswg4j7qDnjEkJV*S@c88Fb`WL5SP zWli~D(JL8+Gq{Dy>Q&+MUP~~z3EaS#S682H$;%4*!hnzjofgJaDxZ^{sC=gM5{Q-4 z_o?xO*?Wtj5XL4|kLYEP%zKbR(g6}Ihfg9BcMxp0kR;MdIJmJO1k&h91;UacB+;44 zu$5zD1TOU^j@3Q5ib%?0`WXsXp9WW;r>wZGzlLZV*e#?j3&uP-{ckRLZhb0QZ;@U( zL`|B_1ZXMHLk0+w2oNi2b2>8mqVd$Gzi4mO`r=R3#`Ug0Odu4iRKDI%ixx~t#&JD9@uTQ*c@`VlH(DPgELD;IIxF>$yRbwwK|xgC`&fU zzDQm*)YZvbAU?PWR~l}+;|m&UrNpbhOx^L#N~4FTml|NXCatO zCPPp@!sl}V2iLLK#^7$Q%@G9bc^n~AUx?WpJdaO2BV|R%R0QLpNUtF^2!|%^3`yBw z)-aw)ITj&J#YaG z3P2vfNe+O)#ki<636;q)sT{+mqnI2;703WiP<$X71>RBMUG+0W`*HRYrRXHk5~?hk zGMnK=1npoef${i!p1^C-Bj)2$AZ(5LW#@J03%6^v|2tz=E8Eg6pIl8DomPO?vFiV) zVP1EQO~w}v+nuzuF%Kvr_^R&dy1QTFwp` zilI_ehDkm1#X(UHU;}gb6CA#22pMc%roC9jZkjMdD2$097O=b@EEb6bBG?T3XqW&4 z%Z>eDTQ5xj92-c(_#&`HU*^M5*()>@#Plkk6fE%pvH~gCj{|680eCJ9pot_P!2@Y1 zc%BTP3HgK2M6c2$*egC`5=p-tFf>kD2paqc2_uPQE&=ifgV!Df9#o*xdKihdnJL)& zTti~jut6b{pwSUgVzD|}EfNSM8ktP07E8n;bws3E7$J^S{WM1g`&M%>IL&y9CJ=~3 LP;hW`f(H5zVNN0p literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3 new file mode 100644 index 0000000..d24bd28 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3 @@ -0,0 +1,78 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_UPLOAD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_UPLOAD \- enable data upload +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD, long upload); +.SH DESCRIPTION +The long parameter \fIupload\fP set to 1 tells the library to prepare for and +perform an upload. The \fICURLOPT_READDATA(3)\fP and +\fICURLOPT_INFILESIZE(3)\fP or \fICURLOPT_INFILESIZE_LARGE(3)\fP options are +also interesting for uploads. If the protocol is HTTP, uploading means using +the PUT request unless you tell libcurl otherwise. + +Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. +You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual. + +If you use PUT to a HTTP 1.1 server, you can upload data without knowing the +size before starting the transfer if you use chunked encoding. You enable this +by adding a header like "Transfer-Encoding: chunked" with +\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you +must specify the size. +.SH DEFAULT +0, default is download +.SH PROTOCOLS +Most +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + /* we want to use our own read function */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + /* specify target */ + curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/to/newfile"); + + /* now specify which pointer to pass to our callback */ + curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); + + /* Set the size of the file to upload */ + curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize); + + /* Now run off and do what you've been told! */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_PUT "(3), " CURLOPT_READFUNCTION "(3), " +.BR CURLOPT_INFILESIZE_LARGE "(3), " diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.html b/docs/libcurl/opts/CURLOPT_UPLOAD.html new file mode 100644 index 0000000..f0c399f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_UPLOAD.html @@ -0,0 +1,80 @@ + + +CURLOPT_UPLOAD man page + + + + +

    NAME

    +

    CURLOPT_UPLOAD - enable data upload

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD, long upload);

    DESCRIPTION

    +

    The long parameter upload set to 1 tells the library to prepare for and perform an upload. The CURLOPT_READDATA and CURLOPT_INFILESIZE or CURLOPT_INFILESIZE_LARGE options are also interesting for uploads. If the protocol is HTTP, uploading means using the PUT request unless you tell libcurl otherwise. +

    Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual. +

    If you use PUT to a HTTP 1.1 server, you can upload data without knowing the size before starting the transfer if you use chunked encoding. You enable this by adding a header like "Transfer-Encoding: chunked" with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size.

    DEFAULT

    +

    0, default is download

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   /* we want to use our own read function */ +   curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); +

      /* enable uploading */ +   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); +

      /* specify target */ +   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/to/newfile"); +

      /* now specify which pointer to pass to our callback */ +   curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); +

      /* Set the size of the file to upload */ +   curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize); +

      /* Now run off and do what you've been told! */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_PUT, CURLOPT_READFUNCTION, CURLOPT_INFILESIZE_LARGE,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.pdf b/docs/libcurl/opts/CURLOPT_UPLOAD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b3a45f739ae08b79a143c237582faa810658aac GIT binary patch literal 4742 zcmb_gdt6L;8`m!4AXcvm;jn5-X3ja&T$-t-t09_6YQi}I?ro!TV-+ezH=Z~4+d4A9HeV*U*{GQ+MJ7XpE zx)^eDLcDQR7!eM$fJB7wCU8$&qL$)39;73* zxL674voq#3Y44mF_2v&>B71_F??s|8GADTVHEaW3YGHhKt9P00%w*Zc`7nPoek>>^ zDIw#iUfVY!tj>D9JZ$~9uHQhGrrt8?E zC)@KT?qsFFb4N%9VV5qRMpM?5%4Z~>@*N($_W9IOiRI(vrz|?rlTFGf)=rbwiu4=$ ztq=2OhkirD&zX<-s$=-N*RLjKNXKo)3QXi?d;E*?*0~Pycv|JkIohpvK5;1L*0#g` z(>Km)YOh$DF*m~NO)8xBZ1~MLqu1UrSt&dAAk8E^<7Af3viS#Pp|Pfd`&ZxEseHOo*I$dm?SAR-$S!vbtPFN3&5E&k zmVbWv?PPqBBQwIc(YQ7{v3f?9(Y={jy9U@+Ep16J?=W4!YZz(iwYNh1Rp5rCbGPrC zEZy2=^Ihr%_Yx2Ov;fC`8*9_((j{I$oMyF0a4RaG-3?EGmC& zGONGy#Lae(JNx&KGaJ?ZO{R}u<=YpX-304U&Kq6JGOr8c#tdX`-KWdvwdAJ}T?fBi7WNIf8RQ2e9LVaD5&Ry4Y1n~nBr6UGH@9IP=a+ZdXoc4t6Q>kOYi;mao{Em$Q1} zsolTTJ-F9Mn{=p4nPjBIr;x;9Z~IJTDWcY07g!T{hfko(_=6;?@CGdfrnMA3&Q-p#2Kaapb+Rzy@V z9}l#sT9m$iZNi0mzQrPi49{Qe?6gk*Q^44*l_#Zf)lF-l7sY^nbG zMj^JcW#ESNz3|X%S@oj*u_?kJ#;6HC-mBIAuRJ6{Cx?wq^fmUb?uywsuF0M8=gZvR z#_U1P44G_dg8MwWM!;Z6~EH1;;b;P`qrhdyx!WT6tc6USVlVj{fn)!eDk69qUGJ4AD z_UNn4!iB>&rrn$3b2&x-GSzLtn0qPfG9S)iHkrf+Z?P1PKHfNUh?^-2x$z2LF0?~V zt`)Pt`|+A_;K*dB{k$X-d)w}TDXVG{gB6vfH>zf|9h!J!Ha2yp*Ss3lexH^(S!r#e z+ZNZ4M|LqY%=6}mXP`%rITJF?#7`_7&29=FE}1*rbHndTwiX>|NVj#{!H^7{((m}s zOPQB4w>-j2>Pw=OO9ju1y;o_A@2Adk{#IDO<0tcahe?v1n(7}D4=cAPDW}(EMl|8; z_6+q(VI}bk5AL>RyJ}Ze{(4K2HP`>d9c{&1Fd`v+b*&cMO?~?lFH^a`B3M*NT_w(*Ep0 z+fJ;HGPW=wjxo#YHniRQN55ya^Unrcu6ecfp<+ye)4cnB4)xokxIRZ#jcxQB7F!!4 zF1~v4Nr9dh67mCg+nr-8FCOipSy$b>vn9Unz5~lil@=Cly3cxnJ|X1H-pcc@UrRY} zo9rZAQS^y-Yn~i+j*{)MwoWbc9TD%AwCnp#qHmIX?dpGz&@Gi;+jbH{&J@4iI&9m) zbFJ)xSPNpc$v7j&f9St1iHrTCy4e!uCRBEMJY6<^NAc-|mT@mu4r_i2Mdj7xT2ci& zZq?PdE)3t0H4|4!d#_?JBCl`q(k8z#4jqGfWsLV%yI+h3M}*=q91-ABx!7H;hl5Zs z&Ezm)2L?R^LPTl;T=Xysw6wU2fbB^Z0K~XX9jTSzI=~NvTD8O%CxQ^bAYjA~*Au{Q znx2^MYcR#I9uvMAm}7Lq3!n^$2Y3gFI+&yyA_$0j<0D=4P!E6x0)!0_>R@D+T&jbE zAToXt6aoW;ND}e`Q_@v0Yw5A{5EEjBI;;<(H+lh1h^1f##(J>c`)2pTm`kz8F%=SW((IS0zh^Jg8!@-sUdngFP7$_o>Lm1m0QOZ@3x{&vaGL+~;guddv zPeXvfyN{$|_6!z}*V_Y5E_#hv5`hzNC>|zPIa8XCoS?vRsWW9BQ-BII9(cHXMywY1 zjrH-9#70OsQi=-?a&i%a*1@TIv4$!$uw5OD>m<&TJVf67Nu+|Ft5<52U=P81r9!3S z>YXVD6D}B&VuS)4REP*?N`OEJ6Kb_0LQcSR8i$5aG5e{oOenjt2dM6E>R0SHDzkv>PBU^!a3hLEdOFzHwvs*WU_DUp$KDVK%I#Pm>!m@1Lc zL#Y^s%cv-L$d6DQvqwYO($GG4nh(PKi$5>{9NL3CfDsp*57I~pu63qN7kb0f!__*X z$3M)Wp)3m0yZkQ|6{yYUvj7U(n+7MK!xe!2D~s_2ryGxsVoWNEQBem!l*7dwxEN-K zVq6q;LO#+2#RsMy;MWfL_47AOKhXTZRIT*`TY?v+Rm)^>6t2~gmB46pI?cYvqrt3K z%LyTC^g(vMbiTwIf#APqOsOQdG^xk+R7)b2;Mn%^{C_sgm#(o?@-ARaq*h_*4ygpe z6*w824wM-K5lbapnOdt9gS{=*XuugNCbv8S_9TVp1SSbNp}={D-g8qBJp+ZD>?N*3 ztO|3c=&4fB4v`9i!t+-dw52`OP{?^b1A`s%9_ur;GKfHLgR&v-P7WRff1&5g0lhyi z!5!yJi6#$2F#0Q@An)(q)3~p%Z9do5w%~#%y96Yh>=PSLF4<%#hB}}e%)!uK6cnWZ zHPDCuL!-AFY(Cd7w(o9ay%v{2D2y>7^1$kOU>1{U&xB=guZ&J-0JcFsu&PhSz<|a_ zGCJk}nA2bN=qUXY84A|)sUG@?9^IZ~03YEoS%7_fBx7*ECH}F@9?+VPWcJL@$Q(YE zu^6Am!Y0{CA0D9<%N4j5{Lcd;zVcWc, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_URL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_URL \- provide the URL to use in the request +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL); +.SH DESCRIPTION +Pass in a pointer to the \fIURL\fP to work with. The parameter should be a +char * to a zero terminated string which must be URL-encoded in the following +format: + +scheme://host:port/path + +For a greater explanation of the format please see RFC3986. + +libcurl doesn't validate the syntax or use this variable until the transfer is +issued. Even if you set a crazy value here, \fIcurl_easy_setopt(3)\fP will +still return \fICURLE_OK\fP. + +If the given URL lacks the scheme (such as "http://" or "ftp://" etc) then +libcurl will attempt to resolve the protocol based on one of the following +given host names: HTTP, FTP, DICT, LDAP, IMAP, POP3 or SMTP + +Should the protocol, either that specified by the scheme or deduced by libcurl +from the host name, not be supported by libcurl then +\fICURLE_UNSUPPORTED_PROTOCOL\fP will be returned from either the +\fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP functions when you +call them. Use \fIcurl_version_info(3)\fP for detailed information of which +protocols are supported by the build of libcurl you are using. + +\fICURLOPT_PROTOCOLS(3)\fP can be used to limit what protocols libcurl will +use for this transfer, independent of what libcurl has been compiled to +support. That may be useful if you accept the URL from an external source and +want to limit the accessibility. + +\fICURLOPT_URL(3)\fP is the only option that \fBmust\fP be set before a +transfer is started. + +The host part of the URL contains the address of the server that you want to +connect to. This can be the fully qualified domain name of the server, the +local network name of the machine on your network or the IP address of the +server or machine represented by either an IPv4 or IPv6 address. For example: + +http://www.example.com/ + +http://hostname/ + +http://192.168.0.1/ + +http://[2001:1890:1112:1::20]/ + +It is also possible to specify the user name, password and any supported login +options as part of the host, for the following protocols, when connecting to +servers that require authentication: + +http://user:password@www.example.com + +ftp://user:password@ftp.example.com + +smb://domain%2fuser:password@server.example.com + +imap://user:password;options@mail.example.com + +pop3://user:password;options@mail.example.com + +smtp://user:password;options@mail.example.com + +At present only IMAP, POP3 and SMTP support login options as part of the host. +For more information about the login options in URL syntax please see RFC2384, +RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). + +The port is optional and when not specified libcurl will use the default port +based on the determined or specified protocol: 80 for HTTP, 21 for FTP and 25 +for SMTP, etc. The following examples show how to specify the port: + +http://www.example.com:8080/ - This will connect to a web server using port +8080 rather than 80. + +smtp://mail.example.com:587/ - This will connect to a SMTP server on the +alternative mail port. + +The path part of the URL is protocol specific and whilst some examples are +given below this list is not conclusive: + +.IP HTTP +The path part of a HTTP request specifies the file to retrieve and from what +directory. If the directory is not specified then the web server's root +directory is used. If the file is omitted then the default document will be +retrieved for either the directory specified or the root directory. The exact +resource returned for each URL is entirely dependent on the server's +configuration. + +http://www.example.com - This gets the main page from the web server. + +http://www.example.com/index.html - This returns the main page by explicitly +requesting it. + +http://www.example.com/contactus/ - This returns the default document from +the contactus directory. + +.IP FTP +The path part of an FTP request specifies the file to retrieve and from what +directory. If the file part is omitted then libcurl downloads the directory +listing for the directory specified. If the directory is omitted then +the directory listing for the root / home directory will be returned. + +ftp://ftp.example.com - This retrieves the directory listing for the root +directory. + +ftp://ftp.example.com/readme.txt - This downloads the file readme.txt from the +root directory. + +ftp://ftp.example.com/libcurl/readme.txt - This downloads readme.txt from the +libcurl directory. + +ftp://user:password@ftp.example.com/readme.txt - This retrieves the readme.txt +file from the user's home directory. When a username and password is +specified, everything that is specified in the path part is relative to the +user's home directory. To retrieve files from the root directory or a +directory underneath the root directory then the absolute path must be +specified by prepending an additional forward slash to the beginning of the +path. + +ftp://user:password@ftp.example.com//readme.txt - This retrieves the readme.txt +from the root directory when logging in as a specified user. + +.IP SMTP +The path part of a SMTP request specifies the host name to present during +communication with the mail server. If the path is omitted then libcurl will +attempt to resolve the local computer's host name. However, this may not +return the fully qualified domain name that is required by some mail servers +and specifying this path allows you to set an alternative name, such as +your machine's fully qualified domain name, which you might have obtained +from an external function such as gethostname or getaddrinfo. + +smtp://mail.example.com - This connects to the mail server at example.com and +sends your local computer's host name in the HELO / EHLO command. + +smtp://mail.example.com/client.example.com - This will send client.example.com in +the HELO / EHLO command to the mail server at example.com. + +.IP POP3 +The path part of a POP3 request specifies the message ID to retrieve. If the +ID is not specified then a list of waiting messages is returned instead. + +pop3://user:password@mail.example.com - This lists the available messages for +the user + +pop3://user:password@mail.example.com/1 - This retrieves the first message for +the user + +.IP IMAP +The path part of an IMAP request not only specifies the mailbox to list (Added +in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the +mailbox, to specify the UID, SECTION (Added in 7.30.0) and PARTIAL octets +(Added in 7.37.0) of the message to fetch and to specify what messages to +search for (Added in 7.37.0). + +imap://user:password@mail.example.com - Performs a top level folder list + +imap://user:password@mail.example.com/INBOX - Performs a folder list on the +user's inbox + +imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox +and fetches message 1 + +imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects +the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches +message 2 if it is + +imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the +user's inbox and fetches the text portion of message 3 + +imap://user:password@mail.example.com/INBOX/;UID=4/;PARTIAL=0.1024 - Selects +the user's inbox and fetches the first 1024 octets of message 4 + +imap://user:password@mail.example.com/INBOX?NEW - Selects the user's inbox and +checks for NEW messages + +imap://user:password@mail.example.com/INBOX?SUBJECT%20shadows - Selects the +user's inbox and searches for messages containing "shadows" in the subject +line + +For more information about the individual components of an IMAP URL please +see RFC5092. + +.IP SCP +The path part of a SCP request specifies the file to retrieve and from what +directory. The file part may not be omitted. The file is taken as an absolute +path from the root directory on the server. To specify a path relative to the +user's home directory on the server, prepend ~/ to the path portion. If the +user name is not embedded in the URL, it can be set with the +\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option. + +scp://user@example.com/etc/issue - This specifies the file /etc/issue + +scp://example.com/~/my-file - This specifies the file my-file in the +user's home directory on the server + +.IP SFTP +The path part of a SFTP request specifies the file to retrieve and from what +directory. If the file part is omitted then libcurl downloads the directory +listing for the directory specified. If the path ends in a / then a directory +listing is returned instead of a file. If the path is omitted entirely then +the directory listing for the root / home directory will be returned. If the +user name is not embedded in the URL, it can be set with the +\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option. + +sftp://user:password@example.com/etc/issue - This specifies the file +/etc/issue + +sftp://user@example.com/~/my-file - This specifies the file my-file in the +user's home directory + +sftp://ssh.example.com/~/Documents/ - This requests a directory listing +of the Documents directory under the user's home directory + +.IP SMB +The path part of a SMB request specifies the file to retrieve and from what +share and directory or the share to upload to and as such, may not be omitted. +If the user name is not embedded in the URL, it can be set with the +\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option. If the user name +is embedded in the URL then it must contain the domain name and as such, the +backslash must be URL encoded as %2f. + +smb://server.example.com/files/issue - This specifies the file "issue" located +in the root of the "files" share + +smb://server.example.com/files/ -T issue - This specifies the file "issue" will +be uploaded to the root of the "files" share. + +.IP LDAP +The path part of a LDAP request can be used to specify the: Distinguished +Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field +is separated by a question mark and when that field is not required an empty +string with the question mark separator should be included. + +ldap://ldap.example.com/o=My%20Organisation - This will perform a LDAP search +with the DN as My Organisation. + +ldap://ldap.example.com/o=My%20Organisation?postalAddress - This will perform +the same search but will only return postalAddress attributes. + +ldap://ldap.example.com/?rootDomainNamingContext - This specifies an empty DN +and requests information about the rootDomainNamingContext attribute for an +Active Directory server. + +For more information about the individual components of a LDAP URL please +see RFC4516. +.IP RTMP +There's no official URL spec for RTMP so libcurl uses the URL syntax supported +by the underlying librtmp library. It has a syntax where it wants a +traditional URL, followed by a space and a series of space-separated +name=value pairs. + +While space is not typically a "legal" letter, libcurl accepts them. When a +user wants to pass in a '#' (hash) character it will be treated as a fragment +and get cut off by libcurl if provided literally. You will instead have to +escape it by providing it as backslash and its ASCII value in hexadecimal: +"\\23". +.SH DEFAULT +There is no default URL. If this option isn't set, no transfer can be +performed. +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +POP3 and SMTP were added in 7.31.0 +.SH RETURN VALUE +Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient +heap space. + +Note that \fIcurl_easy_setopt(3)\fP won't actually parse the given string so +given a bad URL, it will not be detected until \fIcurl_easy_perform(3)\fP or +similar is called. +.SH "SEE ALSO" +.BR CURLOPT_VERBOSE "(3), " CURLOPT_PROTOCOLS "(3), " +.BR CURLOPT_FORBID_REUSE "(3), " CURLOPT_FRESH_CONNECT "(3), " +.BR curl_easy_perform "(3)" diff --git a/docs/libcurl/opts/CURLOPT_URL.html b/docs/libcurl/opts/CURLOPT_URL.html new file mode 100644 index 0000000..0f75582 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_URL.html @@ -0,0 +1,155 @@ + + +CURLOPT_URL man page + + + + +

    NAME

    +

    CURLOPT_URL - provide the URL to use in the request

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL);

    DESCRIPTION

    +

    Pass in a pointer to the URL to work with. The parameter should be a char * to a zero terminated string which must be URL-encoded in the following format: +

    scheme://host:port/path +

    For a greater explanation of the format please see RFC 3986. +

    libcurl doesn't validate the syntax or use this variable until the transfer is issued. Even if you set a crazy value here, curl_easy_setopt(3) will still return CURLE_OK. +

    If the given URL lacks the scheme (such as "http://" or "ftp://" etc) then libcurl will attempt to resolve the protocol based on one of the following given host names: HTTP, FTP, DICT, LDAP, IMAP, POP3 or SMTP +

    Should the protocol, either that specified by the scheme or deduced by libcurl from the host name, not be supported by libcurl then CURLE_UNSUPPORTED_PROTOCOL will be returned from either the curl_easy_perform(3) or curl_multi_perform(3) functions when you call them. Use curl_version_info(3) for detailed information of which protocols are supported by the build of libcurl you are using. +

    CURLOPT_PROTOCOLS can be used to limit what protocols libcurl will use for this transfer, independent of what libcurl has been compiled to support. That may be useful if you accept the URL from an external source and want to limit the accessibility. +

    CURLOPT_URL is the only option that must be set before a transfer is started. +

    The host part of the URL contains the address of the server that you want to connect to. This can be the fully qualified domain name of the server, the local network name of the machine on your network or the IP address of the server or machine represented by either an IPv4 or IPv6 address. For example: +

    http://www.example.com/ +

    http://hostname/ +

    http://192.168.0.1/ +

    http://[2001:1890:1112:1::20]/ +

    It is also possible to specify the user name, password and any supported login options as part of the host, for the following protocols, when connecting to servers that require authentication: +

    http://user:password@www.example.com +

    ftp://user:password@ftp.example.com +

    smb://domain%2fuser:password@server.example.com +

    imap://user:password;options@mail.example.com +

    pop3://user:password;options@mail.example.com +

    smtp://user:password;options@mail.example.com +

    At present only IMAP, POP3 and SMTP support login options as part of the host. For more information about the login options in URL syntax please see RFC 2384, RFC 5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0). +

    The port is optional and when not specified libcurl will use the default port based on the determined or specified protocol: 80 for HTTP, 21 for FTP and 25 for SMTP, etc. The following examples show how to specify the port: +

    http://www.example.com:8080/ - This will connect to a web server using port 8080 rather than 80. +

    smtp://mail.example.com:587/ - This will connect to a SMTP server on the alternative mail port. +

    The path part of the URL is protocol specific and whilst some examples are given below this list is not conclusive: +

    +

    HTTP +

    The path part of a HTTP request specifies the file to retrieve and from what directory. If the directory is not specified then the web server's root directory is used. If the file is omitted then the default document will be retrieved for either the directory specified or the root directory. The exact resource returned for each URL is entirely dependent on the server's configuration. +

    http://www.example.com - This gets the main page from the web server. +

    http://www.example.com/index.html - This returns the main page by explicitly requesting it. +

    http://www.example.com/contactus/ - This returns the default document from the contactus directory. +

    +

    FTP +

    The path part of an FTP request specifies the file to retrieve and from what directory. If the file part is omitted then libcurl downloads the directory listing for the directory specified. If the directory is omitted then the directory listing for the root / home directory will be returned. +

    ftp://ftp.example.com - This retrieves the directory listing for the root directory. +

    ftp://ftp.example.com/readme.txt - This downloads the file readme.txt from the root directory. +

    ftp://ftp.example.com/libcurl/readme.txt - This downloads readme.txt from the libcurl directory. +

    ftp://user:password@ftp.example.com/readme.txt - This retrieves the readme.txt file from the user's home directory. When a username and password is specified, everything that is specified in the path part is relative to the user's home directory. To retrieve files from the root directory or a directory underneath the root directory then the absolute path must be specified by prepending an additional forward slash to the beginning of the path. +

    ftp://user:password@ftp.example.com//readme.txt - This retrieves the readme.txt from the root directory when logging in as a specified user. +

    +

    SMTP +

    The path part of a SMTP request specifies the host name to present during communication with the mail server. If the path is omitted then libcurl will attempt to resolve the local computer's host name. However, this may not return the fully qualified domain name that is required by some mail servers and specifying this path allows you to set an alternative name, such as your machine's fully qualified domain name, which you might have obtained from an external function such as gethostname or getaddrinfo. +

    smtp://mail.example.com - This connects to the mail server at example.com and sends your local computer's host name in the HELO / EHLO command. +

    smtp://mail.example.com/client.example.com - This will send client.example.com in the HELO / EHLO command to the mail server at example.com. +

    +

    POP3 +

    The path part of a POP3 request specifies the message ID to retrieve. If the ID is not specified then a list of waiting messages is returned instead. +

    pop3://user:password@mail.example.com - This lists the available messages for the user +

    pop3://user:password@mail.example.com/1 - This retrieves the first message for the user +

    +

    IMAP +

    The path part of an IMAP request not only specifies the mailbox to list (Added in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the mailbox, to specify the UID, SECTION (Added in 7.30.0) and PARTIAL octets (Added in 7.37.0) of the message to fetch and to specify what messages to search for (Added in 7.37.0). +

    imap://user:password@mail.example.com - Performs a top level folder list +

    imap://user:password@mail.example.com/INBOX - Performs a folder list on the user's inbox +

    imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox and fetches message 1 +

    imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches message 2 if it is +

    imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the user's inbox and fetches the text portion of message 3 +

    imap://user:password@mail.example.com/INBOX/;UID=4/;PARTIAL=0.1024 - Selects the user's inbox and fetches the first 1024 octets of message 4 +

    imap://user:password@mail.example.com/INBOX?NEW - Selects the user's inbox and checks for NEW messages +

    imap://user:password@mail.example.com/INBOX?SUBJECT%20shadows - Selects the user's inbox and searches for messages containing "shadows" in the subject line +

    For more information about the individual components of an IMAP URL please see RFC 5092. +

    +

    SCP +

    The path part of a SCP request specifies the file to retrieve and from what directory. The file part may not be omitted. The file is taken as an absolute path from the root directory on the server. To specify a path relative to the user's home directory on the server, prepend ~/ to the path portion. If the user name is not embedded in the URL, it can be set with the CURLOPT_USERPWD or CURLOPT_USERNAME option. +

    scp://user@example.com/etc/issue - This specifies the file /etc/issue +

    scp://example.com/~/my-file - This specifies the file my-file in the user's home directory on the server +

    +

    SFTP +

    The path part of a SFTP request specifies the file to retrieve and from what directory. If the file part is omitted then libcurl downloads the directory listing for the directory specified. If the path ends in a / then a directory listing is returned instead of a file. If the path is omitted entirely then the directory listing for the root / home directory will be returned. If the user name is not embedded in the URL, it can be set with the CURLOPT_USERPWD or CURLOPT_USERNAME option. +

    sftp://user:password@example.com/etc/issue - This specifies the file /etc/issue +

    sftp://user@example.com/~/my-file - This specifies the file my-file in the user's home directory +

    sftp://ssh.example.com/~/Documents/ - This requests a directory listing of the Documents directory under the user's home directory +

    +

    SMB +

    The path part of a SMB request specifies the file to retrieve and from what share and directory or the share to upload to and as such, may not be omitted. If the user name is not embedded in the URL, it can be set with the CURLOPT_USERPWD or CURLOPT_USERNAME option. If the user name is embedded in the URL then it must contain the domain name and as such, the backslash must be URL encoded as %2f. +

    smb://server.example.com/files/issue - This specifies the file "issue" located in the root of the "files" share +

    smb://server.example.com/files/ -T issue - This specifies the file "issue" will be uploaded to the root of the "files" share. +

    +

    LDAP +

    The path part of a LDAP request can be used to specify the: Distinguished Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field is separated by a question mark and when that field is not required an empty string with the question mark separator should be included. +

    ldap://ldap.example.com/o=My%20Organisation - This will perform a LDAP search with the DN as My Organisation. +

    ldap://ldap.example.com/o=My%20Organisation?postalAddress - This will perform the same search but will only return postalAddress attributes. +

    ldap://ldap.example.com/?rootDomainNamingContext - This specifies an empty DN and requests information about the rootDomainNamingContext attribute for an Active Directory server. +

    For more information about the individual components of a LDAP URL please see RFC 4516. +

    RTMP +

    There's no official URL spec for RTMP so libcurl uses the URL syntax supported by the underlying librtmp library. It has a syntax where it wants a traditional URL, followed by a space and a series of space-separated name=value pairs. +

    While space is not typically a "legal" letter, libcurl accepts them. When a user wants to pass in a '#' (hash) character it will be treated as a fragment and get cut off by libcurl if provided literally. You will instead have to escape it by providing it as backslash and its ASCII value in hexadecimal: "\23".

    DEFAULT

    +

    There is no default URL. If this option isn't set, no transfer can be performed.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    POP3 and SMTP were added in 7.31.0

    RETURN VALUE

    +

    Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient heap space. +

    Note that curl_easy_setopt(3) won't actually parse the given string so given a bad URL, it will not be detected until curl_easy_perform(3) or similar is called.

    SEE ALSO

    +

    CURLOPT_VERBOSE, CURLOPT_PROTOCOLS, CURLOPT_FORBID_REUSE, CURLOPT_FRESH_CONNECT, curl_easy_perform (3)

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_URL.pdf b/docs/libcurl/opts/CURLOPT_URL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7867b41fc169b258caae4a174e6dad6ae8e456d9 GIT binary patch literal 14943 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3 new file mode 100644 index 0000000..13ccbd4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3 @@ -0,0 +1,47 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_USERAGENT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_USERAGENT \- set HTTP user-agent header +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua); +.SH DESCRIPTION +Pass a pointer to a zero terminated string as parameter. It will be used to +set the User-Agent: header in the HTTP request sent to the remote server. This +can be used to fool servers or scripts. You can also set any custom header +with \fICURLOPT_HTTPHEADER(3)\fP. +.SH DEFAULT +NULL, no User-Agent: header is used by default. +.SH PROTOCOLS +HTTP, HTTPS +.SH EXAMPLE +TODO +.SH AVAILABILITY +As long as HTTP is supported +.SH RETURN VALUE +Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_REFERER "(3), " CURLOPT_HTTPHEADER "(3), " diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.html b/docs/libcurl/opts/CURLOPT_USERAGENT.html new file mode 100644 index 0000000..e418ec5 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERAGENT.html @@ -0,0 +1,60 @@ + + +CURLOPT_USERAGENT man page + + + + +

    NAME

    +

    CURLOPT_USERAGENT - set HTTP user-agent header

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua);

    DESCRIPTION

    +

    Pass a pointer to a zero terminated string as parameter. It will be used to set the User-Agent: header in the HTTP request sent to the remote server. This can be used to fool servers or scripts. You can also set any custom header with CURLOPT_HTTPHEADER.

    DEFAULT

    +

    NULL, no User-Agent: header is used by default.

    PROTOCOLS

    +

    HTTP, HTTPS

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    As long as HTTP is supported

    RETURN VALUE

    +

    Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_REFERER, CURLOPT_HTTPHEADER,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.pdf b/docs/libcurl/opts/CURLOPT_USERAGENT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d3ef56883054c9b4d39359cadaa7e12d10076257 GIT binary patch literal 4014 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 T*ceyQ_(Bl|1qDS;j)MLRWyo(p literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3 new file mode 100644 index 0000000..7546f74 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERNAME.3 @@ -0,0 +1,71 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_USERNAME \- user name to use in authentication +.SH SYNOPSIS +.nf +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERNAME, + char *username); +.SH DESCRIPTION +Pass a char * as parameter, which should be pointing to the zero terminated +user name to use for the transfer. + +\fBCURLOPT_USERNAME(3)\fP sets the user name to be used in protocol +authentication. You should not use this option together with the (older) +\fICURLOPT_USERPWD(3)\fP option. + +When using Kerberos V5 authentication with a Windows based server, you should +include the domain name in order for the server to successfully obtain a +Kerberos Ticket. If you don't then the initial part of the authentication +handshake may fail. + +When using NTLM, the user name can be specified simply as the user name +without the domain name should the server be part of a single domain and +forest. + +To include the domain name use either Down-Level Logon Name or UPN (User +Principal Name) formats. For example, EXAMPLE\\user and user@example.com +respectively. + +Some HTTP servers (on Windows) support inclusion of the domain for Basic +authentication as well. + +To specify the password and login options, along with the user name, use the +\fICURLOPT_PASSWORD(3)\fP and \fICURLOPT_LOGIN_OPTIONS(3)\fP options. +.SH DEFAULT +blank +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.19.1 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERPWD "(3), " CURLOPT_PASSWORD "(3), " +.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)" diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.html b/docs/libcurl/opts/CURLOPT_USERNAME.html new file mode 100644 index 0000000..e0d459d --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERNAME.html @@ -0,0 +1,70 @@ + + +CURLOPT_USERNAME man page + + + + +

    NAME

    +

    CURLOPT_USERNAME - user name to use in authentication

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERNAME, +   char *username); +

    +

    DESCRIPTION

    +

    Pass a char * as parameter, which should be pointing to the zero terminated user name to use for the transfer. +

    CURLOPT_USERNAME sets the user name to be used in protocol authentication. You should not use this option together with the (older) CURLOPT_USERPWD option. +

    When using Kerberos V5 authentication with a Windows based server, you should include the domain name in order for the server to successfully obtain a Kerberos Ticket. If you don't then the initial part of the authentication handshake may fail. +

    When using NTLM, the user name can be specified simply as the user name without the domain name should the server be part of a single domain and forest. +

    To include the domain name use either Down-Level Logon Name or UPN (User Principal Name) formats. For example, EXAMPLE\user and user@example.com respectively. +

    Some HTTP servers (on Windows) support inclusion of the domain for Basic authentication as well. +

    To specify the password and login options, along with the user name, use the CURLOPT_PASSWORD and CURLOPT_LOGIN_OPTIONS options.

    DEFAULT

    +

    blank

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.19.1

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERPWD, CURLOPT_PASSWORD, CURLOPT_HTTPAUTH, CURLOPT_PROXYAUTH,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.pdf b/docs/libcurl/opts/CURLOPT_USERNAME.pdf new file mode 100644 index 0000000000000000000000000000000000000000..904f8b0b708c9b00ef7495d4be9e1a53e0abb82e GIT binary patch literal 4731 zcmb_gc~}$I7FR@zK@n|np;$&OjR?uiBq5t2DhUygH3R__H6#;=WFwhCKyd*IDlRC3 z0&Zv(LBzHqE-h*c8bQS>2x8spt|%(*TJ_xt;Qn6wzR&q5cg{WMcg{WMo@L?^EEG{t zDud)=zP)q<$pbnixD5Vgia77AaLYriWmWN{VAbOs17%d_Kv5>oKXC zWLljY{-@^h;r=Pj;f(CeO})fHtlDcmd#A=8Dkw{o`!3sZ-!WnOA75dpVA-VQlg!UD zUgo|uZ@Xpd8o#=aRrgBa+& znjUfq*lU#q;T$euCwzOaDd}w>F!(>N*+S=}(P~!O3>E91F=g;_-UOONP$6_-sgA zrQ2T`nMiHtGoYKJRj?zehMO>SrM_^{(4fHlARSU2KP9+-!6wb-r@v;MP&8uvA=MJo zv9H=EudIwi9E$A}$;o zbmY;a=L6aShc8pkYUXb zswDcn&5R+tdiPdB67FE*uiZGiZWYuBhe7cHOX7PDE~r=@($H=EZ^EU?-7j-imXlOTt=K_~t*U8DD!Yn_fnh=8~(uLYVB3Hc#f{wQ=WXJdO;IaDEpZcP)!t zwz8~cf_=Y<`Pv4*u!}DoVtQ5CCetd`nX7)Sn&I}?J)+yS!iOctw*1gMklJ(X$h&vu zR)?qKw$ko1j-HKix;n4Vo|eU-{q|k@u_8G&z3EEUjgX>?<|_lqhTpc_tGHcOb~>-U zBXX8XBDIzs~9Sdns^{(t6%RWt=x?3P}cJm-zuZ-1}44ot1JFa6l8T0 zImfKI!4XY!zX$td*{5C(z3`;3M{RiRqQ1%6&_d>lDR&RMS?{1^IZHxFQ{0BwI7{M2 zstWQl=IWbmkN&)Bf^eNfWX?g(K$D*B3@tYrLvO`YgoaYssTa=u;s-|aNbc%n@ZC2xi z1h&m)eXmv4K4Hu%y@u=wY^2UUFdLmz(n+&T|WMw>qp4-GdLB@}{2VpI&(1 z*c$$=&E;pHRk zg0qbeqhJ5Dcwv+} z(1m%TuS=bMw>mD~(=E;LaM*~HV@+GD8V^WPxZh03&StE0-0I`7#@AzSUFPok<@=IS zS4}&~yIW#gu<4H*r5a;TYTcyBo-=ByzCZQT%-q7Em-o&Nd362hz^D0FXz;od=Oq2u z!{euVRqc!koGcpQ>dhb-@yg<*)lRp(vWgZkt{>MAPTzYZa=SK@dGcyQ+Hm% z`ksBxmG`xhzYMM4SR`{in^4$t>2C7_^Y^MbP1>Oe*mRw&Om(FO}l3~5gKXKRkL9!h?w&b=%&R_3?n9OR~th&pWT6aZI&oo~3tJbX< zJG%5v{@g>%if4Ykv*x>>2~cM~KkCG4G9N5!zG~HGKNt7W)a`v{XCIZmxhd`SnP|~a zySC~5M|~A;du)|WDyyyUuqCQQL3GrR<}0>0+w8M@1nF{)wYFTTesr6=w-s}GK8j^S zJ^o{D!d6G-y6Aq-_RFevO>BtWQIG=*mTcQ=-d3xk-|?-q9gD%6D$Ru)NRh z`L`RM+K|<&e|We!%i+m9L;UPL1%b8l%BeW-iST5r_(k8+U$2$AA1U}IiYgbZS3}qH zE{~qhDX(;5aMhfb3G3G6|DMQ-Z65!CwHcb}wwrAnGz{x4dJ;3y;pJ)DL+9w4f|~)DR;VcH>LHr zdsNTJjR`V2XG}_4o7eZRDx0WL?l+LxT!)&Bvcu`Sw|Up5t`?=uIdHw-lr=g(Oe62? zzhFi5Y@$;WzbFSqNS!ps+kP%d(qVA0GzNnMFu79dr8Pm55wPvS@qpM2S`-NuYjM!s zAp~&gF%1sU!LAsPF@x5qmth7l6a?$FvQP}441=)&f+d&<2Xfvfe0-=y6h%8kL|Pz@ z(kw4vPJjjA9UvMYV!jZQ0IAbHLPf{C0nmVfki|j+1W!=P4bWr~VZWFZ1px#j0r`$7 zp{jFK>5vpiaj8lh(*@CKeE^0_KC1#Nb zIq_Q<%Q3rlf#*@esbW~nA#pkuY!dqe34)_j!b@tv2yej>r5ZC(e8CZvGK(u;$!CM37J*6fFLM=Z1ZzfrGJ0S^c z;VwB?s8lF0aHYTX(#)Z0T@Li8>|SMc7tAtJ!PYcfUY3?`r7 znFG8rCY@9khv85(7NgX7lJEYqpA0GGp5$ZDRGEKvFv{U@V1x$KXcWLfF(helsfnU7i~#y9hA1Q6h-nN|i%nFSRt+m7 zV3dl$U5bR@IC`ZHS86p7p;#KNHR7IRqfsg6G8G(}jK+{sWC~g|1w}Ch1pyBQk;>T| z7M+E$%> z0LuVx@MH8^g#t>z^adglD3wN|(mOO-#5%cnFcG77yz{yJCDjE4 z{BMt`)x?!1__#u?%%}!s+gJGiT$s-tW4Y{&!8)T}Wyub?48~L#VVePj83h*0Wn6_; zua<(lE!F8j4V4mC9tL-k%;$kkT#2hNz9sj@sql`4N=f7rS0&ZNc#=&NIi`>rRXCX+ zrm=9#JEEad@;eq5IruHsCt_tGf!qdRgWpsRJ_-6v&*uYrTP{J5^CTw{#SpCCA1H|a z-C2#h@_OW_(%Ka?cp^)H!-+f@DdZAKhM))=;h=0wevuJ`4A?*({sTv6HjMmKzPP^W z$R<6eAR!RyK_UuP#{)4vJm?;f0_vpEXmrr=i3iej(HJQ0BN`25fvMzuKEnPFX~-vN zph|zlN275-bN&DinD!Bk!3I6}13m@~%myFO=!{R$SRd1v;PfBLvJfyPb>ZQ9sZxdM z!Jj)29I8ylfd3#c^l8Cd1tKkmU|)?w3w2Cwu&)rB%oA{gh&SCElI8-=} m#^Nx%yit~j#T4-WnInoA*$lW;k6VJqpt0B_7Z>j!5$Qh|k;e=G literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3 new file mode 100644 index 0000000..22e920f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERPWD.3 @@ -0,0 +1,76 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_USERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_USERPWD \- user name and password to use in authentication +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd); +.SH DESCRIPTION +Pass a char * as parameter, pointing to a zero terminated login details string +for the connection. The format of which is: [user name]:[password]. + +When using Kerberos V5 authentication with a Windows based server, you should +specify the user name part with the domain name in order for the server to +successfully obtain a Kerberos Ticket. If you don't then the initial part of +the authentication handshake may fail. + +When using NTLM, the user name can be specified simply as the user name +without the domain name should the server be part of a single domain and +forest. + +To specify the domain name use either Down-Level Logon Name or UPN (User +Principal Name) formats. For example, EXAMPLE\\user and user@example.com +respectively. + +Some HTTP servers (on Windows) support inclusion of the domain for Basic +authentication as well. + +When using HTTP and \fICURLOPT_FOLLOWLOCATION(3)\fP, libcurl might perform +several requests to possibly different hosts. libcurl will only send this user +and password information to hosts using the initial host name (unless +\fICURLOPT_UNRESTRICTED_AUTH(3)\fP is set), so if libcurl follows locations to +other hosts it will not send the user and password to those. This is enforced +to prevent accidental information leakage. + +Use \fICURLOPT_HTTPAUTH(3)\fP to specify the authentication method for HTTP +based connections or \fICURLOPT_LOGIN_OPTIONS(3)\fP to control IMAP, POP3 and +SMTP options. + +The user and password strings are not URL decoded, so there's no way to send +in a user name containing a colon using this option. Use +\fICURLOPT_USERNAME(3)\fP for that, or include it in the URL. +.SH DEFAULT +NULL +.SH PROTOCOLS +Most +.SH EXAMPLE +TODO +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK on success or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), " diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.html b/docs/libcurl/opts/CURLOPT_USERPWD.html new file mode 100644 index 0000000..c1c3394 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USERPWD.html @@ -0,0 +1,67 @@ + + +CURLOPT_USERPWD man page + + + + +

    NAME

    +

    CURLOPT_USERPWD - user name and password to use in authentication

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd);

    DESCRIPTION

    +

    Pass a char * as parameter, pointing to a zero terminated login details string for the connection. The format of which is: [user name]:[password]. +

    When using Kerberos V5 authentication with a Windows based server, you should specify the user name part with the domain name in order for the server to successfully obtain a Kerberos Ticket. If you don't then the initial part of the authentication handshake may fail. +

    When using NTLM, the user name can be specified simply as the user name without the domain name should the server be part of a single domain and forest. +

    To specify the domain name use either Down-Level Logon Name or UPN (User Principal Name) formats. For example, EXAMPLE\user and user@example.com respectively. +

    Some HTTP servers (on Windows) support inclusion of the domain for Basic authentication as well. +

    When using HTTP and CURLOPT_FOLLOWLOCATION, libcurl might perform several requests to possibly different hosts. libcurl will only send this user and password information to hosts using the initial host name (unless CURLOPT_UNRESTRICTED_AUTH is set), so if libcurl follows locations to other hosts it will not send the user and password to those. This is enforced to prevent accidental information leakage. +

    Use CURLOPT_HTTPAUTH to specify the authentication method for HTTP based connections or CURLOPT_LOGIN_OPTIONS to control IMAP, POP3 and SMTP options. +

    The user and password strings are not URL decoded, so there's no way to send in a user name containing a colon using this option. Use CURLOPT_USERNAME for that, or include it in the URL.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    Most

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_USERNAME, CURLOPT_PASSWORD,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.pdf b/docs/libcurl/opts/CURLOPT_USERPWD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e5209b8b5b1d11a2b390e434e16d673a3087d59 GIT binary patch literal 5037 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_USE_SSL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_USE_SSL \- request using SSL / TLS for the transfer +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USE_SSL, long level); +.SH DESCRIPTION +Pass a long using one of the values from below, to make libcurl use your +desired \fIlevel\fP of SSL for the transfer. + +These are all protocols that start out plain text and get "upgraded" to SSL +using the STARTTLS command. + +This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc. +.IP CURLUSESSL_NONE +Don't attempt to use SSL. +.IP CURLUSESSL_TRY +Try using SSL, proceed as normal otherwise. +.IP CURLUSESSL_CONTROL +Require SSL for the control connection or fail with \fICURLE_USE_SSL_FAILED\fP. +.IP CURLUSESSL_ALL +Require SSL for all communication or fail with \fICURLE_USE_SSL_FAILED\fP. +.SH DEFAULT +CURLUSESSL_NONE +.SH PROTOCOLS +FTP, SMTP, POP3, IMAP +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/file.ext"); + + /* require use of SSL for this, or fail */ + curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Added in 7.11.0. This option was known as CURLOPT_FTP_SSL up to 7.16.4, and +the constants were known as CURLFTPSSL_* +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_SSLVERSION "(3), " CURLOPT_SSL_OPTIONS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.html b/docs/libcurl/opts/CURLOPT_USE_SSL.html new file mode 100644 index 0000000..22916b0 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_USE_SSL.html @@ -0,0 +1,81 @@ + + +CURLOPT_USE_SSL man page + + + + +

    NAME

    +

    CURLOPT_USE_SSL - request using SSL / TLS for the transfer

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USE_SSL, long level);

    DESCRIPTION

    +

    Pass a long using one of the values from below, to make libcurl use your desired level of SSL for the transfer. +

    These are all protocols that start out plain text and get "upgraded" to SSL using the STARTTLS command. +

    This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc. +

    CURLUSESSL_NONE +

    Don't attempt to use SSL. +

    CURLUSESSL_TRY +

    Try using SSL, proceed as normal otherwise. +

    CURLUSESSL_CONTROL +

    Require SSL for the control connection or fail with CURLE_USE_SSL_FAILED. +

    CURLUSESSL_ALL +

    Require SSL for all communication or fail with CURLE_USE_SSL_FAILED.

    DEFAULT

    +

    CURLUSESSL_NONE

    PROTOCOLS

    +

    FTP, SMTP, POP3, IMAP

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/file.ext"); +

      /* require use of SSL for this, or fail */ +   curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Added in 7.11.0. This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants were known as CURLFTPSSL_*

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_SSLVERSION, CURLOPT_SSL_OPTIONS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.pdf b/docs/libcurl/opts/CURLOPT_USE_SSL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2c54422cc0a3701164310ae7b4c9b24525fb338 GIT binary patch literal 4371 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3 new file mode 100644 index 0000000..732b8c4 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3 @@ -0,0 +1,63 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_VERBOSE 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_VERBOSE \- set verbose mode on/off +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff); +.SH DESCRIPTION +Set the \fIonoff\fP parameter to 1 to make the library display a lot of +verbose information about its operations on this \fIhandle\fP. Very useful for +libcurl and/or protocol debugging and understanding. The verbose information +will be sent to stderr, or the stream set with \fICURLOPT_STDERR(3)\fP. + +You hardly ever want this set in production use, you will almost always want +this when you debug/report problems. + +To also get all the protocol data sent and received, consider using the +\fICURLOPT_DEBUGFUNCTION(3)\fP. +.SH DEFAULT +0, meaning disabled. +.SH PROTOCOLS +All +.SH EXAMPLE +.nf +CURL *curl = curl_easy_init(); +if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + + /* ask libcurl to show us the verbose output */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + + /* Perform the request */ + curl_easy_perform(curl); +} +.fi +.SH AVAILABILITY +Always +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.html b/docs/libcurl/opts/CURLOPT_VERBOSE.html new file mode 100644 index 0000000..402a394 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_VERBOSE.html @@ -0,0 +1,73 @@ + + +CURLOPT_VERBOSE man page + + + + +

    NAME

    +

    CURLOPT_VERBOSE - set verbose mode on/off

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff);

    DESCRIPTION

    +

    Set the onoff parameter to 1 to make the library display a lot of verbose information about its operations on this handle. Very useful for libcurl and/or protocol debugging and understanding. The verbose information will be sent to stderr, or the stream set with CURLOPT_STDERR. +

    You hardly ever want this set in production use, you will almost always want this when you debug/report problems. +

    To also get all the protocol data sent and received, consider using the CURLOPT_DEBUGFUNCTION.

    DEFAULT

    +

    0, meaning disabled.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    +

    CURL *curl = curl_easy_init(); + if(curl) { +   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); +

      /* ask libcurl to show us the verbose output */ +   curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); +

      /* Perform the request */ +   curl_easy_perform(curl); + } +

    + +

    AVAILABILITY

    +

    Always

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_STDERR, CURLOPT_DEBUGFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.pdf b/docs/libcurl/opts/CURLOPT_VERBOSE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5250d4ec73cf7c18d7a4c2d6fdf51bee3151d939 GIT binary patch literal 4253 zcmb^!X;f2J+67Ugs71wis`6YgXi46ZJtkpCLBbLcmBr2@d5M8+Brg!Lo|#d>jS3do zM1^YIaG`>@Vni<5*Op)e>3sg!0WO$4r^SvRId zHR+oIMl5NV>v4WXR{DYKEO<6g*Z1de+K$z?f)1RkVhxRs4%E8KTii;*A7}rbxoQ5D zTMp@c&z&EZQnyjKSXH#rdo0>sn!4}lvIjm{Iv#Q|xt;U3gmsab^_w@o9C7vf@D5ej z;bSYW`dO!1B-if`tln~ZQb&?;M_jXq>QUnBYsr;@B6!EM4U0;%=d24Dj-A}>iWM+c z#JVOm6{k<+Ja?X&6ma;-hK?PtlMu{ZouwQ=7gu>nKF0HhJy7?*o3Q1`fXiQ>(k3jP z>h-9h|J@6b&tA9wqs6gesCPidjj{)_uWowwyLxi&_~d@d?Ncw*OvzRj?Qsjdo>X@3 zpuZ$@h;D1vllF{0XIBa@&UuknRNB%|TT8g6(ZUBEaILnE9{u%$&{=2bp11Ff8TzY> zOG{DC^Qin+>kloi@T*Jq{@2=@?d!jvxate*kgSjP@73LVl2UqYiD%pb4_4_PwJ++Q zLB1ack6d*jw@Q9En}FD@vx+Y#1$Er#xW^7j41 z54$_>tWxg&=N+H9!qV%++BGG=Ot^@brQ(dhQPS<+zXxB!lUFWPJNFqP4CI{+v#uCB zpX6KQ?Jac+Cyjm`8E>o6c4_ zR5bRh9hNhC(c1YX-(B-5F1r(!+H~;;dPUlNMa8)Ci@TS%t`63(UfCzsgP!IMouD6{ zaDGZ?RG{Cbhv90k%uizXUe^0&^;@1bX+bTg_S&b<)0|!1UzTh*CMiy@_<7HLWGfxf z71CNBhkTJdbn8lSkU*NWR(9GnD<^kOQ^}ePQ_a;1LHgj^=g*#xy#>!s-gPV^WJb9- z=jeh>Cl&ekL*_Xic@SHgpf+dab-es7K0JD6=!peInmL2}KU;QuGE2aX#j4E%*A$J6 z<@PPz8GW>ozb39}^62WsMu+tNqrEHFZeGdDSCluL2>NaGD0IqCf!>j0mM$z(3dIQy3Gh$bqL}V?>5rFRdOTo_ zF=(4aeRJp5__4L!aslVox&wg$Gbl6a*la?7JtSal%bYx0%*`>e%-Y-7oDjV9T2#c}+h@G`WBAOmGcZE0v^Q#SqnbO_(y3pR!xqx) zFiv;lk6dIV;4oZGz%oLq!F>!?C|nkm7E!2BSq0pk^loBM={$67$~qW_y!!!5H*P8 zGyt;eM~UbhOn@6u5VC1#hTz#6r5TE$QToeiaS-5Op;-1Hr9|0hS|_D1PU2dFx{HNf zdl^CEO7H@qoxHkb^WSFBZ3Ybv4U<8rRBBh!W|du(oKK_Zw!FU5=x8_s+t{ zpjG|_29!>{Gmsl}xV|R`e?3?XG ztkdW%=D2QaY_aJ{+7-2K`{&7myLK0p&EZL<_T(3PT8+3OkszUXLaotD827(F!hkeN z31co-hRBS*#6r!iR1*=A8WO2UO;iY#3{NRd?1_V#A(&R&$W+;uATvam6_QE5^5B3; z6oOS`)fsglc_6D!t2c|R5{8XL1nv|VWR45d}2nJ&q6JRjS zi}WOJW$Mk7fjpZcnt5-?^k$Y#CzisXgEjMDl!d@ug8YCvCXJEQ81xV&7>_qtND0GY z(I`bcl@L>49Gt08Vew29B~(lV9HxNB#}GcoS8@edmpEe&HQ$m49)LhL@B_GsKx0r^ z6og5_m>Cuf&0J_Olb!M*Aq(L#V7vJrN-GeX-n{?==5TV#72r5DlG5iiD2tFY71xqkkivI#>56m8<22&(R38~s-P^q9~!epi* zfwC}+#qN}7BeP?PVJb#Fyz`;`g&SqE|LrlIj!J0?PvmD%SahIY2m1X#3G<<2tW>;F z*l00nZPlSvz=W2dbTfl6qd;S&LZmX7bU4Uu+-L;N6Q@!h206))ioqkPA+?0mR(sxB zvh$+VP_-n|;(E1&VPz@_6>iaz4Cx%b4O`h64XsAnd9l&K-Mo5bIx z=mVV($Edqqg5f4%q)^Qe+}_?KsKIUT#$9#o-dkBu1CyPq65w#EPTc)ORFNSlB0z+w zz*b)j1YrO)P=|klVXp@F-s)xAn^9~v5h@x2pLEd6tgIBHijlemer1&u905Sp8t Ie`o;hKNWlJO8@`> literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 new file mode 100644 index 0000000..b567045 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 @@ -0,0 +1,87 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_WILDCARDMATCH 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WILDCARDMATCH, long onoff); +.SH DESCRIPTION +Set \fIonoff\fP to 1 if you want to transfer multiple files according to a +file name pattern. The pattern can be specified as part of the +\fICURLOPT_URL(3)\fP option, using an fnmatch-like pattern (Shell Pattern +Matching) in the last part of URL (file name). + +By default, libcurl uses its internal wildcard matching implementation. You +can provide your own matching function by the +\fICURLOPT_FNMATCH_FUNCTION(3)\fP option. + +A brief introduction of its syntax follows: +.RS +.IP "* - ASTERISK" +\&ftp://example.com/some/path/\fB*.txt\fP (for all txt's from the root +directory) +.RE +.RS +.IP "? - QUESTION MARK" +Question mark matches any (exactly one) character. + +\&ftp://example.com/some/path/\fBphoto?.jpeg\fP +.RE +.RS +.IP "[ - BRACKET EXPRESSION" +The left bracket opens a bracket expression. The question mark and asterisk have +no special meaning in a bracket expression. Each bracket expression ends by the +right bracket and matches exactly one character. Some examples follow: + +\fB[a-zA-Z0\-9]\fP or \fB[f\-gF\-G]\fP \- character interval + +\fB[abc]\fP - character enumeration + +\fB[^abc]\fP or \fB[!abc]\fP - negation + +\fB[[:\fP\fIname\fP\fB:]]\fP class expression. Supported classes are +\fBalnum\fP,\fBlower\fP, \fBspace\fP, \fBalpha\fP, \fBdigit\fP, \fBprint\fP, +\fBupper\fP, \fBblank\fP, \fBgraph\fP, \fBxdigit\fP. + +\fB[][-!^]\fP - special case \- matches only '\-', ']', '[', '!' or '^'. These +characters have no special purpose. + +\fB[\\[\\]\\\\]\fP - escape syntax. Matches '[', ']' or '\\'. + +Using the rules above, a file name pattern can be constructed: + +\&ftp://example.com/some/path/\fB[a-z[:upper:]\\\\].jpeg\fP +.RE +.PP +.SH PROTOCOLS +This feature is only supported for FTP download. +.SH EXAMPLE +See http://curl.haxx.se/libcurl/c/ftp-wildcard.html +.SH AVAILABILITY +Added in 7.21.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_FNMATCH_FUNCTION "(3), " CURLOPT_URL "(3), " diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.html b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.html new file mode 100644 index 0000000..1abff18 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.html @@ -0,0 +1,83 @@ + + +CURLOPT_WILDCARDMATCH man page + + + + +

    NAME

    +

    CURLOPT_WILDCARDMATCH - enable directory wildcard transfers

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WILDCARDMATCH, long onoff);

    DESCRIPTION

    +

    Set onoff to 1 if you want to transfer multiple files according to a file name pattern. The pattern can be specified as part of the CURLOPT_URL option, using an fnmatch-like pattern (Shell Pattern Matching) in the last part of URL (file name). +

    By default, libcurl uses its internal wildcard matching implementation. You can provide your own matching function by the CURLOPT_FNMATCH_FUNCTION option. +

    A brief introduction of its syntax follows: +

    +

    * - ASTERISK +

    ftp://example.com/some/path/*.txt (for all txt's from the root directory) +

    +

    +

    ? - QUESTION MARK +

    Question mark matches any (exactly one) character. +

    ftp://example.com/some/path/photo?.jpeg +

    +

    +

    [ - BRACKET EXPRESSION +

    The left bracket opens a bracket expression. The question mark and asterisk have no special meaning in a bracket expression. Each bracket expression ends by the right bracket and matches exactly one character. Some examples follow: +

    [a-zA-Z0-9] or [f-gF-G] - character interval +

    [abc] - character enumeration +

    [^abc] or [!abc] - negation +

    [[:name:]] class expression. Supported classes are alnum,lower, space, alpha, digit, print, upper, blank, graph, xdigit. +

    [][-!^] - special case - matches only '-', ']', '[', '!' or '^'. These characters have no special purpose. +

    [\[\]\\] - escape syntax. Matches '[', ']' or '´. +

    Using the rules above, a file name pattern can be constructed: +

    ftp://example.com/some/path/[a-z[:upper:]\\].jpeg +

    +

    PROTOCOLS

    +

    This feature is only supported for FTP download.

    EXAMPLE

    +

    See http://curl.haxx.se/libcurl/c/ftp-wildcard.html

    AVAILABILITY

    +

    Added in 7.21.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

    SEE ALSO

    +

    CURLOPT_FNMATCH_FUNCTION, CURLOPT_URL,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.pdf b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0d81dc6eb55a9e905f85b254de9796e1781c6b8 GIT binary patch literal 5926 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3 new file mode 100644 index 0000000..be07c76 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3 @@ -0,0 +1,58 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_WRITEDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_WRITEDATA \- custom pointer passed to the write callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer); +.SH DESCRIPTION +A data \fIpointer\fP to pass to the write callback. If you use the +\fICURLOPT_WRITEFUNCTION(3)\fP option, this is the pointer you'll get in that +callback's 4th argument. If you don't use a write callback, you must make +\fIpointer\fP a 'FILE *' (cast to 'void *') as libcurl will pass this to +\fIfwrite(3)\fP when writing data. + +The internal \fICURLOPT_WRITEFUNCTION(3)\fP will write the data to the FILE * +given with this option, or to stdout if this option hasn't been set. + +If you're using libcurl as a win32 DLL, you \fBMUST\fP use the +\fICURLOPT_WRITEFUNCTION(3)\fP if you set this option or you will experience +crashes. +.SH DEFAULT +By default, this is a FILE * to stdout. +.SH PROTOCOLS +Used for all protocols. +.SH EXAMPLE +A common technique is to use the write callback to store the incoming data +into a dynamically growing allocated buffer, and then this CURLOPT_WRITEDATA +is used to point to a struct or the buffer to store data in. Like in the +getinmemory example: http://curl.haxx.se/libcurl/c/getinmemory.html +.SH AVAILABILITY +Available in all libcurl versions. This option was formerly known as +\fICURLOPT_FILE\fP, the name \fICURLOPT_WRITEDATA\fP was introduced in 7.9.7. +.SH RETURN VALUE +This will return CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_WRITEFUNCTION "(3), " CURLOPT_READDATA "(3), " diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.html b/docs/libcurl/opts/CURLOPT_WRITEDATA.html new file mode 100644 index 0000000..fb9dff9 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.html @@ -0,0 +1,62 @@ + + +CURLOPT_WRITEDATA man page + + + + +

    NAME

    +

    CURLOPT_WRITEDATA - custom pointer passed to the write callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);

    DESCRIPTION

    +

    A data pointer to pass to the write callback. If you use the CURLOPT_WRITEFUNCTION option, this is the pointer you'll get in that callback's 4th argument. If you don't use a write callback, you must make pointer a 'FILE *' (cast to 'void *') as libcurl will pass this to fwrite(3) when writing data. +

    The internal CURLOPT_WRITEFUNCTION will write the data to the FILE * given with this option, or to stdout if this option hasn't been set. +

    If you're using libcurl as a win32 DLL, you MUST use the CURLOPT_WRITEFUNCTION if you set this option or you will experience crashes.

    DEFAULT

    +

    By default, this is a FILE * to stdout.

    PROTOCOLS

    +

    Used for all protocols.

    EXAMPLE

    +

    A common technique is to use the write callback to store the incoming data into a dynamically growing allocated buffer, and then this CURLOPT_WRITEDATA is used to point to a struct or the buffer to store data in. Like in the getinmemory example: http://curl.haxx.se/libcurl/c/getinmemory.html

    AVAILABILITY

    +

    Available in all libcurl versions. This option was formerly known as CURLOPT_FILE, the name CURLOPT_WRITEDATA was introduced in 7.9.7.

    RETURN VALUE

    +

    This will return CURLE_OK.

    SEE ALSO

    +

    CURLOPT_WRITEFUNCTION, CURLOPT_READDATA,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.pdf b/docs/libcurl/opts/CURLOPT_WRITEDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2751caa020c848a087f6b897f8ae1cdc18d70db7 GIT binary patch literal 4668 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 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 new file mode 100644 index 0000000..f5a45a3 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 @@ -0,0 +1,81 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_WRITEFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_WRITEFUNCTION \- set callback for writing received data +.SH SYNOPSIS +.nf +#include + +size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This callback function gets called by libcurl as soon as there is data +received that needs to be saved. \fIptr\fP points to the delivered data, and +the size of that data is \fIsize\fP multiplied with \fInmemb\fP. + +The callback function will be passed as much data as possible in all invokes, +but you must not make any assumptions. It may be one byte, it may be +thousands. The maximum amount of body data that will be passed to the write +callback is defined in the curl.h header file: \fICURL_MAX_WRITE_SIZE\fP (the +usual default is 16K). If \fICURLOPT_HEADER(3)\fP is enabled, which makes +header data get passed to the write callback, you can get up to +\fICURL_MAX_HTTP_HEADER\fP bytes of header data passed into it. This usually +means 100K. + +This function may be called with zero bytes data if the transferred file is +empty. + +The data passed to this function will not be zero terminated! + +Set the \fIuserdata\fP argument with the \fICURLOPT_WRITEDATA(3)\fP option. + +Your callback should return the number of bytes actually taken care of. If +that amount differs from the amount passed to your callback function, it'll +signal an error condition to the library. This will cause the transfer to get +aborted and the libcurl function used will return \fICURLE_WRITE_ERROR\fP. + +If your callback function returns CURL_WRITEFUNC_PAUSE it will cause this +transfer to become paused. See \fIcurl_easy_pause(3)\fP for further details. + +Set this option to NULL to get the internal default function used instead of +your callback. The internal default function will write the data to the FILE * +given with \fICURLOPT_WRITEDATA(3)\fP. +.SH DEFAULT +libcurl will use 'fwrite' as a callback by default. +.SH PROTOCOLS +For all protocols +.SH AVAILABILITY +Support for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0. +.SH RETURN VALUE +This will return CURLE_OK. +.SH EXAMPLE +A common technique is to use this callback to store the incoming data into a +dynamically growing allocated buffer. Like in the getinmemory example: +http://curl.haxx.se/libcurl/c/getinmemory.html +.SH "SEE ALSO" +.BR CURLOPT_WRITEDATA "(3), " CURLOPT_READFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.html b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.html new file mode 100644 index 0000000..94bb1b2 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.html @@ -0,0 +1,72 @@ + + +CURLOPT_WRITEFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_WRITEFUNCTION - set callback for writing received data

    SYNOPSIS

    +

    +

    #include <curl/curl.h> +

    size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback); +

    +

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This callback function gets called by libcurl as soon as there is data received that needs to be saved. ptr points to the delivered data, and the size of that data is size multiplied with nmemb. +

    The callback function will be passed as much data as possible in all invokes, but you must not make any assumptions. It may be one byte, it may be thousands. The maximum amount of body data that will be passed to the write callback is defined in the curl.h header file: CURL_MAX_WRITE_SIZE (the usual default is 16K). If CURLOPT_HEADER is enabled, which makes header data get passed to the write callback, you can get up to CURL_MAX_HTTP_HEADER bytes of header data passed into it. This usually means 100K. +

    This function may be called with zero bytes data if the transferred file is empty. +

    The data passed to this function will not be zero terminated! +

    Set the userdata argument with the CURLOPT_WRITEDATA option. +

    Your callback should return the number of bytes actually taken care of. If that amount differs from the amount passed to your callback function, it'll signal an error condition to the library. This will cause the transfer to get aborted and the libcurl function used will return CURLE_WRITE_ERROR. +

    If your callback function returns CURL_WRITEFUNC_PAUSE it will cause this transfer to become paused. See curl_easy_pause(3) for further details. +

    Set this option to NULL to get the internal default function used instead of your callback. The internal default function will write the data to the FILE * given with CURLOPT_WRITEDATA.

    DEFAULT

    +

    libcurl will use 'fwrite' as a callback by default.

    PROTOCOLS

    +

    For all protocols

    AVAILABILITY

    +

    Support for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0.

    RETURN VALUE

    +

    This will return CURLE_OK.

    EXAMPLE

    +

    A common technique is to use this callback to store the incoming data into a dynamically growing allocated buffer. Like in the getinmemory example: http://curl.haxx.se/libcurl/c/getinmemory.html

    SEE ALSO

    +

    CURLOPT_WRITEDATA, CURLOPT_READFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..42c2177d0b6093df794a4bbae8f1586d954e2fa7 GIT binary patch literal 5273 zcmb_gc|26>|0ktPt0gMRp%_auXXcDyW{io9Eygag+!`}y7-rEdjHtBPl9CdUN~lz{ zs7sbeB2wR5q_irzNhK{*x8-+caI0It@A7(e{+Z`|p7&>YKA-3FJnu6`o^(eH9&3Rz zYI?S{07V3FfG{)yMWupnupmql4p<@*Z_ts;lfWVXbmTE5Fdb$I*)WZU5=%rdlaG?+ zoesDyx=qqp-RZv~Qh#yL!fZgc=Wdr7!}0JS{X~t1jrFp)R)>sjjVaD%)ffJVw_gK) zSy`q0(%3xnAjbdJNn54WxN~v?sUp8NpZB~v!1Ed&6`6C*NAbc z$eY#qy3agHd1;RQo`elKObCAuEbbmqnYb{stJsNi`8=$7j3%^r4=P)`=sh3KHTmp( z#=#}OwcPzR+B-F%P=?LEpjUleM13mzaOLW_&V^?F<09U#6ZRJ^s5gR*Y5QuoJat}1 zj*7fkKm8^DV(`<}gE#a`g@R81{uB1E)ceu~J1w>jGYp&W<8SPGxB10q1O5p(t>n%0 z!2nmQ3#|TI8`K91wpY{Ijp&|1Z42F>->BYPLg+fUW}vNR|CI(7m`tNyrJtz;_8!b~ z!&;?U7?kBM*`ZeP9``A?#psdtW6PZVaLN+9;Do+|Cb8RGd){JOGHvdNEd6y3V(T&B zBXZhfkIip$J326ed5;Hq!NLPqz9f8b?~nJ(NY+cWD06Umx?XQ{vEGBCORSB=n`c}f z%{?6LaLU73yW^!tjb@Lhw$w|1`nX-iSuE31Li+c zB5E&E`Rin4wUhyJC{c$Uu4=u4K1XX$u9r7Fh zE}25m#kIT-n8IFMG&8%9{;bKp3j4M;%u&stF*{_2(lM%PrCll}UeyXFU4Po{n|u9+ zcYHk0>^0>?^X}Dq<_(z!zskE&mB|WrSNXJ${V?T&!CHo8;+C2FB+`n(pqt5rL$U6| zac)-)O3ZLdp4*8DVSO4O#U>?Ycb_Q}695_1CVjckbo)A&nrW9Ebp6}RKYeOq`jQ6< zQWNoh?2^eRGhUtNb%sYQn3wIPoRB(a(vX+;qyld1fgClDK>nKxv;2YcS&dx@JxwnJ zb%_q$AGP%o0K%K26~B>_8vyEi$dIcH3M;5AiaXY~D!y7wrY()3W$sVA$F&`|80ZYI;1O*tDr{@&S*K`KD@#v)WjV$qH&noYCUATddrY+Y*JhqhKX+Q(Qv z{BYv7A>}0tukNqC^>8Nf?ck@6Rz@XT`;V;MtHn?)YAz>I{xEL5HBn_CqQtn%e8Gh5 z!qSR4DL2jh5B00sRprLIHL6FYWf6w&HfR}E+BlqaWpr{>biIbx{&sn7;89;6+!^)u zX6fyw?%)ikgbRfo%P&meOabR!Bz40qd z|Cr^JVAhxV^!IUd5^T2|YB$uMYO9=(UV8L|_fz+M&reaZt#Y^;O+i~EPE%=T zrm`apR(B?CZ*{Q)kLm=>bi!}Up2j+@zA}TGB2Cyb*S5#ja5CVSy8ZMFw1H?};;D4r zCnbZJJcFF8D@r3$3Qi_A+&yD@;?brhflht3*UBH|QP$`Z?>sR-ZuV9gt>yB^rv9qO zCmGhofzwncc^uuKw6jhe?DzKKC6Cu7s%lOe>Cpb&i9=dB%#NAPxnB8$D~g+r4%S2M zC9a2p_IK=%#hnh`*4bk^*JDl=*XMUe&tA9V@5OsrxvTa(oCU^t)g|0I^5BadcE9=1 zs>;GJ4$WlPSifzxFz8)ZtteOZXg{QtV8=5k{NT6#aWp+}C~<1yq)Ge!j3u?2)!oy@ zG{G7(o|m10W|kdyNMBW4f3pZO$#fznog<&RS6bd@IV^pL>AdchyY4`Ggr{(^==yAw zxH>F4cD49a@LJZr2?teP7Kj^UK~r!_#LflN>brrEO=_q>>%$nSD=R&ZO^_ZbH zfBo08=IGvBezDztKi%c**)4mMV`4uX&Nw!2664_D+?(C4CD`tX|cT zyr7BNaxLJDzDE&VKP#YB^1=G?&Z`xg^UOnes!5u?X>qvW_cfn#i$kI>vU;O$lY0%z zms#&h6)D9{zfX!TBRvt_;Ys727o`s=m9$L*4fmWGAioYQ_TI3{HYZLcbR0atF{8$0 zE8T5&v}Za$KINoJnvm_^nWT?>YhClCRVOgT^%!B-;Nuko?H$&ArB{Z+JayjTUZvAl z)&y*OFIs(lL+|(rVMW%S>QdE4ot)Bly3^iS1E%a#ow24*bRN0Z8xO;m0_uI+Yx}MD z+r(_EJvi|S$->sNBurp?*DgB1S$t)CzOhj-=*bL&K?cm`G8YSFKoAa@ zCX$H&$pQ*Nf!;z1!u**kA(a5=3(F*k zo`X!{e0Di>QSKn6O8~C~m z6zJi}0Pr;0Xpo9kjk@x-Ldo^KznW1jb8HrmL*eB~^#;AkDDudFgd+VzLyj2LSj-f| z@@#>=Ts|zuxFAd5vJ|NR)qBB%dfNQ&7}lk#Z6F+GsZ<#1qROCftG2!*%6fgCOhZ$$w4T!B;^ z@^w*)5`Al7taxA35WsL7`)+iM9uDU^uM)vNtK5BAt0GxsHhK{aMP0;1S_j6+m{Ayx;sZzwz+#q-p}n`8qoEui zqsaJCd}I#+GCofrrpRp23Ka@6mWx3&pnymsZO{P>Pe39R@*=qs0K$^7cnqGf5a5WI zd^koZiUjajOEh9q#O6@Ek@gueh`iaL!zGd^3JAu;#9(6xSfMBk#FNQn5C?$}gh3D( zajZbXlwkzo`G`M7Al!hz)dXU!A|@^Vc*q=wr{Hi@@E=H|_=u`K@&Sx|5dRmd-ypwH6^eY3EkO$t z2{{}f8WxG=mB3>m2um38s8Ab4Q9*f)zRAw7&KEO^!T9$Xkm2Y$8n zlUgZ6NN*!$1OGlbXei(pJ-^P-*W(ho<806|^1~1reNQOl_xI>&Jl5AHKWl4KiWPg3+38izw8Fr*Lv17frrOn%lcrhnhaG7-!{;Q%}lB|or6 z9>9`FBoF}(Fe-zrtPn;de*nRl%)-+02N`6AM{e}*aS)OCgA9kP=|>#l2OLDQK&Z+0 z_6RtHWc?r`AUxoE97MK6lKu}FiS(n4EN30x;|O@GA7UXu7RZ%7hLebxTplb!{`vzz zAMPp`$sd4_J|V)ZkV<<4po@Sb1msmmSf2|W2%;jnp_3qcOGisPoTHV6r9A;pw_NOC lZ?_m)jI$@$(f%_cL{8bn5~fI^D4GQc!l8_e96TIR{|Cg_-53A> literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 new file mode 100644 index 0000000..b2c170f --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 @@ -0,0 +1,46 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_XFERINFODATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFODATA, void *pointer); +.SH DESCRIPTION +Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first +argument in the progress callback set with \fICURLOPT_XFERINFOFUNCTION(3)\fP. + +This is an alias for \fICURLOPT_PROGRESSDATA(3)\fP. +.SH DEFAULT +The default value of this parameter is NULL. +.SH PROTOCOLS +All +.SH EXAMPLE +http://curl.haxx.se/libcurl/c/progressfunc.html +.SH AVAILABILITY +Added in 7.32.0 +.SH RETURN VALUE +Returns CURLE_OK +.SH "SEE ALSO" +.BR CURLOPT_XFERINFOFUNCTION "(3), " CURLOPT_XFERINFOFUNCTION "(3), " diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.html b/docs/libcurl/opts/CURLOPT_XFERINFODATA.html new file mode 100644 index 0000000..3c61c0e --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.html @@ -0,0 +1,61 @@ + + +CURLOPT_XFERINFODATA man page + + + + +

    NAME

    +

    CURLOPT_XFERINFODATA - custom pointer passed to the progress callback

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFODATA, void *pointer);

    DESCRIPTION

    +

    Pass a pointer that will be untouched by libcurl and passed as the first argument in the progress callback set with CURLOPT_XFERINFOFUNCTION. +

    This is an alias for CURLOPT_PROGRESSDATA.

    DEFAULT

    +

    The default value of this parameter is NULL.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    http://curl.haxx.se/libcurl/c/progressfunc.html

    AVAILABILITY

    +

    Added in 7.32.0

    RETURN VALUE

    +

    Returns CURLE_OK

    SEE ALSO

    +

    CURLOPT_XFERINFOFUNCTION, CURLOPT_XFERINFOFUNCTION,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.pdf b/docs/libcurl/opts/CURLOPT_XFERINFODATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..87d1cfd65356a9afa474ad7d13f3dce3e0170b9b GIT binary patch literal 3814 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 S!#RT{k;pK}-#>D46!Z(k%@@T0 literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 new file mode 100644 index 0000000..cad8118 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 @@ -0,0 +1,81 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_XFERINFOFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_XFERINFOFUNCTION \- callback to progress meter function +.SH SYNOPSIS +#include + +int progress_callback(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFOFUNCTION, progress_callback); +.SH DESCRIPTION +Pass a pointer to your callback function, which should match the prototype +shown above. + +This function gets called by libcurl instead of its internal equivalent with a +frequent interval. While data is being transferred it will be called very +frequently, and during slow periods like when nothing is being transferred it +can slow down to about one call per second. + +\fIclientp\fP is the pointer set with \fICURLOPT_XFERINFODATA(3)\fP, it is not +used by libcurl but is only passed along from the application to the callback. + +The callback gets told how much data libcurl will transfer and has +transferred, in number of bytes. \fIdltotal\fP is the total number of bytes +libcurl expects to download in this transfer. \fIdlnow\fP is the number of +bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl +expects to upload in this transfer. \fIulnow\fP is the number of bytes +uploaded so far. + +Unknown/unused argument values passed to the callback will be set to zero +(like if you only download data, the upload size will remain 0). Many times +the callback will be called one or more times first, before it knows the data +sizes so a program must be made to handle that. + +Returning a non-zero value from this callback will cause libcurl to abort the +transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. + +If you transfer data with the multi interface, this function will not be +called during periods of idleness unless you call the appropriate libcurl +function that performs transfers. + +\fICURLOPT_NOPROGRESS(3)\fP must be set to 0 to make this function actually +get called. +.SH DEFAULT +By default, libcurl has an internal progress meter. That's rarely wanted by +users. +.SH PROTOCOLS +All +.SH EXAMPLE +http://curl.haxx.se/libcurl/c/progressfunc.html +.SH AVAILABILITY +Added in 7.32.0. This callback replaces \fICURLOPT_PROGRESSFUNCTION(3)\fP +.SH RETURN VALUE +Returns CURLE_OK. +.SH "SEE ALSO" +.BR CURLOPT_XFERINFODATA "(3), " CURLOPT_NOPROGRESS "(3), " diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.html b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.html new file mode 100644 index 0000000..12435a1 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.html @@ -0,0 +1,68 @@ + + +CURLOPT_XFERINFOFUNCTION man page + + + + +

    NAME

    +

    CURLOPT_XFERINFOFUNCTION - callback to progress meter function

    SYNOPSIS

    +

    #include <curl/curl.h> +

    int progress_callback(void *clientp,   curl_off_t dltotal,   curl_off_t dlnow,   curl_off_t ultotal,   curl_off_t ulnow); +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFOFUNCTION, progress_callback);

    DESCRIPTION

    +

    Pass a pointer to your callback function, which should match the prototype shown above. +

    This function gets called by libcurl instead of its internal equivalent with a frequent interval. While data is being transferred it will be called very frequently, and during slow periods like when nothing is being transferred it can slow down to about one call per second. +

    clientp is the pointer set with CURLOPT_XFERINFODATA, it is not used by libcurl but is only passed along from the application to the callback. +

    The callback gets told how much data libcurl will transfer and has transferred, in number of bytes. dltotal is the total number of bytes libcurl expects to download in this transfer. dlnow is the number of bytes downloaded so far. ultotal is the total number of bytes libcurl expects to upload in this transfer. ulnow is the number of bytes uploaded so far. +

    Unknown/unused argument values passed to the callback will be set to zero (like if you only download data, the upload size will remain 0). Many times the callback will be called one or more times first, before it knows the data sizes so a program must be made to handle that. +

    Returning a non-zero value from this callback will cause libcurl to abort the transfer and return CURLE_ABORTED_BY_CALLBACK. +

    If you transfer data with the multi interface, this function will not be called during periods of idleness unless you call the appropriate libcurl function that performs transfers. +

    CURLOPT_NOPROGRESS must be set to 0 to make this function actually get called.

    DEFAULT

    +

    By default, libcurl has an internal progress meter. That's rarely wanted by users.

    PROTOCOLS

    +

    All

    EXAMPLE

    +

    http://curl.haxx.se/libcurl/c/progressfunc.html

    AVAILABILITY

    +

    Added in 7.32.0. This callback replaces CURLOPT_PROGRESSFUNCTION

    RETURN VALUE

    +

    Returns CURLE_OK.

    SEE ALSO

    +

    CURLOPT_XFERINFODATA, CURLOPT_NOPROGRESS,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.pdf b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56d3a0da4a1aa5f7b50a82a4643bf305cc6c4c35 GIT binary patch literal 5111 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 RwrE5$iGs4Wc3$j)`ah3^gt!0z literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 new file mode 100644 index 0000000..2644c88 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 @@ -0,0 +1,49 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH CURLOPT_XOAUTH2_BEARER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" +.SH NAME +CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token +.SH SYNOPSIS +#include + +CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token); +.SH DESCRIPTION +Pass a char * as parameter, which should point to the zero terminated OAuth +2.0 Bearer Access Token for use with IMAP, POP3 and SMTP servers that support +the OAuth 2.0 Authorization Framework. + +Note: The user name used to generate the Bearer Token should be supplied via +the \fICURLOPT_USERNAME(3)\fP option. +.SH DEFAULT +NULL +.SH PROTOCOLS +IMAP, POP3 and SMTP +.SH EXAMPLE +TODO +.SH AVAILABILITY +Added in 7.33.0 +.SH RETURN VALUE +Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or +CURLE_OUT_OF_MEMORY if there was insufficient heap space. +.SH "SEE ALSO" +.BR CURLOPT_MAIL_AUTH "(3), " CURLOPT_USERNAME "(3), " diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.html b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.html new file mode 100644 index 0000000..0658c30 --- /dev/null +++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.html @@ -0,0 +1,61 @@ + + +CURLOPT_XOAUTH2_BEARER man page + + + + +

    NAME

    +

    CURLOPT_XOAUTH2_BEARER - specify OAuth 2.0 access token

    SYNOPSIS

    +

    #include <curl/curl.h> +

    CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);

    DESCRIPTION

    +

    Pass a char * as parameter, which should point to the zero terminated OAuth 2.0 Bearer Access Token for use with IMAP, POP3 and SMTP servers that support the OAuth 2.0 Authorization Framework. +

    Note: The user name used to generate the Bearer Token should be supplied via the CURLOPT_USERNAME option.

    DEFAULT

    +

    NULL

    PROTOCOLS

    +

    IMAP, POP3 and SMTP

    EXAMPLE

    +

    TODO

    AVAILABILITY

    +

    Added in 7.33.0

    RETURN VALUE

    +

    Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space.

    SEE ALSO

    +

    CURLOPT_MAIL_AUTH, CURLOPT_USERNAME,

    + This HTML page was made with roffit. + diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.pdf b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8406cf6b7934e6fc8278e0484fab39ccb4a5a36 GIT binary patch literal 4044 zcmb_fdt4J&7T)UaTBk_0Vy#wTfJ(HQ%uFVMBqad?go*?)JOp{PlVk!@k_==fO~{J2 zwJ58C7L_g1Qnx8q7Zni|SE=F~s}-MpNZYl57R3kHhju}`cak8e?6&*+Isb5T?m6E% z_ndpadzg|CrQ%}(5j5rKwG|&iVi<*K?Q2kIC=y4Sv)LRt7)UgTiZZgK1x8dxf+eF! z9jzx73W#AXBw>Q=?^UNce_U8pWkliPw+=S-c(pl3%e_|DT$(@W!%&-?#!zDXxRtTsu+1g)~kY^xMJTC4Y5Bi-Ygit(D%empZ55oj)ZF|p@Mx| zVzVyw#-4xo%9xfNK7D1E(?))>Yhg6Kr)hEgNb$YETLq0lR+YT&C+!V?eOubF9R@h% z_^oiVBzZ$hfGSi->T(eL!rYNJm;)N?d&s7K2#l@Wp+OmA#u8PI=hja3m4ksF(TM%2X zx1}<7)SZm~x6MD>>fZl*Y5PQdS^Hw@JbNQN1lvk#3f zGi5Z@1g5k^Z?avjZD}HX%PYTG)GJHP_$;PA$0z>znH!Ri|LXN)+WZqo0?p2Mn_Hi4 zo7!yqx?@=W$lhJWe)hvp)ZY3fMdfM6jj!?2P8i?zH;L) zC-E;kgmXr9t=Scn8*zMhqW6>~M}2Dj)O{7_)}C8a(-3Z$JX(L~^A+I-DxR1snGtl_ zD>iHXoQ>7p!*ZGD=O+06+}pU}1>u|{lb`HaIsQsR>ULSiQ-ao@kGI8V%-t|=$-)!8 zp=U}jwvByfgV&O0TK}Lv*Xal+H~Vj)vU*;D4_qwX`i9q{;*WR0y;a$b;Y&&LsOonP zm7Z^JjME2Rh!O0+u4%kJYvQu>t5qL5x~e-1w~L)SCzLOHb<2*Fjwi#{5*3H?S0sOV z+jsSwJCmHhOe);;eYilnRFJvqT-V(#O=s4%tzD3w(cn$)E;D@{r*@nvpE&Nw89Q8G zQobsmjoW%WviY*4lz3fI-rjRIWBCHx$;;|z*ZbFp*K2p4y?B0W?5VP%<-{Mq!-DW) zXY1y`SBlzkcgo>~PiG!mw{mB6YuSX7yT?!4eZF~5^R{E+`mQR+ z8~d_!(>|UcITZd|i{B-!^^V3{7bV~E zK2vh7X}80lpWbq@i>Rlhg&~_wr_NT~`koyZ8#$g=-#BrYtg?7|fcS@zNS3Om+aVqq z^xdSRvz_v4LBz70OApAf^+!kYT1II{NNjS-`tTy@v^%eKUH2cpJ~1)N?Au$uwC1gx?h$+M{b|vARVzue-a}|$#gQOKecWG6 zD8wO;Of*1{Nd+>gp#(y=_uG1OU1B6B+P^m4b1|&gi)YnAsB+||TyJ$Nbljt(VFt>?{2IiR1^#c$u5($0-L34u5}%>az+nEksL3SnGQHHbzE zN!<$xBzee!)9_d*35Mjdg(OiXlHtz;N1$}BR3MxfLK3Z7ma80hMi5ee;yCP~A(XUH z|2qJ&?dq>7$MpW9#G1h4P&mH{8hteTTgdzqC z!a{JwM47Ej=D?v`B^r#-U%Y`dq^jfkpLz@z1uGPu9taJy=MlPGl7+QoHf5IcZtmH~ zgDJh7H&?7i)p?O*4)wCbLMA%mlXQ+;om9^YQ$V3%1ZW+SZzuBj2G`8Mz$BxS2SjS( zQ~{iVU1m4snZO-_?Ixp{k=f-umx&ClIWfY6T`Fv@oR_LjfLWS0=29#y6i5XaAH!$B z1`A;#ZL}p9#stAU0BO-1WE#*uZb0x$&dXuhJQ;%6Y&L-n7toe$1d~do2r5K`LO#&o zGX-Xru=CAKAn@l3gi5_{W@ZGgm;^f7gixsnCP0yXM^WH77AlXWXfw zjmF$r;SOb*SkZvU`UfClpr&+#8uRG>CPX8{z{lZH^BBU6L>Ybb~U?4}T+n3#`Z zd{mNzN@bWthT+puOopPN$U~Z-_`oz0%#2`${2iu)GzXc|mLzZ`6xkNqV1QpIEeux) zOdu2raJNU7nMW%W;c7G}JC8eGM4npxzcXesaaWqtlSR=ws|nEd%&7n8!aVL8>vi`7 z&a+yKuI|w55Yk9;u`!^`7>HP}lNo4>i2!$-$jbv9N^n;m0e6z82nCxg#TrS4tM?*| ztb1XkxL%SO33IlbXXool17S6?JVmnErLA{Y!$>LI3zr=-fHg#|Tq4lhplrx}=1@TJ zWBMK+&;VV6H%`v8abyTq4-ORE`|V-l{=S|%R9jC24?Nc;AmLn}OpTIpO@?Bq1eIbE zSAX$Pln2y6AO41hryHgY)i2ZTzsPnAX@F1|6GI$fxj#5qEXKvK0rto+u?W1>+y|Tc zWw;1`M23kZ;4OSm55t9z$WU;mNA=K0^sr!VB6tW-5)7uZhh-=jVIGo&;NXdUNER#} zLMC}sCKWvr3#bE_diwEL3qcu43;1stMiMCp3GxSnp^pZ06{xfZMrN7~H0++*keN|% zdZ<{eREnd;k_c&}Bt(e|Bc#gU5Qzj8D@7qfRkTF$+ZvhN$i}dQg>@AT7fUf{%9QBY GD(F95qLM5C literal 0 HcmV?d00001 diff --git a/docs/libcurl/opts/Makefile.am b/docs/libcurl/opts/Makefile.am new file mode 100644 index 0000000..eac785c --- /dev/null +++ b/docs/libcurl/opts/Makefile.am @@ -0,0 +1,346 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### + +AUTOMAKE_OPTIONS = foreign no-dependencies + +man_MANS = CURLOPT_ACCEPT_ENCODING.3 CURLOPT_ACCEPTTIMEOUT_MS.3 \ + CURLOPT_ADDRESS_SCOPE.3 CURLOPT_APPEND.3 CURLOPT_AUTOREFERER.3 \ + CURLOPT_BUFFERSIZE.3 CURLOPT_CAINFO.3 CURLOPT_CAPATH.3 \ + CURLOPT_CERTINFO.3 CURLOPT_CHUNK_BGN_FUNCTION.3 CURLOPT_CHUNK_DATA.3 \ + CURLOPT_CHUNK_END_FUNCTION.3 CURLOPT_CLOSESOCKETDATA.3 \ + CURLOPT_CLOSESOCKETFUNCTION.3 CURLOPT_CONNECT_ONLY.3 \ + CURLOPT_CONNECTTIMEOUT.3 CURLOPT_CONNECTTIMEOUT_MS.3 \ + CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.3 CURLOPT_COOKIE.3 \ + CURLOPT_COOKIEFILE.3 CURLOPT_COOKIEJAR.3 CURLOPT_COOKIELIST.3 \ + CURLOPT_COOKIESESSION.3 CURLOPT_COPYPOSTFIELDS.3 CURLOPT_CRLF.3 \ + CURLOPT_CRLFILE.3 CURLOPT_CUSTOMREQUEST.3 CURLOPT_DEBUGDATA.3 \ + CURLOPT_DEBUGFUNCTION.3 CURLOPT_DIRLISTONLY.3 \ + CURLOPT_DNS_CACHE_TIMEOUT.3 CURLOPT_DNS_INTERFACE.3 \ + CURLOPT_DNS_LOCAL_IP4.3 CURLOPT_DNS_LOCAL_IP6.3 CURLOPT_DNS_SERVERS.3 \ + CURLOPT_DNS_USE_GLOBAL_CACHE.3 CURLOPT_EGDSOCKET.3 \ + CURLOPT_ERRORBUFFER.3 CURLOPT_EXPECT_100_TIMEOUT_MS.3 \ + CURLOPT_FAILONERROR.3 CURLOPT_FILETIME.3 CURLOPT_FNMATCH_DATA.3 \ + CURLOPT_FNMATCH_FUNCTION.3 CURLOPT_FOLLOWLOCATION.3 \ + CURLOPT_FORBID_REUSE.3 CURLOPT_FRESH_CONNECT.3 CURLOPT_FTP_ACCOUNT.3 \ + CURLOPT_FTP_ALTERNATIVE_TO_USER.3 CURLOPT_FTP_CREATE_MISSING_DIRS.3 \ + CURLOPT_FTP_FILEMETHOD.3 CURLOPT_FTPPORT.3 \ + CURLOPT_FTP_RESPONSE_TIMEOUT.3 CURLOPT_FTP_SKIP_PASV_IP.3 \ + CURLOPT_FTPSSLAUTH.3 CURLOPT_FTP_SSL_CCC.3 CURLOPT_FTP_USE_EPRT.3 \ + CURLOPT_FTP_USE_EPSV.3 CURLOPT_FTP_USE_PRET.3 \ + CURLOPT_GSSAPI_DELEGATION.3 CURLOPT_HEADER.3 CURLOPT_HEADERDATA.3 \ + CURLOPT_HEADERFUNCTION.3 CURLOPT_HEADEROPT.3 CURLOPT_HTTP200ALIASES.3 \ + CURLOPT_HTTPAUTH.3 CURLOPT_HTTP_CONTENT_DECODING.3 CURLOPT_HTTPGET.3 \ + CURLOPT_HTTPHEADER.3 CURLOPT_HTTPPOST.3 CURLOPT_HTTPPROXYTUNNEL.3 \ + CURLOPT_HTTP_TRANSFER_DECODING.3 CURLOPT_HTTP_VERSION.3 \ + CURLOPT_IGNORE_CONTENT_LENGTH.3 CURLOPT_INFILESIZE.3 \ + CURLOPT_INFILESIZE_LARGE.3 CURLOPT_INTERFACE.3 \ + CURLOPT_INTERLEAVEDATA.3 CURLOPT_INTERLEAVEFUNCTION.3 \ + CURLOPT_IOCTLDATA.3 CURLOPT_IOCTLFUNCTION.3 CURLOPT_IPRESOLVE.3 \ + CURLOPT_ISSUERCERT.3 CURLOPT_KEYPASSWD.3 CURLOPT_KRBLEVEL.3 \ + CURLOPT_LOCALPORT.3 CURLOPT_LOCALPORTRANGE.3 CURLOPT_LOGIN_OPTIONS.3 \ + CURLOPT_LOW_SPEED_LIMIT.3 CURLOPT_LOW_SPEED_TIME.3 CURLOPT_MAIL_AUTH.3 \ + CURLOPT_MAIL_FROM.3 CURLOPT_MAIL_RCPT.3 CURLOPT_MAXCONNECTS.3 \ + CURLOPT_MAXFILESIZE.3 CURLOPT_MAXFILESIZE_LARGE.3 \ + CURLOPT_MAX_RECV_SPEED_LARGE.3 CURLOPT_MAXREDIRS.3 \ + CURLOPT_MAX_SEND_SPEED_LARGE.3 CURLOPT_NETRC.3 CURLOPT_NETRC_FILE.3 \ + CURLOPT_NEW_DIRECTORY_PERMS.3 CURLOPT_NEW_FILE_PERMS.3 \ + CURLOPT_NOBODY.3 CURLOPT_NOPROGRESS.3 CURLOPT_NOPROXY.3 \ + CURLOPT_NOSIGNAL.3 CURLOPT_OPENSOCKETDATA.3 \ + CURLOPT_OPENSOCKETFUNCTION.3 CURLOPT_PASSWORD.3 CURLOPT_PORT.3 \ + CURLOPT_POST.3 CURLOPT_POSTFIELDS.3 CURLOPT_POSTFIELDSIZE.3 \ + CURLOPT_POSTFIELDSIZE_LARGE.3 CURLOPT_POSTQUOTE.3 CURLOPT_POSTREDIR.3 \ + CURLOPT_PREQUOTE.3 CURLOPT_PRIVATE.3 CURLOPT_PROGRESSDATA.3 \ + CURLOPT_PROGRESSFUNCTION.3 CURLOPT_PROTOCOLS.3 CURLOPT_PROXY.3 \ + CURLOPT_PROXYAUTH.3 CURLOPT_PROXYHEADER.3 CURLOPT_PROXYPASSWORD.3 \ + CURLOPT_PROXYPORT.3 CURLOPT_PROXY_TRANSFER_MODE.3 CURLOPT_PROXYTYPE.3 \ + CURLOPT_PROXYUSERNAME.3 CURLOPT_PROXYUSERPWD.3 CURLOPT_PUT.3 \ + CURLOPT_QUOTE.3 CURLOPT_RANDOM_FILE.3 CURLOPT_RANGE.3 \ + CURLOPT_READDATA.3 CURLOPT_READFUNCTION.3 CURLOPT_REDIR_PROTOCOLS.3 \ + CURLOPT_REFERER.3 CURLOPT_RESOLVE.3 CURLOPT_RESUME_FROM.3 \ + CURLOPT_RESUME_FROM_LARGE.3 CURLOPT_RTSP_CLIENT_CSEQ.3 \ + CURLOPT_RTSP_REQUEST.3 CURLOPT_RTSP_SERVER_CSEQ.3 \ + CURLOPT_RTSP_SESSION_ID.3 CURLOPT_RTSP_STREAM_URI.3 \ + CURLOPT_RTSP_TRANSPORT.3 CURLOPT_SASL_IR.3 CURLOPT_SEEKDATA.3 \ + CURLOPT_SEEKFUNCTION.3 CURLOPT_SHARE.3 CURLOPT_SOCKOPTDATA.3 \ + CURLOPT_SOCKOPTFUNCTION.3 CURLOPT_SOCKS5_GSSAPI_NEC.3 \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.3 CURLOPT_SSH_AUTH_TYPES.3 \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 CURLOPT_SSH_KEYDATA.3 \ + CURLOPT_SSH_KEYFUNCTION.3 CURLOPT_SSH_KNOWNHOSTS.3 \ + CURLOPT_SSH_PRIVATE_KEYFILE.3 CURLOPT_SSH_PUBLIC_KEYFILE.3 \ + CURLOPT_SSLCERT.3 CURLOPT_SSLCERTTYPE.3 CURLOPT_SSL_CIPHER_LIST.3 \ + CURLOPT_SSL_CTX_DATA.3 CURLOPT_SSL_CTX_FUNCTION.3 \ + CURLOPT_SSL_ENABLE_ALPN.3 CURLOPT_SSL_ENABLE_NPN.3 CURLOPT_SSLENGINE.3 \ + CURLOPT_SSLENGINE_DEFAULT.3 CURLOPT_SSLKEY.3 CURLOPT_SSLKEYTYPE.3 \ + CURLOPT_SSL_OPTIONS.3 CURLOPT_SSL_SESSIONID_CACHE.3 \ + CURLOPT_SSL_VERIFYHOST.3 CURLOPT_SSL_VERIFYPEER.3 CURLOPT_SSLVERSION.3 \ + CURLOPT_STDERR.3 CURLOPT_TCP_KEEPALIVE.3 CURLOPT_TCP_KEEPIDLE.3 \ + CURLOPT_TCP_KEEPINTVL.3 CURLOPT_TCP_NODELAY.3 CURLOPT_TELNETOPTIONS.3 \ + CURLOPT_TFTP_BLKSIZE.3 CURLOPT_TIMECONDITION.3 CURLOPT_TIMEOUT.3 \ + CURLOPT_TIMEOUT_MS.3 CURLOPT_TIMEVALUE.3 CURLOPT_TLSAUTH_PASSWORD.3 \ + CURLOPT_TLSAUTH_TYPE.3 CURLOPT_TLSAUTH_USERNAME.3 \ + CURLOPT_TRANSFER_ENCODING.3 CURLOPT_TRANSFERTEXT.3 \ + CURLOPT_UNRESTRICTED_AUTH.3 CURLOPT_UPLOAD.3 CURLOPT_URL.3 \ + CURLOPT_USERAGENT.3 CURLOPT_USERNAME.3 CURLOPT_USERPWD.3 \ + CURLOPT_USE_SSL.3 CURLOPT_VERBOSE.3 CURLOPT_WILDCARDMATCH.3 \ + CURLOPT_WRITEDATA.3 CURLOPT_WRITEFUNCTION.3 CURLOPT_XFERINFODATA.3 \ + CURLOPT_XFERINFOFUNCTION.3 CURLOPT_XOAUTH2_BEARER.3 \ + CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 CURLMOPT_MAXCONNECTS.3 \ + CURLMOPT_MAX_HOST_CONNECTIONS.3 CURLMOPT_MAX_PIPELINE_LENGTH.3 \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.3 CURLMOPT_PIPELINING.3 \ + CURLMOPT_PIPELINING_SERVER_BL.3 CURLMOPT_PIPELINING_SITE_BL.3 \ + CURLMOPT_SOCKETDATA.3 CURLMOPT_SOCKETFUNCTION.3 CURLMOPT_TIMERDATA.3 \ + CURLMOPT_TIMERFUNCTION.3 CURLOPT_UNIX_SOCKET_PATH.3 + + +HTMLPAGES = CURLOPT_ACCEPT_ENCODING.html CURLOPT_ACCEPTTIMEOUT_MS.html \ + CURLOPT_ADDRESS_SCOPE.html CURLOPT_APPEND.html \ + CURLOPT_AUTOREFERER.html CURLOPT_BUFFERSIZE.html CURLOPT_CAINFO.html \ + CURLOPT_CAPATH.html CURLOPT_CERTINFO.html \ + CURLOPT_CHUNK_BGN_FUNCTION.html CURLOPT_CHUNK_DATA.html \ + CURLOPT_CHUNK_END_FUNCTION.html CURLOPT_CLOSESOCKETDATA.html \ + CURLOPT_CLOSESOCKETFUNCTION.html CURLOPT_CONNECT_ONLY.html \ + CURLOPT_CONNECTTIMEOUT.html CURLOPT_CONNECTTIMEOUT_MS.html \ + CURLOPT_CONV_FROM_NETWORK_FUNCTION.html \ + CURLOPT_CONV_FROM_UTF8_FUNCTION.html \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.html CURLOPT_COOKIE.html \ + CURLOPT_COOKIEFILE.html CURLOPT_COOKIEJAR.html CURLOPT_COOKIELIST.html \ + CURLOPT_COOKIESESSION.html CURLOPT_COPYPOSTFIELDS.html \ + CURLOPT_CRLF.html CURLOPT_CRLFILE.html CURLOPT_CUSTOMREQUEST.html \ + CURLOPT_DEBUGDATA.html CURLOPT_DEBUGFUNCTION.html \ + CURLOPT_DIRLISTONLY.html CURLOPT_DNS_CACHE_TIMEOUT.html \ + CURLOPT_DNS_INTERFACE.html CURLOPT_DNS_LOCAL_IP4.html \ + CURLOPT_DNS_LOCAL_IP6.html CURLOPT_DNS_SERVERS.html \ + CURLOPT_DNS_USE_GLOBAL_CACHE.html CURLOPT_EGDSOCKET.html \ + CURLOPT_ERRORBUFFER.html CURLOPT_EXPECT_100_TIMEOUT_MS.html \ + CURLOPT_FAILONERROR.html CURLOPT_FILETIME.html \ + CURLOPT_FNMATCH_DATA.html CURLOPT_FNMATCH_FUNCTION.html \ + CURLOPT_FOLLOWLOCATION.html CURLOPT_FORBID_REUSE.html \ + CURLOPT_FRESH_CONNECT.html CURLOPT_FTP_ACCOUNT.html \ + CURLOPT_FTP_ALTERNATIVE_TO_USER.html \ + CURLOPT_FTP_CREATE_MISSING_DIRS.html CURLOPT_FTP_FILEMETHOD.html \ + CURLOPT_FTPPORT.html CURLOPT_FTP_RESPONSE_TIMEOUT.html \ + CURLOPT_FTP_SKIP_PASV_IP.html CURLOPT_FTPSSLAUTH.html \ + CURLOPT_FTP_SSL_CCC.html CURLOPT_FTP_USE_EPRT.html \ + CURLOPT_FTP_USE_EPSV.html CURLOPT_FTP_USE_PRET.html \ + CURLOPT_GSSAPI_DELEGATION.html CURLOPT_HEADER.html \ + CURLOPT_HEADERDATA.html CURLOPT_HEADERFUNCTION.html \ + CURLOPT_HEADEROPT.html CURLOPT_HTTP200ALIASES.html \ + CURLOPT_HTTPAUTH.html CURLOPT_HTTP_CONTENT_DECODING.html \ + CURLOPT_HTTPGET.html CURLOPT_HTTPHEADER.html CURLOPT_HTTPPOST.html \ + CURLOPT_HTTPPROXYTUNNEL.html CURLOPT_HTTP_TRANSFER_DECODING.html \ + CURLOPT_HTTP_VERSION.html CURLOPT_IGNORE_CONTENT_LENGTH.html \ + CURLOPT_INFILESIZE.html CURLOPT_INFILESIZE_LARGE.html \ + CURLOPT_INTERFACE.html CURLOPT_INTERLEAVEDATA.html \ + CURLOPT_INTERLEAVEFUNCTION.html CURLOPT_IOCTLDATA.html \ + CURLOPT_IOCTLFUNCTION.html CURLOPT_IPRESOLVE.html \ + CURLOPT_ISSUERCERT.html CURLOPT_KEYPASSWD.html CURLOPT_KRBLEVEL.html \ + CURLOPT_LOCALPORT.html CURLOPT_LOCALPORTRANGE.html \ + CURLOPT_LOGIN_OPTIONS.html CURLOPT_LOW_SPEED_LIMIT.html \ + CURLOPT_LOW_SPEED_TIME.html CURLOPT_MAIL_AUTH.html \ + CURLOPT_MAIL_FROM.html CURLOPT_MAIL_RCPT.html CURLOPT_MAXCONNECTS.html \ + CURLOPT_MAXFILESIZE.html CURLOPT_MAXFILESIZE_LARGE.html \ + CURLOPT_MAX_RECV_SPEED_LARGE.html CURLOPT_MAXREDIRS.html \ + CURLOPT_MAX_SEND_SPEED_LARGE.html CURLOPT_NETRC.html \ + CURLOPT_NETRC_FILE.html CURLOPT_NEW_DIRECTORY_PERMS.html \ + CURLOPT_NEW_FILE_PERMS.html CURLOPT_NOBODY.html \ + CURLOPT_NOPROGRESS.html CURLOPT_NOPROXY.html CURLOPT_NOSIGNAL.html \ + CURLOPT_OPENSOCKETDATA.html CURLOPT_OPENSOCKETFUNCTION.html \ + CURLOPT_PASSWORD.html CURLOPT_PORT.html CURLOPT_POST.html \ + CURLOPT_POSTFIELDS.html CURLOPT_POSTFIELDSIZE.html \ + CURLOPT_POSTFIELDSIZE_LARGE.html CURLOPT_POSTQUOTE.html \ + CURLOPT_POSTREDIR.html CURLOPT_PREQUOTE.html CURLOPT_PRIVATE.html \ + CURLOPT_PROGRESSDATA.html CURLOPT_PROGRESSFUNCTION.html \ + CURLOPT_PROTOCOLS.html CURLOPT_PROXY.html CURLOPT_PROXYAUTH.html \ + CURLOPT_PROXYHEADER.html CURLOPT_PROXYPASSWORD.html \ + CURLOPT_PROXYPORT.html CURLOPT_PROXY_TRANSFER_MODE.html \ + CURLOPT_PROXYTYPE.html CURLOPT_PROXYUSERNAME.html \ + CURLOPT_PROXYUSERPWD.html CURLOPT_PUT.html CURLOPT_QUOTE.html \ + CURLOPT_RANDOM_FILE.html CURLOPT_RANGE.html CURLOPT_READDATA.html \ + CURLOPT_READFUNCTION.html CURLOPT_REDIR_PROTOCOLS.html \ + CURLOPT_REFERER.html CURLOPT_RESOLVE.html CURLOPT_RESUME_FROM.html \ + CURLOPT_RESUME_FROM_LARGE.html CURLOPT_RTSP_CLIENT_CSEQ.html \ + CURLOPT_RTSP_REQUEST.html CURLOPT_RTSP_SERVER_CSEQ.html \ + CURLOPT_RTSP_SESSION_ID.html CURLOPT_RTSP_STREAM_URI.html \ + CURLOPT_RTSP_TRANSPORT.html CURLOPT_SASL_IR.html CURLOPT_SEEKDATA.html \ + CURLOPT_SEEKFUNCTION.html CURLOPT_SHARE.html CURLOPT_SOCKOPTDATA.html \ + CURLOPT_SOCKOPTFUNCTION.html CURLOPT_SOCKS5_GSSAPI_NEC.html \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.html CURLOPT_SSH_AUTH_TYPES.html \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html CURLOPT_SSH_KEYDATA.html \ + CURLOPT_SSH_KEYFUNCTION.html CURLOPT_SSH_KNOWNHOSTS.html \ + CURLOPT_SSH_PRIVATE_KEYFILE.html CURLOPT_SSH_PUBLIC_KEYFILE.html \ + CURLOPT_SSLCERT.html CURLOPT_SSLCERTTYPE.html \ + CURLOPT_SSL_CIPHER_LIST.html CURLOPT_SSL_CTX_DATA.html \ + CURLOPT_SSL_CTX_FUNCTION.html CURLOPT_SSL_ENABLE_ALPN.html \ + CURLOPT_SSL_ENABLE_NPN.html CURLOPT_SSLENGINE.html \ + CURLOPT_SSLENGINE_DEFAULT.html CURLOPT_SSLKEY.html \ + CURLOPT_SSLKEYTYPE.html CURLOPT_SSL_OPTIONS.html \ + CURLOPT_SSL_SESSIONID_CACHE.html CURLOPT_SSL_VERIFYHOST.html \ + CURLOPT_SSL_VERIFYPEER.html CURLOPT_SSLVERSION.html \ + CURLOPT_STDERR.html CURLOPT_TCP_KEEPALIVE.html \ + CURLOPT_TCP_KEEPIDLE.html CURLOPT_TCP_KEEPINTVL.html \ + CURLOPT_TCP_NODELAY.html CURLOPT_TELNETOPTIONS.html \ + CURLOPT_TFTP_BLKSIZE.html CURLOPT_TIMECONDITION.html \ + CURLOPT_TIMEOUT.html CURLOPT_TIMEOUT_MS.html CURLOPT_TIMEVALUE.html \ + CURLOPT_TLSAUTH_PASSWORD.html CURLOPT_TLSAUTH_TYPE.html \ + CURLOPT_TLSAUTH_USERNAME.html CURLOPT_TRANSFER_ENCODING.html \ + CURLOPT_TRANSFERTEXT.html CURLOPT_UNRESTRICTED_AUTH.html \ + CURLOPT_UPLOAD.html CURLOPT_URL.html CURLOPT_USERAGENT.html \ + CURLOPT_USERNAME.html CURLOPT_USERPWD.html CURLOPT_USE_SSL.html \ + CURLOPT_VERBOSE.html CURLOPT_WILDCARDMATCH.html CURLOPT_WRITEDATA.html \ + CURLOPT_WRITEFUNCTION.html CURLOPT_XFERINFODATA.html \ + CURLOPT_XFERINFOFUNCTION.html CURLOPT_XOAUTH2_BEARER.html \ + CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html CURLMOPT_MAXCONNECTS.html \ + CURLMOPT_MAX_HOST_CONNECTIONS.html CURLMOPT_MAX_PIPELINE_LENGTH.html \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.html CURLMOPT_PIPELINING.html \ + CURLMOPT_PIPELINING_SERVER_BL.html CURLMOPT_PIPELINING_SITE_BL.html \ + CURLMOPT_SOCKETDATA.html CURLMOPT_SOCKETFUNCTION.html \ + CURLMOPT_TIMERDATA.html CURLMOPT_TIMERFUNCTION.html \ + CURLOPT_UNIX_SOCKET_PATH.html + +PDFPAGES = CURLOPT_ACCEPT_ENCODING.pdf CURLOPT_ACCEPTTIMEOUT_MS.pdf \ + CURLOPT_ADDRESS_SCOPE.pdf CURLOPT_APPEND.pdf CURLOPT_AUTOREFERER.pdf \ + CURLOPT_BUFFERSIZE.pdf CURLOPT_CAINFO.pdf CURLOPT_CAPATH.pdf \ + CURLOPT_CERTINFO.pdf CURLOPT_CHUNK_BGN_FUNCTION.pdf \ + CURLOPT_CHUNK_DATA.pdf CURLOPT_CHUNK_END_FUNCTION.pdf \ + CURLOPT_CLOSESOCKETDATA.pdf CURLOPT_CLOSESOCKETFUNCTION.pdf \ + CURLOPT_CONNECT_ONLY.pdf CURLOPT_CONNECTTIMEOUT.pdf \ + CURLOPT_CONNECTTIMEOUT_MS.pdf CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf \ + CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf CURLOPT_COOKIE.pdf \ + CURLOPT_COOKIEFILE.pdf CURLOPT_COOKIEJAR.pdf CURLOPT_COOKIELIST.pdf \ + CURLOPT_COOKIESESSION.pdf CURLOPT_COPYPOSTFIELDS.pdf CURLOPT_CRLF.pdf \ + CURLOPT_CRLFILE.pdf CURLOPT_CUSTOMREQUEST.pdf CURLOPT_DEBUGDATA.pdf \ + CURLOPT_DEBUGFUNCTION.pdf CURLOPT_DIRLISTONLY.pdf \ + CURLOPT_DNS_CACHE_TIMEOUT.pdf CURLOPT_DNS_INTERFACE.pdf \ + CURLOPT_DNS_LOCAL_IP4.pdf CURLOPT_DNS_LOCAL_IP6.pdf \ + CURLOPT_DNS_SERVERS.pdf CURLOPT_DNS_USE_GLOBAL_CACHE.pdf \ + CURLOPT_EGDSOCKET.pdf CURLOPT_ERRORBUFFER.pdf \ + CURLOPT_EXPECT_100_TIMEOUT_MS.pdf CURLOPT_FAILONERROR.pdf \ + CURLOPT_FILETIME.pdf CURLOPT_FNMATCH_DATA.pdf \ + CURLOPT_FNMATCH_FUNCTION.pdf CURLOPT_FOLLOWLOCATION.pdf \ + CURLOPT_FORBID_REUSE.pdf CURLOPT_FRESH_CONNECT.pdf \ + CURLOPT_FTP_ACCOUNT.pdf CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf \ + CURLOPT_FTP_CREATE_MISSING_DIRS.pdf CURLOPT_FTP_FILEMETHOD.pdf \ + CURLOPT_FTPPORT.pdf CURLOPT_FTP_RESPONSE_TIMEOUT.pdf \ + CURLOPT_FTP_SKIP_PASV_IP.pdf CURLOPT_FTPSSLAUTH.pdf \ + CURLOPT_FTP_SSL_CCC.pdf CURLOPT_FTP_USE_EPRT.pdf \ + CURLOPT_FTP_USE_EPSV.pdf CURLOPT_FTP_USE_PRET.pdf \ + CURLOPT_GSSAPI_DELEGATION.pdf CURLOPT_HEADER.pdf \ + CURLOPT_HEADERDATA.pdf CURLOPT_HEADERFUNCTION.pdf \ + CURLOPT_HEADEROPT.pdf CURLOPT_HTTP200ALIASES.pdf CURLOPT_HTTPAUTH.pdf \ + CURLOPT_HTTP_CONTENT_DECODING.pdf CURLOPT_HTTPGET.pdf \ + CURLOPT_HTTPHEADER.pdf CURLOPT_HTTPPOST.pdf \ + CURLOPT_HTTPPROXYTUNNEL.pdf CURLOPT_HTTP_TRANSFER_DECODING.pdf \ + CURLOPT_HTTP_VERSION.pdf CURLOPT_IGNORE_CONTENT_LENGTH.pdf \ + CURLOPT_INFILESIZE.pdf CURLOPT_INFILESIZE_LARGE.pdf \ + CURLOPT_INTERFACE.pdf CURLOPT_INTERLEAVEDATA.pdf \ + CURLOPT_INTERLEAVEFUNCTION.pdf CURLOPT_IOCTLDATA.pdf \ + CURLOPT_IOCTLFUNCTION.pdf CURLOPT_IPRESOLVE.pdf CURLOPT_ISSUERCERT.pdf \ + CURLOPT_KEYPASSWD.pdf CURLOPT_KRBLEVEL.pdf CURLOPT_LOCALPORT.pdf \ + CURLOPT_LOCALPORTRANGE.pdf CURLOPT_LOGIN_OPTIONS.pdf \ + CURLOPT_LOW_SPEED_LIMIT.pdf CURLOPT_LOW_SPEED_TIME.pdf \ + CURLOPT_MAIL_AUTH.pdf CURLOPT_MAIL_FROM.pdf CURLOPT_MAIL_RCPT.pdf \ + CURLOPT_MAXCONNECTS.pdf CURLOPT_MAXFILESIZE.pdf \ + CURLOPT_MAXFILESIZE_LARGE.pdf CURLOPT_MAX_RECV_SPEED_LARGE.pdf \ + CURLOPT_MAXREDIRS.pdf CURLOPT_MAX_SEND_SPEED_LARGE.pdf \ + CURLOPT_NETRC.pdf CURLOPT_NETRC_FILE.pdf \ + CURLOPT_NEW_DIRECTORY_PERMS.pdf CURLOPT_NEW_FILE_PERMS.pdf \ + CURLOPT_NOBODY.pdf CURLOPT_NOPROGRESS.pdf CURLOPT_NOPROXY.pdf \ + CURLOPT_NOSIGNAL.pdf CURLOPT_OPENSOCKETDATA.pdf \ + CURLOPT_OPENSOCKETFUNCTION.pdf CURLOPT_PASSWORD.pdf CURLOPT_PORT.pdf \ + CURLOPT_POST.pdf CURLOPT_POSTFIELDS.pdf CURLOPT_POSTFIELDSIZE.pdf \ + CURLOPT_POSTFIELDSIZE_LARGE.pdf CURLOPT_POSTQUOTE.pdf \ + CURLOPT_POSTREDIR.pdf CURLOPT_PREQUOTE.pdf CURLOPT_PRIVATE.pdf \ + CURLOPT_PROGRESSDATA.pdf CURLOPT_PROGRESSFUNCTION.pdf \ + CURLOPT_PROTOCOLS.pdf CURLOPT_PROXY.pdf CURLOPT_PROXYAUTH.pdf \ + CURLOPT_PROXYHEADER.pdf CURLOPT_PROXYPASSWORD.pdf \ + CURLOPT_PROXYPORT.pdf CURLOPT_PROXY_TRANSFER_MODE.pdf \ + CURLOPT_PROXYTYPE.pdf CURLOPT_PROXYUSERNAME.pdf \ + CURLOPT_PROXYUSERPWD.pdf CURLOPT_PUT.pdf CURLOPT_QUOTE.pdf \ + CURLOPT_RANDOM_FILE.pdf CURLOPT_RANGE.pdf CURLOPT_READDATA.pdf \ + CURLOPT_READFUNCTION.pdf CURLOPT_REDIR_PROTOCOLS.pdf \ + CURLOPT_REFERER.pdf CURLOPT_RESOLVE.pdf CURLOPT_RESUME_FROM.pdf \ + CURLOPT_RESUME_FROM_LARGE.pdf CURLOPT_RTSP_CLIENT_CSEQ.pdf \ + CURLOPT_RTSP_REQUEST.pdf CURLOPT_RTSP_SERVER_CSEQ.pdf \ + CURLOPT_RTSP_SESSION_ID.pdf CURLOPT_RTSP_STREAM_URI.pdf \ + CURLOPT_RTSP_TRANSPORT.pdf CURLOPT_SASL_IR.pdf CURLOPT_SEEKDATA.pdf \ + CURLOPT_SEEKFUNCTION.pdf CURLOPT_SHARE.pdf CURLOPT_SOCKOPTDATA.pdf \ + CURLOPT_SOCKOPTFUNCTION.pdf CURLOPT_SOCKS5_GSSAPI_NEC.pdf \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf CURLOPT_SSH_AUTH_TYPES.pdf \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf CURLOPT_SSH_KEYDATA.pdf \ + CURLOPT_SSH_KEYFUNCTION.pdf CURLOPT_SSH_KNOWNHOSTS.pdf \ + CURLOPT_SSH_PRIVATE_KEYFILE.pdf CURLOPT_SSH_PUBLIC_KEYFILE.pdf \ + CURLOPT_SSLCERT.pdf CURLOPT_SSLCERTTYPE.pdf \ + CURLOPT_SSL_CIPHER_LIST.pdf CURLOPT_SSL_CTX_DATA.pdf \ + CURLOPT_SSL_CTX_FUNCTION.pdf CURLOPT_SSL_ENABLE_ALPN.pdf \ + CURLOPT_SSL_ENABLE_NPN.pdf CURLOPT_SSLENGINE.pdf \ + CURLOPT_SSLENGINE_DEFAULT.pdf CURLOPT_SSLKEY.pdf \ + CURLOPT_SSLKEYTYPE.pdf CURLOPT_SSL_OPTIONS.pdf \ + CURLOPT_SSL_SESSIONID_CACHE.pdf CURLOPT_SSL_VERIFYHOST.pdf \ + CURLOPT_SSL_VERIFYPEER.pdf CURLOPT_SSLVERSION.pdf CURLOPT_STDERR.pdf \ + CURLOPT_TCP_KEEPALIVE.pdf CURLOPT_TCP_KEEPIDLE.pdf \ + CURLOPT_TCP_KEEPINTVL.pdf CURLOPT_TCP_NODELAY.pdf \ + CURLOPT_TELNETOPTIONS.pdf CURLOPT_TFTP_BLKSIZE.pdf \ + CURLOPT_TIMECONDITION.pdf CURLOPT_TIMEOUT.pdf CURLOPT_TIMEOUT_MS.pdf \ + CURLOPT_TIMEVALUE.pdf CURLOPT_TLSAUTH_PASSWORD.pdf \ + CURLOPT_TLSAUTH_TYPE.pdf CURLOPT_TLSAUTH_USERNAME.pdf \ + CURLOPT_TRANSFER_ENCODING.pdf CURLOPT_TRANSFERTEXT.pdf \ + CURLOPT_UNRESTRICTED_AUTH.pdf CURLOPT_UPLOAD.pdf CURLOPT_URL.pdf \ + CURLOPT_USERAGENT.pdf CURLOPT_USERNAME.pdf CURLOPT_USERPWD.pdf \ + CURLOPT_USE_SSL.pdf CURLOPT_VERBOSE.pdf CURLOPT_WILDCARDMATCH.pdf \ + CURLOPT_WRITEDATA.pdf CURLOPT_WRITEFUNCTION.pdf \ + CURLOPT_XFERINFODATA.pdf CURLOPT_XFERINFOFUNCTION.pdf \ + CURLOPT_XOAUTH2_BEARER.pdf CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf CURLMOPT_MAXCONNECTS.pdf \ + CURLMOPT_MAX_HOST_CONNECTIONS.pdf CURLMOPT_MAX_PIPELINE_LENGTH.pdf \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf CURLMOPT_PIPELINING.pdf \ + CURLMOPT_PIPELINING_SERVER_BL.pdf CURLMOPT_PIPELINING_SITE_BL.pdf \ + CURLMOPT_SOCKETDATA.pdf CURLMOPT_SOCKETFUNCTION.pdf \ + CURLMOPT_TIMERDATA.pdf CURLMOPT_TIMERFUNCTION.pdf \ + CURLOPT_UNIX_SOCKET_PATH.pdf + +CLEANFILES = $(HTMLPAGES) $(PDFPAGES) + +EXTRA_DIST = $(man_MANS) $(HTMLPAGES) $(PDFPAGES) +MAN2HTML= roffit --mandir=. < $< >$@ + +SUFFIXES = .3 .html + +html: $(HTMLPAGES) + +.3.html: + $(MAN2HTML) + +pdf: $(PDFPAGES) + +.3.pdf: + @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ + groff -Tps -man $< >$$foo.ps; \ + ps2pdf $$foo.ps $@; \ + rm $$foo.ps; \ + echo "converted $< to $@") + +mancheck: + @cd $(top_srcdir)/docs/libcurl/opts && ls `awk -F, '!/OBSOLETE/ && /^ CINIT/ { a=substr($$1, 9); print "CURLOPT_" a ".3"}' $(top_srcdir)/include/curl/curl.h` diff --git a/docs/libcurl/opts/Makefile.in b/docs/libcurl/opts/Makefile.in new file mode 100644 index 0000000..cb2f5d2 --- /dev/null +++ b/docs/libcurl/opts/Makefile.in @@ -0,0 +1,929 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs/libcurl/opts +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ + $(top_srcdir)/m4/curl-confopts.m4 \ + $(top_srcdir)/m4/curl-functions.m4 \ + $(top_srcdir)/m4/curl-openssl.m4 \ + $(top_srcdir)/m4/curl-override.m4 \ + $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/xc-am-iface.m4 \ + $(top_srcdir)/m4/xc-cc-check.m4 \ + $(top_srcdir)/m4/xc-lt-iface.m4 \ + $(top_srcdir)/m4/xc-translit.m4 \ + $(top_srcdir)/m4/xc-val-flgs.m4 \ + $(top_srcdir)/m4/zz40-xc-ovr.m4 \ + $(top_srcdir)/m4/zz50-xc-ovr.m4 \ + $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/lib/curl_config.h \ + $(top_builddir)/include/curl/curlbuild.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = +am__depfiles_maybe = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@ +CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@ +CURLVERSION = @CURLVERSION@ +CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ +CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@ +CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ +CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ +CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ +CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@ +CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ +CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ +CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ +CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ +CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ +CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ +CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ +CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ +CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ +CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@ +CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@ +CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_SHARED = @ENABLE_SHARED@ +ENABLE_STATIC = @ENABLE_STATIC@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ +HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ +HAVE_LIBZ = @HAVE_LIBZ@ +HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ +IDN_ENABLED = @IDN_ENABLED@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IPV6_ENABLED = @IPV6_ENABLED@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@ +LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@ +LIBMETALINK_LIBS = @LIBMETALINK_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANOPT = @MANOPT@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKGADD_NAME = @PKGADD_NAME@ +PKGADD_PKG = @PKGADD_PKG@ +PKGADD_VENDOR = @PKGADD_VENDOR@ +PKGCONFIG = @PKGCONFIG@ +RANDOM_FILE = @RANDOM_FILE@ +RANLIB = @RANLIB@ +REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SSL_ENABLED = @SSL_ENABLED@ +STRIP = @STRIP@ +SUPPORT_FEATURES = @SUPPORT_FEATURES@ +SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@ +USE_ARES = @USE_ARES@ +USE_AXTLS = @USE_AXTLS@ +USE_CYASSL = @USE_CYASSL@ +USE_DARWINSSL = @USE_DARWINSSL@ +USE_GNUTLS = @USE_GNUTLS@ +USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ +USE_LIBRTMP = @USE_LIBRTMP@ +USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ +USE_NSS = @USE_NSS@ +USE_OPENLDAP = @USE_OPENLDAP@ +USE_POLARSSL = @USE_POLARSSL@ +USE_SCHANNEL = @USE_SCHANNEL@ +USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ +USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ +VERSION = @VERSION@ +VERSIONNUM = @VERSIONNUM@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libext = @libext@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign no-dependencies +man_MANS = CURLOPT_ACCEPT_ENCODING.3 CURLOPT_ACCEPTTIMEOUT_MS.3 \ + CURLOPT_ADDRESS_SCOPE.3 CURLOPT_APPEND.3 CURLOPT_AUTOREFERER.3 \ + CURLOPT_BUFFERSIZE.3 CURLOPT_CAINFO.3 CURLOPT_CAPATH.3 \ + CURLOPT_CERTINFO.3 CURLOPT_CHUNK_BGN_FUNCTION.3 CURLOPT_CHUNK_DATA.3 \ + CURLOPT_CHUNK_END_FUNCTION.3 CURLOPT_CLOSESOCKETDATA.3 \ + CURLOPT_CLOSESOCKETFUNCTION.3 CURLOPT_CONNECT_ONLY.3 \ + CURLOPT_CONNECTTIMEOUT.3 CURLOPT_CONNECTTIMEOUT_MS.3 \ + CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.3 CURLOPT_COOKIE.3 \ + CURLOPT_COOKIEFILE.3 CURLOPT_COOKIEJAR.3 CURLOPT_COOKIELIST.3 \ + CURLOPT_COOKIESESSION.3 CURLOPT_COPYPOSTFIELDS.3 CURLOPT_CRLF.3 \ + CURLOPT_CRLFILE.3 CURLOPT_CUSTOMREQUEST.3 CURLOPT_DEBUGDATA.3 \ + CURLOPT_DEBUGFUNCTION.3 CURLOPT_DIRLISTONLY.3 \ + CURLOPT_DNS_CACHE_TIMEOUT.3 CURLOPT_DNS_INTERFACE.3 \ + CURLOPT_DNS_LOCAL_IP4.3 CURLOPT_DNS_LOCAL_IP6.3 CURLOPT_DNS_SERVERS.3 \ + CURLOPT_DNS_USE_GLOBAL_CACHE.3 CURLOPT_EGDSOCKET.3 \ + CURLOPT_ERRORBUFFER.3 CURLOPT_EXPECT_100_TIMEOUT_MS.3 \ + CURLOPT_FAILONERROR.3 CURLOPT_FILETIME.3 CURLOPT_FNMATCH_DATA.3 \ + CURLOPT_FNMATCH_FUNCTION.3 CURLOPT_FOLLOWLOCATION.3 \ + CURLOPT_FORBID_REUSE.3 CURLOPT_FRESH_CONNECT.3 CURLOPT_FTP_ACCOUNT.3 \ + CURLOPT_FTP_ALTERNATIVE_TO_USER.3 CURLOPT_FTP_CREATE_MISSING_DIRS.3 \ + CURLOPT_FTP_FILEMETHOD.3 CURLOPT_FTPPORT.3 \ + CURLOPT_FTP_RESPONSE_TIMEOUT.3 CURLOPT_FTP_SKIP_PASV_IP.3 \ + CURLOPT_FTPSSLAUTH.3 CURLOPT_FTP_SSL_CCC.3 CURLOPT_FTP_USE_EPRT.3 \ + CURLOPT_FTP_USE_EPSV.3 CURLOPT_FTP_USE_PRET.3 \ + CURLOPT_GSSAPI_DELEGATION.3 CURLOPT_HEADER.3 CURLOPT_HEADERDATA.3 \ + CURLOPT_HEADERFUNCTION.3 CURLOPT_HEADEROPT.3 CURLOPT_HTTP200ALIASES.3 \ + CURLOPT_HTTPAUTH.3 CURLOPT_HTTP_CONTENT_DECODING.3 CURLOPT_HTTPGET.3 \ + CURLOPT_HTTPHEADER.3 CURLOPT_HTTPPOST.3 CURLOPT_HTTPPROXYTUNNEL.3 \ + CURLOPT_HTTP_TRANSFER_DECODING.3 CURLOPT_HTTP_VERSION.3 \ + CURLOPT_IGNORE_CONTENT_LENGTH.3 CURLOPT_INFILESIZE.3 \ + CURLOPT_INFILESIZE_LARGE.3 CURLOPT_INTERFACE.3 \ + CURLOPT_INTERLEAVEDATA.3 CURLOPT_INTERLEAVEFUNCTION.3 \ + CURLOPT_IOCTLDATA.3 CURLOPT_IOCTLFUNCTION.3 CURLOPT_IPRESOLVE.3 \ + CURLOPT_ISSUERCERT.3 CURLOPT_KEYPASSWD.3 CURLOPT_KRBLEVEL.3 \ + CURLOPT_LOCALPORT.3 CURLOPT_LOCALPORTRANGE.3 CURLOPT_LOGIN_OPTIONS.3 \ + CURLOPT_LOW_SPEED_LIMIT.3 CURLOPT_LOW_SPEED_TIME.3 CURLOPT_MAIL_AUTH.3 \ + CURLOPT_MAIL_FROM.3 CURLOPT_MAIL_RCPT.3 CURLOPT_MAXCONNECTS.3 \ + CURLOPT_MAXFILESIZE.3 CURLOPT_MAXFILESIZE_LARGE.3 \ + CURLOPT_MAX_RECV_SPEED_LARGE.3 CURLOPT_MAXREDIRS.3 \ + CURLOPT_MAX_SEND_SPEED_LARGE.3 CURLOPT_NETRC.3 CURLOPT_NETRC_FILE.3 \ + CURLOPT_NEW_DIRECTORY_PERMS.3 CURLOPT_NEW_FILE_PERMS.3 \ + CURLOPT_NOBODY.3 CURLOPT_NOPROGRESS.3 CURLOPT_NOPROXY.3 \ + CURLOPT_NOSIGNAL.3 CURLOPT_OPENSOCKETDATA.3 \ + CURLOPT_OPENSOCKETFUNCTION.3 CURLOPT_PASSWORD.3 CURLOPT_PORT.3 \ + CURLOPT_POST.3 CURLOPT_POSTFIELDS.3 CURLOPT_POSTFIELDSIZE.3 \ + CURLOPT_POSTFIELDSIZE_LARGE.3 CURLOPT_POSTQUOTE.3 CURLOPT_POSTREDIR.3 \ + CURLOPT_PREQUOTE.3 CURLOPT_PRIVATE.3 CURLOPT_PROGRESSDATA.3 \ + CURLOPT_PROGRESSFUNCTION.3 CURLOPT_PROTOCOLS.3 CURLOPT_PROXY.3 \ + CURLOPT_PROXYAUTH.3 CURLOPT_PROXYHEADER.3 CURLOPT_PROXYPASSWORD.3 \ + CURLOPT_PROXYPORT.3 CURLOPT_PROXY_TRANSFER_MODE.3 CURLOPT_PROXYTYPE.3 \ + CURLOPT_PROXYUSERNAME.3 CURLOPT_PROXYUSERPWD.3 CURLOPT_PUT.3 \ + CURLOPT_QUOTE.3 CURLOPT_RANDOM_FILE.3 CURLOPT_RANGE.3 \ + CURLOPT_READDATA.3 CURLOPT_READFUNCTION.3 CURLOPT_REDIR_PROTOCOLS.3 \ + CURLOPT_REFERER.3 CURLOPT_RESOLVE.3 CURLOPT_RESUME_FROM.3 \ + CURLOPT_RESUME_FROM_LARGE.3 CURLOPT_RTSP_CLIENT_CSEQ.3 \ + CURLOPT_RTSP_REQUEST.3 CURLOPT_RTSP_SERVER_CSEQ.3 \ + CURLOPT_RTSP_SESSION_ID.3 CURLOPT_RTSP_STREAM_URI.3 \ + CURLOPT_RTSP_TRANSPORT.3 CURLOPT_SASL_IR.3 CURLOPT_SEEKDATA.3 \ + CURLOPT_SEEKFUNCTION.3 CURLOPT_SHARE.3 CURLOPT_SOCKOPTDATA.3 \ + CURLOPT_SOCKOPTFUNCTION.3 CURLOPT_SOCKS5_GSSAPI_NEC.3 \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.3 CURLOPT_SSH_AUTH_TYPES.3 \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 CURLOPT_SSH_KEYDATA.3 \ + CURLOPT_SSH_KEYFUNCTION.3 CURLOPT_SSH_KNOWNHOSTS.3 \ + CURLOPT_SSH_PRIVATE_KEYFILE.3 CURLOPT_SSH_PUBLIC_KEYFILE.3 \ + CURLOPT_SSLCERT.3 CURLOPT_SSLCERTTYPE.3 CURLOPT_SSL_CIPHER_LIST.3 \ + CURLOPT_SSL_CTX_DATA.3 CURLOPT_SSL_CTX_FUNCTION.3 \ + CURLOPT_SSL_ENABLE_ALPN.3 CURLOPT_SSL_ENABLE_NPN.3 CURLOPT_SSLENGINE.3 \ + CURLOPT_SSLENGINE_DEFAULT.3 CURLOPT_SSLKEY.3 CURLOPT_SSLKEYTYPE.3 \ + CURLOPT_SSL_OPTIONS.3 CURLOPT_SSL_SESSIONID_CACHE.3 \ + CURLOPT_SSL_VERIFYHOST.3 CURLOPT_SSL_VERIFYPEER.3 CURLOPT_SSLVERSION.3 \ + CURLOPT_STDERR.3 CURLOPT_TCP_KEEPALIVE.3 CURLOPT_TCP_KEEPIDLE.3 \ + CURLOPT_TCP_KEEPINTVL.3 CURLOPT_TCP_NODELAY.3 CURLOPT_TELNETOPTIONS.3 \ + CURLOPT_TFTP_BLKSIZE.3 CURLOPT_TIMECONDITION.3 CURLOPT_TIMEOUT.3 \ + CURLOPT_TIMEOUT_MS.3 CURLOPT_TIMEVALUE.3 CURLOPT_TLSAUTH_PASSWORD.3 \ + CURLOPT_TLSAUTH_TYPE.3 CURLOPT_TLSAUTH_USERNAME.3 \ + CURLOPT_TRANSFER_ENCODING.3 CURLOPT_TRANSFERTEXT.3 \ + CURLOPT_UNRESTRICTED_AUTH.3 CURLOPT_UPLOAD.3 CURLOPT_URL.3 \ + CURLOPT_USERAGENT.3 CURLOPT_USERNAME.3 CURLOPT_USERPWD.3 \ + CURLOPT_USE_SSL.3 CURLOPT_VERBOSE.3 CURLOPT_WILDCARDMATCH.3 \ + CURLOPT_WRITEDATA.3 CURLOPT_WRITEFUNCTION.3 CURLOPT_XFERINFODATA.3 \ + CURLOPT_XFERINFOFUNCTION.3 CURLOPT_XOAUTH2_BEARER.3 \ + CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 CURLMOPT_MAXCONNECTS.3 \ + CURLMOPT_MAX_HOST_CONNECTIONS.3 CURLMOPT_MAX_PIPELINE_LENGTH.3 \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.3 CURLMOPT_PIPELINING.3 \ + CURLMOPT_PIPELINING_SERVER_BL.3 CURLMOPT_PIPELINING_SITE_BL.3 \ + CURLMOPT_SOCKETDATA.3 CURLMOPT_SOCKETFUNCTION.3 CURLMOPT_TIMERDATA.3 \ + CURLMOPT_TIMERFUNCTION.3 CURLOPT_UNIX_SOCKET_PATH.3 + +HTMLPAGES = CURLOPT_ACCEPT_ENCODING.html CURLOPT_ACCEPTTIMEOUT_MS.html \ + CURLOPT_ADDRESS_SCOPE.html CURLOPT_APPEND.html \ + CURLOPT_AUTOREFERER.html CURLOPT_BUFFERSIZE.html CURLOPT_CAINFO.html \ + CURLOPT_CAPATH.html CURLOPT_CERTINFO.html \ + CURLOPT_CHUNK_BGN_FUNCTION.html CURLOPT_CHUNK_DATA.html \ + CURLOPT_CHUNK_END_FUNCTION.html CURLOPT_CLOSESOCKETDATA.html \ + CURLOPT_CLOSESOCKETFUNCTION.html CURLOPT_CONNECT_ONLY.html \ + CURLOPT_CONNECTTIMEOUT.html CURLOPT_CONNECTTIMEOUT_MS.html \ + CURLOPT_CONV_FROM_NETWORK_FUNCTION.html \ + CURLOPT_CONV_FROM_UTF8_FUNCTION.html \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.html CURLOPT_COOKIE.html \ + CURLOPT_COOKIEFILE.html CURLOPT_COOKIEJAR.html CURLOPT_COOKIELIST.html \ + CURLOPT_COOKIESESSION.html CURLOPT_COPYPOSTFIELDS.html \ + CURLOPT_CRLF.html CURLOPT_CRLFILE.html CURLOPT_CUSTOMREQUEST.html \ + CURLOPT_DEBUGDATA.html CURLOPT_DEBUGFUNCTION.html \ + CURLOPT_DIRLISTONLY.html CURLOPT_DNS_CACHE_TIMEOUT.html \ + CURLOPT_DNS_INTERFACE.html CURLOPT_DNS_LOCAL_IP4.html \ + CURLOPT_DNS_LOCAL_IP6.html CURLOPT_DNS_SERVERS.html \ + CURLOPT_DNS_USE_GLOBAL_CACHE.html CURLOPT_EGDSOCKET.html \ + CURLOPT_ERRORBUFFER.html CURLOPT_EXPECT_100_TIMEOUT_MS.html \ + CURLOPT_FAILONERROR.html CURLOPT_FILETIME.html \ + CURLOPT_FNMATCH_DATA.html CURLOPT_FNMATCH_FUNCTION.html \ + CURLOPT_FOLLOWLOCATION.html CURLOPT_FORBID_REUSE.html \ + CURLOPT_FRESH_CONNECT.html CURLOPT_FTP_ACCOUNT.html \ + CURLOPT_FTP_ALTERNATIVE_TO_USER.html \ + CURLOPT_FTP_CREATE_MISSING_DIRS.html CURLOPT_FTP_FILEMETHOD.html \ + CURLOPT_FTPPORT.html CURLOPT_FTP_RESPONSE_TIMEOUT.html \ + CURLOPT_FTP_SKIP_PASV_IP.html CURLOPT_FTPSSLAUTH.html \ + CURLOPT_FTP_SSL_CCC.html CURLOPT_FTP_USE_EPRT.html \ + CURLOPT_FTP_USE_EPSV.html CURLOPT_FTP_USE_PRET.html \ + CURLOPT_GSSAPI_DELEGATION.html CURLOPT_HEADER.html \ + CURLOPT_HEADERDATA.html CURLOPT_HEADERFUNCTION.html \ + CURLOPT_HEADEROPT.html CURLOPT_HTTP200ALIASES.html \ + CURLOPT_HTTPAUTH.html CURLOPT_HTTP_CONTENT_DECODING.html \ + CURLOPT_HTTPGET.html CURLOPT_HTTPHEADER.html CURLOPT_HTTPPOST.html \ + CURLOPT_HTTPPROXYTUNNEL.html CURLOPT_HTTP_TRANSFER_DECODING.html \ + CURLOPT_HTTP_VERSION.html CURLOPT_IGNORE_CONTENT_LENGTH.html \ + CURLOPT_INFILESIZE.html CURLOPT_INFILESIZE_LARGE.html \ + CURLOPT_INTERFACE.html CURLOPT_INTERLEAVEDATA.html \ + CURLOPT_INTERLEAVEFUNCTION.html CURLOPT_IOCTLDATA.html \ + CURLOPT_IOCTLFUNCTION.html CURLOPT_IPRESOLVE.html \ + CURLOPT_ISSUERCERT.html CURLOPT_KEYPASSWD.html CURLOPT_KRBLEVEL.html \ + CURLOPT_LOCALPORT.html CURLOPT_LOCALPORTRANGE.html \ + CURLOPT_LOGIN_OPTIONS.html CURLOPT_LOW_SPEED_LIMIT.html \ + CURLOPT_LOW_SPEED_TIME.html CURLOPT_MAIL_AUTH.html \ + CURLOPT_MAIL_FROM.html CURLOPT_MAIL_RCPT.html CURLOPT_MAXCONNECTS.html \ + CURLOPT_MAXFILESIZE.html CURLOPT_MAXFILESIZE_LARGE.html \ + CURLOPT_MAX_RECV_SPEED_LARGE.html CURLOPT_MAXREDIRS.html \ + CURLOPT_MAX_SEND_SPEED_LARGE.html CURLOPT_NETRC.html \ + CURLOPT_NETRC_FILE.html CURLOPT_NEW_DIRECTORY_PERMS.html \ + CURLOPT_NEW_FILE_PERMS.html CURLOPT_NOBODY.html \ + CURLOPT_NOPROGRESS.html CURLOPT_NOPROXY.html CURLOPT_NOSIGNAL.html \ + CURLOPT_OPENSOCKETDATA.html CURLOPT_OPENSOCKETFUNCTION.html \ + CURLOPT_PASSWORD.html CURLOPT_PORT.html CURLOPT_POST.html \ + CURLOPT_POSTFIELDS.html CURLOPT_POSTFIELDSIZE.html \ + CURLOPT_POSTFIELDSIZE_LARGE.html CURLOPT_POSTQUOTE.html \ + CURLOPT_POSTREDIR.html CURLOPT_PREQUOTE.html CURLOPT_PRIVATE.html \ + CURLOPT_PROGRESSDATA.html CURLOPT_PROGRESSFUNCTION.html \ + CURLOPT_PROTOCOLS.html CURLOPT_PROXY.html CURLOPT_PROXYAUTH.html \ + CURLOPT_PROXYHEADER.html CURLOPT_PROXYPASSWORD.html \ + CURLOPT_PROXYPORT.html CURLOPT_PROXY_TRANSFER_MODE.html \ + CURLOPT_PROXYTYPE.html CURLOPT_PROXYUSERNAME.html \ + CURLOPT_PROXYUSERPWD.html CURLOPT_PUT.html CURLOPT_QUOTE.html \ + CURLOPT_RANDOM_FILE.html CURLOPT_RANGE.html CURLOPT_READDATA.html \ + CURLOPT_READFUNCTION.html CURLOPT_REDIR_PROTOCOLS.html \ + CURLOPT_REFERER.html CURLOPT_RESOLVE.html CURLOPT_RESUME_FROM.html \ + CURLOPT_RESUME_FROM_LARGE.html CURLOPT_RTSP_CLIENT_CSEQ.html \ + CURLOPT_RTSP_REQUEST.html CURLOPT_RTSP_SERVER_CSEQ.html \ + CURLOPT_RTSP_SESSION_ID.html CURLOPT_RTSP_STREAM_URI.html \ + CURLOPT_RTSP_TRANSPORT.html CURLOPT_SASL_IR.html CURLOPT_SEEKDATA.html \ + CURLOPT_SEEKFUNCTION.html CURLOPT_SHARE.html CURLOPT_SOCKOPTDATA.html \ + CURLOPT_SOCKOPTFUNCTION.html CURLOPT_SOCKS5_GSSAPI_NEC.html \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.html CURLOPT_SSH_AUTH_TYPES.html \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html CURLOPT_SSH_KEYDATA.html \ + CURLOPT_SSH_KEYFUNCTION.html CURLOPT_SSH_KNOWNHOSTS.html \ + CURLOPT_SSH_PRIVATE_KEYFILE.html CURLOPT_SSH_PUBLIC_KEYFILE.html \ + CURLOPT_SSLCERT.html CURLOPT_SSLCERTTYPE.html \ + CURLOPT_SSL_CIPHER_LIST.html CURLOPT_SSL_CTX_DATA.html \ + CURLOPT_SSL_CTX_FUNCTION.html CURLOPT_SSL_ENABLE_ALPN.html \ + CURLOPT_SSL_ENABLE_NPN.html CURLOPT_SSLENGINE.html \ + CURLOPT_SSLENGINE_DEFAULT.html CURLOPT_SSLKEY.html \ + CURLOPT_SSLKEYTYPE.html CURLOPT_SSL_OPTIONS.html \ + CURLOPT_SSL_SESSIONID_CACHE.html CURLOPT_SSL_VERIFYHOST.html \ + CURLOPT_SSL_VERIFYPEER.html CURLOPT_SSLVERSION.html \ + CURLOPT_STDERR.html CURLOPT_TCP_KEEPALIVE.html \ + CURLOPT_TCP_KEEPIDLE.html CURLOPT_TCP_KEEPINTVL.html \ + CURLOPT_TCP_NODELAY.html CURLOPT_TELNETOPTIONS.html \ + CURLOPT_TFTP_BLKSIZE.html CURLOPT_TIMECONDITION.html \ + CURLOPT_TIMEOUT.html CURLOPT_TIMEOUT_MS.html CURLOPT_TIMEVALUE.html \ + CURLOPT_TLSAUTH_PASSWORD.html CURLOPT_TLSAUTH_TYPE.html \ + CURLOPT_TLSAUTH_USERNAME.html CURLOPT_TRANSFER_ENCODING.html \ + CURLOPT_TRANSFERTEXT.html CURLOPT_UNRESTRICTED_AUTH.html \ + CURLOPT_UPLOAD.html CURLOPT_URL.html CURLOPT_USERAGENT.html \ + CURLOPT_USERNAME.html CURLOPT_USERPWD.html CURLOPT_USE_SSL.html \ + CURLOPT_VERBOSE.html CURLOPT_WILDCARDMATCH.html CURLOPT_WRITEDATA.html \ + CURLOPT_WRITEFUNCTION.html CURLOPT_XFERINFODATA.html \ + CURLOPT_XFERINFOFUNCTION.html CURLOPT_XOAUTH2_BEARER.html \ + CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html CURLMOPT_MAXCONNECTS.html \ + CURLMOPT_MAX_HOST_CONNECTIONS.html CURLMOPT_MAX_PIPELINE_LENGTH.html \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.html CURLMOPT_PIPELINING.html \ + CURLMOPT_PIPELINING_SERVER_BL.html CURLMOPT_PIPELINING_SITE_BL.html \ + CURLMOPT_SOCKETDATA.html CURLMOPT_SOCKETFUNCTION.html \ + CURLMOPT_TIMERDATA.html CURLMOPT_TIMERFUNCTION.html \ + CURLOPT_UNIX_SOCKET_PATH.html + +PDFPAGES = CURLOPT_ACCEPT_ENCODING.pdf CURLOPT_ACCEPTTIMEOUT_MS.pdf \ + CURLOPT_ADDRESS_SCOPE.pdf CURLOPT_APPEND.pdf CURLOPT_AUTOREFERER.pdf \ + CURLOPT_BUFFERSIZE.pdf CURLOPT_CAINFO.pdf CURLOPT_CAPATH.pdf \ + CURLOPT_CERTINFO.pdf CURLOPT_CHUNK_BGN_FUNCTION.pdf \ + CURLOPT_CHUNK_DATA.pdf CURLOPT_CHUNK_END_FUNCTION.pdf \ + CURLOPT_CLOSESOCKETDATA.pdf CURLOPT_CLOSESOCKETFUNCTION.pdf \ + CURLOPT_CONNECT_ONLY.pdf CURLOPT_CONNECTTIMEOUT.pdf \ + CURLOPT_CONNECTTIMEOUT_MS.pdf CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf \ + CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf \ + CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf CURLOPT_COOKIE.pdf \ + CURLOPT_COOKIEFILE.pdf CURLOPT_COOKIEJAR.pdf CURLOPT_COOKIELIST.pdf \ + CURLOPT_COOKIESESSION.pdf CURLOPT_COPYPOSTFIELDS.pdf CURLOPT_CRLF.pdf \ + CURLOPT_CRLFILE.pdf CURLOPT_CUSTOMREQUEST.pdf CURLOPT_DEBUGDATA.pdf \ + CURLOPT_DEBUGFUNCTION.pdf CURLOPT_DIRLISTONLY.pdf \ + CURLOPT_DNS_CACHE_TIMEOUT.pdf CURLOPT_DNS_INTERFACE.pdf \ + CURLOPT_DNS_LOCAL_IP4.pdf CURLOPT_DNS_LOCAL_IP6.pdf \ + CURLOPT_DNS_SERVERS.pdf CURLOPT_DNS_USE_GLOBAL_CACHE.pdf \ + CURLOPT_EGDSOCKET.pdf CURLOPT_ERRORBUFFER.pdf \ + CURLOPT_EXPECT_100_TIMEOUT_MS.pdf CURLOPT_FAILONERROR.pdf \ + CURLOPT_FILETIME.pdf CURLOPT_FNMATCH_DATA.pdf \ + CURLOPT_FNMATCH_FUNCTION.pdf CURLOPT_FOLLOWLOCATION.pdf \ + CURLOPT_FORBID_REUSE.pdf CURLOPT_FRESH_CONNECT.pdf \ + CURLOPT_FTP_ACCOUNT.pdf CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf \ + CURLOPT_FTP_CREATE_MISSING_DIRS.pdf CURLOPT_FTP_FILEMETHOD.pdf \ + CURLOPT_FTPPORT.pdf CURLOPT_FTP_RESPONSE_TIMEOUT.pdf \ + CURLOPT_FTP_SKIP_PASV_IP.pdf CURLOPT_FTPSSLAUTH.pdf \ + CURLOPT_FTP_SSL_CCC.pdf CURLOPT_FTP_USE_EPRT.pdf \ + CURLOPT_FTP_USE_EPSV.pdf CURLOPT_FTP_USE_PRET.pdf \ + CURLOPT_GSSAPI_DELEGATION.pdf CURLOPT_HEADER.pdf \ + CURLOPT_HEADERDATA.pdf CURLOPT_HEADERFUNCTION.pdf \ + CURLOPT_HEADEROPT.pdf CURLOPT_HTTP200ALIASES.pdf CURLOPT_HTTPAUTH.pdf \ + CURLOPT_HTTP_CONTENT_DECODING.pdf CURLOPT_HTTPGET.pdf \ + CURLOPT_HTTPHEADER.pdf CURLOPT_HTTPPOST.pdf \ + CURLOPT_HTTPPROXYTUNNEL.pdf CURLOPT_HTTP_TRANSFER_DECODING.pdf \ + CURLOPT_HTTP_VERSION.pdf CURLOPT_IGNORE_CONTENT_LENGTH.pdf \ + CURLOPT_INFILESIZE.pdf CURLOPT_INFILESIZE_LARGE.pdf \ + CURLOPT_INTERFACE.pdf CURLOPT_INTERLEAVEDATA.pdf \ + CURLOPT_INTERLEAVEFUNCTION.pdf CURLOPT_IOCTLDATA.pdf \ + CURLOPT_IOCTLFUNCTION.pdf CURLOPT_IPRESOLVE.pdf CURLOPT_ISSUERCERT.pdf \ + CURLOPT_KEYPASSWD.pdf CURLOPT_KRBLEVEL.pdf CURLOPT_LOCALPORT.pdf \ + CURLOPT_LOCALPORTRANGE.pdf CURLOPT_LOGIN_OPTIONS.pdf \ + CURLOPT_LOW_SPEED_LIMIT.pdf CURLOPT_LOW_SPEED_TIME.pdf \ + CURLOPT_MAIL_AUTH.pdf CURLOPT_MAIL_FROM.pdf CURLOPT_MAIL_RCPT.pdf \ + CURLOPT_MAXCONNECTS.pdf CURLOPT_MAXFILESIZE.pdf \ + CURLOPT_MAXFILESIZE_LARGE.pdf CURLOPT_MAX_RECV_SPEED_LARGE.pdf \ + CURLOPT_MAXREDIRS.pdf CURLOPT_MAX_SEND_SPEED_LARGE.pdf \ + CURLOPT_NETRC.pdf CURLOPT_NETRC_FILE.pdf \ + CURLOPT_NEW_DIRECTORY_PERMS.pdf CURLOPT_NEW_FILE_PERMS.pdf \ + CURLOPT_NOBODY.pdf CURLOPT_NOPROGRESS.pdf CURLOPT_NOPROXY.pdf \ + CURLOPT_NOSIGNAL.pdf CURLOPT_OPENSOCKETDATA.pdf \ + CURLOPT_OPENSOCKETFUNCTION.pdf CURLOPT_PASSWORD.pdf CURLOPT_PORT.pdf \ + CURLOPT_POST.pdf CURLOPT_POSTFIELDS.pdf CURLOPT_POSTFIELDSIZE.pdf \ + CURLOPT_POSTFIELDSIZE_LARGE.pdf CURLOPT_POSTQUOTE.pdf \ + CURLOPT_POSTREDIR.pdf CURLOPT_PREQUOTE.pdf CURLOPT_PRIVATE.pdf \ + CURLOPT_PROGRESSDATA.pdf CURLOPT_PROGRESSFUNCTION.pdf \ + CURLOPT_PROTOCOLS.pdf CURLOPT_PROXY.pdf CURLOPT_PROXYAUTH.pdf \ + CURLOPT_PROXYHEADER.pdf CURLOPT_PROXYPASSWORD.pdf \ + CURLOPT_PROXYPORT.pdf CURLOPT_PROXY_TRANSFER_MODE.pdf \ + CURLOPT_PROXYTYPE.pdf CURLOPT_PROXYUSERNAME.pdf \ + CURLOPT_PROXYUSERPWD.pdf CURLOPT_PUT.pdf CURLOPT_QUOTE.pdf \ + CURLOPT_RANDOM_FILE.pdf CURLOPT_RANGE.pdf CURLOPT_READDATA.pdf \ + CURLOPT_READFUNCTION.pdf CURLOPT_REDIR_PROTOCOLS.pdf \ + CURLOPT_REFERER.pdf CURLOPT_RESOLVE.pdf CURLOPT_RESUME_FROM.pdf \ + CURLOPT_RESUME_FROM_LARGE.pdf CURLOPT_RTSP_CLIENT_CSEQ.pdf \ + CURLOPT_RTSP_REQUEST.pdf CURLOPT_RTSP_SERVER_CSEQ.pdf \ + CURLOPT_RTSP_SESSION_ID.pdf CURLOPT_RTSP_STREAM_URI.pdf \ + CURLOPT_RTSP_TRANSPORT.pdf CURLOPT_SASL_IR.pdf CURLOPT_SEEKDATA.pdf \ + CURLOPT_SEEKFUNCTION.pdf CURLOPT_SHARE.pdf CURLOPT_SOCKOPTDATA.pdf \ + CURLOPT_SOCKOPTFUNCTION.pdf CURLOPT_SOCKS5_GSSAPI_NEC.pdf \ + CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf CURLOPT_SSH_AUTH_TYPES.pdf \ + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf CURLOPT_SSH_KEYDATA.pdf \ + CURLOPT_SSH_KEYFUNCTION.pdf CURLOPT_SSH_KNOWNHOSTS.pdf \ + CURLOPT_SSH_PRIVATE_KEYFILE.pdf CURLOPT_SSH_PUBLIC_KEYFILE.pdf \ + CURLOPT_SSLCERT.pdf CURLOPT_SSLCERTTYPE.pdf \ + CURLOPT_SSL_CIPHER_LIST.pdf CURLOPT_SSL_CTX_DATA.pdf \ + CURLOPT_SSL_CTX_FUNCTION.pdf CURLOPT_SSL_ENABLE_ALPN.pdf \ + CURLOPT_SSL_ENABLE_NPN.pdf CURLOPT_SSLENGINE.pdf \ + CURLOPT_SSLENGINE_DEFAULT.pdf CURLOPT_SSLKEY.pdf \ + CURLOPT_SSLKEYTYPE.pdf CURLOPT_SSL_OPTIONS.pdf \ + CURLOPT_SSL_SESSIONID_CACHE.pdf CURLOPT_SSL_VERIFYHOST.pdf \ + CURLOPT_SSL_VERIFYPEER.pdf CURLOPT_SSLVERSION.pdf CURLOPT_STDERR.pdf \ + CURLOPT_TCP_KEEPALIVE.pdf CURLOPT_TCP_KEEPIDLE.pdf \ + CURLOPT_TCP_KEEPINTVL.pdf CURLOPT_TCP_NODELAY.pdf \ + CURLOPT_TELNETOPTIONS.pdf CURLOPT_TFTP_BLKSIZE.pdf \ + CURLOPT_TIMECONDITION.pdf CURLOPT_TIMEOUT.pdf CURLOPT_TIMEOUT_MS.pdf \ + CURLOPT_TIMEVALUE.pdf CURLOPT_TLSAUTH_PASSWORD.pdf \ + CURLOPT_TLSAUTH_TYPE.pdf CURLOPT_TLSAUTH_USERNAME.pdf \ + CURLOPT_TRANSFER_ENCODING.pdf CURLOPT_TRANSFERTEXT.pdf \ + CURLOPT_UNRESTRICTED_AUTH.pdf CURLOPT_UPLOAD.pdf CURLOPT_URL.pdf \ + CURLOPT_USERAGENT.pdf CURLOPT_USERNAME.pdf CURLOPT_USERPWD.pdf \ + CURLOPT_USE_SSL.pdf CURLOPT_VERBOSE.pdf CURLOPT_WILDCARDMATCH.pdf \ + CURLOPT_WRITEDATA.pdf CURLOPT_WRITEFUNCTION.pdf \ + CURLOPT_XFERINFODATA.pdf CURLOPT_XFERINFOFUNCTION.pdf \ + CURLOPT_XOAUTH2_BEARER.pdf CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf \ + CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf CURLMOPT_MAXCONNECTS.pdf \ + CURLMOPT_MAX_HOST_CONNECTIONS.pdf CURLMOPT_MAX_PIPELINE_LENGTH.pdf \ + CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf CURLMOPT_PIPELINING.pdf \ + CURLMOPT_PIPELINING_SERVER_BL.pdf CURLMOPT_PIPELINING_SITE_BL.pdf \ + CURLMOPT_SOCKETDATA.pdf CURLMOPT_SOCKETFUNCTION.pdf \ + CURLMOPT_TIMERDATA.pdf CURLMOPT_TIMERFUNCTION.pdf \ + CURLOPT_UNIX_SOCKET_PATH.pdf + +CLEANFILES = $(HTMLPAGES) $(PDFPAGES) +EXTRA_DIST = $(man_MANS) $(HTMLPAGES) $(PDFPAGES) +MAN2HTML = roffit --mandir=. < $< >$@ +SUFFIXES = .3 .html +all: all-am + +.SUFFIXES: +.SUFFIXES: .3 .html .pdf +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/libcurl/opts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/libcurl/opts/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man3dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.3[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man3 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-man \ + uninstall-man3 + + +html: $(HTMLPAGES) + +.3.html: + $(MAN2HTML) + +pdf: $(PDFPAGES) + +.3.pdf: + @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ + groff -Tps -man $< >$$foo.ps; \ + ps2pdf $$foo.ps $@; \ + rm $$foo.ps; \ + echo "converted $< to $@") + +mancheck: + @cd $(top_srcdir)/docs/libcurl/opts && ls `awk -F, '!/OBSOLETE/ && /^ CINIT/ { a=substr($$1, 9); print "CURLOPT_" a ".3"}' $(top_srcdir)/include/curl/curl.h` + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index e61cbbe..b8b0838 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -17,7 +17,8 @@ CURLAUTH_ANYSAFE 7.10.6 CURLAUTH_BASIC 7.10.6 CURLAUTH_DIGEST 7.10.6 CURLAUTH_DIGEST_IE 7.19.3 -CURLAUTH_GSSNEGOTIATE 7.10.6 +CURLAUTH_GSSNEGOTIATE 7.10.6 7.38.0 +CURLAUTH_NEGOTIATE 7.38.0 CURLAUTH_NONE 7.10.6 CURLAUTH_NTLM 7.10.6 CURLAUTH_NTLM_WB 7.22.0 @@ -73,6 +74,7 @@ CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0 CURLE_FTP_WRITE_ERROR 7.1 7.17.0 CURLE_FUNCTION_NOT_FOUND 7.1 CURLE_GOT_NOTHING 7.9.1 +CURLE_HTTP2 7.38.0 CURLE_HTTP_NOT_FOUND 7.1 CURLE_HTTP_PORT_FAILED 7.3 7.12.0 CURLE_HTTP_POST_ERROR 7.1 @@ -85,8 +87,8 @@ CURLE_LDAP_SEARCH_FAILED 7.1 CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0 CURLE_LOGIN_DENIED 7.13.1 CURLE_MALFORMAT_USER 7.1 7.17.0 -CURLE_NO_CONNECTION_AVAILABLE 7.30.0 CURLE_NOT_BUILT_IN 7.21.5 +CURLE_NO_CONNECTION_AVAILABLE 7.30.0 CURLE_OK 7.1 CURLE_OPERATION_TIMEDOUT 7.10.2 CURLE_OPERATION_TIMEOUTED 7.1 7.17.0 @@ -118,6 +120,7 @@ CURLE_SSL_ENGINE_NOTFOUND 7.9.3 CURLE_SSL_ENGINE_SETFAILED 7.9.3 CURLE_SSL_ISSUER_ERROR 7.19.0 CURLE_SSL_PEER_CERTIFICATE 7.8 7.17.1 +CURLE_SSL_PINNEDPUBKEYNOTMATCH 7.39.0 CURLE_SSL_SHUTDOWN_FAILED 7.16.1 CURLE_TELNET_OPTION_SYNTAX 7.7 CURLE_TFTP_DISKFULL 7.15.0 7.17.0 @@ -193,6 +196,8 @@ CURLFTP_CREATE_DIR_RETRY 7.19.4 CURLGSSAPI_DELEGATION_FLAG 7.22.0 CURLGSSAPI_DELEGATION_NONE 7.22.0 CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0 +CURLHEADER_SEPARATE 7.37.0 +CURLHEADER_UNIFIED 7.37.0 CURLINFO_APPCONNECT_TIME 7.19.0 CURLINFO_CERTINFO 7.19.1 CURLINFO_CONDITION_UNMET 7.19.4 @@ -250,6 +255,7 @@ CURLINFO_SSL_VERIFYRESULT 7.5 CURLINFO_STARTTRANSFER_TIME 7.9.2 CURLINFO_STRING 7.4.1 CURLINFO_TEXT 7.9.6 +CURLINFO_TLS_SESSION 7.34.0 CURLINFO_TOTAL_TIME 7.4.1 CURLINFO_TYPEMASK 7.4.1 CURLIOCMD_NOP 7.12.3 @@ -270,10 +276,10 @@ CURLKHTYPE_RSA1 7.19.6 CURLKHTYPE_UNKNOWN 7.19.6 CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0 CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0 +CURLMOPT_MAXCONNECTS 7.16.3 CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0 CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0 CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0 -CURLMOPT_MAXCONNECTS 7.16.3 CURLMOPT_PIPELINING 7.16.0 CURLMOPT_PIPELINING_SERVER_BL 7.30.0 CURLMOPT_PIPELINING_SITE_BL 7.30.0 @@ -283,6 +289,7 @@ CURLMOPT_TIMERDATA 7.16.0 CURLMOPT_TIMERFUNCTION 7.16.0 CURLMSG_DONE 7.9.6 CURLMSG_NONE 7.9.6 +CURLM_ADDED_ALREADY 7.32.1 CURLM_BAD_EASY_HANDLE 7.9.6 CURLM_BAD_HANDLE 7.9.6 CURLM_BAD_SOCKET 7.15.4 @@ -331,11 +338,15 @@ CURLOPT_DEBUGDATA 7.9.6 CURLOPT_DEBUGFUNCTION 7.9.6 CURLOPT_DIRLISTONLY 7.17.0 CURLOPT_DNS_CACHE_TIMEOUT 7.9.3 +CURLOPT_DNS_INTERFACE 7.33.0 +CURLOPT_DNS_LOCAL_IP4 7.33.0 +CURLOPT_DNS_LOCAL_IP6 7.33.0 CURLOPT_DNS_SERVERS 7.24.0 CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1 CURLOPT_EGDSOCKET 7.7 CURLOPT_ENCODING 7.10 CURLOPT_ERRORBUFFER 7.1 +CURLOPT_EXPECT_100_TIMEOUT_MS 7.36.0 CURLOPT_FAILONERROR 7.1 CURLOPT_FILE 7.1 7.9.7 CURLOPT_FILETIME 7.5 @@ -364,6 +375,7 @@ CURLOPT_GSSAPI_DELEGATION 7.22.0 CURLOPT_HEADER 7.1 CURLOPT_HEADERDATA 7.10 CURLOPT_HEADERFUNCTION 7.7.2 +CURLOPT_HEADEROPT 7.37.0 CURLOPT_HTTP200ALIASES 7.10.3 CURLOPT_HTTPAUTH 7.10.6 CURLOPT_HTTPGET 7.8.1 @@ -390,6 +402,7 @@ CURLOPT_KRB4LEVEL 7.3 7.17.0 CURLOPT_KRBLEVEL 7.16.4 CURLOPT_LOCALPORT 7.15.2 CURLOPT_LOCALPORTRANGE 7.15.2 +CURLOPT_LOGIN_OPTIONS 7.34.0 CURLOPT_LOW_SPEED_LIMIT 7.1 CURLOPT_LOW_SPEED_TIME 7.1 CURLOPT_MAIL_AUTH 7.25.0 @@ -417,6 +430,7 @@ CURLOPT_PASSWDDATA 7.4.2 7.11.1 7.15.5 CURLOPT_PASSWDFUNCTION 7.4.2 7.11.1 7.15.5 CURLOPT_PASSWORD 7.19.1 CURLOPT_PASV_HOST 7.12.1 7.16.0 7.15.5 +CURLOPT_PINNEDPUBLICKEY 7.39.0 CURLOPT_PORT 7.1 CURLOPT_POST 7.1 CURLOPT_POST301 7.17.1 7.19.1 @@ -432,6 +446,7 @@ CURLOPT_PROGRESSFUNCTION 7.1 7.32.0 CURLOPT_PROTOCOLS 7.19.4 CURLOPT_PROXY 7.1 CURLOPT_PROXYAUTH 7.10.7 +CURLOPT_PROXYHEADER 7.37.0 CURLOPT_PROXYPASSWORD 7.19.1 CURLOPT_PROXYPORT 7.1 CURLOPT_PROXYTYPE 7.10 @@ -492,6 +507,8 @@ CURLOPT_SSLVERSION 7.1 CURLOPT_SSL_CIPHER_LIST 7.9 CURLOPT_SSL_CTX_DATA 7.10.6 CURLOPT_SSL_CTX_FUNCTION 7.10.6 +CURLOPT_SSL_ENABLE_ALPN 7.36.0 +CURLOPT_SSL_ENABLE_NPN 7.36.0 CURLOPT_SSL_OPTIONS 7.25.0 CURLOPT_SSL_SESSIONID_CACHE 7.16.0 CURLOPT_SSL_VERIFYHOST 7.8.1 @@ -512,6 +529,7 @@ CURLOPT_TLSAUTH_TYPE 7.21.4 CURLOPT_TLSAUTH_USERNAME 7.21.4 CURLOPT_TRANSFERTEXT 7.1.1 CURLOPT_TRANSFER_ENCODING 7.21.6 +CURLOPT_UNIX_SOCKET_PATH 7.40.0 CURLOPT_UNRESTRICTED_AUTH 7.10.4 CURLOPT_UPLOAD 7.1 CURLOPT_URL 7.1 @@ -527,6 +545,7 @@ CURLOPT_WRITEHEADER 7.1 CURLOPT_WRITEINFO 7.1 CURLOPT_XFERINFODATA 7.32.0 CURLOPT_XFERINFOFUNCTION 7.32.0 +CURLOPT_XOAUTH2_BEARER 7.33.0 CURLPAUSE_ALL 7.18.0 CURLPAUSE_CONT 7.18.0 CURLPAUSE_RECV 7.18.0 @@ -556,6 +575,8 @@ CURLPROTO_RTMPTS 7.21.0 CURLPROTO_RTSP 7.20.0 CURLPROTO_SCP 7.19.4 CURLPROTO_SFTP 7.19.4 +CURLPROTO_SMB 7.40.0 +CURLPROTO_SMBS 7.40.0 CURLPROTO_SMTP 7.20.0 CURLPROTO_SMTPS 7.20.0 CURLPROTO_TELNET 7.19.4 @@ -588,6 +609,17 @@ CURLSSH_AUTH_KEYBOARD 7.16.1 CURLSSH_AUTH_NONE 7.16.1 CURLSSH_AUTH_PASSWORD 7.16.1 CURLSSH_AUTH_PUBLICKEY 7.16.1 +CURLSSLBACKEND_AXTLS 7.38.0 +CURLSSLBACKEND_CYASSL 7.34.0 +CURLSSLBACKEND_DARWINSSL 7.34.0 +CURLSSLBACKEND_GNUTLS 7.34.0 +CURLSSLBACKEND_GSKIT 7.34.0 +CURLSSLBACKEND_NONE 7.34.0 +CURLSSLBACKEND_NSS 7.34.0 +CURLSSLBACKEND_OPENSSL 7.34.0 +CURLSSLBACKEND_POLARSSL 7.34.0 +CURLSSLBACKEND_QSOSSL 7.34.0 - 7.38.1 +CURLSSLBACKEND_SCHANNEL 7.34.0 CURLSSLOPT_ALLOW_BEAST 7.25.0 CURLUSESSL_ALL 7.17.0 CURLUSESSL_CONTROL 7.17.0 @@ -620,14 +652,15 @@ CURL_FORMADD_NULL 7.9.8 CURL_FORMADD_OK 7.9.8 CURL_FORMADD_OPTION_TWICE 7.9.8 CURL_FORMADD_UNKNOWN_OPTION 7.9.8 +CURL_GLOBAL_ACK_EINTR 7.30.0 CURL_GLOBAL_ALL 7.8 CURL_GLOBAL_DEFAULT 7.8 CURL_GLOBAL_NOTHING 7.8 CURL_GLOBAL_SSL 7.8 CURL_GLOBAL_WIN32 7.8.1 -CURL_GLOBAL_ACK_EINTR 7.30.0 CURL_HTTP_VERSION_1_0 7.9.1 CURL_HTTP_VERSION_1_1 7.9.1 +CURL_HTTP_VERSION_2_0 7.33.0 CURL_HTTP_VERSION_NONE 7.9.1 CURL_IPRESOLVE_V4 7.10.8 CURL_IPRESOLVE_V6 7.10.8 @@ -689,6 +722,9 @@ CURL_SSLVERSION_DEFAULT 7.9.2 CURL_SSLVERSION_SSLv2 7.9.2 CURL_SSLVERSION_SSLv3 7.9.2 CURL_SSLVERSION_TLSv1 7.9.2 +CURL_SSLVERSION_TLSv1_0 7.34.0 +CURL_SSLVERSION_TLSv1_1 7.34.0 +CURL_SSLVERSION_TLSv1_2 7.34.0 CURL_TIMECOND_IFMODSINCE 7.9.7 CURL_TIMECOND_IFUNMODSINCE 7.9.7 CURL_TIMECOND_LASTMOD 7.9.7 @@ -699,10 +735,13 @@ CURL_VERSION_ASYNCHDNS 7.10.7 CURL_VERSION_CONV 7.15.4 CURL_VERSION_CURLDEBUG 7.19.6 CURL_VERSION_DEBUG 7.10.6 -CURL_VERSION_GSSNEGOTIATE 7.10.6 +CURL_VERSION_GSSAPI 7.38.0 +CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0 +CURL_VERSION_HTTP2 7.33.0 CURL_VERSION_IDN 7.12.0 CURL_VERSION_IPV6 7.10 -CURL_VERSION_KERBEROS4 7.10 +CURL_VERSION_KERBEROS4 7.10 7.33.0 +CURL_VERSION_KERBEROS5 7.40.0 CURL_VERSION_LARGEFILE 7.11.1 CURL_VERSION_LIBZ 7.10 CURL_VERSION_NTLM 7.10.6 @@ -711,6 +750,7 @@ CURL_VERSION_SPNEGO 7.10.8 CURL_VERSION_SSL 7.10 CURL_VERSION_SSPI 7.13.2 CURL_VERSION_TLSAUTH_SRP 7.21.4 +CURL_VERSION_UNIX_SOCKETS 7.40.0 CURL_WAIT_POLLIN 7.28.0 CURL_WAIT_POLLOUT 7.28.0 CURL_WAIT_POLLPRI 7.28.0 diff --git a/docs/mk-ca-bundle.html b/docs/mk-ca-bundle.html index fbdd589..0c633de 100644 --- a/docs/mk-ca-bundle.html +++ b/docs/mk-ca-bundle.html @@ -47,13 +47,15 @@ p.roffit {

    NAME

    mk-ca-bundle - convert mozilla's certdata.txt to PEM format

    SYNOPSIS

    -

    mk-ca-bundle [bilnqtuv] [outputfile]

    DESCRIPTION

    -

    The mk-ca-bundle tool downloads the certdata.txt file from Mozilla's source tree over HTTP, then parses certdata.txt and extracts CA Root Certificates into PEM format. These are then processed with the OpenSSL commandline tool to produce the final ca-bundle file. +

    mk-ca-bundle [bilnpqstuv] [outputfile]

    DESCRIPTION

    +

    The mk-ca-bundle tool downloads the certdata.txt file from Mozilla's source tree over HTTP, then parses certdata.txt and extracts certificates into PEM format. By default, only CA root certificates trusted to issue SSL server authentication certificates are extracted. These are then processed with the OpenSSL commandline tool to produce the final ca-bundle file.

    The default outputfile name is ca-bundle.crt. By setting it to '-' (a single dash) you will get the output sent to STDOUT instead of a file.

    The PEM format this scripts uses for output makes the result readily available for use by just about all OpenSSL or GnuTLS powered applications, such as curl, wget and more.

    OPTIONS

    The following options are supported:

    -b

    backup an existing version of outputfilename +

    -d [name] +

    specify which Mozilla tree to pull certdata.txt from (or a custom URL). Valid names are: aurora, beta, central, mozilla, nss, release (default). They are shortcuts for which source tree to get the cert data from.

    -f

    force rebuild even if certdata.txt is current (Added in version 1.17)

    -i @@ -62,10 +64,25 @@ p.roffit {

    print license info about certdata.txt

    -n

    no download of certdata.txt (to use existing) +

    -p [purposes]:[levels] +

    list of Mozilla trust purposes and levels for certificates to include in output. Takes the form of a comma separated list of purposes, a colon, and a comma separated list of levels. The default is to include all certificates trusted to issue SSL Server certificates (SERVER_AUTH:TRUSTED_DELEGATOR). +

    (Added in version 1.21, Perl only) +

    Valid purposes are: +

    ALL, DIGITAL_SIGNATURE, NON_REPUDIATION, KEY_ENCIPHERMENT, DATA_ENCIPHERMENT, KEY_AGREEMENT, KEY_CERT_SIGN, CRL_SIGN, SERVER_AUTH (default), CLIENT_AUTH, CODE_SIGNING, EMAIL_PROTECTION, IPSEC_END_SYSTEM, IPSEC_TUNNEL, IPSEC_USER, TIME_STAMPING, STEP_UP_APPROVED +

    +

    Valid trust levels are: +

    ALL, TRUSTED_DELEGATOR (default), NOT_TRUSTED, MUST_VERIFY_TRUST, TRUSTED +

    -q

    be really quiet (no progress output at all)

    -t

    include plain text listing of certificates +

    -s [algorithms] +

    comma separated list of signature algorithms with which to hash/fingerprint each certificate and output when run in plain text mode. +

    (Added in version 1.21, Perl only) +

    Valid algorithms are: +

    ALL, NONE, MD5 (default), SHA1, SHA256, SHA384, SHA512 +

    -u

    unlink (remove) certdata.txt after processing

    -v diff --git a/docs/mk-ca-bundle.pdf b/docs/mk-ca-bundle.pdf index 5fe5224e7e8e875f0b15b325cc611a749b2d4a72..fbd4b36c1582f086eb206bf577d29aa51f91e772 100644 GIT binary patch delta 4798 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 Da<(h2 delta 2918 zcma))c|6oxAIArkjBRXLBBPopgWt^j#w=tBV_!mL7iL5+#u&>T>nJ>=ZeiRM-3d2a zT>CCt6jA0uQYw*ZjEOW7NqXG=dG7PLe{{}yo!9q#&ii%F=leY;6Zi5^CW)Eq_MHBl zB%8oJ^)SCjCnBXst?Ex#dH4K*ES>6f*H9ZlFH9-BhE|w#PWQ{M?>3v^?c8IKI0RlY6c<`!RI1%c`krcgi76__Zbo)Wp7&59{o!6_& zZXXe~ew2Ui)R4k*yfJY~dZLw@XQ%6#I5?$qQg=nkJlm|`@D7_XSb%p7+c7z%vRmZE zhj_e2t}Z)3L(;|fYt+=uS#H4PX#_1mxbq`FzjgH~PG-|y&{VtVp3ZDOM4P_Wz6`&- z=sb@Imc6D&w4VQ5U3Ys;+i>PMMHQIu)rctJ^t%=Qt8?g~Vi9X+?u|iBYqG5oyG!$V zQ$_1zg5B7ea62<~L3&V8$OJR7Wxb`-jWd=yzX2c5w|B>`(iv;F1V>u~t5TEsqXSPq zmZ-h)%k(|+k+-*JO@_%jtlRTv<=QGP;zZDl>F`AW1mZe*Bw{Nu6z3CYJ}*xD2iJ?(|r5 zYJ%4^zBQvLf&K<1D7R-#dxJQ&DlMSu^NA&o%sTa+>S+nFLsvU-!!kYPiu}{TQ`Tw~ zf>PIqQ|cs8%8R2i=6lsgB6jBfa71;8yo$-YW2;(f%wvOf&$66(y%poybUtmg*U~BX z{A!%jG&ed)-&Nt6SowU}*ny59SA~;oz6(e4jCc5STh!;z^H(I=rfhq}N2y{HjU=7Y zM40+TLw{k_oTI$uDnm&6E{JBLpZAjusXU=h2yYjMk#(MZ0Q}Wp#4K)FQEzbmI<42h z8+i@RLJs*qQMA{oTJ>{pVa>EbOM zC!)wZ!{0j24=1nh5IWMfkD6-4L~Qu&rmtqJS|!E2(T-TU22ZI;g*hA33KR+Y6I#R_ zK#s!Mk&v?2S7qFxO5WH55hb^A4lZ|LCV^ju^>5aQ;8i9uE;HIE(um!LPH!5t3a(I? z%TWS}C5ob?n`MxpZAl+F`!OLBo*ERA=YMG^@VQE+q*fv}=oA9{<%IF=>qnEUKnUl; zGuH~s`uh#F!Q=1i1EiG+a;u(X9pR}+f<#EJz0G`6oH#T@G;`+q3+ZALK8d#=rS#PE zKK)*9c`HcBvGbc>Yqa+l}BjoX%xjLF1xo)7cy0XG*_aNl)DD zx+w9}5J!Xy^CV9fn!3bGc6{Z5YNir>H z_y!)BHIizux$`vplkusE501HqM`7j~n8p4`v-z)7qPm0DMc;<**@wr;B3Zb0_Gkh& zjht3@W#evy)re2J2Sr*^caj-jW(wb2bGvq{UqOjhR zzIt(Id7eH094maLN2)X{A=d2Sx`fwS*{#u?UoI_F4X(&(K;F%~j*8!(QrL7Ge>>pU zd^`8#nnxLuwsEpMmYbytly%$}9#}Q}7)JDSja~aOwJYF4n!8%)E`n@i7A=S0QdSmuzbQlaVBbICk8Y$5MT=hS?;^x~kKVA1p(-K(2(pZ%%UJ2KLr`zHo>^EFH4=_ub-@gT zQCQXn>;h|0MqdcS5|UM8aiw7_UD@A-z`s^ov%0J{OF>Ry3#>=Vg$f-6^aIfTXdF%l zgGc%6pimTw4zSg9Facx?mVhFY$rL|UhrFE-mbJJCq4zVmCY%u(LX99YLTRkbJ^NVk z3JP)<9RR;ITmb?R#1hdcZ2-->rJ(hX`YQ#35SpdDhxBvilJ{8t9JuBGr@(rgV!6;( zzB5V+00zKsbpnX}VObLZG!H}d?8C_BevuR{b0Qi*{V%~fq`Y4qeb~r|LM4a!pM^5$ zlt3r|N9nV?l=qsTG5UD;U*!ehR5mKQ!jw&7<`(+Y&, et al. + * Copyright (C) 1998 - 2014, 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 @@ -69,7 +69,7 @@ require it! */ #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) #include #endif @@ -423,7 +423,9 @@ typedef enum { CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ CURLE_FTP_CANT_GET_HOST, /* 15 */ - CURLE_OBSOLETE16, /* 16 - NOT USED */ + 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 */ @@ -519,13 +521,18 @@ typedef enum { 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 */ CURL_LAST /* never use! */ } CURLcode; #ifndef CURL_NO_OLDIES /* define this to test if your app builds with all the obsolete stuff removed! */ -/* Previously obsoletes error codes re-used in 7.24.0 */ +/* 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 @@ -579,6 +586,16 @@ typedef enum { 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 */ @@ -609,7 +626,8 @@ typedef enum { * CURLAUTH_NONE - No HTTP authentication * CURLAUTH_BASIC - HTTP Basic authentication (default) * CURLAUTH_DIGEST - HTTP Digest authentication - * CURLAUTH_GSSNEGOTIATE - HTTP GSS-Negotiate 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 @@ -622,7 +640,9 @@ typedef enum { #define CURLAUTH_NONE ((unsigned long)0) #define CURLAUTH_BASIC (((unsigned long)1)<<0) #define CURLAUTH_DIGEST (((unsigned long)1)<<1) -#define CURLAUTH_GSSNEGOTIATE (((unsigned long)1)<<2) +#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) @@ -645,16 +665,18 @@ typedef enum { #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 type { - CURLKHTYPE_UNKNOWN, - CURLKHTYPE_RSA1, - CURLKHTYPE_RSA, - CURLKHTYPE_DSS - } keytype; + enum curl_khtype keytype; }; /* this is the set of return values expected from the curl_sshkeycallback @@ -752,6 +774,10 @@ typedef enum { 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) @@ -779,6 +805,8 @@ typedef enum { #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 @@ -814,7 +842,7 @@ typedef enum { typedef enum { /* This is the FILE * or void * the regular output should be written to. */ - CINIT(FILE, OBJECTPOINT, 1), + CINIT(WRITEDATA, OBJECTPOINT, 1), /* The full URL to get/put */ CINIT(URL, OBJECTPOINT, 2), @@ -825,10 +853,10 @@ typedef enum { /* Name of proxy to use. */ CINIT(PROXY, OBJECTPOINT, 4), - /* "name:password" to use when fetching. */ + /* "user:password;options" to use when fetching. */ CINIT(USERPWD, OBJECTPOINT, 5), - /* "name:password" to use with proxy. */ + /* "user:password" to use with proxy. */ CINIT(PROXYUSERPWD, OBJECTPOINT, 6), /* Range to get, specified as an ASCII string. */ @@ -837,7 +865,7 @@ typedef enum { /* not used */ /* Specified file stream to upload from (use as input): */ - CINIT(INFILE, OBJECTPOINT, 9), + 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: */ @@ -901,7 +929,8 @@ typedef enum { /* Set cookie in request: */ CINIT(COOKIE, OBJECTPOINT, 22), - /* This points to a linked list of headers, struct curl_slist kind */ + /* 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 */ @@ -921,7 +950,7 @@ typedef enum { /* send FILE * or void * to store headers to, if you use a callback it is simply passed to the callback unmodified */ - CINIT(WRITEHEADER, OBJECTPOINT, 29), + CINIT(HEADERDATA, OBJECTPOINT, 29), /* point to a file to read the initial cookies from, also enables "cookie awareness" */ @@ -954,13 +983,13 @@ typedef enum { /* send linked-list of post-transfer QUOTE commands */ CINIT(POSTQUOTE, OBJECTPOINT, 39), - CINIT(WRITEINFO, OBJECTPOINT, 40), /* DEPRECATED, do not use! */ + 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 >= 300 */ + 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 */ @@ -1033,7 +1062,7 @@ typedef enum { /* Max amount of cached alive connections */ CINIT(MAXCONNECTS, LONG, 71), - CINIT(CLOSEPOLICY, LONG, 72), /* DEPRECATED, do not use! */ + CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ /* 73 = OBSOLETE */ @@ -1386,8 +1415,7 @@ typedef enum { CINIT(ADDRESS_SCOPE, LONG, 171), /* Collect certificate chain info and allow it to get retrievable with - CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only - working with OpenSSL-powered builds. */ + CURLINFO_CERTINFO after the transfer is complete. */ CINIT(CERTINFO, LONG, 172), /* "name" and "pwd" to use when fetching. */ @@ -1551,6 +1579,49 @@ typedef enum { * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), + /* The XOAUTH2 bearer token */ + CINIT(XOAUTH2_BEARER, OBJECTPOINT, 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, OBJECTPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP4, OBJECTPOINT, 222), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP6, OBJECTPOINT, 223), + + /* Set authentication options directly */ + CINIT(LOGIN_OPTIONS, OBJECTPOINT, 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, OBJECTPOINT, 230), + + /* Path to Unix domain socket */ + CINIT(UNIX_SOCKET_PATH, OBJECTPOINT, 231), + CURLOPT_LASTENTRY /* the last unused */ } CURLoption; @@ -1587,13 +1658,10 @@ typedef enum { 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 */ +#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_WRITEDATA CURLOPT_FILE -#define CURLOPT_READDATA CURLOPT_INFILE -#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER #define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ @@ -1603,6 +1671,7 @@ enum { 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.0 in the request */ CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ }; @@ -1640,9 +1709,12 @@ enum CURL_NETRC_OPTION { enum { CURL_SSLVERSION_DEFAULT, - CURL_SSLVERSION_TLSv1, + 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_LAST /* never use, keep last */ }; @@ -1961,6 +2033,29 @@ struct curl_certinfo { 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 +} curl_sslbackend; + +/* 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_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + #define CURLINFO_STRING 0x100000 #define CURLINFO_LONG 0x200000 #define CURLINFO_DOUBLE 0x300000 @@ -2012,9 +2107,10 @@ typedef enum { CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43, /* Fill in new entries below here! */ - CURLINFO_LASTONE = 42 + CURLINFO_LASTONE = 43 } CURLINFO; /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as @@ -2150,22 +2246,30 @@ typedef struct { } curl_version_info_data; -#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ -#define CURL_VERSION_KERBEROS4 (1<<1) /* kerberos auth is supported */ -#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 support */ -#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 */ -#define CURL_VERSION_LARGEFILE (1<<9) /* supports files bigger than 2GB */ -#define CURL_VERSION_IDN (1<<10) /* International Domain Names support */ -#define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */ -#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 delegating to winbind helper */ +#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 suported */ +#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 */ /* * NAME curl_version_info() diff --git a/include/curl/curlbuild.h b/include/curl/curlbuild.h index 3ad2f01..f09419a 100644 --- a/include/curl/curlbuild.h +++ b/include/curl/curlbuild.h @@ -528,7 +528,7 @@ #elif defined(__GNUC__) # if defined(__ILP32__) || \ - defined(__i386__) || defined(__ppc__) || defined(__arm__) + defined(__i386__) || defined(__ppc__) || defined(__arm__) || defined(__sparc__) # define CURL_SIZEOF_LONG 4 # define CURL_TYPEOF_CURL_OFF_T long long # define CURL_FORMAT_CURL_OFF_T "lld" @@ -538,7 +538,7 @@ # define CURL_SUFFIX_CURL_OFF_T LL # define CURL_SUFFIX_CURL_OFF_TU ULL # elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) + 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" diff --git a/include/curl/curlbuild.h.cmake b/include/curl/curlbuild.h.cmake index 3aa772f..60bc7a7 100644 --- a/include/curl/curlbuild.h.cmake +++ b/include/curl/curlbuild.h.cmake @@ -58,51 +58,52 @@ /* ================================================================ */ #ifdef CURL_SIZEOF_LONG -# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" +#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 "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 "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 "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 "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 "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 "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 "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 "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 "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined #endif @@ -110,71 +111,87 @@ /* 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 ${CURL_PULL_SYS_TYPES_H} +#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 ${CURL_PULL_STDINT_H} +#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 ${CURL_PULL_INTTYPES_H} +#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. */ -#cmakedefine CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} +#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} /* Integral data type used for curl_socklen_t. */ -#cmakedefine CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} - -/* on windows socklen_t is in here */ -#ifdef _WIN32 -# include -# include -#endif +#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} -#ifdef HAVE_SYS_SOCKET_H -# include -#endif +/* 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; -/* The size of `curl_socklen_t', as computed by sizeof. */ -#cmakedefine CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} - /* Signed integral data type used for curl_off_t. */ -#cmakedefine CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_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. */ -#cmakedefine CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" +#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" /* unsigned curl_off_t formatting string without "%" conversion specifier. */ -#cmakedefine CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" +#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" /* curl_off_t formatting string directive with "%" conversion specifier. */ -#cmakedefine CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" +#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" /* The size of `curl_off_t', as computed by sizeof. */ -#cmakedefine CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} +#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} /* curl_off_t constant suffix. */ -#cmakedefine CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} +#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} /* unsigned curl_off_t constant suffix. */ -#cmakedefine CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} +#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} #endif /* __CURL_CURLBUILD_H */ diff --git a/include/curl/curlver.h b/include/curl/curlver.h index c2be02c..ccdafc1 100644 --- a/include/curl/curlver.h +++ b/include/curl/curlver.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -26,16 +26,16 @@ 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 - 2013 Daniel Stenberg, ." +#define LIBCURL_COPYRIGHT "1996 - 2015 Daniel Stenberg, ." /* This is the version number of the libcurl package from which this header file origins: */ -#define LIBCURL_VERSION "7.32.0" +#define LIBCURL_VERSION "7.40.0" /* The numeric version number is also available "in parts" by using these defines: */ #define LIBCURL_VERSION_MAJOR 7 -#define LIBCURL_VERSION_MINOR 32 +#define LIBCURL_VERSION_MINOR 40 #define LIBCURL_VERSION_PATCH 0 /* This is the numeric version of the libcurl version number, meant for easier @@ -53,7 +53,7 @@ and it is always a greater number in a more recent release. It makes comparisons with greater than and less than work. */ -#define LIBCURL_VERSION_NUM 0x072000 +#define LIBCURL_VERSION_NUM 0x072800 /* * This is the date and time when the full source package was created. The @@ -64,6 +64,6 @@ * * "Mon Feb 12 11:35:33 UTC 2007" */ -#define LIBCURL_TIMESTAMP "Sun Aug 11 22:15:54 UTC 2013" +#define LIBCURL_TIMESTAMP "Thu Jan 8 08:17:17 UTC 2015" #endif /* __CURL_CURLVER_H */ diff --git a/include/curl/multi.h b/include/curl/multi.h index a5eb3c6..3c4acb0 100644 --- a/include/curl/multi.h +++ b/include/curl/multi.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -64,6 +64,8 @@ typedef enum { 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; diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h index f8917e8..69d41a2 100644 --- a/include/curl/typecheck-gcc.h +++ b/include/curl/typecheck-gcc.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -264,6 +264,12 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist, (option) == CURLOPT_RTSP_SESSION_ID || \ (option) == CURLOPT_RTSP_STREAM_URI || \ (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ 0) /* evaluates to true if option takes a curl_write_callback argument */ @@ -285,7 +291,7 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist, (option) == CURLOPT_SOCKOPTDATA || \ (option) == CURLOPT_OPENSOCKETDATA || \ (option) == CURLOPT_PROGRESSDATA || \ - (option) == CURLOPT_WRITEHEADER || \ + (option) == CURLOPT_HEADERDATA || \ (option) == CURLOPT_DEBUGDATA || \ (option) == CURLOPT_SSL_CTX_DATA || \ (option) == CURLOPT_SEEKDATA || \ diff --git a/install-sh b/install-sh index a9244eb..377bb86 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-01-19.21; # UTC +scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,7 +35,7 @@ scriptversion=2011-01-19.21; # UTC # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written @@ -156,7 +156,7 @@ while test $# -ne 0; do -s) stripcmd=$stripprog;; -t) dst_arg=$2 - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac @@ -190,7 +190,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac @@ -202,7 +202,7 @@ if test $# -eq 0; then echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi @@ -240,7 +240,7 @@ fi for src do - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac @@ -354,7 +354,7 @@ do if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. + # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index b2bcf09..e7886ac 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -48,25 +48,6 @@ endif() # ) # ENDIF(NOT HAVE_STRTOLL AND NOT HAVE__STRTOI64) -if(HAVE_FEATURES_H) - set_source_files_properties( - cookie.c - easy.c - formdata.c - getenv.c - nonblock.c - hash.c - http.c - if2ip.c - mprintf.c - multi.c - sendf.c - telnet.c - transfer.c - url.c - COMPILE_FLAGS -D_BSD_SOURCE) -endif(HAVE_FEATURES_H) - # The rest of the build @@ -76,7 +57,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -if(CURL_USE_ARES) +if(USE_ARES) include_directories(${CARES_INCLUDE_DIR}) endif() @@ -106,8 +87,6 @@ endif() set_target_properties(${LIB_NAME} PROPERTIES COMPILE_DEFINITIONS BUILDING_LIBCURL) -setup_curl_dependencies(${LIB_NAME}) - # Remove the "lib" prefix since the library is already named "libcurl". set_target_properties(${LIB_NAME} PROPERTIES PREFIX "") set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "") diff --git a/lib/Makefile.Watcom b/lib/Makefile.Watcom index b775365..14f5ac8 100644 --- a/lib/Makefile.Watcom +++ b/lib/Makefile.Watcom @@ -3,16 +3,31 @@ # G. Vanem # +.ERASE + +!if $(__VERSION__) < 1280 +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!message ! This Open Watcom version is too old and is no longer supported ! +!message ! Please download latest version from www.openwatcom.org ! +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!error Unsupported version of Open Watcom +!endif + !ifndef %watcom !error WATCOM environment variable not set! !endif +# In order to process Makefile.inc wmake must be called with -u switch! +!ifndef %MAKEFLAGS +!error You MUST call wmake with the -u switch! +!endif + !ifdef %libname LIBNAME = $(%libname) !else LIBNAME = libcurl !endif -TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib +TARGETS = $(LIBNAME).dll $(LIBNAME).lib CC = wcc386 LD = wlink @@ -23,37 +38,29 @@ RC = wrc ! loaddll wcc386 wccd386 ! loaddll wpp386 wppd386 ! loaddll wlib wlibd -! if $(__VERSION__) > 1270 -! loaddll wlink wlinkd -! else -! loaddll wlink wlink -! endif +! loaddll wlink wlinkd !endif !ifdef __LINUX__ -DS = / CP = cp MD = mkdir -p -RD = rmdir -p -RM = rm -f !else -DS = $(X)\$(X) CP = copy 2>NUL MD = mkdir -RD = rmdir /q /s 2>NUL -!if $(__VERSION__) < 1250 -RM = del /q /f 2>NUL -!else -RM = rm -f !endif +!if $(__VERSION__) > 1290 +RD = rm -rf +!else ifdef __UNIX__ +RD = rm -rf +!else +RD = rmdir /q /s 2>NUL !endif -SYS_INCL = -I$(%watcom)$(DS)h$(DS)nt -I$(%watcom)$(DS)h -SYS_LIBS = $(%watcom)$(DS)lib386$(DS)nt;$(%watcom)$(DS)lib386 +SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h" CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm & -wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV & - -dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -I. -I..$(DS)include $(SYS_INCL) + -dBUILDING_LIBCURL -I. -I"../include" $(SYS_INCL) !ifdef %debug DEBUG = -dDEBUG=1 -dDEBUGBUILD @@ -70,6 +77,11 @@ CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6 CFLAGS += -dUSE_WINDOWS_SSPI !endif +!ifdef %use_winssl +CFLAGS += -dUSE_WINDOWS_SSPI +CFLAGS += -DUSE_SCHANNEL +!endif + !ifdef %use_winidn CFLAGS += -dWINVER=0x0600 -dUSE_WIN32_IDN ! if $(__VERSION__) <= 1290 @@ -83,169 +95,162 @@ CFLAGS += -dWANT_IDN_PROTOTYPES !ifdef %zlib_root ZLIB_ROOT = $(%zlib_root) !else -ZLIB_ROOT = ..$(DS)..$(DS)zlib-1.2.8 +ZLIB_ROOT = ../../zlib-1.2.8 !endif !ifdef %libssh2_root LIBSSH2_ROOT = $(%libssh2_root) !else -LIBSSH2_ROOT = ..$(DS)..$(DS)libssh2-1.4.3 +LIBSSH2_ROOT = ../../libssh2-1.4.3 !endif !ifdef %librtmp_root LIBRTMP_ROOT = $(%librtmp_root) !else -LIBRTMP_ROOT = ..$(DS)..$(DS)rtmpdump-2.3 +LIBRTMP_ROOT = ../../rtmpdump-2.3 !endif !ifdef %openssl_root OPENSSL_ROOT = $(%openssl_root) !else -OPENSSL_ROOT = ..$(DS)..$(DS)openssl-0.9.8y +OPENSSL_ROOT = ../../openssl-0.9.8zc !endif !ifdef %ares_root ARES_ROOT = $(%ares_root) !else -ARES_ROOT = ..$(DS)ares +ARES_ROOT = ../ares !endif !ifdef %use_zlib -CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I$(ZLIB_ROOT) +CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)" !endif !ifdef %use_rtmp -CFLAGS += -dUSE_LIBRTMP -I$(LIBRTMP_ROOT) +CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)" !endif !ifdef %use_ssh2 -CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I$(LIBSSH2_ROOT)$(DS)include -I$(LIBSSH2_ROOT)$(DS)win32 +CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32" !endif !ifdef %use_ssl -CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)$(DS)inc32 +CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I"$(OPENSSL_ROOT)/inc32" !endif !ifdef %use_ares -CFLAGS += -dUSE_ARES -I$(ARES_ROOT) +CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)" !endif !ifdef %use_watt32 -CFLAGS += -dUSE_WATT32 -I$(%watt_root)$(DS)inc +CFLAGS += -dUSE_WATT32 -I"$(%watt_root)/inc" !endif OBJ_BASE = WC_Win32.obj -LINK_ARG = $(OBJ_BASE)$(DS)dyn$(DS)wlink.arg -LIB_ARG = $(OBJ_BASE)$(DS)stat$(DS)wlib.arg - -# In order to process Makefile.inc wmake must be called with -u switch! -!ifndef %MAKEFLAGS -!error You MUST call wmake with the -u switch! +!if $(__VERSION__) > 1290 +OBJ_STAT = $(OBJ_BASE)/stat +OBJ_DYN = $(OBJ_BASE)/dyn +!else ifdef __UNIX__ +OBJ_STAT = $(OBJ_BASE)/stat +OBJ_DYN = $(OBJ_BASE)/dyn !else -!include Makefile.inc +OBJ_STAT = $(OBJ_BASE)\stat +OBJ_DYN = $(OBJ_BASE)\dyn !endif -OBJS = $(CSOURCES:.c=.obj) -!ifdef __LINUX__ -OBJS = $OBJ_DIR/$(OBJS: = $OBJ_DIR/) +LINK_ARG = $(OBJ_DYN)/wlink.arg +LIB_ARG = $(OBJ_STAT)/wlib.arg -!else -OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\) -!endif +!include Makefile.inc -# -# Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN). -# -OBJ_DIR = $(OBJ_BASE)$(DS)stat -OBJS_STAT = $+ $(OBJS) $- +OBJS1 = ./$(CSOURCES:.c=.obj) +OBJS2 = $(OBJS1:vtls/=) +OBJS3 = $(OBJS2: = ./) +OBJS_STAT = $(OBJS3:./=$(OBJ_STAT)/) +OBJS_DYN = $(OBJS3:./=$(OBJ_DYN)/) -OBJ_DIR = $(OBJ_BASE)$(DS)dyn -OBJS_DYN = $+ $(OBJS) $- +CURLBUILDH = ../include/curl/curlbuild.h +RESOURCE = $(OBJ_DYN)/libcurl.res -CURLBUILDH = ..$(DS)include$(DS)curl$(DS)curlbuild.h -RESOURCE = $(OBJ_BASE)$(DS)dyn$(DS)libcurl.res +DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn -all: $(CURLBUILDH) $(OBJ_BASE) $(TARGETS) .SYMBOLIC +.c : vtls + +all: $(CURLBUILDH) $(DIRS) $(TARGETS) .SYMBOLIC @echo Welcome to libcurl clean: .SYMBOLIC - -$(RM) $(OBJS_STAT) - -$(RM) $(OBJS_DYN) - -$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG) + -rm -f $(OBJS_STAT) + -rm -f $(OBJS_DYN) + -rm -f $(RESOURCE) $(LINK_ARG) $(LIB_ARG) vclean distclean: clean .SYMBOLIC - -$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym - -$(RD) $(OBJ_BASE)$(DS)stat - -$(RD) $(OBJ_BASE)$(DS)dyn + -rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym + -$(RD) $(OBJ_STAT) + -$(RD) $(OBJ_DYN) -$(RD) $(OBJ_BASE) -$(OBJ_BASE): +$(DIRS): -$(MD) $^@ - -$(MD) $^@$(DS)stat - -$(MD) $^@$(DS)dyn $(CURLBUILDH): .EXISTSONLY $(CP) $^@.dist $^@ -$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(LINK_ARG) - $(LD) name $^@ @$]@ - -$(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG) - $(AR) -q -b -c $^@ @$]@ - -.ERASE -$(RESOURCE): libcurl.rc - $(RC) $(DEBUG) -q -r -zm -bt=nt -I..$(DS)include $(SYS_INCL) $[@ -fo=$^@ - -.ERASE -.c{$(OBJ_BASE)$(DS)dyn}.obj: - $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ - -.ERASE -.c{$(OBJ_BASE)$(DS)stat}.obj: - $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ - -$(LINK_ARG): $(__MAKEFILES__) - %create $^@ - @%append $^@ system nt dll - @%append $^@ file { $(OBJS_DYN) } +$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__) + %create $(LINK_ARG) + @%append $(LINK_ARG) system nt dll !ifdef %debug - @%append $^@ debug all - @%append $^@ option symfile + @%append $(LINK_ARG) debug all + @%append $(LINK_ARG) option symfile !endif - @%append $^@ option quiet, map, caseexact, eliminate, implib=$(LIBNAME)_imp.lib, - @%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS) - @%append $^@ library wldap32.lib + @%append $(LINK_ARG) option quiet, caseexact, eliminate + @%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map + @%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib + @%append $(LINK_ARG) option res=$(RESOURCE) + @for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f + @%append $(LINK_ARG) library wldap32.lib !ifdef %use_watt32 - @%append $^@ library $(%watt_root)$(DS)lib$(DS)wattcpw_imp.lib + @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib' !else - @%append $^@ library ws2_32.lib + @%append $(LINK_ARG) library ws2_32.lib !endif !ifdef %use_zlib - @%append $^@ library $(ZLIB_ROOT)$(DS)zlib.lib + @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib' !endif !ifdef %use_rtmp - @%append $^@ library $(LIBRTMP_ROOT)$(DS)librtmp$(DS)librtmp.lib + @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib' !endif !ifdef %use_ssh2 - @%append $^@ library $(LIBSSH2_ROOT)$(DS)win32$(DS)libssh2.lib + @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib' !endif !ifdef %use_ssl - @%append $^@ library $(OPENSSL_ROOT)$(DS)out32$(DS)libeay32.lib, $(OPENSSL_ROOT)$(DS)out32$(DS)ssleay32.lib + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib' + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib' !endif !ifdef %use_ares - @%append $^@ library $(ARES_ROOT)$(DS)cares.lib + @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib' !endif !ifdef %use_winidn ! if $(__VERSION__) > 1290 - @%append $^@ library normaliz.lib + @%append $(LINK_ARG) library normaliz.lib ! else - @%append $^@ import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' - @%append $^@ import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' + @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' + @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' ! endif !endif + $(LD) name $^@ @$(LINK_ARG) -$(LIB_ARG): $(__MAKEFILES__) - %create $^@ - @for %f in ($(OBJS_STAT)) do @%append $^@ +- %f +$(LIBNAME).lib: $(OBJS_STAT) + %create $(LIB_ARG) + @for %f in ($<) do @%append $(LIB_ARG) +- %f + $(AR) -q -b -c -pa $^@ @$(LIB_ARG) +$(RESOURCE): libcurl.rc + $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@ + +.c{$(OBJ_DYN)}.obj: + $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ + +.c{$(OBJ_STAT)}.obj: + $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ + diff --git a/lib/Makefile.am b/lib/Makefile.am index 4477cc2..6dffbd9 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -60,20 +60,15 @@ CFLAGS += @CURL_CFLAG_EXTRAS@ # $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file # $(top_srcdir)/ares is for in-tree c-ares's external include files -if USE_EMBEDDED_ARES -AM_CPPFLAGS = -I$(top_builddir)/include/curl \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/lib \ - -I$(top_srcdir)/lib \ - -I$(top_builddir)/ares \ - -I$(top_srcdir)/ares -else AM_CPPFLAGS = -I$(top_builddir)/include/curl \ -I$(top_builddir)/include \ -I$(top_srcdir)/include \ -I$(top_builddir)/lib \ -I$(top_srcdir)/lib + +if USE_EMBEDDED_ARES +AM_CPPFLAGS += -I$(top_builddir)/ares \ + -I$(top_srcdir)/ares endif # Prevent LIBS from being used for all link targets diff --git a/lib/Makefile.b32 b/lib/Makefile.b32 index 7dbb37f..b9531fd 100644 --- a/lib/Makefile.b32 +++ b/lib/Makefile.b32 @@ -27,7 +27,7 @@ ZLIB_PATH = ..\..\zlib-1.2.8 # Edit the path below to point to the base of your OpenSSL package. !ifndef OPENSSL_PATH -OPENSSL_PATH = ..\..\openssl-0.9.8y +OPENSSL_PATH = ..\..\openssl-0.9.8zc !endif # Set libcurl static lib, dll and import lib @@ -49,9 +49,9 @@ CC_FLAGS = -5 -O2 -tWM -w -w-aus -w-ccc -w-dup -w-prc -w-pro -w-rch -w-sig -w-sp LIBFLAGS = /C /P32 LDFLAGS = -q -lq -laa -tWD -SRCDIR = . +SRCDIR = .;.\vtls OBJDIR = .\BCC_objs -INCDIRS = -I.;..\include +INCDIRS = -I.;.\lib;..\include LINKLIB = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib DEFINES = -DNDEBUG -DWIN32 -DBUILDING_LIBCURL @@ -94,10 +94,11 @@ LINKLIB = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\l # build source files with hyphens in their name as objects with underscores # using explicit compilation build rules instead of implicit ones. -NOHYPHEN = $(CSOURCES:-=_) +NOHYPHEN1 = $(CSOURCES:-=_) +NOHYPHEN2 = $(NOHYPHEN1:vtls/=) -OBJECTS = $(NOHYPHEN:.c=.obj) -PREPROCESSED = $(NOHYPHEN:.c=.int) +OBJECTS = $(NOHYPHEN2:.c=.obj) +PREPROCESSED = $(NOHYPHEN2:.c=.int) # Borland's command line compiler (BCC32) version 5.5.1 integrated # preprocessor has a bug which results in silently generating wrong diff --git a/lib/Makefile.in b/lib/Makefile.in index 51e7c5f..5947cf0 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -14,14 +14,27 @@ @SET_MAKE@ -# ./lib/Makefile.inc -# Using the backslash as line continuation character might be problematic -# with some make flavours, as Watcom's wmake showed us already. If we -# ever want to change this in a portable manner then we should consider -# this idea (posted to the libcurl list by Adam Kellas): -# CSRC1 = file1.c file2.c file3.c -# CSRC2 = file4.c file5.c file6.c -# CSOURCES = $(CSRC1) $(CSRC2) +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' @@ -87,13 +100,16 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -@CURL_LT_SHLIB_USE_VERSION_INFO_TRUE@am__append_1 = $(VERSIONINFO) -@CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_2 = -no-undefined -@CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_3 = -mimpure-text -@CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE@am__append_4 = -Wl,--version-script=libcurl.vers -@USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_5 = -DCURL_STATICLIB -@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_6 = -DCURL_HIDDEN_SYMBOLS -@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_7 = $(CFLAG_CURL_SYMBOL_HIDING) +@USE_EMBEDDED_ARES_TRUE@am__append_1 = -I$(top_builddir)/ares \ +@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/ares + +@CURL_LT_SHLIB_USE_VERSION_INFO_TRUE@am__append_2 = $(VERSIONINFO) +@CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_3 = -no-undefined +@CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_4 = -mimpure-text +@CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE@am__append_5 = -Wl,--version-script=libcurl.vers +@USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_6 = -DCURL_STATICLIB +@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_7 = -DCURL_HIDDEN_SYMBOLS +@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_8 = $(CFLAG_CURL_SYMBOL_HIDING) DIST_COMMON = $(srcdir)/Makefile.inc $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(srcdir)/curl_config.h.in \ $(top_srcdir)/mkinstalldirs $(srcdir)/libcurl.vers.in \ @@ -159,12 +175,11 @@ am__objects_1 = libcurl_la-file.lo libcurl_la-timeval.lo \ libcurl_la-cookie.lo libcurl_la-http.lo libcurl_la-sendf.lo \ libcurl_la-ftp.lo libcurl_la-url.lo libcurl_la-dict.lo \ libcurl_la-if2ip.lo libcurl_la-speedcheck.lo \ - libcurl_la-ldap.lo libcurl_la-ssluse.lo libcurl_la-version.lo \ - libcurl_la-getenv.lo libcurl_la-escape.lo \ - libcurl_la-mprintf.lo libcurl_la-telnet.lo libcurl_la-netrc.lo \ - libcurl_la-getinfo.lo libcurl_la-transfer.lo \ - libcurl_la-strequal.lo libcurl_la-easy.lo \ - libcurl_la-security.lo libcurl_la-krb4.lo \ + libcurl_la-ldap.lo libcurl_la-version.lo libcurl_la-getenv.lo \ + libcurl_la-escape.lo libcurl_la-mprintf.lo \ + libcurl_la-telnet.lo libcurl_la-netrc.lo libcurl_la-getinfo.lo \ + libcurl_la-transfer.lo libcurl_la-strequal.lo \ + libcurl_la-easy.lo libcurl_la-security.lo \ libcurl_la-curl_fnmatch.lo libcurl_la-fileinfo.lo \ libcurl_la-ftplistparser.lo libcurl_la-wildcard.lo \ libcurl_la-krb5.lo libcurl_la-memdebug.lo \ @@ -179,34 +194,41 @@ am__objects_1 = libcurl_la-file.lo libcurl_la-timeval.lo \ libcurl_la-hostip4.lo libcurl_la-hostip6.lo \ libcurl_la-hostsyn.lo libcurl_la-inet_ntop.lo \ libcurl_la-parsedate.lo libcurl_la-select.lo \ - libcurl_la-gtls.lo libcurl_la-sslgen.lo libcurl_la-tftp.lo \ - libcurl_la-splay.lo libcurl_la-strdup.lo libcurl_la-socks.lo \ - libcurl_la-ssh.lo libcurl_la-nss.lo libcurl_la-qssl.lo \ - libcurl_la-rawstr.lo libcurl_la-curl_addrinfo.lo \ - libcurl_la-socks_gssapi.lo libcurl_la-socks_sspi.lo \ - libcurl_la-curl_sspi.lo libcurl_la-slist.lo \ - libcurl_la-nonblock.lo libcurl_la-curl_memrchr.lo \ - libcurl_la-imap.lo libcurl_la-pop3.lo libcurl_la-smtp.lo \ - libcurl_la-pingpong.lo libcurl_la-rtsp.lo \ - libcurl_la-curl_threads.lo libcurl_la-warnless.lo \ - libcurl_la-hmac.lo libcurl_la-polarssl.lo \ - libcurl_la-polarssl_threadlock.lo libcurl_la-curl_rtmp.lo \ - libcurl_la-openldap.lo libcurl_la-curl_gethostname.lo \ - libcurl_la-gopher.lo libcurl_la-axtls.lo \ + libcurl_la-tftp.lo libcurl_la-splay.lo libcurl_la-strdup.lo \ + libcurl_la-socks.lo libcurl_la-ssh.lo libcurl_la-rawstr.lo \ + libcurl_la-curl_addrinfo.lo libcurl_la-socks_gssapi.lo \ + libcurl_la-socks_sspi.lo libcurl_la-curl_sspi.lo \ + libcurl_la-slist.lo libcurl_la-nonblock.lo \ + libcurl_la-curl_memrchr.lo libcurl_la-imap.lo \ + libcurl_la-pop3.lo libcurl_la-smtp.lo libcurl_la-pingpong.lo \ + libcurl_la-rtsp.lo libcurl_la-curl_threads.lo \ + libcurl_la-warnless.lo libcurl_la-hmac.lo \ + libcurl_la-curl_rtmp.lo libcurl_la-openldap.lo \ + libcurl_la-curl_gethostname.lo libcurl_la-gopher.lo \ libcurl_la-idn_win32.lo libcurl_la-http_negotiate_sspi.lo \ - libcurl_la-cyassl.lo libcurl_la-http_proxy.lo \ - libcurl_la-non-ascii.lo libcurl_la-asyn-ares.lo \ - libcurl_la-asyn-thread.lo libcurl_la-curl_gssapi.lo \ - libcurl_la-curl_ntlm.lo libcurl_la-curl_ntlm_wb.lo \ - libcurl_la-curl_ntlm_core.lo libcurl_la-curl_ntlm_msgs.lo \ - libcurl_la-curl_sasl.lo libcurl_la-curl_schannel.lo \ - libcurl_la-curl_multibyte.lo libcurl_la-curl_darwinssl.lo \ - libcurl_la-hostcheck.lo libcurl_la-bundles.lo \ - libcurl_la-conncache.lo libcurl_la-pipeline.lo \ - libcurl_la-dotdot.lo libcurl_la-x509asn1.lo \ - libcurl_la-gskit.lo -am__objects_2 = -am_libcurl_la_OBJECTS = $(am__objects_1) $(am__objects_2) + libcurl_la-http_proxy.lo libcurl_la-non-ascii.lo \ + libcurl_la-asyn-ares.lo libcurl_la-asyn-thread.lo \ + libcurl_la-curl_gssapi.lo libcurl_la-curl_ntlm.lo \ + libcurl_la-curl_ntlm_wb.lo libcurl_la-curl_ntlm_core.lo \ + libcurl_la-curl_ntlm_msgs.lo libcurl_la-curl_sasl.lo \ + libcurl_la-curl_multibyte.lo libcurl_la-hostcheck.lo \ + libcurl_la-bundles.lo libcurl_la-conncache.lo \ + libcurl_la-pipeline.lo libcurl_la-dotdot.lo \ + libcurl_la-x509asn1.lo libcurl_la-http2.lo \ + libcurl_la-curl_sasl_sspi.lo libcurl_la-smb.lo \ + libcurl_la-curl_sasl_gssapi.lo libcurl_la-curl_endian.lo +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_2 = vtls/libcurl_la-openssl.lo vtls/libcurl_la-gtls.lo \ + vtls/libcurl_la-vtls.lo vtls/libcurl_la-nss.lo \ + vtls/libcurl_la-polarssl.lo \ + vtls/libcurl_la-polarssl_threadlock.lo \ + vtls/libcurl_la-axtls.lo vtls/libcurl_la-cyassl.lo \ + vtls/libcurl_la-curl_schannel.lo \ + vtls/libcurl_la-curl_darwinssl.lo vtls/libcurl_la-gskit.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = +am__objects_5 = $(am__objects_4) $(am__objects_4) +am_libcurl_la_OBJECTS = $(am__objects_3) $(am__objects_5) libcurl_la_OBJECTS = $(am_libcurl_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -216,19 +238,18 @@ libcurl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurl_la_CFLAGS) \ $(CFLAGS) $(libcurl_la_LDFLAGS) $(LDFLAGS) -o $@ libcurlu_la_LIBADD = -am__objects_3 = libcurlu_la-file.lo libcurlu_la-timeval.lo \ +am__objects_6 = libcurlu_la-file.lo libcurlu_la-timeval.lo \ libcurlu_la-base64.lo libcurlu_la-hostip.lo \ libcurlu_la-progress.lo libcurlu_la-formdata.lo \ libcurlu_la-cookie.lo libcurlu_la-http.lo libcurlu_la-sendf.lo \ libcurlu_la-ftp.lo libcurlu_la-url.lo libcurlu_la-dict.lo \ libcurlu_la-if2ip.lo libcurlu_la-speedcheck.lo \ - libcurlu_la-ldap.lo libcurlu_la-ssluse.lo \ - libcurlu_la-version.lo libcurlu_la-getenv.lo \ - libcurlu_la-escape.lo libcurlu_la-mprintf.lo \ - libcurlu_la-telnet.lo libcurlu_la-netrc.lo \ - libcurlu_la-getinfo.lo libcurlu_la-transfer.lo \ - libcurlu_la-strequal.lo libcurlu_la-easy.lo \ - libcurlu_la-security.lo libcurlu_la-krb4.lo \ + libcurlu_la-ldap.lo libcurlu_la-version.lo \ + libcurlu_la-getenv.lo libcurlu_la-escape.lo \ + libcurlu_la-mprintf.lo libcurlu_la-telnet.lo \ + libcurlu_la-netrc.lo libcurlu_la-getinfo.lo \ + libcurlu_la-transfer.lo libcurlu_la-strequal.lo \ + libcurlu_la-easy.lo libcurlu_la-security.lo \ libcurlu_la-curl_fnmatch.lo libcurlu_la-fileinfo.lo \ libcurlu_la-ftplistparser.lo libcurlu_la-wildcard.lo \ libcurlu_la-krb5.lo libcurlu_la-memdebug.lo \ @@ -243,34 +264,39 @@ am__objects_3 = libcurlu_la-file.lo libcurlu_la-timeval.lo \ libcurlu_la-hostasyn.lo libcurlu_la-hostip4.lo \ libcurlu_la-hostip6.lo libcurlu_la-hostsyn.lo \ libcurlu_la-inet_ntop.lo libcurlu_la-parsedate.lo \ - libcurlu_la-select.lo libcurlu_la-gtls.lo \ - libcurlu_la-sslgen.lo libcurlu_la-tftp.lo libcurlu_la-splay.lo \ + libcurlu_la-select.lo libcurlu_la-tftp.lo libcurlu_la-splay.lo \ libcurlu_la-strdup.lo libcurlu_la-socks.lo libcurlu_la-ssh.lo \ - libcurlu_la-nss.lo libcurlu_la-qssl.lo libcurlu_la-rawstr.lo \ - libcurlu_la-curl_addrinfo.lo libcurlu_la-socks_gssapi.lo \ - libcurlu_la-socks_sspi.lo libcurlu_la-curl_sspi.lo \ - libcurlu_la-slist.lo libcurlu_la-nonblock.lo \ - libcurlu_la-curl_memrchr.lo libcurlu_la-imap.lo \ - libcurlu_la-pop3.lo libcurlu_la-smtp.lo \ + libcurlu_la-rawstr.lo libcurlu_la-curl_addrinfo.lo \ + libcurlu_la-socks_gssapi.lo libcurlu_la-socks_sspi.lo \ + libcurlu_la-curl_sspi.lo libcurlu_la-slist.lo \ + libcurlu_la-nonblock.lo libcurlu_la-curl_memrchr.lo \ + libcurlu_la-imap.lo libcurlu_la-pop3.lo libcurlu_la-smtp.lo \ libcurlu_la-pingpong.lo libcurlu_la-rtsp.lo \ libcurlu_la-curl_threads.lo libcurlu_la-warnless.lo \ - libcurlu_la-hmac.lo libcurlu_la-polarssl.lo \ - libcurlu_la-polarssl_threadlock.lo libcurlu_la-curl_rtmp.lo \ + libcurlu_la-hmac.lo libcurlu_la-curl_rtmp.lo \ libcurlu_la-openldap.lo libcurlu_la-curl_gethostname.lo \ - libcurlu_la-gopher.lo libcurlu_la-axtls.lo \ - libcurlu_la-idn_win32.lo libcurlu_la-http_negotiate_sspi.lo \ - libcurlu_la-cyassl.lo libcurlu_la-http_proxy.lo \ + libcurlu_la-gopher.lo libcurlu_la-idn_win32.lo \ + libcurlu_la-http_negotiate_sspi.lo libcurlu_la-http_proxy.lo \ libcurlu_la-non-ascii.lo libcurlu_la-asyn-ares.lo \ libcurlu_la-asyn-thread.lo libcurlu_la-curl_gssapi.lo \ libcurlu_la-curl_ntlm.lo libcurlu_la-curl_ntlm_wb.lo \ libcurlu_la-curl_ntlm_core.lo libcurlu_la-curl_ntlm_msgs.lo \ - libcurlu_la-curl_sasl.lo libcurlu_la-curl_schannel.lo \ - libcurlu_la-curl_multibyte.lo libcurlu_la-curl_darwinssl.lo \ + libcurlu_la-curl_sasl.lo libcurlu_la-curl_multibyte.lo \ libcurlu_la-hostcheck.lo libcurlu_la-bundles.lo \ libcurlu_la-conncache.lo libcurlu_la-pipeline.lo \ libcurlu_la-dotdot.lo libcurlu_la-x509asn1.lo \ - libcurlu_la-gskit.lo -am_libcurlu_la_OBJECTS = $(am__objects_3) $(am__objects_2) + libcurlu_la-http2.lo libcurlu_la-curl_sasl_sspi.lo \ + libcurlu_la-smb.lo libcurlu_la-curl_sasl_gssapi.lo \ + libcurlu_la-curl_endian.lo +am__objects_7 = vtls/libcurlu_la-openssl.lo vtls/libcurlu_la-gtls.lo \ + vtls/libcurlu_la-vtls.lo vtls/libcurlu_la-nss.lo \ + vtls/libcurlu_la-polarssl.lo \ + vtls/libcurlu_la-polarssl_threadlock.lo \ + vtls/libcurlu_la-axtls.lo vtls/libcurlu_la-cyassl.lo \ + vtls/libcurlu_la-curl_schannel.lo \ + vtls/libcurlu_la-curl_darwinssl.lo vtls/libcurlu_la-gskit.lo +am__objects_8 = $(am__objects_6) $(am__objects_7) +am_libcurlu_la_OBJECTS = $(am__objects_8) $(am__objects_5) libcurlu_la_OBJECTS = $(am_libcurlu_la_OBJECTS) libcurlu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurlu_la_CFLAGS) \ @@ -372,6 +398,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -396,7 +423,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -405,7 +431,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -428,6 +453,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -463,11 +489,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -567,25 +595,6 @@ lib_LTLIBRARIES = libcurl.la @BUILD_UNITTESTS_FALSE@noinst_LTLIBRARIES = @BUILD_UNITTESTS_TRUE@noinst_LTLIBRARIES = libcurlu.la -# This flag accepts an argument of the form current[:revision[:age]]. So, -# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to -# 1. -# -# Here's the simplified rule guide on how to change -version-info: -# (current version is C:R:A) -# -# 1. if there are only source changes, use C:R+1:A -# 2. if interfaces were added use C+1:0:A+1 -# 3. if interfaces were removed, then use C+1:0:0 -# -# For the full guide on libcurl ABI rules, see docs/libcurl/ABI -@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \ -@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/include \ -@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/include \ -@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/lib \ -@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/lib \ -@USE_EMBEDDED_ARES_FALSE@ -DBUILDING_LIBCURL - # Specify our include paths here, and do it relative to $(top_srcdir) and # $(top_builddir), to ensure that these paths which belong to the library # being currently built and tested are searched before the library which @@ -611,14 +620,9 @@ lib_LTLIBRARIES = libcurl.la # 3. if interfaces were removed, then use C+1:0:0 # # For the full guide on libcurl ABI rules, see docs/libcurl/ABI -@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/include \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/include \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/lib \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/lib \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/ares \ -@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/ares \ -@USE_EMBEDDED_ARES_TRUE@ -DBUILDING_LIBCURL +AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \ + -I$(top_srcdir)/include -I$(top_builddir)/lib \ + -I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL @SONAME_BUMP_FALSE@VERSIONINFO = -version-info 7:0:3 # @@ -633,56 +637,64 @@ lib_LTLIBRARIES = libcurl.la @SONAME_BUMP_TRUE@VERSIONINFO = -version-info 8:0:3 AM_LDFLAGS = AM_CFLAGS = -libcurl_la_CPPFLAGS_EXTRA = $(am__append_5) $(am__append_6) -libcurl_la_LDFLAGS_EXTRA = $(am__append_1) $(am__append_2) \ - $(am__append_3) $(am__append_4) -libcurl_la_CFLAGS_EXTRA = $(am__append_7) +libcurl_la_CPPFLAGS_EXTRA = $(am__append_6) $(am__append_7) +libcurl_la_LDFLAGS_EXTRA = $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) +libcurl_la_CFLAGS_EXTRA = $(am__append_8) libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA) libcurl_la_LDFLAGS = $(AM_LDFLAGS) $(libcurl_la_LDFLAGS_EXTRA) $(LDFLAGS) $(LIBCURL_LIBS) libcurl_la_CFLAGS = $(AM_CFLAGS) $(libcurl_la_CFLAGS_EXTRA) libcurlu_la_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB -DUNITTESTS libcurlu_la_LDFLAGS = $(AM_LDFLAGS) -static $(LIBCURL_LIBS) libcurlu_la_CFLAGS = $(AM_CFLAGS) -CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ - cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ - ldap.c ssluse.c version.c getenv.c escape.c mprintf.c telnet.c \ - netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \ - curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \ - memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ - content_encoding.c share.c http_digest.c md4.c md5.c \ - http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \ - hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \ - select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c \ - qssl.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ - curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ - pingpong.c rtsp.c curl_threads.c warnless.c hmac.c polarssl.c \ - polarssl_threadlock.c curl_rtmp.c openldap.c curl_gethostname.c \ - gopher.c axtls.c idn_win32.c http_negotiate_sspi.c cyassl.c \ - http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \ - curl_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c \ - curl_sasl.c curl_schannel.c curl_multibyte.c curl_darwinssl.c \ +LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \ + vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c \ + vtls/cyassl.c vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c + +LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \ + vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h \ + vtls/cyassl.h vtls/curl_schannel.h vtls/curl_darwinssl.h vtls/gskit.h + +LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ + cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ + ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c \ + getinfo.c transfer.c strequal.c easy.c security.c curl_fnmatch.c \ + fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \ + strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c \ + http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \ + strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \ + inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \ + ssh.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ + curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ + pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \ + openldap.c curl_gethostname.c gopher.c idn_win32.c \ + http_negotiate_sspi.c http_proxy.c non-ascii.c asyn-ares.c \ + asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.c \ + curl_ntlm_core.c curl_ntlm_msgs.c curl_sasl.c curl_multibyte.c \ hostcheck.c bundles.c conncache.c pipeline.c dotdot.c x509asn1.c \ - gskit.c - -HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \ - progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \ - if2ip.h speedcheck.h urldata.h curl_ldap.h ssluse.h escape.h telnet.h \ - getinfo.h strequal.h krb4.h memdebug.h http_chunks.h \ - curl_fnmatch.h wildcard.h fileinfo.h ftplistparser.h strtok.h \ - connect.h llist.h hash.h content_encoding.h share.h curl_md4.h \ - curl_md5.h http_digest.h http_negotiate.h inet_pton.h amigaos.h \ - strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h curl_setup.h \ - transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \ - tftp.h sockaddr.h splay.h strdup.h socks.h ssh.h nssg.h curl_base64.h \ - rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \ - curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h \ - warnless.h curl_hmac.h polarssl.h polarssl_threadlock.h curl_rtmp.h \ - curl_gethostname.h gopher.h axtls.h cyassl.h http_proxy.h non-ascii.h \ - asyn.h curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ - curl_ntlm_msgs.h curl_sasl.h curl_schannel.h curl_multibyte.h \ - curl_darwinssl.h hostcheck.h bundles.h conncache.h curl_setup_once.h \ - multihandle.h setup-vms.h pipeline.h dotdot.h x509asn1.h gskit.h - + http2.c curl_sasl_sspi.c smb.c curl_sasl_gssapi.c curl_endian.c + +LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \ + formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \ + speedcheck.h urldata.h curl_ldap.h escape.h telnet.h getinfo.h \ + strequal.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h \ + wildcard.h fileinfo.h ftplistparser.h strtok.h connect.h llist.h \ + hash.h content_encoding.h share.h curl_md4.h curl_md5.h http_digest.h \ + http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h \ + inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h \ + easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h \ + socks.h ssh.h curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h \ + slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h \ + rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h \ + curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \ + curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ + curl_ntlm_msgs.h curl_sasl.h curl_multibyte.h hostcheck.h bundles.h \ + conncache.h curl_setup_once.h multihandle.h setup-vms.h pipeline.h \ + dotdot.h x509asn1.h http2.h sigpipe.h smb.h curl_endian.h + +LIB_RCFILES = libcurl.rc +CSOURCES = $(LIB_CFILES) $(LIB_VTLS_CFILES) +HHEADERS = $(LIB_HFILES) $(LIB_VTLS_HFILES) # Makefile.inc provides the CSOURCES and HHEADERS defines libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS) @@ -725,8 +737,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): curl_config.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/curl_config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -786,15 +798,67 @@ clean-noinstLTLIBRARIES: echo rm -f $${locs}; \ rm -f $${locs}; \ } +vtls/$(am__dirstamp): + @$(MKDIR_P) vtls + @: > vtls/$(am__dirstamp) +vtls/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) vtls/$(DEPDIR) + @: > vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-openssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-gtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-vtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-nss.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-polarssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-polarssl_threadlock.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-axtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-cyassl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-curl_schannel.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-curl_darwinssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurl_la-gskit.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) libcurl.la: $(libcurl_la_OBJECTS) $(libcurl_la_DEPENDENCIES) $(EXTRA_libcurl_la_DEPENDENCIES) $(AM_V_CCLD)$(libcurl_la_LINK) -rpath $(libdir) $(libcurl_la_OBJECTS) $(libcurl_la_LIBADD) $(LIBS) +vtls/libcurlu_la-openssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-gtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-vtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-nss.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-polarssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-polarssl_threadlock.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-axtls.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-cyassl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-curl_schannel.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-curl_darwinssl.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) +vtls/libcurlu_la-gskit.lo: vtls/$(am__dirstamp) \ + vtls/$(DEPDIR)/$(am__dirstamp) libcurlu.la: $(libcurlu_la_OBJECTS) $(libcurlu_la_DEPENDENCIES) $(EXTRA_libcurlu_la_DEPENDENCIES) $(AM_V_CCLD)$(libcurlu_la_LINK) $(am_libcurlu_la_rpath) $(libcurlu_la_OBJECTS) $(libcurlu_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f vtls/*.$(OBJEXT) + -rm -f vtls/*.lo distclean-compile: -rm -f *.tab.c @@ -802,7 +866,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-amigaos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-asyn-ares.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-asyn-thread.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-axtls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-base64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-bundles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-conncache.Plo@am__quote@ @@ -810,7 +873,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-content_encoding.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_addrinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_darwinssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_endian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_fnmatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_gethostname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_gssapi.Plo@am__quote@ @@ -822,10 +885,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_ntlm_wb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_rtmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_sasl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_schannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_sasl_gssapi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_sasl_sspi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_sspi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_threads.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-cyassl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-dict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-dotdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-easy.Plo@am__quote@ @@ -838,8 +901,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-getenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-getinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-gopher.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-gskit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-gtls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-hmac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-hostasyn.Plo@am__quote@ @@ -849,6 +910,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-hostip6.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-hostsyn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-http.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-http2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-http_chunks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-http_digest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-http_negotiate.Plo@am__quote@ @@ -859,7 +921,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-imap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-inet_ntop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-inet_pton.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-krb4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-krb5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ldap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-llist.Plo@am__quote@ @@ -871,16 +932,12 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-netrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-non-ascii.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-nonblock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-nss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-openldap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-parsedate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pingpong.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pipeline.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-polarssl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pop3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-progress.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-qssl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-rawstr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-rtsp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-security.Plo@am__quote@ @@ -888,6 +945,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-sendf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-share.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-slist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_gssapi.Plo@am__quote@ @@ -895,8 +953,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-speedcheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-splay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssh.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-sslgen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssluse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strequal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strerror.Plo@am__quote@ @@ -914,7 +970,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-amigaos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-asyn-ares.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-asyn-thread.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-axtls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-base64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-bundles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-conncache.Plo@am__quote@ @@ -922,7 +977,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-content_encoding.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_addrinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_darwinssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_endian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_fnmatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_gethostname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_gssapi.Plo@am__quote@ @@ -934,10 +989,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_ntlm_wb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_rtmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_sasl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_schannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_sasl_gssapi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_sasl_sspi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_sspi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_threads.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-cyassl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-dict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-dotdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-easy.Plo@am__quote@ @@ -950,8 +1005,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-getenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-getinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-gopher.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-gskit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-gtls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-hmac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-hostasyn.Plo@am__quote@ @@ -961,6 +1014,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-hostip6.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-hostsyn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-http.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-http2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-http_chunks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-http_digest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-http_negotiate.Plo@am__quote@ @@ -971,7 +1025,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-imap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-inet_ntop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-inet_pton.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-krb4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-krb5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ldap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-llist.Plo@am__quote@ @@ -983,16 +1036,12 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-netrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-non-ascii.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-nonblock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-nss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-openldap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-parsedate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pingpong.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pipeline.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-polarssl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pop3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-progress.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-qssl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-rawstr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-rtsp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-security.Plo@am__quote@ @@ -1000,6 +1049,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-sendf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-share.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-slist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo@am__quote@ @@ -1007,8 +1057,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-speedcheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-splay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssh.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-sslgen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssluse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strequal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strerror.Plo@am__quote@ @@ -1023,24 +1071,49 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-warnless.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-wildcard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-x509asn1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-axtls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-curl_darwinssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-curl_schannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-cyassl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gskit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gtls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-nss.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-openssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-polarssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-vtls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-axtls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-curl_darwinssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-curl_schannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-gskit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-gtls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-nss.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-openssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-polarssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-vtls.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< @@ -1150,13 +1223,6 @@ libcurl_la-ldap.lo: ldap.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ldap.lo `test -f 'ldap.c' || echo '$(srcdir)/'`ldap.c -libcurl_la-ssluse.lo: ssluse.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-ssluse.lo -MD -MP -MF $(DEPDIR)/libcurl_la-ssluse.Tpo -c -o libcurl_la-ssluse.lo `test -f 'ssluse.c' || echo '$(srcdir)/'`ssluse.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-ssluse.Tpo $(DEPDIR)/libcurl_la-ssluse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssluse.c' object='libcurl_la-ssluse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssluse.lo `test -f 'ssluse.c' || echo '$(srcdir)/'`ssluse.c - libcurl_la-version.lo: version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-version.lo -MD -MP -MF $(DEPDIR)/libcurl_la-version.Tpo -c -o libcurl_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-version.Tpo $(DEPDIR)/libcurl_la-version.Plo @@ -1234,13 +1300,6 @@ libcurl_la-security.lo: security.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c -libcurl_la-krb4.lo: krb4.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-krb4.lo -MD -MP -MF $(DEPDIR)/libcurl_la-krb4.Tpo -c -o libcurl_la-krb4.lo `test -f 'krb4.c' || echo '$(srcdir)/'`krb4.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-krb4.Tpo $(DEPDIR)/libcurl_la-krb4.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='krb4.c' object='libcurl_la-krb4.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-krb4.lo `test -f 'krb4.c' || echo '$(srcdir)/'`krb4.c - libcurl_la-curl_fnmatch.lo: curl_fnmatch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_fnmatch.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_fnmatch.Tpo -c -o libcurl_la-curl_fnmatch.lo `test -f 'curl_fnmatch.c' || echo '$(srcdir)/'`curl_fnmatch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_fnmatch.Tpo $(DEPDIR)/libcurl_la-curl_fnmatch.Plo @@ -1444,20 +1503,6 @@ libcurl_la-select.lo: select.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-select.lo `test -f 'select.c' || echo '$(srcdir)/'`select.c -libcurl_la-gtls.lo: gtls.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-gtls.lo -MD -MP -MF $(DEPDIR)/libcurl_la-gtls.Tpo -c -o libcurl_la-gtls.lo `test -f 'gtls.c' || echo '$(srcdir)/'`gtls.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-gtls.Tpo $(DEPDIR)/libcurl_la-gtls.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtls.c' object='libcurl_la-gtls.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-gtls.lo `test -f 'gtls.c' || echo '$(srcdir)/'`gtls.c - -libcurl_la-sslgen.lo: sslgen.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-sslgen.lo -MD -MP -MF $(DEPDIR)/libcurl_la-sslgen.Tpo -c -o libcurl_la-sslgen.lo `test -f 'sslgen.c' || echo '$(srcdir)/'`sslgen.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-sslgen.Tpo $(DEPDIR)/libcurl_la-sslgen.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslgen.c' object='libcurl_la-sslgen.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-sslgen.lo `test -f 'sslgen.c' || echo '$(srcdir)/'`sslgen.c - libcurl_la-tftp.lo: tftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-tftp.lo -MD -MP -MF $(DEPDIR)/libcurl_la-tftp.Tpo -c -o libcurl_la-tftp.lo `test -f 'tftp.c' || echo '$(srcdir)/'`tftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-tftp.Tpo $(DEPDIR)/libcurl_la-tftp.Plo @@ -1493,20 +1538,6 @@ libcurl_la-ssh.lo: ssh.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c -libcurl_la-nss.lo: nss.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-nss.lo -MD -MP -MF $(DEPDIR)/libcurl_la-nss.Tpo -c -o libcurl_la-nss.lo `test -f 'nss.c' || echo '$(srcdir)/'`nss.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-nss.Tpo $(DEPDIR)/libcurl_la-nss.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nss.c' object='libcurl_la-nss.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-nss.lo `test -f 'nss.c' || echo '$(srcdir)/'`nss.c - -libcurl_la-qssl.lo: qssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-qssl.lo -MD -MP -MF $(DEPDIR)/libcurl_la-qssl.Tpo -c -o libcurl_la-qssl.lo `test -f 'qssl.c' || echo '$(srcdir)/'`qssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-qssl.Tpo $(DEPDIR)/libcurl_la-qssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qssl.c' object='libcurl_la-qssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-qssl.lo `test -f 'qssl.c' || echo '$(srcdir)/'`qssl.c - libcurl_la-rawstr.lo: rawstr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-rawstr.lo -MD -MP -MF $(DEPDIR)/libcurl_la-rawstr.Tpo -c -o libcurl_la-rawstr.lo `test -f 'rawstr.c' || echo '$(srcdir)/'`rawstr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-rawstr.Tpo $(DEPDIR)/libcurl_la-rawstr.Plo @@ -1619,20 +1650,6 @@ libcurl_la-hmac.lo: hmac.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-hmac.lo `test -f 'hmac.c' || echo '$(srcdir)/'`hmac.c -libcurl_la-polarssl.lo: polarssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-polarssl.lo -MD -MP -MF $(DEPDIR)/libcurl_la-polarssl.Tpo -c -o libcurl_la-polarssl.lo `test -f 'polarssl.c' || echo '$(srcdir)/'`polarssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-polarssl.Tpo $(DEPDIR)/libcurl_la-polarssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='polarssl.c' object='libcurl_la-polarssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-polarssl.lo `test -f 'polarssl.c' || echo '$(srcdir)/'`polarssl.c - -libcurl_la-polarssl_threadlock.lo: polarssl_threadlock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-polarssl_threadlock.lo -MD -MP -MF $(DEPDIR)/libcurl_la-polarssl_threadlock.Tpo -c -o libcurl_la-polarssl_threadlock.lo `test -f 'polarssl_threadlock.c' || echo '$(srcdir)/'`polarssl_threadlock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-polarssl_threadlock.Tpo $(DEPDIR)/libcurl_la-polarssl_threadlock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='polarssl_threadlock.c' object='libcurl_la-polarssl_threadlock.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-polarssl_threadlock.lo `test -f 'polarssl_threadlock.c' || echo '$(srcdir)/'`polarssl_threadlock.c - libcurl_la-curl_rtmp.lo: curl_rtmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_rtmp.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_rtmp.Tpo -c -o libcurl_la-curl_rtmp.lo `test -f 'curl_rtmp.c' || echo '$(srcdir)/'`curl_rtmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_rtmp.Tpo $(DEPDIR)/libcurl_la-curl_rtmp.Plo @@ -1661,13 +1678,6 @@ libcurl_la-gopher.lo: gopher.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-gopher.lo `test -f 'gopher.c' || echo '$(srcdir)/'`gopher.c -libcurl_la-axtls.lo: axtls.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-axtls.lo -MD -MP -MF $(DEPDIR)/libcurl_la-axtls.Tpo -c -o libcurl_la-axtls.lo `test -f 'axtls.c' || echo '$(srcdir)/'`axtls.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-axtls.Tpo $(DEPDIR)/libcurl_la-axtls.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axtls.c' object='libcurl_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-axtls.lo `test -f 'axtls.c' || echo '$(srcdir)/'`axtls.c - libcurl_la-idn_win32.lo: idn_win32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-idn_win32.lo -MD -MP -MF $(DEPDIR)/libcurl_la-idn_win32.Tpo -c -o libcurl_la-idn_win32.lo `test -f 'idn_win32.c' || echo '$(srcdir)/'`idn_win32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-idn_win32.Tpo $(DEPDIR)/libcurl_la-idn_win32.Plo @@ -1682,13 +1692,6 @@ libcurl_la-http_negotiate_sspi.lo: http_negotiate_sspi.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-http_negotiate_sspi.lo `test -f 'http_negotiate_sspi.c' || echo '$(srcdir)/'`http_negotiate_sspi.c -libcurl_la-cyassl.lo: cyassl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-cyassl.lo -MD -MP -MF $(DEPDIR)/libcurl_la-cyassl.Tpo -c -o libcurl_la-cyassl.lo `test -f 'cyassl.c' || echo '$(srcdir)/'`cyassl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-cyassl.Tpo $(DEPDIR)/libcurl_la-cyassl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cyassl.c' object='libcurl_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-cyassl.lo `test -f 'cyassl.c' || echo '$(srcdir)/'`cyassl.c - libcurl_la-http_proxy.lo: http_proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-http_proxy.lo -MD -MP -MF $(DEPDIR)/libcurl_la-http_proxy.Tpo -c -o libcurl_la-http_proxy.lo `test -f 'http_proxy.c' || echo '$(srcdir)/'`http_proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-http_proxy.Tpo $(DEPDIR)/libcurl_la-http_proxy.Plo @@ -1759,13 +1762,6 @@ libcurl_la-curl_sasl.lo: curl_sasl.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_sasl.lo `test -f 'curl_sasl.c' || echo '$(srcdir)/'`curl_sasl.c -libcurl_la-curl_schannel.lo: curl_schannel.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_schannel.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_schannel.Tpo -c -o libcurl_la-curl_schannel.lo `test -f 'curl_schannel.c' || echo '$(srcdir)/'`curl_schannel.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_schannel.Tpo $(DEPDIR)/libcurl_la-curl_schannel.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_schannel.c' object='libcurl_la-curl_schannel.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_schannel.lo `test -f 'curl_schannel.c' || echo '$(srcdir)/'`curl_schannel.c - libcurl_la-curl_multibyte.lo: curl_multibyte.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_multibyte.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_multibyte.Tpo -c -o libcurl_la-curl_multibyte.lo `test -f 'curl_multibyte.c' || echo '$(srcdir)/'`curl_multibyte.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_multibyte.Tpo $(DEPDIR)/libcurl_la-curl_multibyte.Plo @@ -1773,13 +1769,6 @@ libcurl_la-curl_multibyte.lo: curl_multibyte.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_multibyte.lo `test -f 'curl_multibyte.c' || echo '$(srcdir)/'`curl_multibyte.c -libcurl_la-curl_darwinssl.lo: curl_darwinssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_darwinssl.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_darwinssl.Tpo -c -o libcurl_la-curl_darwinssl.lo `test -f 'curl_darwinssl.c' || echo '$(srcdir)/'`curl_darwinssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_darwinssl.Tpo $(DEPDIR)/libcurl_la-curl_darwinssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_darwinssl.c' object='libcurl_la-curl_darwinssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_darwinssl.lo `test -f 'curl_darwinssl.c' || echo '$(srcdir)/'`curl_darwinssl.c - libcurl_la-hostcheck.lo: hostcheck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-hostcheck.lo -MD -MP -MF $(DEPDIR)/libcurl_la-hostcheck.Tpo -c -o libcurl_la-hostcheck.lo `test -f 'hostcheck.c' || echo '$(srcdir)/'`hostcheck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-hostcheck.Tpo $(DEPDIR)/libcurl_la-hostcheck.Plo @@ -1822,12 +1811,117 @@ libcurl_la-x509asn1.lo: x509asn1.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-x509asn1.lo `test -f 'x509asn1.c' || echo '$(srcdir)/'`x509asn1.c -libcurl_la-gskit.lo: gskit.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-gskit.lo -MD -MP -MF $(DEPDIR)/libcurl_la-gskit.Tpo -c -o libcurl_la-gskit.lo `test -f 'gskit.c' || echo '$(srcdir)/'`gskit.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-gskit.Tpo $(DEPDIR)/libcurl_la-gskit.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gskit.c' object='libcurl_la-gskit.lo' libtool=yes @AMDEPBACKSLASH@ +libcurl_la-http2.lo: http2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-http2.lo -MD -MP -MF $(DEPDIR)/libcurl_la-http2.Tpo -c -o libcurl_la-http2.lo `test -f 'http2.c' || echo '$(srcdir)/'`http2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-http2.Tpo $(DEPDIR)/libcurl_la-http2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='http2.c' object='libcurl_la-http2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-http2.lo `test -f 'http2.c' || echo '$(srcdir)/'`http2.c + +libcurl_la-curl_sasl_sspi.lo: curl_sasl_sspi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_sasl_sspi.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_sasl_sspi.Tpo -c -o libcurl_la-curl_sasl_sspi.lo `test -f 'curl_sasl_sspi.c' || echo '$(srcdir)/'`curl_sasl_sspi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_sasl_sspi.Tpo $(DEPDIR)/libcurl_la-curl_sasl_sspi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_sasl_sspi.c' object='libcurl_la-curl_sasl_sspi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_sasl_sspi.lo `test -f 'curl_sasl_sspi.c' || echo '$(srcdir)/'`curl_sasl_sspi.c + +libcurl_la-smb.lo: smb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-smb.lo -MD -MP -MF $(DEPDIR)/libcurl_la-smb.Tpo -c -o libcurl_la-smb.lo `test -f 'smb.c' || echo '$(srcdir)/'`smb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-smb.Tpo $(DEPDIR)/libcurl_la-smb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smb.c' object='libcurl_la-smb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-smb.lo `test -f 'smb.c' || echo '$(srcdir)/'`smb.c + +libcurl_la-curl_sasl_gssapi.lo: curl_sasl_gssapi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_sasl_gssapi.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_sasl_gssapi.Tpo -c -o libcurl_la-curl_sasl_gssapi.lo `test -f 'curl_sasl_gssapi.c' || echo '$(srcdir)/'`curl_sasl_gssapi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_sasl_gssapi.Tpo $(DEPDIR)/libcurl_la-curl_sasl_gssapi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_sasl_gssapi.c' object='libcurl_la-curl_sasl_gssapi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_sasl_gssapi.lo `test -f 'curl_sasl_gssapi.c' || echo '$(srcdir)/'`curl_sasl_gssapi.c + +libcurl_la-curl_endian.lo: curl_endian.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_endian.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_endian.Tpo -c -o libcurl_la-curl_endian.lo `test -f 'curl_endian.c' || echo '$(srcdir)/'`curl_endian.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_endian.Tpo $(DEPDIR)/libcurl_la-curl_endian.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_endian.c' object='libcurl_la-curl_endian.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_endian.lo `test -f 'curl_endian.c' || echo '$(srcdir)/'`curl_endian.c + +vtls/libcurl_la-openssl.lo: vtls/openssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-openssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-openssl.Tpo -c -o vtls/libcurl_la-openssl.lo `test -f 'vtls/openssl.c' || echo '$(srcdir)/'`vtls/openssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-openssl.Tpo vtls/$(DEPDIR)/libcurl_la-openssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/openssl.c' object='vtls/libcurl_la-openssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-openssl.lo `test -f 'vtls/openssl.c' || echo '$(srcdir)/'`vtls/openssl.c + +vtls/libcurl_la-gtls.lo: vtls/gtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-gtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-gtls.Tpo -c -o vtls/libcurl_la-gtls.lo `test -f 'vtls/gtls.c' || echo '$(srcdir)/'`vtls/gtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-gtls.Tpo vtls/$(DEPDIR)/libcurl_la-gtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/gtls.c' object='vtls/libcurl_la-gtls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-gtls.lo `test -f 'vtls/gtls.c' || echo '$(srcdir)/'`vtls/gtls.c + +vtls/libcurl_la-vtls.lo: vtls/vtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-vtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-vtls.Tpo -c -o vtls/libcurl_la-vtls.lo `test -f 'vtls/vtls.c' || echo '$(srcdir)/'`vtls/vtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-vtls.Tpo vtls/$(DEPDIR)/libcurl_la-vtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/vtls.c' object='vtls/libcurl_la-vtls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-vtls.lo `test -f 'vtls/vtls.c' || echo '$(srcdir)/'`vtls/vtls.c + +vtls/libcurl_la-nss.lo: vtls/nss.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-nss.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-nss.Tpo -c -o vtls/libcurl_la-nss.lo `test -f 'vtls/nss.c' || echo '$(srcdir)/'`vtls/nss.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-nss.Tpo vtls/$(DEPDIR)/libcurl_la-nss.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/nss.c' object='vtls/libcurl_la-nss.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-nss.lo `test -f 'vtls/nss.c' || echo '$(srcdir)/'`vtls/nss.c + +vtls/libcurl_la-polarssl.lo: vtls/polarssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-polarssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-polarssl.Tpo -c -o vtls/libcurl_la-polarssl.lo `test -f 'vtls/polarssl.c' || echo '$(srcdir)/'`vtls/polarssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-polarssl.Tpo vtls/$(DEPDIR)/libcurl_la-polarssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/polarssl.c' object='vtls/libcurl_la-polarssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-polarssl.lo `test -f 'vtls/polarssl.c' || echo '$(srcdir)/'`vtls/polarssl.c + +vtls/libcurl_la-polarssl_threadlock.lo: vtls/polarssl_threadlock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-polarssl_threadlock.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Tpo -c -o vtls/libcurl_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Tpo vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/polarssl_threadlock.c' object='vtls/libcurl_la-polarssl_threadlock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c + +vtls/libcurl_la-axtls.lo: vtls/axtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-axtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-axtls.Tpo -c -o vtls/libcurl_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-axtls.Tpo vtls/$(DEPDIR)/libcurl_la-axtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/axtls.c' object='vtls/libcurl_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-gskit.lo `test -f 'gskit.c' || echo '$(srcdir)/'`gskit.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c + +vtls/libcurl_la-cyassl.lo: vtls/cyassl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-cyassl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-cyassl.Tpo -c -o vtls/libcurl_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-cyassl.Tpo vtls/$(DEPDIR)/libcurl_la-cyassl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/cyassl.c' object='vtls/libcurl_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c + +vtls/libcurl_la-curl_schannel.lo: vtls/curl_schannel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-curl_schannel.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-curl_schannel.Tpo -c -o vtls/libcurl_la-curl_schannel.lo `test -f 'vtls/curl_schannel.c' || echo '$(srcdir)/'`vtls/curl_schannel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-curl_schannel.Tpo vtls/$(DEPDIR)/libcurl_la-curl_schannel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/curl_schannel.c' object='vtls/libcurl_la-curl_schannel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-curl_schannel.lo `test -f 'vtls/curl_schannel.c' || echo '$(srcdir)/'`vtls/curl_schannel.c + +vtls/libcurl_la-curl_darwinssl.lo: vtls/curl_darwinssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-curl_darwinssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-curl_darwinssl.Tpo -c -o vtls/libcurl_la-curl_darwinssl.lo `test -f 'vtls/curl_darwinssl.c' || echo '$(srcdir)/'`vtls/curl_darwinssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-curl_darwinssl.Tpo vtls/$(DEPDIR)/libcurl_la-curl_darwinssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/curl_darwinssl.c' object='vtls/libcurl_la-curl_darwinssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-curl_darwinssl.lo `test -f 'vtls/curl_darwinssl.c' || echo '$(srcdir)/'`vtls/curl_darwinssl.c + +vtls/libcurl_la-gskit.lo: vtls/gskit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-gskit.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-gskit.Tpo -c -o vtls/libcurl_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-gskit.Tpo vtls/$(DEPDIR)/libcurl_la-gskit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/gskit.c' object='vtls/libcurl_la-gskit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c libcurlu_la-file.lo: file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-file.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-file.Tpo -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c @@ -1934,13 +2028,6 @@ libcurlu_la-ldap.lo: ldap.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ldap.lo `test -f 'ldap.c' || echo '$(srcdir)/'`ldap.c -libcurlu_la-ssluse.lo: ssluse.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-ssluse.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-ssluse.Tpo -c -o libcurlu_la-ssluse.lo `test -f 'ssluse.c' || echo '$(srcdir)/'`ssluse.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-ssluse.Tpo $(DEPDIR)/libcurlu_la-ssluse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssluse.c' object='libcurlu_la-ssluse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssluse.lo `test -f 'ssluse.c' || echo '$(srcdir)/'`ssluse.c - libcurlu_la-version.lo: version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-version.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-version.Tpo -c -o libcurlu_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-version.Tpo $(DEPDIR)/libcurlu_la-version.Plo @@ -2018,13 +2105,6 @@ libcurlu_la-security.lo: security.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c -libcurlu_la-krb4.lo: krb4.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-krb4.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-krb4.Tpo -c -o libcurlu_la-krb4.lo `test -f 'krb4.c' || echo '$(srcdir)/'`krb4.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-krb4.Tpo $(DEPDIR)/libcurlu_la-krb4.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='krb4.c' object='libcurlu_la-krb4.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-krb4.lo `test -f 'krb4.c' || echo '$(srcdir)/'`krb4.c - libcurlu_la-curl_fnmatch.lo: curl_fnmatch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_fnmatch.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_fnmatch.Tpo -c -o libcurlu_la-curl_fnmatch.lo `test -f 'curl_fnmatch.c' || echo '$(srcdir)/'`curl_fnmatch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_fnmatch.Tpo $(DEPDIR)/libcurlu_la-curl_fnmatch.Plo @@ -2228,20 +2308,6 @@ libcurlu_la-select.lo: select.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-select.lo `test -f 'select.c' || echo '$(srcdir)/'`select.c -libcurlu_la-gtls.lo: gtls.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-gtls.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-gtls.Tpo -c -o libcurlu_la-gtls.lo `test -f 'gtls.c' || echo '$(srcdir)/'`gtls.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-gtls.Tpo $(DEPDIR)/libcurlu_la-gtls.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtls.c' object='libcurlu_la-gtls.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-gtls.lo `test -f 'gtls.c' || echo '$(srcdir)/'`gtls.c - -libcurlu_la-sslgen.lo: sslgen.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-sslgen.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-sslgen.Tpo -c -o libcurlu_la-sslgen.lo `test -f 'sslgen.c' || echo '$(srcdir)/'`sslgen.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-sslgen.Tpo $(DEPDIR)/libcurlu_la-sslgen.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslgen.c' object='libcurlu_la-sslgen.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-sslgen.lo `test -f 'sslgen.c' || echo '$(srcdir)/'`sslgen.c - libcurlu_la-tftp.lo: tftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-tftp.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-tftp.Tpo -c -o libcurlu_la-tftp.lo `test -f 'tftp.c' || echo '$(srcdir)/'`tftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-tftp.Tpo $(DEPDIR)/libcurlu_la-tftp.Plo @@ -2277,20 +2343,6 @@ libcurlu_la-ssh.lo: ssh.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c -libcurlu_la-nss.lo: nss.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-nss.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-nss.Tpo -c -o libcurlu_la-nss.lo `test -f 'nss.c' || echo '$(srcdir)/'`nss.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-nss.Tpo $(DEPDIR)/libcurlu_la-nss.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nss.c' object='libcurlu_la-nss.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-nss.lo `test -f 'nss.c' || echo '$(srcdir)/'`nss.c - -libcurlu_la-qssl.lo: qssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-qssl.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-qssl.Tpo -c -o libcurlu_la-qssl.lo `test -f 'qssl.c' || echo '$(srcdir)/'`qssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-qssl.Tpo $(DEPDIR)/libcurlu_la-qssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qssl.c' object='libcurlu_la-qssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-qssl.lo `test -f 'qssl.c' || echo '$(srcdir)/'`qssl.c - libcurlu_la-rawstr.lo: rawstr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-rawstr.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-rawstr.Tpo -c -o libcurlu_la-rawstr.lo `test -f 'rawstr.c' || echo '$(srcdir)/'`rawstr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-rawstr.Tpo $(DEPDIR)/libcurlu_la-rawstr.Plo @@ -2403,20 +2455,6 @@ libcurlu_la-hmac.lo: hmac.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-hmac.lo `test -f 'hmac.c' || echo '$(srcdir)/'`hmac.c -libcurlu_la-polarssl.lo: polarssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-polarssl.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-polarssl.Tpo -c -o libcurlu_la-polarssl.lo `test -f 'polarssl.c' || echo '$(srcdir)/'`polarssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-polarssl.Tpo $(DEPDIR)/libcurlu_la-polarssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='polarssl.c' object='libcurlu_la-polarssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-polarssl.lo `test -f 'polarssl.c' || echo '$(srcdir)/'`polarssl.c - -libcurlu_la-polarssl_threadlock.lo: polarssl_threadlock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-polarssl_threadlock.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-polarssl_threadlock.Tpo -c -o libcurlu_la-polarssl_threadlock.lo `test -f 'polarssl_threadlock.c' || echo '$(srcdir)/'`polarssl_threadlock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-polarssl_threadlock.Tpo $(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='polarssl_threadlock.c' object='libcurlu_la-polarssl_threadlock.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-polarssl_threadlock.lo `test -f 'polarssl_threadlock.c' || echo '$(srcdir)/'`polarssl_threadlock.c - libcurlu_la-curl_rtmp.lo: curl_rtmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_rtmp.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_rtmp.Tpo -c -o libcurlu_la-curl_rtmp.lo `test -f 'curl_rtmp.c' || echo '$(srcdir)/'`curl_rtmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_rtmp.Tpo $(DEPDIR)/libcurlu_la-curl_rtmp.Plo @@ -2445,13 +2483,6 @@ libcurlu_la-gopher.lo: gopher.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-gopher.lo `test -f 'gopher.c' || echo '$(srcdir)/'`gopher.c -libcurlu_la-axtls.lo: axtls.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-axtls.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-axtls.Tpo -c -o libcurlu_la-axtls.lo `test -f 'axtls.c' || echo '$(srcdir)/'`axtls.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-axtls.Tpo $(DEPDIR)/libcurlu_la-axtls.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axtls.c' object='libcurlu_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-axtls.lo `test -f 'axtls.c' || echo '$(srcdir)/'`axtls.c - libcurlu_la-idn_win32.lo: idn_win32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-idn_win32.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-idn_win32.Tpo -c -o libcurlu_la-idn_win32.lo `test -f 'idn_win32.c' || echo '$(srcdir)/'`idn_win32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-idn_win32.Tpo $(DEPDIR)/libcurlu_la-idn_win32.Plo @@ -2466,13 +2497,6 @@ libcurlu_la-http_negotiate_sspi.lo: http_negotiate_sspi.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-http_negotiate_sspi.lo `test -f 'http_negotiate_sspi.c' || echo '$(srcdir)/'`http_negotiate_sspi.c -libcurlu_la-cyassl.lo: cyassl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-cyassl.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-cyassl.Tpo -c -o libcurlu_la-cyassl.lo `test -f 'cyassl.c' || echo '$(srcdir)/'`cyassl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-cyassl.Tpo $(DEPDIR)/libcurlu_la-cyassl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cyassl.c' object='libcurlu_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-cyassl.lo `test -f 'cyassl.c' || echo '$(srcdir)/'`cyassl.c - libcurlu_la-http_proxy.lo: http_proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-http_proxy.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-http_proxy.Tpo -c -o libcurlu_la-http_proxy.lo `test -f 'http_proxy.c' || echo '$(srcdir)/'`http_proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-http_proxy.Tpo $(DEPDIR)/libcurlu_la-http_proxy.Plo @@ -2543,13 +2567,6 @@ libcurlu_la-curl_sasl.lo: curl_sasl.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_sasl.lo `test -f 'curl_sasl.c' || echo '$(srcdir)/'`curl_sasl.c -libcurlu_la-curl_schannel.lo: curl_schannel.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_schannel.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_schannel.Tpo -c -o libcurlu_la-curl_schannel.lo `test -f 'curl_schannel.c' || echo '$(srcdir)/'`curl_schannel.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_schannel.Tpo $(DEPDIR)/libcurlu_la-curl_schannel.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_schannel.c' object='libcurlu_la-curl_schannel.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_schannel.lo `test -f 'curl_schannel.c' || echo '$(srcdir)/'`curl_schannel.c - libcurlu_la-curl_multibyte.lo: curl_multibyte.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_multibyte.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_multibyte.Tpo -c -o libcurlu_la-curl_multibyte.lo `test -f 'curl_multibyte.c' || echo '$(srcdir)/'`curl_multibyte.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_multibyte.Tpo $(DEPDIR)/libcurlu_la-curl_multibyte.Plo @@ -2557,13 +2574,6 @@ libcurlu_la-curl_multibyte.lo: curl_multibyte.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_multibyte.lo `test -f 'curl_multibyte.c' || echo '$(srcdir)/'`curl_multibyte.c -libcurlu_la-curl_darwinssl.lo: curl_darwinssl.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_darwinssl.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_darwinssl.Tpo -c -o libcurlu_la-curl_darwinssl.lo `test -f 'curl_darwinssl.c' || echo '$(srcdir)/'`curl_darwinssl.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_darwinssl.Tpo $(DEPDIR)/libcurlu_la-curl_darwinssl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_darwinssl.c' object='libcurlu_la-curl_darwinssl.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_darwinssl.lo `test -f 'curl_darwinssl.c' || echo '$(srcdir)/'`curl_darwinssl.c - libcurlu_la-hostcheck.lo: hostcheck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-hostcheck.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-hostcheck.Tpo -c -o libcurlu_la-hostcheck.lo `test -f 'hostcheck.c' || echo '$(srcdir)/'`hostcheck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-hostcheck.Tpo $(DEPDIR)/libcurlu_la-hostcheck.Plo @@ -2606,18 +2616,124 @@ libcurlu_la-x509asn1.lo: x509asn1.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-x509asn1.lo `test -f 'x509asn1.c' || echo '$(srcdir)/'`x509asn1.c -libcurlu_la-gskit.lo: gskit.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-gskit.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-gskit.Tpo -c -o libcurlu_la-gskit.lo `test -f 'gskit.c' || echo '$(srcdir)/'`gskit.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-gskit.Tpo $(DEPDIR)/libcurlu_la-gskit.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gskit.c' object='libcurlu_la-gskit.lo' libtool=yes @AMDEPBACKSLASH@ +libcurlu_la-http2.lo: http2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-http2.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-http2.Tpo -c -o libcurlu_la-http2.lo `test -f 'http2.c' || echo '$(srcdir)/'`http2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-http2.Tpo $(DEPDIR)/libcurlu_la-http2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='http2.c' object='libcurlu_la-http2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-http2.lo `test -f 'http2.c' || echo '$(srcdir)/'`http2.c + +libcurlu_la-curl_sasl_sspi.lo: curl_sasl_sspi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_sasl_sspi.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_sasl_sspi.Tpo -c -o libcurlu_la-curl_sasl_sspi.lo `test -f 'curl_sasl_sspi.c' || echo '$(srcdir)/'`curl_sasl_sspi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_sasl_sspi.Tpo $(DEPDIR)/libcurlu_la-curl_sasl_sspi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_sasl_sspi.c' object='libcurlu_la-curl_sasl_sspi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_sasl_sspi.lo `test -f 'curl_sasl_sspi.c' || echo '$(srcdir)/'`curl_sasl_sspi.c + +libcurlu_la-smb.lo: smb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-smb.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-smb.Tpo -c -o libcurlu_la-smb.lo `test -f 'smb.c' || echo '$(srcdir)/'`smb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-smb.Tpo $(DEPDIR)/libcurlu_la-smb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smb.c' object='libcurlu_la-smb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-smb.lo `test -f 'smb.c' || echo '$(srcdir)/'`smb.c + +libcurlu_la-curl_sasl_gssapi.lo: curl_sasl_gssapi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_sasl_gssapi.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_sasl_gssapi.Tpo -c -o libcurlu_la-curl_sasl_gssapi.lo `test -f 'curl_sasl_gssapi.c' || echo '$(srcdir)/'`curl_sasl_gssapi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_sasl_gssapi.Tpo $(DEPDIR)/libcurlu_la-curl_sasl_gssapi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_sasl_gssapi.c' object='libcurlu_la-curl_sasl_gssapi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_sasl_gssapi.lo `test -f 'curl_sasl_gssapi.c' || echo '$(srcdir)/'`curl_sasl_gssapi.c + +libcurlu_la-curl_endian.lo: curl_endian.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_endian.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_endian.Tpo -c -o libcurlu_la-curl_endian.lo `test -f 'curl_endian.c' || echo '$(srcdir)/'`curl_endian.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_endian.Tpo $(DEPDIR)/libcurlu_la-curl_endian.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_endian.c' object='libcurlu_la-curl_endian.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_endian.lo `test -f 'curl_endian.c' || echo '$(srcdir)/'`curl_endian.c + +vtls/libcurlu_la-openssl.lo: vtls/openssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-openssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-openssl.Tpo -c -o vtls/libcurlu_la-openssl.lo `test -f 'vtls/openssl.c' || echo '$(srcdir)/'`vtls/openssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-openssl.Tpo vtls/$(DEPDIR)/libcurlu_la-openssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/openssl.c' object='vtls/libcurlu_la-openssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-openssl.lo `test -f 'vtls/openssl.c' || echo '$(srcdir)/'`vtls/openssl.c + +vtls/libcurlu_la-gtls.lo: vtls/gtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-gtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-gtls.Tpo -c -o vtls/libcurlu_la-gtls.lo `test -f 'vtls/gtls.c' || echo '$(srcdir)/'`vtls/gtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-gtls.Tpo vtls/$(DEPDIR)/libcurlu_la-gtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/gtls.c' object='vtls/libcurlu_la-gtls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-gtls.lo `test -f 'vtls/gtls.c' || echo '$(srcdir)/'`vtls/gtls.c + +vtls/libcurlu_la-vtls.lo: vtls/vtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-vtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-vtls.Tpo -c -o vtls/libcurlu_la-vtls.lo `test -f 'vtls/vtls.c' || echo '$(srcdir)/'`vtls/vtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-vtls.Tpo vtls/$(DEPDIR)/libcurlu_la-vtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/vtls.c' object='vtls/libcurlu_la-vtls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-vtls.lo `test -f 'vtls/vtls.c' || echo '$(srcdir)/'`vtls/vtls.c + +vtls/libcurlu_la-nss.lo: vtls/nss.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-nss.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-nss.Tpo -c -o vtls/libcurlu_la-nss.lo `test -f 'vtls/nss.c' || echo '$(srcdir)/'`vtls/nss.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-nss.Tpo vtls/$(DEPDIR)/libcurlu_la-nss.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/nss.c' object='vtls/libcurlu_la-nss.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-nss.lo `test -f 'vtls/nss.c' || echo '$(srcdir)/'`vtls/nss.c + +vtls/libcurlu_la-polarssl.lo: vtls/polarssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-polarssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-polarssl.Tpo -c -o vtls/libcurlu_la-polarssl.lo `test -f 'vtls/polarssl.c' || echo '$(srcdir)/'`vtls/polarssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-polarssl.Tpo vtls/$(DEPDIR)/libcurlu_la-polarssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/polarssl.c' object='vtls/libcurlu_la-polarssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-polarssl.lo `test -f 'vtls/polarssl.c' || echo '$(srcdir)/'`vtls/polarssl.c + +vtls/libcurlu_la-polarssl_threadlock.lo: vtls/polarssl_threadlock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-polarssl_threadlock.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Tpo -c -o vtls/libcurlu_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Tpo vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/polarssl_threadlock.c' object='vtls/libcurlu_la-polarssl_threadlock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c + +vtls/libcurlu_la-axtls.lo: vtls/axtls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-axtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-axtls.Tpo -c -o vtls/libcurlu_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-axtls.Tpo vtls/$(DEPDIR)/libcurlu_la-axtls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/axtls.c' object='vtls/libcurlu_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c + +vtls/libcurlu_la-cyassl.lo: vtls/cyassl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-cyassl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-cyassl.Tpo -c -o vtls/libcurlu_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-cyassl.Tpo vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/cyassl.c' object='vtls/libcurlu_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c + +vtls/libcurlu_la-curl_schannel.lo: vtls/curl_schannel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-curl_schannel.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-curl_schannel.Tpo -c -o vtls/libcurlu_la-curl_schannel.lo `test -f 'vtls/curl_schannel.c' || echo '$(srcdir)/'`vtls/curl_schannel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-curl_schannel.Tpo vtls/$(DEPDIR)/libcurlu_la-curl_schannel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/curl_schannel.c' object='vtls/libcurlu_la-curl_schannel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-curl_schannel.lo `test -f 'vtls/curl_schannel.c' || echo '$(srcdir)/'`vtls/curl_schannel.c + +vtls/libcurlu_la-curl_darwinssl.lo: vtls/curl_darwinssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-curl_darwinssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-curl_darwinssl.Tpo -c -o vtls/libcurlu_la-curl_darwinssl.lo `test -f 'vtls/curl_darwinssl.c' || echo '$(srcdir)/'`vtls/curl_darwinssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-curl_darwinssl.Tpo vtls/$(DEPDIR)/libcurlu_la-curl_darwinssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/curl_darwinssl.c' object='vtls/libcurlu_la-curl_darwinssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-curl_darwinssl.lo `test -f 'vtls/curl_darwinssl.c' || echo '$(srcdir)/'`vtls/curl_darwinssl.c + +vtls/libcurlu_la-gskit.lo: vtls/gskit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-gskit.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-gskit.Tpo -c -o vtls/libcurlu_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-gskit.Tpo vtls/$(DEPDIR)/libcurlu_la-gskit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vtls/gskit.c' object='vtls/libcurlu_la-gskit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-gskit.lo `test -f 'gskit.c' || echo '$(srcdir)/'`gskit.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf vtls/.libs vtls/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique @@ -2735,6 +2851,8 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f vtls/$(DEPDIR)/$(am__dirstamp) + -rm -f vtls/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -2745,7 +2863,7 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) vtls/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags @@ -2791,7 +2909,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) vtls/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/lib/Makefile.inc b/lib/Makefile.inc index 586d94a..8f9d16d 100644 --- a/lib/Makefile.inc +++ b/lib/Makefile.inc @@ -1,48 +1,71 @@ -# ./lib/Makefile.inc -# Using the backslash as line continuation character might be problematic -# with some make flavours, as Watcom's wmake showed us already. If we -# ever want to change this in a portable manner then we should consider -# this idea (posted to the libcurl list by Adam Kellas): -# CSRC1 = file1.c file2.c file3.c -# CSRC2 = file4.c file5.c file6.c -# CSOURCES = $(CSRC1) $(CSRC2) +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### -CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ - cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ - ldap.c ssluse.c version.c getenv.c escape.c mprintf.c telnet.c \ - netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \ - curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \ - memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ - content_encoding.c share.c http_digest.c md4.c md5.c \ - http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \ - hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \ - select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c \ - qssl.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ - curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ - pingpong.c rtsp.c curl_threads.c warnless.c hmac.c polarssl.c \ - polarssl_threadlock.c curl_rtmp.c openldap.c curl_gethostname.c \ - gopher.c axtls.c idn_win32.c http_negotiate_sspi.c cyassl.c \ - http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \ - curl_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c \ - curl_sasl.c curl_schannel.c curl_multibyte.c curl_darwinssl.c \ +LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \ + vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c \ + vtls/cyassl.c vtls/curl_schannel.c vtls/curl_darwinssl.c vtls/gskit.c + +LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \ + vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h \ + vtls/cyassl.h vtls/curl_schannel.h vtls/curl_darwinssl.h vtls/gskit.h + +LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \ + cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ + ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c \ + getinfo.c transfer.c strequal.c easy.c security.c curl_fnmatch.c \ + fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \ + strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c \ + http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \ + strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \ + inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \ + ssh.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ + curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ + pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \ + openldap.c curl_gethostname.c gopher.c idn_win32.c \ + http_negotiate_sspi.c http_proxy.c non-ascii.c asyn-ares.c \ + asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.c \ + curl_ntlm_core.c curl_ntlm_msgs.c curl_sasl.c curl_multibyte.c \ hostcheck.c bundles.c conncache.c pipeline.c dotdot.c x509asn1.c \ - gskit.c + http2.c curl_sasl_sspi.c smb.c curl_sasl_gssapi.c curl_endian.c + +LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \ + formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \ + speedcheck.h urldata.h curl_ldap.h escape.h telnet.h getinfo.h \ + strequal.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h \ + wildcard.h fileinfo.h ftplistparser.h strtok.h connect.h llist.h \ + hash.h content_encoding.h share.h curl_md4.h curl_md5.h http_digest.h \ + http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h \ + inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h \ + easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h \ + socks.h ssh.h curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h \ + slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h \ + rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h \ + curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \ + curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ + curl_ntlm_msgs.h curl_sasl.h curl_multibyte.h hostcheck.h bundles.h \ + conncache.h curl_setup_once.h multihandle.h setup-vms.h pipeline.h \ + dotdot.h x509asn1.h http2.h sigpipe.h smb.h curl_endian.h + +LIB_RCFILES = libcurl.rc -HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \ - progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \ - if2ip.h speedcheck.h urldata.h curl_ldap.h ssluse.h escape.h telnet.h \ - getinfo.h strequal.h krb4.h memdebug.h http_chunks.h \ - curl_fnmatch.h wildcard.h fileinfo.h ftplistparser.h strtok.h \ - connect.h llist.h hash.h content_encoding.h share.h curl_md4.h \ - curl_md5.h http_digest.h http_negotiate.h inet_pton.h amigaos.h \ - strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h curl_setup.h \ - transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \ - tftp.h sockaddr.h splay.h strdup.h socks.h ssh.h nssg.h curl_base64.h \ - rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \ - curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h \ - warnless.h curl_hmac.h polarssl.h polarssl_threadlock.h curl_rtmp.h \ - curl_gethostname.h gopher.h axtls.h cyassl.h http_proxy.h non-ascii.h \ - asyn.h curl_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \ - curl_ntlm_msgs.h curl_sasl.h curl_schannel.h curl_multibyte.h \ - curl_darwinssl.h hostcheck.h bundles.h conncache.h curl_setup_once.h \ - multihandle.h setup-vms.h pipeline.h dotdot.h x509asn1.h gskit.h +CSOURCES = $(LIB_CFILES) $(LIB_VTLS_CFILES) +HHEADERS = $(LIB_HFILES) $(LIB_VTLS_HFILES) diff --git a/lib/Makefile.m32 b/lib/Makefile.m32 index a401c71..f3673c5 100644 --- a/lib/Makefile.m32 +++ b/lib/Makefile.m32 @@ -18,7 +18,7 @@ ZLIB_PATH = ../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. ifndef LIBSSH2_PATH @@ -42,6 +42,10 @@ endif ifndef LDAP_SDK LDAP_SDK = c:/novell/ndk/cldapsdk/win32 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-0.6.7 +endif PROOT = .. @@ -50,25 +54,34 @@ ifndef LIBCARES_PATH LIBCARES_PATH = $(PROOT)/ares endif -# Edit the var below to set to your architecture or set environment var. -ifndef ARCH -ARCH = w32 -endif - CC = $(CROSSPREFIX)gcc CFLAGS = -g -O2 -Wall CFLAGS += -fno-strict-aliasing -ifeq ($(ARCH),w64) -CFLAGS += -D_AMD64_ -endif # comment LDFLAGS below to keep debug info LDFLAGS = -s AR = $(CROSSPREFIX)ar RANLIB = $(CROSSPREFIX)ranlib RC = $(CROSSPREFIX)windres -RCFLAGS = --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O COFF -i +RCFLAGS = --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O COFF STRIP = $(CROSSPREFIX)strip -g +# Set environment var ARCH to your architecture to override autodetection. +ifndef ARCH +ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64) +ARCH = w64 +else +ARCH = w32 +endif +endif + +ifeq ($(ARCH),w64) +CFLAGS += -D_AMD64_ +RCFLAGS += -F pe-x86-64 +else +CFLAGS += -m32 +RCFLAGS += -F pe-i386 +endif + # Platform-dependent helper tool macros ifeq ($(findstring /sh,$(SHELL)),/sh) DEL = rm -f $1 @@ -137,9 +150,6 @@ endif ifeq ($(findstring -sspi,$(CFG)),-sspi) SSPI = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -SPNEGO = 1 -endif ifeq ($(findstring -ldaps,$(CFG)),-ldaps) LDAPS = 1 endif @@ -150,6 +160,9 @@ ifeq ($(findstring -winssl,$(CFG)),-winssl) WINSSL = 1 SSPI = 1 endif +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +NGHTTP2 = 1 +endif INCLUDES = -I. -I../include CFLAGS += -DBUILDING_LIBCURL @@ -169,6 +182,11 @@ ifdef RTMP CFLAGS += -DUSE_LIBRTMP DLL_LIBS += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm endif +ifdef NGHTTP2 + INCLUDES += -I"$(NGHTTP2_PATH)/include" + CFLAGS += -DUSE_NGHTTP2 + DLL_LIBS += -L"$(NGHTTP2_PATH)/lib" -lnghttp2 +endif ifdef SSH2 INCLUDES += -I"$(LIBSSH2_PATH)/include" -I"$(LIBSSH2_PATH)/win32" CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H @@ -285,10 +303,10 @@ $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE) $(libcurl_dll_DEPENDENC $(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS) %.o: %.c $(PROOT)/include/curl/curlbuild.h - $(CC) $(INCLUDES) $(CFLAGS) -c $< + $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ %.res: %.rc - $(RC) $(RCFLAGS) $< -o $@ + $(RC) $(RCFLAGS) -i $< -o $@ clean: ifeq "$(wildcard $(PROOT)/include/curl/curlbuild.h.dist)" "$(PROOT)/include/curl/curlbuild.h.dist" diff --git a/lib/Makefile.netware b/lib/Makefile.netware index 058047b..802959c 100644 --- a/lib/Makefile.netware +++ b/lib/Makefile.netware @@ -19,7 +19,7 @@ endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. @@ -42,6 +42,11 @@ ifndef LIBRTMP_PATH LIBRTMP_PATH = ../../librtmp-2.3 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-0.6.7 +endif + # Edit the path below to point to the base of your fbopenssl package. ifndef FBOPENSSL_PATH FBOPENSSL_PATH = ../../fbopenssl-0.4 @@ -217,8 +222,8 @@ endif ifeq ($(findstring -idn,$(CFG)),-idn) WITH_IDN = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -WITH_SPNEGO = 1 +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +WITH_NGHTTP2 = 1 endif ifeq ($(findstring -ipv6,$(CFG)),-ipv6) ENABLE_IPV6 = 1 @@ -247,10 +252,6 @@ ifdef WITH_SSL LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT) IMPORTS += GetProcessSwitchCount RunningProcess INSTDEP += ca-bundle.crt -ifdef WITH_SPNEGO - INCLUDES += -I$(FBOPENSSL_PATH)/include - LDLIBS += $(FBOPENSSL_PATH)/nw/fbopenssl.$(LIBEXT) -endif else ifdef WITH_AXTLS INCLUDES += -I$(AXTLS_PATH)/inc @@ -276,6 +277,10 @@ ifdef WITH_IDN INCLUDES += -I$(LIBIDN_PATH)/include LDLIBS += $(LIBIDN_PATH)/lib/libidn.$(LIBEXT) endif +ifdef WITH_NGHTTP2 + INCLUDES += -I$(NGHTTP2_PATH)/include + LDLIBS += $(NGHTTP2_PATH)/lib/libnghttp2.$(LIBEXT) +endif ifeq ($(LIBARCH),LIBC) INCLUDES += -I$(NDK_LIBC)/include @@ -315,10 +320,12 @@ endif # Makefile.inc provides the CSOURCES and HHEADERS defines include Makefile.inc -OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(OBJDIR)/nwos.o +OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(notdir $(CSOURCES)))) $(OBJDIR)/nwos.o OBJL = $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS) +vpath %.c . vtls + all: lib nlm nlm: prebuild $(TARGET).nlm @@ -650,6 +657,9 @@ endif ifdef WITH_RTMP @echo $(DL)#define USE_LIBRTMP 1$(DL) >> $@ endif +ifdef WITH_NGHTTP2 + @echo $(DL)#define USE_NGHTTP2 1$(DL) >> $@ +endif @echo $(DL)#ifdef __GNUC__$(DL) >> $@ @echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@ @echo $(DL)#else$(DL) >> $@ @@ -690,15 +700,20 @@ ifdef WITH_ZLIB else @echo zlib support: no endif +ifdef WITH_NGHTTP2 + @echo http2 support: enabled +else + @echo http2 support: no +endif ifdef WITH_ARES @echo c-ares support: enabled else @echo c-ares support: no endif ifdef ENABLE_IPV6 - @echo ipv6 support: enabled + @echo IPv6 support: enabled else - @echo ipv6 support: no + @echo IPv6 support: no endif $(CURL_INC)/curl/curlbuild.h: Makefile.netware FORCE diff --git a/lib/Makefile.vc10 b/lib/Makefile.vc10 index b4a8354..461e4f7 100644 --- a/lib/Makefile.vc10 +++ b/lib/Makefile.vc10 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -65,7 +65,7 @@ !INCLUDE ..\winbuild\Makefile.msvc.names !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF LIBSSH2_PATH @@ -130,6 +130,10 @@ CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include CFLAGS = $(CFLAGS) /DUSE_IPV6 !ENDIF +!IFDEF USE_IDN +CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES +!ENDIF + ############################################################## # Runtime library configuration @@ -166,6 +170,18 @@ CFGSET = TRUE !ENDIF ###################### +# release-winssl + +!IF "$(CFG)" == "release-winssl" +TARGET = $(LIBCURL_STA_LIB_REL) +DIROBJ = $(CFG) +LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" +LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) +CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB) +CFGSET = TRUE +!ENDIF + +###################### # release-zlib !IF "$(CFG)" == "release-zlib" @@ -519,6 +535,7 @@ X_OBJS= \ $(DIROBJ)\cookie.obj \ $(DIROBJ)\curl_addrinfo.obj \ $(DIROBJ)\curl_darwinssl.obj \ + $(DIROBJ)\curl_endian.obj \ $(DIROBJ)\curl_fnmatch.obj \ $(DIROBJ)\curl_gethostname.obj \ $(DIROBJ)\curl_gssapi.obj \ @@ -530,6 +547,8 @@ X_OBJS= \ $(DIROBJ)\curl_ntlm_wb.obj \ $(DIROBJ)\curl_rtmp.obj \ $(DIROBJ)\curl_sasl.obj \ + $(DIROBJ)\curl_sasl_gssapi.obj \ + $(DIROBJ)\curl_sasl_sspi.obj \ $(DIROBJ)\curl_schannel.obj \ $(DIROBJ)\curl_sspi.obj \ $(DIROBJ)\curl_threads.obj \ @@ -566,7 +585,6 @@ X_OBJS= \ $(DIROBJ)\imap.obj \ $(DIROBJ)\inet_ntop.obj \ $(DIROBJ)\inet_pton.obj \ - $(DIROBJ)\krb4.obj \ $(DIROBJ)\krb5.obj \ $(DIROBJ)\ldap.obj \ $(DIROBJ)\llist.obj \ @@ -587,7 +605,6 @@ X_OBJS= \ $(DIROBJ)\polarssl_threadlock.obj \ $(DIROBJ)\pop3.obj \ $(DIROBJ)\progress.obj \ - $(DIROBJ)\qssl.obj \ $(DIROBJ)\rawstr.obj \ $(DIROBJ)\rtsp.obj \ $(DIROBJ)\security.obj \ @@ -595,6 +612,7 @@ X_OBJS= \ $(DIROBJ)\sendf.obj \ $(DIROBJ)\share.obj \ $(DIROBJ)\slist.obj \ + $(DIROBJ)\smb.obj \ $(DIROBJ)\smtp.obj \ $(DIROBJ)\socks.obj \ $(DIROBJ)\socks_gssapi.obj \ @@ -602,8 +620,8 @@ X_OBJS= \ $(DIROBJ)\speedcheck.obj \ $(DIROBJ)\splay.obj \ $(DIROBJ)\ssh.obj \ - $(DIROBJ)\sslgen.obj \ - $(DIROBJ)\ssluse.obj \ + $(DIROBJ)\vtls.obj \ + $(DIROBJ)\openssl.obj \ $(DIROBJ)\strdup.obj \ $(DIROBJ)\strequal.obj \ $(DIROBJ)\strerror.obj \ @@ -642,6 +660,9 @@ $(DIROBJ): {.\}.c{$(DIROBJ)\}.obj: $(CC) $(CFLAGS) /Fo"$@" $< +{.\vtls\}.c{$(DIROBJ)\}.obj: + $(CC) $(CFLAGS) /Fo"$@" $< + debug-dll\libcurl.res \ debug-dll-ssl-dll\libcurl.res \ debug-dll-zlib-dll\libcurl.res \ diff --git a/lib/Makefile.vc6 b/lib/Makefile.vc6 index fda1e13..ee20ebe 100644 --- a/lib/Makefile.vc6 +++ b/lib/Makefile.vc6 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -65,7 +65,7 @@ !INCLUDE ..\winbuild\Makefile.msvc.names !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF LIBSSH2_PATH @@ -130,6 +130,10 @@ CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include CFLAGS = $(CFLAGS) /DUSE_IPV6 !ENDIF +!IFDEF USE_IDN +CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES +!ENDIF + ############################################################## # Runtime library configuration @@ -166,6 +170,18 @@ CFGSET = TRUE !ENDIF ###################### +# release-winssl + +!IF "$(CFG)" == "release-winssl" +TARGET = $(LIBCURL_STA_LIB_REL) +DIROBJ = $(CFG) +LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" +LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) +CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB) +CFGSET = TRUE +!ENDIF + +###################### # release-zlib !IF "$(CFG)" == "release-zlib" @@ -519,6 +535,7 @@ X_OBJS= \ $(DIROBJ)\cookie.obj \ $(DIROBJ)\curl_addrinfo.obj \ $(DIROBJ)\curl_darwinssl.obj \ + $(DIROBJ)\curl_endian.obj \ $(DIROBJ)\curl_fnmatch.obj \ $(DIROBJ)\curl_gethostname.obj \ $(DIROBJ)\curl_gssapi.obj \ @@ -530,6 +547,8 @@ X_OBJS= \ $(DIROBJ)\curl_ntlm_wb.obj \ $(DIROBJ)\curl_rtmp.obj \ $(DIROBJ)\curl_sasl.obj \ + $(DIROBJ)\curl_sasl_gssapi.obj \ + $(DIROBJ)\curl_sasl_sspi.obj \ $(DIROBJ)\curl_schannel.obj \ $(DIROBJ)\curl_sspi.obj \ $(DIROBJ)\curl_threads.obj \ @@ -566,7 +585,6 @@ X_OBJS= \ $(DIROBJ)\imap.obj \ $(DIROBJ)\inet_ntop.obj \ $(DIROBJ)\inet_pton.obj \ - $(DIROBJ)\krb4.obj \ $(DIROBJ)\krb5.obj \ $(DIROBJ)\ldap.obj \ $(DIROBJ)\llist.obj \ @@ -587,7 +605,6 @@ X_OBJS= \ $(DIROBJ)\polarssl_threadlock.obj \ $(DIROBJ)\pop3.obj \ $(DIROBJ)\progress.obj \ - $(DIROBJ)\qssl.obj \ $(DIROBJ)\rawstr.obj \ $(DIROBJ)\rtsp.obj \ $(DIROBJ)\security.obj \ @@ -595,6 +612,7 @@ X_OBJS= \ $(DIROBJ)\sendf.obj \ $(DIROBJ)\share.obj \ $(DIROBJ)\slist.obj \ + $(DIROBJ)\smb.obj \ $(DIROBJ)\smtp.obj \ $(DIROBJ)\socks.obj \ $(DIROBJ)\socks_gssapi.obj \ @@ -602,8 +620,8 @@ X_OBJS= \ $(DIROBJ)\speedcheck.obj \ $(DIROBJ)\splay.obj \ $(DIROBJ)\ssh.obj \ - $(DIROBJ)\sslgen.obj \ - $(DIROBJ)\ssluse.obj \ + $(DIROBJ)\vtls.obj \ + $(DIROBJ)\openssl.obj \ $(DIROBJ)\strdup.obj \ $(DIROBJ)\strequal.obj \ $(DIROBJ)\strerror.obj \ @@ -642,6 +660,9 @@ $(DIROBJ): {.\}.c{$(DIROBJ)\}.obj: $(CC) $(CFLAGS) /Fo"$@" $< +{.\vtls\}.c{$(DIROBJ)\}.obj: + $(CC) $(CFLAGS) /Fo"$@" $< + debug-dll\libcurl.res \ debug-dll-ssl-dll\libcurl.res \ debug-dll-zlib-dll\libcurl.res \ diff --git a/lib/Makefile.vc8 b/lib/Makefile.vc8 index e0f851d..0d10ac5 100644 --- a/lib/Makefile.vc8 +++ b/lib/Makefile.vc8 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -65,7 +65,7 @@ !INCLUDE ..\winbuild\Makefile.msvc.names !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF LIBSSH2_PATH @@ -130,6 +130,10 @@ CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include CFLAGS = $(CFLAGS) /DUSE_IPV6 !ENDIF +!IFDEF USE_IDN +CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES +!ENDIF + ############################################################## # Runtime library configuration @@ -166,6 +170,18 @@ CFGSET = TRUE !ENDIF ###################### +# release-winssl + +!IF "$(CFG)" == "release-winssl" +TARGET = $(LIBCURL_STA_LIB_REL) +DIROBJ = $(CFG) +LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" +LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) +CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB) +CFGSET = TRUE +!ENDIF + +###################### # release-zlib !IF "$(CFG)" == "release-zlib" @@ -519,6 +535,7 @@ X_OBJS= \ $(DIROBJ)\cookie.obj \ $(DIROBJ)\curl_addrinfo.obj \ $(DIROBJ)\curl_darwinssl.obj \ + $(DIROBJ)\curl_endian.obj \ $(DIROBJ)\curl_fnmatch.obj \ $(DIROBJ)\curl_gethostname.obj \ $(DIROBJ)\curl_gssapi.obj \ @@ -530,6 +547,8 @@ X_OBJS= \ $(DIROBJ)\curl_ntlm_wb.obj \ $(DIROBJ)\curl_rtmp.obj \ $(DIROBJ)\curl_sasl.obj \ + $(DIROBJ)\curl_sasl_gssapi.obj \ + $(DIROBJ)\curl_sasl_sspi.obj \ $(DIROBJ)\curl_schannel.obj \ $(DIROBJ)\curl_sspi.obj \ $(DIROBJ)\curl_threads.obj \ @@ -566,7 +585,6 @@ X_OBJS= \ $(DIROBJ)\imap.obj \ $(DIROBJ)\inet_ntop.obj \ $(DIROBJ)\inet_pton.obj \ - $(DIROBJ)\krb4.obj \ $(DIROBJ)\krb5.obj \ $(DIROBJ)\ldap.obj \ $(DIROBJ)\llist.obj \ @@ -587,7 +605,6 @@ X_OBJS= \ $(DIROBJ)\polarssl_threadlock.obj \ $(DIROBJ)\pop3.obj \ $(DIROBJ)\progress.obj \ - $(DIROBJ)\qssl.obj \ $(DIROBJ)\rawstr.obj \ $(DIROBJ)\rtsp.obj \ $(DIROBJ)\security.obj \ @@ -595,6 +612,7 @@ X_OBJS= \ $(DIROBJ)\sendf.obj \ $(DIROBJ)\share.obj \ $(DIROBJ)\slist.obj \ + $(DIROBJ)\smb.obj \ $(DIROBJ)\smtp.obj \ $(DIROBJ)\socks.obj \ $(DIROBJ)\socks_gssapi.obj \ @@ -602,8 +620,8 @@ X_OBJS= \ $(DIROBJ)\speedcheck.obj \ $(DIROBJ)\splay.obj \ $(DIROBJ)\ssh.obj \ - $(DIROBJ)\sslgen.obj \ - $(DIROBJ)\ssluse.obj \ + $(DIROBJ)\vtls.obj \ + $(DIROBJ)\openssl.obj \ $(DIROBJ)\strdup.obj \ $(DIROBJ)\strequal.obj \ $(DIROBJ)\strerror.obj \ @@ -642,6 +660,9 @@ $(DIROBJ): {.\}.c{$(DIROBJ)\}.obj: $(CC) $(CFLAGS) /Fo"$@" $< +{.\vtls\}.c{$(DIROBJ)\}.obj: + $(CC) $(CFLAGS) /Fo"$@" $< + debug-dll\libcurl.res \ debug-dll-ssl-dll\libcurl.res \ debug-dll-zlib-dll\libcurl.res \ diff --git a/lib/Makefile.vc9 b/lib/Makefile.vc9 index 7b6e0ca..9f1b8d4 100644 --- a/lib/Makefile.vc9 +++ b/lib/Makefile.vc9 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -65,7 +65,7 @@ !INCLUDE ..\winbuild\Makefile.msvc.names !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF LIBSSH2_PATH @@ -130,6 +130,10 @@ CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include CFLAGS = $(CFLAGS) /DUSE_IPV6 !ENDIF +!IFDEF USE_IDN +CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES +!ENDIF + ############################################################## # Runtime library configuration @@ -166,6 +170,18 @@ CFGSET = TRUE !ENDIF ###################### +# release-winssl + +!IF "$(CFG)" == "release-winssl" +TARGET = $(LIBCURL_STA_LIB_REL) +DIROBJ = $(CFG) +LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" +LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) +CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB) +CFGSET = TRUE +!ENDIF + +###################### # release-zlib !IF "$(CFG)" == "release-zlib" @@ -519,6 +535,7 @@ X_OBJS= \ $(DIROBJ)\cookie.obj \ $(DIROBJ)\curl_addrinfo.obj \ $(DIROBJ)\curl_darwinssl.obj \ + $(DIROBJ)\curl_endian.obj \ $(DIROBJ)\curl_fnmatch.obj \ $(DIROBJ)\curl_gethostname.obj \ $(DIROBJ)\curl_gssapi.obj \ @@ -530,6 +547,8 @@ X_OBJS= \ $(DIROBJ)\curl_ntlm_wb.obj \ $(DIROBJ)\curl_rtmp.obj \ $(DIROBJ)\curl_sasl.obj \ + $(DIROBJ)\curl_sasl_gssapi.obj \ + $(DIROBJ)\curl_sasl_sspi.obj \ $(DIROBJ)\curl_schannel.obj \ $(DIROBJ)\curl_sspi.obj \ $(DIROBJ)\curl_threads.obj \ @@ -566,7 +585,6 @@ X_OBJS= \ $(DIROBJ)\imap.obj \ $(DIROBJ)\inet_ntop.obj \ $(DIROBJ)\inet_pton.obj \ - $(DIROBJ)\krb4.obj \ $(DIROBJ)\krb5.obj \ $(DIROBJ)\ldap.obj \ $(DIROBJ)\llist.obj \ @@ -587,7 +605,6 @@ X_OBJS= \ $(DIROBJ)\polarssl_threadlock.obj \ $(DIROBJ)\pop3.obj \ $(DIROBJ)\progress.obj \ - $(DIROBJ)\qssl.obj \ $(DIROBJ)\rawstr.obj \ $(DIROBJ)\rtsp.obj \ $(DIROBJ)\security.obj \ @@ -595,6 +612,7 @@ X_OBJS= \ $(DIROBJ)\sendf.obj \ $(DIROBJ)\share.obj \ $(DIROBJ)\slist.obj \ + $(DIROBJ)\smb.obj \ $(DIROBJ)\smtp.obj \ $(DIROBJ)\socks.obj \ $(DIROBJ)\socks_gssapi.obj \ @@ -602,8 +620,8 @@ X_OBJS= \ $(DIROBJ)\speedcheck.obj \ $(DIROBJ)\splay.obj \ $(DIROBJ)\ssh.obj \ - $(DIROBJ)\sslgen.obj \ - $(DIROBJ)\ssluse.obj \ + $(DIROBJ)\vtls.obj \ + $(DIROBJ)\openssl.obj \ $(DIROBJ)\strdup.obj \ $(DIROBJ)\strequal.obj \ $(DIROBJ)\strerror.obj \ @@ -642,6 +660,9 @@ $(DIROBJ): {.\}.c{$(DIROBJ)\}.obj: $(CC) $(CFLAGS) /Fo"$@" $< +{.\vtls\}.c{$(DIROBJ)\}.obj: + $(CC) $(CFLAGS) /Fo"$@" $< + debug-dll\libcurl.res \ debug-dll-ssl-dll\libcurl.res \ debug-dll-zlib-dll\libcurl.res \ diff --git a/lib/Makefile.vxworks b/lib/Makefile.vxworks index 0f9de51..7ff197f 100644 --- a/lib/Makefile.vxworks +++ b/lib/Makefile.vxworks @@ -33,8 +33,8 @@ BUILD_TYPE := debug USER_CFLAGS:= # directories where to seek for includes and libraries -OPENSSL_INC := D:/libraries/openssl/openssl-0.9.8y-vxWorks6.3/include -OPENSSL_LIB := D:/libraries/openssl/openssl-0.9.8y-vxWorks6.3 +OPENSSL_INC := D:/libraries/openssl/openssl-0.9.8zc-vxWorks6.3/include +OPENSSL_LIB := D:/libraries/openssl/openssl-0.9.8zc-vxWorks6.3 ZLIB_INC := D:/libraries/zlib/zlib-1.2.8-VxWorks6.3/zlib-1.2.8 ZLIB_LIB := D:/libraries/zlib/zlib-1.2.8-VxWorks6.3/binaries/vxworks_3.1_gnu/Debug/lib ARES_INC := diff --git a/lib/README.hostip b/lib/README.hostip index 2e30bc7..d5688ff 100644 --- a/lib/README.hostip +++ b/lib/README.hostip @@ -10,12 +10,12 @@ defined. CURLRES_ARES - is defined if libcurl is built to use c-ares for asynchronous - name resolves. It cannot have ENABLE_IPV6 defined at the same time, as c-ares - has no ipv6 support. This can be Windows or *nix. + name resolves. This can be Windows or *nix. - CURLRES_THREADED - is defined if libcurl is built to run under (native) - Windows, and then the name resolve will be done in a new thread, and the - supported asynch API will be the same as for ares-builds. + 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 @@ -23,13 +23,13 @@ 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 - hostares.c - functions for ares-using name resolves - hostthre.c - functions for threaded name resolves - hostip4.c - ipv4-specific functions - hostip6.c - ipv6-specific functions + 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. diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c index 081667d..4404b6c 100644 --- a/lib/asyn-ares.c +++ b/lib/asyn-ares.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -178,7 +178,7 @@ static void destroy_async_data (struct Curl_async *async); */ void Curl_resolver_cancel(struct connectdata *conn) { - if(conn && conn->data && conn->data->state.resolver) + if(conn->data && conn->data->state.resolver) ares_cancel((ares_channel)conn->data->state.resolver); destroy_async_data(&conn->async); } @@ -235,7 +235,7 @@ int Curl_resolver_getsock(struct connectdata *conn, milli = (timeout->tv_sec * 1000) + (timeout->tv_usec/1000); if(milli == 0) milli += 10; - Curl_expire(conn->data, milli); + Curl_expire_latest(conn->data, milli); return max; } @@ -315,7 +315,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, struct SessionHandle *data = conn->data; struct ResolverResults *res = (struct ResolverResults *) conn->async.os_specific; - CURLcode rc = CURLE_OK; + CURLcode result = CURLE_OK; *dns = NULL; @@ -329,7 +329,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, if(!conn->async.dns) { failf(data, "Could not resolve: %s (%s)", conn->async.hostname, ares_strerror(conn->async.status)); - rc = conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY: + result = conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY: CURLE_COULDNT_RESOLVE_HOST; } else @@ -338,7 +338,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, destroy_async_data(&conn->async); } - return rc; + return result; } /* @@ -355,7 +355,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, struct Curl_dns_entry **entry) { - CURLcode rc=CURLE_OK; + CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; long timeout; struct timeval now = Curl_tvnow(); @@ -394,7 +394,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, break; if(Curl_pgrsUpdate(conn)) { - rc = CURLE_ABORTED_BY_CALLBACK; + result = CURLE_ABORTED_BY_CALLBACK; timeout = -1; /* trigger the cancel below */ } else { @@ -403,6 +403,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, timeout -= timediff?timediff:1; /* always deduct at least 1 */ now = now2; /* for next loop */ } + if(timeout < 0) { /* our timeout, so we cancel the ares operation */ ares_cancel((ares_channel)data->state.resolver); @@ -412,18 +413,17 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, /* Operation complete, if the lookup was successful we now have the entry in the cache. */ - if(entry) *entry = conn->async.dns; - if(rc) + if(result) /* close the connection, since we can't return failure here without cleaning up this connection properly. TODO: remove this action from here, it is not a name resolver decision. */ - conn->bits.close = TRUE; + connclose(conn, "c-ares resolve failed"); - return rc; + return result; } /* Connects results to the list */ @@ -623,4 +623,72 @@ CURLcode Curl_set_dns_servers(struct SessionHandle *data, #endif return result; } + +CURLcode Curl_set_dns_interface(struct SessionHandle *data, + const char *interf) +{ +#if (ARES_VERSION >= 0x010704) + if(!interf) + interf = ""; + + ares_set_local_dev((ares_channel)data->state.resolver, interf); + + return CURLE_OK; +#else /* c-ares version too old! */ + (void)data; + (void)interf; + return CURLE_NOT_BUILT_IN; +#endif +} + +CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, + const char *local_ip4) +{ +#if (ARES_VERSION >= 0x010704) + struct in_addr a4; + + if((!local_ip4) || (local_ip4[0] == 0)) { + a4.s_addr = 0; /* disabled: do not bind to a specific address */ + } + else { + if(Curl_inet_pton(AF_INET, local_ip4, &a4) != 1) { + return CURLE_BAD_FUNCTION_ARGUMENT; + } + } + + ares_set_local_ip4((ares_channel)data->state.resolver, ntohl(a4.s_addr)); + + return CURLE_OK; +#else /* c-ares version too old! */ + (void)data; + (void)local_ip4; + return CURLE_NOT_BUILT_IN; +#endif +} + +CURLcode Curl_set_dns_local_ip6(struct SessionHandle *data, + const char *local_ip6) +{ +#if (ARES_VERSION >= 0x010704) && defined(ENABLE_IPV6) + unsigned char a6[INET6_ADDRSTRLEN]; + + if((!local_ip6) || (local_ip6[0] == 0)) { + /* disabled: do not bind to a specific address */ + memset(a6, 0, sizeof(a6)); + } + else { + if(Curl_inet_pton(AF_INET6, local_ip6, a6) != 1) { + return CURLE_BAD_FUNCTION_ARGUMENT; + } + } + + ares_set_local_ip6((ares_channel)data->state.resolver, a6); + + return CURLE_OK; +#else /* c-ares version too old! */ + (void)data; + (void)local_ip6; + return CURLE_NOT_BUILT_IN; +#endif +} #endif /* CURLRES_ARES */ diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c index 66fb510..80b5e78 100644 --- a/lib/asyn-thread.c +++ b/lib/asyn-thread.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -68,6 +68,7 @@ #include "inet_pton.h" #include "inet_ntop.h" #include "curl_threads.h" +#include "connect.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -165,6 +166,7 @@ struct thread_sync_data { #ifdef HAVE_GETADDRINFO struct addrinfo hints; #endif + struct thread_data *td; /* for thread-self cleanup */ }; struct thread_data { @@ -201,15 +203,18 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd) /* Initialize resolver thread synchronization data */ static -int init_thread_sync_data(struct thread_sync_data * tsd, +int init_thread_sync_data(struct thread_data * td, const char * hostname, int port, const struct addrinfo *hints) { + struct thread_sync_data *tsd = &td->tsd; + memset(tsd, 0, sizeof(*tsd)); + tsd->td = td; tsd->port = port; -#ifdef CURLRES_IPV6 +#ifdef HAVE_GETADDRINFO DEBUGASSERT(hints); tsd->hints = *hints; #else @@ -265,7 +270,8 @@ static int getaddrinfo_complete(struct connectdata *conn) static unsigned int CURL_STDCALL getaddrinfo_thread (void *arg) { struct thread_sync_data *tsd = (struct thread_sync_data*)arg; - char service [NI_MAXSERV]; + struct thread_data *td = tsd->td; + char service[12]; int rc; snprintf(service, sizeof(service), "%d", tsd->port); @@ -279,8 +285,16 @@ static unsigned int CURL_STDCALL getaddrinfo_thread (void *arg) } Curl_mutex_acquire(tsd->mtx); - tsd->done = 1; - Curl_mutex_release(tsd->mtx); + if(tsd->done) { + /* too late, gotta clean up the mess */ + Curl_mutex_release(tsd->mtx); + destroy_thread_sync_data(tsd); + free(td); + } + else { + tsd->done = 1; + Curl_mutex_release(tsd->mtx); + } return 0; } @@ -293,6 +307,7 @@ static unsigned int CURL_STDCALL getaddrinfo_thread (void *arg) static unsigned int CURL_STDCALL gethostbyname_thread (void *arg) { struct thread_sync_data *tsd = (struct thread_sync_data *)arg; + struct thread_data *td = tsd->td; tsd->res = Curl_ipv4_resolve_r(tsd->hostname, tsd->port); @@ -303,8 +318,16 @@ static unsigned int CURL_STDCALL gethostbyname_thread (void *arg) } Curl_mutex_acquire(tsd->mtx); - tsd->done = 1; - Curl_mutex_release(tsd->mtx); + if(tsd->done) { + /* too late, gotta clean up the mess */ + Curl_mutex_release(tsd->mtx); + destroy_thread_sync_data(tsd); + free(td); + } + else { + tsd->done = 1; + Curl_mutex_release(tsd->mtx); + } return 0; } @@ -316,21 +339,37 @@ static unsigned int CURL_STDCALL gethostbyname_thread (void *arg) */ static void destroy_async_data (struct Curl_async *async) { - if(async->hostname) - free(async->hostname); - if(async->os_specific) { struct thread_data *td = (struct thread_data*) async->os_specific; + int done; + + /* + * if the thread is still blocking in the resolve syscall, detach it and + * let the thread do the cleanup... + */ + Curl_mutex_acquire(td->tsd.mtx); + done = td->tsd.done; + td->tsd.done = 1; + Curl_mutex_release(td->tsd.mtx); + + if(!done) { + Curl_thread_destroy(td->thread_hnd); + } + else { + if(td->thread_hnd != curl_thread_t_null) + Curl_thread_join(&td->thread_hnd); - if(td->thread_hnd != curl_thread_t_null) - Curl_thread_join(&td->thread_hnd); - - destroy_thread_sync_data(&td->tsd); + destroy_thread_sync_data(&td->tsd); - free(async->os_specific); + free(async->os_specific); + } } - async->hostname = NULL; async->os_specific = NULL; + + if(async->hostname) + free(async->hostname); + + async->hostname = NULL; } /* @@ -356,7 +395,7 @@ static bool init_resolve_thread (struct connectdata *conn, conn->async.dns = NULL; td->thread_hnd = curl_thread_t_null; - if(!init_thread_sync_data(&td->tsd, hostname, port, hints)) + if(!init_thread_sync_data(td, hostname, port, hints)) goto err_exit; Curl_safefree(conn->async.hostname); @@ -395,19 +434,21 @@ static bool init_resolve_thread (struct connectdata *conn, static CURLcode resolver_error(struct connectdata *conn) { const char *host_or_proxy; - CURLcode rc; + CURLcode result; + if(conn->bits.httpproxy) { host_or_proxy = "proxy"; - rc = CURLE_COULDNT_RESOLVE_PROXY; + result = CURLE_COULDNT_RESOLVE_PROXY; } else { host_or_proxy = "host"; - rc = CURLE_COULDNT_RESOLVE_HOST; + result = CURLE_COULDNT_RESOLVE_HOST; } failf(conn->data, "Could not resolve %s: %s", host_or_proxy, conn->async.hostname); - return rc; + + return result; } /* @@ -424,13 +465,13 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, struct Curl_dns_entry **entry) { struct thread_data *td = (struct thread_data*) conn->async.os_specific; - CURLcode rc = CURLE_OK; + CURLcode result = CURLE_OK; DEBUGASSERT(conn && td); /* wait for the thread to resolve the name */ if(Curl_thread_join(&td->thread_hnd)) - rc = getaddrinfo_complete(conn); + result = getaddrinfo_complete(conn); else DEBUGASSERT(0); @@ -441,14 +482,14 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, if(!conn->async.dns) /* a name was not resolved, report error */ - rc = resolver_error(conn); + result = resolver_error(conn); destroy_async_data(&conn->async); if(!conn->async.dns) - conn->bits.close = TRUE; + connclose(conn, "asynch resolve failed"); - return (rc); + return result; } /* @@ -478,9 +519,9 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, getaddrinfo_complete(conn); if(!conn->async.dns) { - CURLcode rc = resolver_error(conn); + CURLcode result = resolver_error(conn); destroy_async_data(&conn->async); - return rc; + return result; } destroy_async_data(&conn->async); *entry = conn->async.dns; @@ -559,7 +600,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn, struct in_addr in; Curl_addrinfo *res; int error; - char sbuf[NI_MAXSERV]; + char sbuf[12]; int pf = PF_INET; #ifdef CURLRES_IPV6 struct in6_addr in6; @@ -594,7 +635,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn, } if((pf != PF_INET) && !Curl_ipv6works()) - /* the stack seems to be a non-ipv6 one */ + /* The stack seems to be a non-IPv6 one */ pf = PF_INET; #endif /* CURLRES_IPV6 */ @@ -635,4 +676,28 @@ CURLcode Curl_set_dns_servers(struct SessionHandle *data, } +CURLcode Curl_set_dns_interface(struct SessionHandle *data, + const char *interf) +{ + (void)data; + (void)interf; + return CURLE_NOT_BUILT_IN; +} + +CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, + const char *local_ip4) +{ + (void)data; + (void)local_ip4; + return CURLE_NOT_BUILT_IN; +} + +CURLcode Curl_set_dns_local_ip6(struct SessionHandle *data, + const char *local_ip6) +{ + (void)data; + (void)local_ip6; + return CURLE_NOT_BUILT_IN; +} + #endif /* CURLRES_THREADED */ diff --git a/lib/base64.c b/lib/base64.c index 3f3f0f9..6b1eb7c 100644 --- a/lib/base64.c +++ b/lib/base64.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -37,32 +37,53 @@ #include "memdebug.h" /* ---- Base64 Encoding/Decoding Table --- */ -static const char table64[]= +static const char base64[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static void decodeQuantum(unsigned char *dest, const char *src) +/* The Base 64 encoding with an URL and filename safe alphabet, RFC 4648 + section 5 */ +static const char base64url[]= + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + +static size_t decodeQuantum(unsigned char *dest, const char *src) { + size_t padding = 0; const char *s, *p; - unsigned long i, v, x = 0; + unsigned long i, x = 0; for(i = 0, s = src; i < 4; i++, s++) { - v = 0; - p = table64; - while(*p && (*p != *s)) { - v++; - p++; - } - if(*p == *s) - x = (x << 6) + v; - else if(*s == '=') + unsigned long v = 0; + + if(*s == '=') { x = (x << 6); + padding++; + } + else { + p = base64; + + while(*p && (*p != *s)) { + v++; + p++; + } + + if(*p == *s) + x = (x << 6) + v; + else + return 0; + } } - dest[2] = curlx_ultouc(x & 0xFFUL); + if(padding < 1) + dest[2] = curlx_ultouc(x & 0xFFUL); + x >>= 8; - dest[1] = curlx_ultouc(x & 0xFFUL); + if(padding < 2) + dest[1] = curlx_ultouc(x & 0xFFUL); + x >>= 8; dest[0] = curlx_ultouc(x & 0xFFUL); + + return 3 - padding; } /* @@ -82,82 +103,78 @@ static void decodeQuantum(unsigned char *dest, const char *src) CURLcode Curl_base64_decode(const char *src, unsigned char **outptr, size_t *outlen) { + size_t srclen = 0; size_t length = 0; - size_t equalsTerm = 0; + size_t padding = 0; size_t i; size_t numQuantums; - unsigned char lastQuantum[3]; size_t rawlen = 0; + unsigned char *pos; unsigned char *newstr; *outptr = NULL; *outlen = 0; + srclen = strlen(src); + + /* Check the length of the input string is valid */ + if(!srclen || srclen % 4) + return CURLE_BAD_CONTENT_ENCODING; + /* Find the position of any = padding characters */ while((src[length] != '=') && src[length]) length++; + /* A maximum of two = padding characters is allowed */ if(src[length] == '=') { - equalsTerm++; - if(src[length+equalsTerm] == '=') - equalsTerm++; + padding++; + if(src[length + 1] == '=') + padding++; } - numQuantums = (length + equalsTerm) / 4; - /* Don't allocate a buffer if the decoded length is 0 */ - if(numQuantums == 0) - return CURLE_OK; + /* Check the = padding characters weren't part way through the input */ + if(length + padding != srclen) + return CURLE_BAD_CONTENT_ENCODING; - rawlen = (numQuantums * 3) - equalsTerm; + /* Calculate the number of quantums */ + numQuantums = srclen / 4; - /* The buffer must be large enough to make room for the last quantum - (which may be partially thrown out) and the zero terminator. */ - newstr = malloc(rawlen+4); + /* Calculate the size of the decoded string */ + rawlen = (numQuantums * 3) - padding; + + /* Allocate our buffer including room for a zero terminator */ + newstr = malloc(rawlen + 1); if(!newstr) return CURLE_OUT_OF_MEMORY; - *outptr = newstr; + pos = newstr; - /* Decode all but the last quantum (which may not decode to a - multiple of 3 bytes) */ - for(i = 0; i < numQuantums - 1; i++) { - decodeQuantum(newstr, src); - newstr += 3; src += 4; - } + /* Decode the quantums */ + for(i = 0; i < numQuantums; i++) { + size_t result = decodeQuantum(pos, src); + if(!result) { + Curl_safefree(newstr); - /* This final decode may actually read slightly past the end of the buffer - if the input string is missing pad bytes. This will almost always be - harmless. */ - decodeQuantum(lastQuantum, src); - for(i = 0; i < 3 - equalsTerm; i++) - newstr[i] = lastQuantum[i]; + return CURLE_BAD_CONTENT_ENCODING; + } - newstr[i] = '\0'; /* zero terminate */ + pos += result; + src += 4; + } - *outlen = rawlen; /* return size of decoded data */ + /* Zero terminate */ + *pos = '\0'; + + /* Return the decoded data */ + *outptr = newstr; + *outlen = rawlen; return CURLE_OK; } -/* - * Curl_base64_encode() - * - * Given a pointer to an input buffer and an input size, encode it and - * return a pointer in *outptr to a newly allocated memory area holding - * encoded data. Size of encoded data is returned in variable pointed by - * outlen. - * - * Input length of 0 indicates input buffer holds a NUL-terminated string. - * - * Returns CURLE_OK on success, otherwise specific error code. Function - * output shall not be considered valid unless CURLE_OK is returned. - * - * When encoded data length is 0, returns NULL in *outptr. - * - * @unittest: 1302 - */ -CURLcode Curl_base64_encode(struct SessionHandle *data, - const char *inputbuff, size_t insize, - char **outptr, size_t *outlen) +static CURLcode base64_encode(const char *table64, + struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) { CURLcode error; unsigned char ibuf[3]; @@ -245,4 +262,52 @@ CURLcode Curl_base64_encode(struct SessionHandle *data, return CURLE_OK; } + +/* + * Curl_base64_encode() + * + * Given a pointer to an input buffer and an input size, encode it and + * return a pointer in *outptr to a newly allocated memory area holding + * encoded data. Size of encoded data is returned in variable pointed by + * outlen. + * + * Input length of 0 indicates input buffer holds a NUL-terminated string. + * + * Returns CURLE_OK on success, otherwise specific error code. Function + * output shall not be considered valid unless CURLE_OK is returned. + * + * When encoded data length is 0, returns NULL in *outptr. + * + * @unittest: 1302 + */ +CURLcode Curl_base64_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) +{ + return base64_encode(base64, data, inputbuff, insize, outptr, outlen); +} + +/* + * Curl_base64url_encode() + * + * Given a pointer to an input buffer and an input size, encode it and + * return a pointer in *outptr to a newly allocated memory area holding + * encoded data. Size of encoded data is returned in variable pointed by + * outlen. + * + * Input length of 0 indicates input buffer holds a NUL-terminated string. + * + * Returns CURLE_OK on success, otherwise specific error code. Function + * output shall not be considered valid unless CURLE_OK is returned. + * + * When encoded data length is 0, returns NULL in *outptr. + * + * @unittest: 1302 + */ +CURLcode Curl_base64url_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) +{ + return base64_encode(base64url, data, inputbuff, insize, outptr, outlen); +} /* ---- End of Base64 Encoding ---- */ diff --git a/lib/config-dos.h b/lib/config-dos.h index cce5e81..dd5b06d 100644 --- a/lib/config-dos.h +++ b/lib/config-dos.h @@ -69,7 +69,6 @@ #define HAVE_SETMODE 1 #define HAVE_SIGNAL 1 #define HAVE_SOCKET 1 -#define HAVE_SPNEGO 1 #define HAVE_STRDUP 1 #define HAVE_STRICMP 1 #define HAVE_STRTOLL 1 diff --git a/lib/config-os400.h b/lib/config-os400.h index a290fe4..1e62228 100644 --- a/lib/config-os400.h +++ b/lib/config-os400.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -175,6 +175,15 @@ /* Define if you have GSS API. */ #define HAVE_GSSAPI +/* Define if you have the GNU gssapi libraries */ +#undef HAVE_GSSGNU + +/* Define if you have the Heimdal gssapi libraries */ +#define HAVE_GSSHEIMDAL + +/* Define if you have the MIT gssapi libraries */ +#undef HAVE_GSSMIT + /* Define if you have the `ucb' library (-lucb). */ #undef HAVE_LIBUCB @@ -528,11 +537,14 @@ /* Define to the function return type for send. */ #define SEND_TYPE_RETV int -/* Define to use the QsoSSL package. */ -#define USE_QSOSSL - /* Define to use the GSKit package. */ -#undef USE_GSKIT +#define USE_GSKIT + +/* Define to use the OS/400 crypto library. */ +#define USE_OS400CRYPTO + +/* Define to use Unix sockets. */ +#define USE_UNIX_SOCKETS /* Use the system keyring as the default CA bundle. */ #define CURL_CA_BUNDLE "/QIBM/UserData/ICSS/Cert/Server/DEFAULT.KDB" diff --git a/lib/config-symbian.h b/lib/config-symbian.h index 17d92b0..f7eaab9 100644 --- a/lib/config-symbian.h +++ b/lib/config-symbian.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -260,7 +260,8 @@ /* Define to 1 if you have the IoctlSocket camel case function. */ /* #undef HAVE_IOCTLSOCKET_CAMEL */ -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. */ +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO + function. */ /* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ /* Define to 1 if you have the header file. */ @@ -480,9 +481,6 @@ /* Define to 1 if you have the `socket' function. */ #define HAVE_SOCKET 1 -/* Define this if you have the SPNEGO library fbopenssl */ -/* #undef HAVE_SPNEGO */ - /* Define to 1 if you have the `SSL_get_shutdown' function. */ /*#define HAVE_SSL_GET_SHUTDOWN 1*/ @@ -659,7 +657,8 @@ /*#define PACKAGE "curl"*/ /* Define to the address where bug reports for this package should be sent. */ -/*#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"*/ +/*#define PACKAGE_BUGREPORT \ + "a suitable curl mailing list => http://curl.haxx.se/mail/"*/ /* Define to the full name of this package. */ /*#define PACKAGE_NAME "curl"*/ diff --git a/lib/config-tpf.h b/lib/config-tpf.h index ddb8f77..6ff701a 100644 --- a/lib/config-tpf.h +++ b/lib/config-tpf.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -246,7 +246,8 @@ /* Define to 1 if you have the IoctlSocket camel case function. */ /* #undef HAVE_IOCTLSOCKET_CAMEL */ -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. */ +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO + function. */ /* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ /* Define to 1 if you have the header file. */ @@ -436,9 +437,6 @@ /* Define to 1 if you have the `socket' function. */ #define HAVE_SOCKET 1 -/* Define this if you have the SPNEGO library fbopenssl */ -/* #undef HAVE_SPNEGO */ - /* Define to 1 if you have the header file. */ /* #undef HAVE_SSL_H */ #define HAVE_SSL_H 1 @@ -581,7 +579,8 @@ #define PACKAGE "curl" /* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/" +#define PACKAGE_BUGREPORT \ + "a suitable curl mailing list => http://curl.haxx.se/mail/" /* Define to the full name of this package. */ #define PACKAGE_NAME "curl" diff --git a/lib/config-vxworks.h b/lib/config-vxworks.h index c94534a..05220b5 100644 --- a/lib/config-vxworks.h +++ b/lib/config-vxworks.h @@ -547,9 +547,6 @@ /* Define to 1 if you have the `socket' function. */ #define HAVE_SOCKET 1 -/* Define this if you have the SPNEGO library fbopenssl */ -/* #undef HAVE_SPNEGO */ - /* Define to 1 if you have the `SSL_get_shutdown' function. */ #define HAVE_SSL_GET_SHUTDOWN 1 diff --git a/lib/config-win32.h b/lib/config-win32.h index 9ce6ad2..744e022 100644 --- a/lib/config-win32.h +++ b/lib/config-win32.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -53,6 +53,11 @@ #define HAVE_GETOPT_H 1 #endif +/* Define to 1 if you have the header file. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1800) +#define HAVE_INTTYPES_H 1 +#endif + /* Define if you have the header file. */ #define HAVE_IO_H 1 @@ -87,6 +92,11 @@ /* Define if you have the header file. */ /* #define HAVE_SSL_H 1 */ +/* Define to 1 if you have the header file. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1800) +#define HAVE_STDBOOL_H 1 +#endif + /* Define if you have the header file. */ #define HAVE_STDLIB_H 1 @@ -160,6 +170,11 @@ /* Define if you can safely include both and . */ /* #define TIME_WITH_SYS_TIME 1 */ +/* Define to 1 if bool is an available type. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1800) +#define HAVE_BOOL_T 1 +#endif + /* ---------------------------------------------------------------- */ /* FUNCTIONS */ /* ---------------------------------------------------------------- */ @@ -250,7 +265,8 @@ #define HAVE_STRSTR 1 /* Define if you have the strtoll function. */ -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__POCC__) +#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__POCC__) || \ + (defined(_MSC_VER) && (_MSC_VER >= 1800)) #define HAVE_STRTOLL 1 #endif @@ -391,21 +407,6 @@ #endif /* ---------------------------------------------------------------- */ -/* STRUCT RELATED */ -/* ---------------------------------------------------------------- */ - -/* Define if you have struct sockaddr_storage. */ -#if !defined(__SALFORDC__) && !defined(__BORLANDC__) -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 -#endif - -/* Define if you have struct timeval. */ -#define HAVE_STRUCT_TIMEVAL 1 - -/* Define if struct sockaddr_in6 has the sin6_scope_id member. */ -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - -/* ---------------------------------------------------------------- */ /* BSD-style lwIP TCP/IP stack SPECIFIC */ /* ---------------------------------------------------------------- */ @@ -480,7 +481,8 @@ #endif /* Define if the compiler supports the 'long long' data type. */ -#if defined(__MINGW32__) || defined(__WATCOMC__) +#if defined(__MINGW32__) || defined(__WATCOMC__) || \ + (defined(_MSC_VER) && (_MSC_VER >= 1310)) #define HAVE_LONGLONG 1 #endif @@ -500,26 +502,39 @@ # endif #endif -/* Officially, Microsoft's Windows SDK versions 6.X do not support Windows - 2000 as a supported build target. VS2008 default installations provide - an embedded Windows SDK v6.0A along with the claim that Windows 2000 is - a valid build target for VS2008. Popular belief is that binaries built - with VS2008 using Windows SDK versions 6.X and Windows 2000 as a build - target are functional. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) +/* Define some minimum and default build targets for Visual Studio */ +#if defined(_MSC_VER) + /* Officially, Microsoft's Windows SDK versions 6.X does not support Windows + 2000 as a supported build target. VS2008 default installations provides + an embedded Windows SDK v6.0A along with the claim that Windows 2000 is a + valid build target for VS2008. Popular belief is that binaries built with + VS2008 using Windows SDK versions v6.X and Windows 2000 as a build target + are functional. */ # define VS2008_MIN_TARGET 0x0500 -#endif -/* When no build target is specified VS2008 default build target is Windows - Vista, which leaves out even Winsows XP. If no build target has been given - for VS2008 we will target the minimum Officially supported build target, - which happens to be Windows XP. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -# define VS2008_DEF_TARGET 0x0501 + /* The minimum build target for VS2012 is Vista unless Update 1 is installed + and the v110_xp toolset is choosen. */ +# if defined(_USING_V110_SDK71_) +# define VS2012_MIN_TARGET 0x0501 +# else +# define VS2012_MIN_TARGET 0x0600 +# endif + + /* VS2008 default build target is Windows Vista. We override default target + to be Windows XP. */ +# define VS2008_DEF_TARGET 0x0501 + + /* VS2012 default build target is Windows Vista unless Update 1 is installed + and the v110_xp toolset is choosen. */ +# if defined(_USING_V110_SDK71_) +# define VS2012_DEF_TARGET 0x0501 +# else +# define VS2012_DEF_TARGET 0x0600 +# endif #endif /* VS2008 default target settings and minimum build target check. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) +#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (_MSC_VER <= 1600) # ifndef _WIN32_WINNT # define _WIN32_WINNT VS2008_DEF_TARGET # endif @@ -531,6 +546,24 @@ # endif #endif +/* VS2012 default target settings and minimum build target check. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1700) +# ifndef _WIN32_WINNT +# define _WIN32_WINNT VS2012_DEF_TARGET +# endif +# ifndef WINVER +# define WINVER VS2012_DEF_TARGET +# endif +# if (_WIN32_WINNT < VS2012_MIN_TARGET) || (WINVER < VS2012_MIN_TARGET) +# if defined(_USING_V110_SDK71_) +# error VS2012 does not support Windows build targets prior to Windows XP +# else +# error VS2012 does not support Windows build targets prior to Windows \ +Vista +# endif +# endif +#endif + /* When no build target is specified Pelles C 5.00 and later default build target is Windows Vista. We override default target to be Windows 2000. */ #if defined(__POCC__) && (__POCC__ >= 500) @@ -573,6 +606,25 @@ #endif /* ---------------------------------------------------------------- */ +/* STRUCT RELATED */ +/* ---------------------------------------------------------------- */ + +/* Define if you have struct sockaddr_storage. */ +#if !defined(__SALFORDC__) && !defined(__BORLANDC__) +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 +#endif + +/* Define if you have struct timeval. */ +#define HAVE_STRUCT_TIMEVAL 1 + +/* Define if struct sockaddr_in6 has the sin6_scope_id member. */ +#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 + +#if HAVE_WINSOCK2_H && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) +#define HAVE_STRUCT_POLLFD 1 +#endif + +/* ---------------------------------------------------------------- */ /* LARGE FILE SUPPORT */ /* ---------------------------------------------------------------- */ @@ -648,6 +700,11 @@ # define CURL_DISABLE_LDAP 1 #endif +/* Define to use the Windows crypto library. */ +#if !defined(USE_SSLEAY) && !defined(USE_NSS) +#define USE_WIN32_CRYPTO +#endif + /* ---------------------------------------------------------------- */ /* ADDITIONAL DEFINITIONS */ /* ---------------------------------------------------------------- */ diff --git a/lib/conncache.c b/lib/conncache.c index 48271f7..fcfb150 100644 --- a/lib/conncache.c +++ b/lib/conncache.c @@ -6,7 +6,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2012, Linus Nielsen Feltzing, - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -131,7 +131,7 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc, conn->host.name); if(!bundle) { result = Curl_bundle_create(data, &new_bundle); - if(result != CURLE_OK) + if(result) return result; if(!conncache_add_bundle(data->state.conn_cache, @@ -143,14 +143,19 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc, } result = Curl_bundle_add_conn(bundle, conn); - if(result != CURLE_OK) { + if(result) { if(new_bundle) conncache_remove_bundle(data->state.conn_cache, new_bundle); return result; } + conn->connection_id = connc->next_connection_id++; connc->num_connections++; + DEBUGF(infof(conn->data, "Added connection %ld. " + "The cache now contains %" CURL_FORMAT_CURL_OFF_TU " members\n", + conn->connection_id, (curl_off_t) connc->num_connections)); + return CURLE_OK; } @@ -166,10 +171,14 @@ void Curl_conncache_remove_conn(struct conncache *connc, if(bundle->num_connections == 0) { conncache_remove_bundle(connc, bundle); } - connc->num_connections--; - DEBUGF(infof(conn->data, "The cache now contains %d members\n", - connc->num_connections)); + if(connc) { + connc->num_connections--; + + DEBUGF(infof(conn->data, "The cache now contains %" + CURL_FORMAT_CURL_OFF_TU " members\n", + (curl_off_t) connc->num_connections)); + } } } @@ -195,22 +204,20 @@ void Curl_conncache_foreach(struct conncache *connc, he = Curl_hash_next_element(&iter); while(he) { struct connectbundle *bundle; - struct connectdata *conn; bundle = he->ptr; + he = Curl_hash_next_element(&iter); curr = bundle->conn_list->head; while(curr) { /* Yes, we need to update curr before calling func(), because func() might decide to remove the connection */ - conn = curr->ptr; + struct connectdata *conn = curr->ptr; curr = curr->next; if(1 == func(conn, param)) return; } - - he = Curl_hash_next_element(&iter); } } @@ -220,7 +227,6 @@ struct connectdata * Curl_conncache_find_first_connection(struct conncache *connc) { struct curl_hash_iterator iter; - struct curl_llist_element *curr; struct curl_hash_element *he; struct connectbundle *bundle; @@ -228,6 +234,7 @@ Curl_conncache_find_first_connection(struct conncache *connc) he = Curl_hash_next_element(&iter); while(he) { + struct curl_llist_element *curr; bundle = he->ptr; curr = bundle->conn_list->head; diff --git a/lib/conncache.h b/lib/conncache.h index f5e41f1..d793f24 100644 --- a/lib/conncache.h +++ b/lib/conncache.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012, 2013, Linus Nielsen Feltzing, + * Copyright (C) 2012 - 2014, Linus Nielsen Feltzing, * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -25,6 +25,8 @@ struct conncache { struct curl_hash *hash; size_t num_connections; + long next_connection_id; + struct timeval last_cleanup; }; struct conncache *Curl_conncache_init(int size); diff --git a/lib/connect.c b/lib/connect.c index 2b5719d..5a60d14 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -71,7 +71,7 @@ #include "sockaddr.h" /* required for Curl_sockaddr_storage */ #include "inet_ntop.h" #include "inet_pton.h" -#include "sslgen.h" /* for Curl_ssl_check_cxn() */ +#include "vtls/vtls.h" /* for Curl_ssl_check_cxn() */ #include "progress.h" #include "warnless.h" #include "conncache.h" @@ -94,7 +94,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error); #define KEEPALIVE_FACTOR(x) #endif -#if defined(HAVE_WINSOCK_H) && !defined(SIO_KEEPALIVE_VALS) +#if defined(HAVE_WINSOCK2_H) && !defined(SIO_KEEPALIVE_VALS) #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) struct tcp_keepalive { @@ -164,8 +164,7 @@ tcpkeepalive(struct SessionHandle *data, static CURLcode singleipconnect(struct connectdata *conn, const Curl_addrinfo *ai, /* start connecting to this */ - curl_socket_t *sock, - bool *connected); + curl_socket_t *sock); /* * Curl_timeleft() returns the amount of milliseconds left allowed for the @@ -225,7 +224,12 @@ long Curl_timeleft(struct SessionHandle *data, } /* subtract elapsed time */ - timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle); + if(duringconnect) + /* since this most recent connect started */ + timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle); + else + /* since the entire operation started */ + timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startop); if(!timeout_ms) /* avoid returning 0 as that means no timeout! */ return -1; @@ -233,47 +237,8 @@ long Curl_timeleft(struct SessionHandle *data, return timeout_ms; } -/* - * checkconnect() checks for a TCP connect on the given socket. - * It returns: - */ - -enum chkconn_t { - CHKCONN_SELECT_ERROR = -1, - CHKCONN_CONNECTED = 0, - CHKCONN_IDLE = 1, - CHKCONN_FDSET_ERROR = 2 -}; - -static enum chkconn_t -checkconnect(curl_socket_t sockfd) -{ - int rc; -#ifdef mpeix - /* Call this function once now, and ignore the results. We do this to - "clear" the error state on the socket so that we can later read it - reliably. This is reported necessary on the MPE/iX operating system. */ - (void)verifyconnect(sockfd, NULL); -#endif - - rc = Curl_socket_ready(CURL_SOCKET_BAD, sockfd, 0); - - if(-1 == rc) - /* error, no connect here, try next */ - return CHKCONN_SELECT_ERROR; - - else if(rc & CURL_CSELECT_ERR) - /* error condition caught */ - return CHKCONN_FDSET_ERROR; - - else if(rc) - return CHKCONN_CONNECTED; - - return CHKCONN_IDLE; -} - static CURLcode bindlocal(struct connectdata *conn, - curl_socket_t sockfd, int af) + curl_socket_t sockfd, int af, unsigned int scope) { struct SessionHandle *data = conn->data; @@ -292,12 +257,6 @@ static CURLcode bindlocal(struct connectdata *conn, int portnum = data->set.localportrange; const char *dev = data->set.str[STRING_DEVICE]; int error; - char myhost[256] = ""; - int done = 0; /* -1 for error, 1 for address found */ - bool is_interface = FALSE; - bool is_host = FALSE; - static const char *if_prefix = "if!"; - static const char *host_prefix = "host!"; /************************************************************* * Select device to bind socket to @@ -309,6 +268,13 @@ static CURLcode bindlocal(struct connectdata *conn, memset(&sa, 0, sizeof(struct Curl_sockaddr_storage)); if(dev && (strlen(dev)<255) ) { + char myhost[256] = ""; + int done = 0; /* -1 for error, 1 for address found */ + bool is_interface = FALSE; + bool is_host = FALSE; + static const char *if_prefix = "if!"; + static const char *host_prefix = "host!"; + if(strncmp(if_prefix, dev, strlen(if_prefix)) == 0) { dev += strlen(if_prefix); is_interface = TRUE; @@ -320,7 +286,8 @@ static CURLcode bindlocal(struct connectdata *conn, /* interface */ if(!is_host) { - switch(Curl_if2ip(af, conn->scope, dev, myhost, sizeof(myhost))) { + switch(Curl_if2ip(af, scope, conn->scope_id, dev, + myhost, sizeof(myhost))) { case IF2IP_NOT_FOUND: if(is_interface) { /* Do not fall back to treating it as a host name */ @@ -409,7 +376,7 @@ static CURLcode bindlocal(struct connectdata *conn, if(done > 0) { #ifdef ENABLE_IPV6 - /* ipv6 address */ + /* IPv6 address */ if(af == AF_INET6) { #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID char *scope_ptr = strchr(myhost, '%'); @@ -432,7 +399,7 @@ static CURLcode bindlocal(struct connectdata *conn, } else #endif - /* ipv4 address */ + /* IPv4 address */ if((af == AF_INET) && (Curl_inet_pton(AF_INET, myhost, &si4->sin_addr) > 0)) { si4->sin_family = AF_INET; @@ -573,42 +540,58 @@ static bool verifyconnect(curl_socket_t sockfd, int *error) more address exists or error */ static CURLcode trynextip(struct connectdata *conn, int sockindex, - bool *connected) + int tempindex) { - curl_socket_t sockfd; - Curl_addrinfo *ai; + CURLcode result = CURLE_COULDNT_CONNECT; /* First clean up after the failed socket. Don't close it yet to ensure that the next IP's socket gets a different file descriptor, which can prevent bugs when the curl_multi_socket_action interface is used with certain select() replacements such as kqueue. */ - curl_socket_t fd_to_close = conn->sock[sockindex]; - conn->sock[sockindex] = CURL_SOCKET_BAD; - *connected = FALSE; + curl_socket_t fd_to_close = conn->tempsock[tempindex]; + conn->tempsock[tempindex] = CURL_SOCKET_BAD; - if(sockindex != FIRSTSOCKET) { - Curl_closesocket(conn, fd_to_close); - return CURLE_COULDNT_CONNECT; /* no next */ - } + if(sockindex == FIRSTSOCKET) { + Curl_addrinfo *ai = NULL; + int family = AF_UNSPEC; - /* try the next address */ - ai = conn->ip_addr->ai_next; - - while(ai) { - CURLcode res = singleipconnect(conn, ai, &sockfd, connected); - if(res) - return res; - if(sockfd != CURL_SOCKET_BAD) { - /* store the new socket descriptor */ - conn->sock[sockindex] = sockfd; - conn->ip_addr = ai; - Curl_closesocket(conn, fd_to_close); - return CURLE_OK; + if(conn->tempaddr[tempindex]) { + /* find next address in the same protocol family */ + family = conn->tempaddr[tempindex]->ai_family; + ai = conn->tempaddr[tempindex]->ai_next; + } + else if(conn->tempaddr[0]) { + /* happy eyeballs - try the other protocol family */ + int firstfamily = conn->tempaddr[0]->ai_family; +#ifdef ENABLE_IPV6 + family = (firstfamily == AF_INET) ? AF_INET6 : AF_INET; +#else + family = firstfamily; +#endif + ai = conn->tempaddr[0]->ai_next; + } + + while(ai) { + while(ai && ai->ai_family != family) + ai = ai->ai_next; + + if(ai) { + result = singleipconnect(conn, ai, &conn->tempsock[tempindex]); + if(result == CURLE_COULDNT_CONNECT) { + ai = ai->ai_next; + continue; + } + + conn->tempaddr[tempindex] = ai; + } + break; } - ai = ai->ai_next; } - Curl_closesocket(conn, fd_to_close); - return CURLE_COULDNT_CONNECT; + + if(fd_to_close != CURL_SOCKET_BAD) + Curl_closesocket(conn, fd_to_close); + + return result; } /* Copies connection info into the session handle to make it available @@ -676,13 +659,17 @@ static bool getaddressinfo(struct sockaddr* sa, char* addr, connection */ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd) { - int error; curl_socklen_t len; struct Curl_sockaddr_storage ssrem; struct Curl_sockaddr_storage ssloc; struct SessionHandle *data = conn->data; + if(conn->socktype == SOCK_DGRAM) + /* there's no connection! */ + return; + if(!conn->bits.reuse) { + int error; len = sizeof(struct Curl_sockaddr_storage); if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) { @@ -693,6 +680,7 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd) } len = sizeof(struct Curl_sockaddr_storage); + memset(&ssloc, 0, sizeof(ssloc)); if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) { error = SOCKERRNO; failf(data, "getsockname() failed with errno %d: %s", @@ -707,6 +695,7 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd) error, Curl_strerror(conn, error)); return; } + memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN); if(!getaddressinfo((struct sockaddr*)&ssloc, conn->local_ip, &conn->local_port)) { @@ -731,12 +720,12 @@ CURLcode Curl_is_connected(struct connectdata *conn, bool *connected) { struct SessionHandle *data = conn->data; - CURLcode code = CURLE_OK; - curl_socket_t sockfd = conn->sock[sockindex]; - long allow = DEFAULT_CONNECT_TIMEOUT; + CURLcode result = CURLE_OK; + long allow; int error = 0; struct timeval now; - enum chkconn_t chk; + int rc; + int i; DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET); @@ -759,72 +748,108 @@ CURLcode Curl_is_connected(struct connectdata *conn, return CURLE_OPERATION_TIMEDOUT; } - /* check socket for connect */ - chk = checkconnect(sockfd); - if(CHKCONN_IDLE == chk) { - if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) { - infof(data, "After %ldms connect time, move on!\n", - conn->timeoutms_per_addr); - goto next; - } + for(i=0; i<2; i++) { + if(conn->tempsock[i] == CURL_SOCKET_BAD) + continue; - /* not an error, but also no connection yet */ - return code; - } +#ifdef mpeix + /* Call this function once now, and ignore the results. We do this to + "clear" the error state on the socket so that we can later read it + reliably. This is reported necessary on the MPE/iX operating system. */ + (void)verifyconnect(conn->tempsock[i], NULL); +#endif + + /* check socket for connect */ + rc = Curl_socket_ready(CURL_SOCKET_BAD, conn->tempsock[i], 0); - if(CHKCONN_CONNECTED == chk) { - if(verifyconnect(sockfd, &error)) { - /* we are connected with TCP, awesome! */ + if(rc == 0) { /* no connection yet */ + if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) { + infof(data, "After %ldms connect time, move on!\n", + conn->timeoutms_per_addr); + error = ETIMEDOUT; + } + + /* should we try another protocol family? */ + if(i == 0 && conn->tempaddr[1] == NULL && + curlx_tvdiff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) { + trynextip(conn, sockindex, 1); + } + } + else if(rc == CURL_CSELECT_OUT) { + if(verifyconnect(conn->tempsock[i], &error)) { + /* we are connected with TCP, awesome! */ + int other = i ^ 1; + + /* use this socket from now on */ + conn->sock[sockindex] = conn->tempsock[i]; + conn->ip_addr = conn->tempaddr[i]; + conn->tempsock[i] = CURL_SOCKET_BAD; + + /* close the other socket, if open */ + if(conn->tempsock[other] != CURL_SOCKET_BAD) { + Curl_closesocket(conn, conn->tempsock[other]); + conn->tempsock[other] = CURL_SOCKET_BAD; + } - /* see if we need to do any proxy magic first once we connected */ - code = Curl_connected_proxy(conn); - if(code) - return code; + /* see if we need to do any proxy magic first once we connected */ + result = Curl_connected_proxy(conn, sockindex); + if(result) + return result; - conn->bits.tcpconnect[sockindex] = TRUE; + conn->bits.tcpconnect[sockindex] = TRUE; - *connected = TRUE; - if(sockindex == FIRSTSOCKET) - Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */ - Curl_verboseconnect(conn); - Curl_updateconninfo(conn, sockfd); + *connected = TRUE; + if(sockindex == FIRSTSOCKET) + Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */ + Curl_updateconninfo(conn, conn->sock[sockindex]); + Curl_verboseconnect(conn); - return CURLE_OK; + return CURLE_OK; + } + else + infof(data, "Connection failed\n"); } - /* nope, not connected for real */ - } - else { - /* nope, not connected */ - if(CHKCONN_FDSET_ERROR == chk) { - (void)verifyconnect(sockfd, &error); - infof(data, "%s\n",Curl_strerror(conn, error)); + else if(rc & CURL_CSELECT_ERR) + (void)verifyconnect(conn->tempsock[i], &error); + + /* + * The connection failed here, we should attempt to connect to the "next + * address" for the given host. But first remember the latest error. + */ + if(error) { + data->state.os_errno = error; + SET_SOCKERRNO(error); + if(conn->tempaddr[i]) { + char ipaddress[MAX_IPADR_LEN]; + Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN); + infof(data, "connect to %s port %ld failed: %s\n", + ipaddress, conn->port, Curl_strerror(conn, error)); + + conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ? + allow : allow / 2; + + result = trynextip(conn, sockindex, i); + } } - else - infof(data, "Connection failed\n"); } - /* - * The connection failed here, we should attempt to connect to the "next - * address" for the given host. But first remember the latest error. - */ - if(error) { - data->state.os_errno = error; - SET_SOCKERRNO(error); - } - next: + if(result) { + /* no more addresses to try */ - conn->timeoutms_per_addr = conn->ip_addr->ai_next == NULL ? - allow : allow / 2; - code = trynextip(conn, sockindex, connected); + /* if the first address family runs out of addresses to try before + the happy eyeball timeout, go ahead and try the next family now */ + if(conn->tempaddr[1] == NULL) { + result = trynextip(conn, sockindex, 1); + if(!result) + return result; + } - if(code) { - error = SOCKERRNO; - data->state.os_errno = error; - failf(data, "Failed connect to %s:%ld; %s", - conn->host.name, conn->port, Curl_strerror(conn, error)); + failf(data, "Failed to connect to %s port %ld: %s", + conn->bits.proxy?conn->proxy.name:conn->host.name, + conn->port, Curl_strerror(conn, error)); } - return code; + return result; } static void tcpnodelay(struct connectdata *conn, @@ -901,19 +926,40 @@ void Curl_sndbufset(curl_socket_t sockfd) int val = CURL_MAX_WRITE_SIZE + 32; int curval = 0; int curlen = sizeof(curval); + DWORD majorVersion = 6; - OSVERSIONINFO osver; static int detectOsState = DETECT_OS_NONE; if(detectOsState == DETECT_OS_NONE) { +#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_WIN2K) || \ + (_WIN32_WINNT < _WIN32_WINNT_WIN2K) + OSVERSIONINFO osver; + memset(&osver, 0, sizeof(osver)); osver.dwOSVersionInfoSize = sizeof(osver); + detectOsState = DETECT_OS_PREVISTA; if(GetVersionEx(&osver)) { - if(osver.dwMajorVersion >= 6) + if(osver.dwMajorVersion >= majorVersion) detectOsState = DETECT_OS_VISTA_OR_LATER; } +#else + ULONGLONG majorVersionMask; + OSVERSIONINFOEX osver; + + memset(&osver, 0, sizeof(osver)); + osver.dwOSVersionInfoSize = sizeof(osver); + osver.dwMajorVersion = majorVersion; + majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION, + VER_GREATER_EQUAL); + + if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask)) + detectOsState = DETECT_OS_VISTA_OR_LATER; + else + detectOsState = DETECT_OS_PREVISTA; +#endif } + if(detectOsState == DETECT_OS_VISTA_OR_LATER) return; @@ -925,7 +971,6 @@ void Curl_sndbufset(curl_socket_t sockfd) } #endif - /* * singleipconnect() * @@ -935,11 +980,9 @@ void Curl_sndbufset(curl_socket_t sockfd) * singleipconnect() connects to the given IP only, and it may return without * having connected. */ -static CURLcode -singleipconnect(struct connectdata *conn, - const Curl_addrinfo *ai, - curl_socket_t *sockp, - bool *connected) +static CURLcode singleipconnect(struct connectdata *conn, + const Curl_addrinfo *ai, + curl_socket_t *sockp) { struct Curl_sockaddr_ex addr; int rc; @@ -947,13 +990,15 @@ singleipconnect(struct connectdata *conn, bool isconnected = FALSE; struct SessionHandle *data = conn->data; curl_socket_t sockfd; - CURLcode res = CURLE_OK; + CURLcode result; + char ipaddress[MAX_IPADR_LEN]; + long port; + bool is_tcp; *sockp = CURL_SOCKET_BAD; - *connected = FALSE; /* default is not connected */ - res = Curl_socket(conn, ai, &addr, &sockfd); - if(res) + result = Curl_socket(conn, ai, &addr, &sockfd); + if(result) /* Failed to create the socket, but still return OK since we signal the lack of socket as well. This allows the parent function to keep looping over alternative addresses/socket families etc. */ @@ -961,7 +1006,7 @@ singleipconnect(struct connectdata *conn, /* store remote address and port used in this connection attempt */ if(!getaddressinfo((struct sockaddr*)&addr.sa_addr, - conn->primary_ip, &conn->primary_port)) { + ipaddress, &port)) { /* malformed address or bug in inet_ntop, try next address */ error = ERRNO; failf(data, "sa_addr inet_ntop() failed with errno %d: %s", @@ -969,19 +1014,18 @@ singleipconnect(struct connectdata *conn, Curl_closesocket(conn, sockfd); return CURLE_OK; } - memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN); - infof(data, " Trying %s...\n", conn->ip_addr_str); - - Curl_persistconninfo(conn); + infof(data, " Trying %s...\n", ipaddress); - if(data->set.tcp_nodelay) + is_tcp = (addr.family == AF_INET || addr.family == AF_INET6) && + addr.socktype == SOCK_STREAM; + if(is_tcp && data->set.tcp_nodelay) tcpnodelay(conn, sockfd); nosigpipe(conn, sockfd); Curl_sndbufset(sockfd); - if(data->set.tcp_keepalive) + if(is_tcp && data->set.tcp_keepalive) tcpkeepalive(data, sockfd); if(data->set.fsockopt) { @@ -999,23 +1043,26 @@ singleipconnect(struct connectdata *conn, } /* possibly bind the local end to an IP, interface or port */ - res = bindlocal(conn, sockfd, addr.family); - if(res) { - Curl_closesocket(conn, sockfd); /* close socket and bail out */ - if(res == CURLE_UNSUPPORTED_PROTOCOL) { - /* The address family is not supported on this interface. - We can continue trying addresses */ - return CURLE_OK; + if(addr.family == AF_INET || addr.family == AF_INET6) { + result = bindlocal(conn, sockfd, addr.family, + Curl_ipv6_scope((struct sockaddr*)&addr.sa_addr)); + if(result) { + Curl_closesocket(conn, sockfd); /* close socket and bail out */ + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + /* The address family is not supported on this interface. + We can continue trying addresses */ + return CURLE_COULDNT_CONNECT; + } + return result; } - return res; } /* set socket non-blocking */ - curlx_nonblock(sockfd, TRUE); + (void)curlx_nonblock(sockfd, TRUE); conn->connecttime = Curl_tvnow(); if(conn->num_addr > 1) - Curl_expire(data, conn->timeoutms_per_addr); + Curl_expire_latest(data, conn->timeoutms_per_addr); /* Connect TCP sockets, bind UDP */ if(!isconnected && (conn->socktype == SOCK_STREAM)) { @@ -1033,7 +1080,7 @@ singleipconnect(struct connectdata *conn, #endif if(-1 == rc) { - switch (error) { + switch(error) { case EINPROGRESS: case EWOULDBLOCK: #if defined(EAGAIN) @@ -1045,25 +1092,25 @@ singleipconnect(struct connectdata *conn, case EAGAIN: #endif #endif - *sockp = sockfd; - return CURLE_OK; + result = CURLE_OK; + break; default: /* unknown error, fallthrough and try another address! */ - failf(data, "Failed to connect to %s: %s", - conn->ip_addr_str, Curl_strerror(conn,error)); + infof(data, "Immediate connect fail for %s: %s\n", + ipaddress, Curl_strerror(conn,error)); data->state.os_errno = error; /* connect failed */ Curl_closesocket(conn, sockfd); - - break; + result = CURLE_COULDNT_CONNECT; } } - else + + if(!result) *sockp = sockfd; - return CURLE_OK; + return result; } /* @@ -1073,29 +1120,13 @@ singleipconnect(struct connectdata *conn, */ CURLcode Curl_connecthost(struct connectdata *conn, /* context */ - const struct Curl_dns_entry *remotehost, - curl_socket_t *sockconn, /* the connected socket */ - Curl_addrinfo **addr, /* the one we used */ - bool *connected) /* really connected? */ + const struct Curl_dns_entry *remotehost) { struct SessionHandle *data = conn->data; - curl_socket_t sockfd = CURL_SOCKET_BAD; - Curl_addrinfo *ai; - Curl_addrinfo *curr_addr; - - struct timeval after; struct timeval before = Curl_tvnow(); + CURLcode result = CURLE_COULDNT_CONNECT; - /************************************************************* - * Figure out what maximum time we have left - *************************************************************/ - long timeout_ms; - - DEBUGASSERT(sockconn); - *connected = FALSE; /* default to not connected */ - - /* get the timeout left */ - timeout_ms = Curl_timeleft(data, &before, TRUE); + long timeout_ms = Curl_timeleft(data, &before, TRUE); if(timeout_ms < 0) { /* a precaution, no need to continue if time already is up */ @@ -1104,57 +1135,26 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */ } conn->num_addr = Curl_num_addresses(remotehost->addr); - - ai = remotehost->addr; - - /* Below is the loop that attempts to connect to all IP-addresses we - * know for the given host. One by one until one IP succeeds. - */ - - /* - * Connecting with a Curl_addrinfo chain - */ - for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) { - CURLcode res; - - /* Max time for the next address */ - conn->timeoutms_per_addr = curr_addr->ai_next == NULL ? - timeout_ms : timeout_ms / 2; - - /* start connecting to the IP curr_addr points to */ - res = singleipconnect(conn, curr_addr, - &sockfd, connected); - if(res) - return res; - - if(sockfd != CURL_SOCKET_BAD) + conn->tempaddr[0] = remotehost->addr; + conn->tempaddr[1] = NULL; + conn->tempsock[0] = CURL_SOCKET_BAD; + conn->tempsock[1] = CURL_SOCKET_BAD; + Curl_expire(conn->data, HAPPY_EYEBALLS_TIMEOUT); + + /* Max time for the next connection attempt */ + conn->timeoutms_per_addr = + conn->tempaddr[0]->ai_next == NULL ? timeout_ms : timeout_ms / 2; + + /* start connecting to first IP */ + while(conn->tempaddr[0]) { + result = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0])); + if(!result) break; - - /* get a new timeout for next attempt */ - after = Curl_tvnow(); - timeout_ms -= Curl_tvdiff(after, before); - if(timeout_ms < 0) { - failf(data, "connect() timed out!"); - return CURLE_OPERATION_TIMEDOUT; - } - before = after; - } /* end of connect-to-each-address loop */ - - *sockconn = sockfd; /* the socket descriptor we've connected */ - - if(sockfd == CURL_SOCKET_BAD) { - /* no good connect was made */ - failf(data, "couldn't connect to %s at %s:%ld", - conn->bits.proxy?"proxy":"host", - conn->bits.proxy?conn->proxy.name:conn->host.name, conn->port); - return CURLE_COULDNT_CONNECT; + conn->tempaddr[0] = conn->tempaddr[0]->ai_next; } - /* leave the socket in non-blocking mode */ - - /* store the address we use */ - if(addr) - *addr = curr_addr; + if(conn->tempsock[0] == CURL_SOCKET_BAD) + return result; data->info.numconnects++; /* to track the number of connections made */ @@ -1251,12 +1251,13 @@ int Curl_closesocket(struct connectdata *conn, else return conn->fclosesocket(conn->closesocket_client, sock); } - sclose(sock); if(conn) /* tell the multi-socket code about this */ Curl_multi_closed(conn, sock); + sclose(sock); + return 0; } @@ -1320,12 +1321,34 @@ CURLcode Curl_socket(struct connectdata *conn, return CURLE_COULDNT_CONNECT; #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) - if(conn->scope && (addr->family == AF_INET6)) { + if(conn->scope_id && (addr->family == AF_INET6)) { struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr; - sa6->sin6_scope_id = conn->scope; + sa6->sin6_scope_id = conn->scope_id; } #endif return CURLE_OK; } + +#ifdef CURLDEBUG +/* + * Curl_conncontrol() is used to set the conn->bits.close bit on or off. It + * MUST be called with the connclose() or connkeep() macros with a stated + * reason. The reason is only shown in debug builds but helps to figure out + * decision paths when connections are or aren't re-used as expected. + */ +void Curl_conncontrol(struct connectdata *conn, bool closeit, + const char *reason) +{ +#if defined(CURL_DISABLE_VERBOSE_STRINGS) + (void) reason; +#endif + + infof(conn->data, "Marked for [%s]: %s\n", closeit?"closure":"keep alive", + reason); + + conn->bits.close = closeit; /* the only place in the source code that should + assign this bit */ +} +#endif diff --git a/lib/connect.h b/lib/connect.h index ab98002..91646c7 100644 --- a/lib/connect.h +++ b/lib/connect.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,11 +31,7 @@ CURLcode Curl_is_connected(struct connectdata *conn, bool *connected); CURLcode Curl_connecthost(struct connectdata *conn, - const struct Curl_dns_entry *host, /* connect to - this */ - curl_socket_t *sockconn, /* not set if error */ - Curl_addrinfo **addr, /* the one we used */ - bool *connected); /* truly connected? */ + const struct Curl_dns_entry *host); /* generic function that returns how much time there's left to run, according to the timeouts set */ @@ -44,6 +40,8 @@ long Curl_timeleft(struct SessionHandle *data, bool duringconnect); #define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */ +#define HAPPY_EYEBALLS_TIMEOUT 200 /* milliseconds to wait between + IPv4/IPv6 connection attempts */ /* * Used to extract socket and connectdata struct for the most recent @@ -104,4 +102,21 @@ CURLcode Curl_socket(struct connectdata *conn, struct Curl_sockaddr_ex *addr, curl_socket_t *sockfd); +#ifdef CURLDEBUG +/* + * Curl_connclose() sets the bit.close bit to TRUE with an explanation. + * Nothing else. + */ +void Curl_conncontrol(struct connectdata *conn, + bool closeit, + const char *reason); +#define connclose(x,y) Curl_conncontrol(x,TRUE, y) +#define connkeep(x,y) Curl_conncontrol(x, FALSE, y) +#else /* if !CURLDEBUG */ + +#define connclose(x,y) (x)->bits.close = TRUE +#define connkeep(x,y) (x)->bits.close = FALSE + +#endif + #endif /* HEADER_CURL_CONNECT_H */ diff --git a/lib/cookie.c b/lib/cookie.c index b679067..0b9c8d3 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,14 +26,17 @@ RECEIVING COOKIE INFORMATION ============================ -struct CookieInfo *cookie_init(char *file); +struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, + const char *file, struct CookieInfo *inc, bool newsession); Inits a cookie struct to store data in a local file. This is always called before any cookies are set. -int cookies_set(struct CookieInfo *cookie, char *cookie_line); +struct Cookie *Curl_cookie_add(struct SessionHandle *data, + struct CookieInfo *c, bool httpheader, char *lineptr, + const char *domain, const char *path); - The 'cookie_line' parameter is a full "Set-cookie:" line as + The 'lineptr' parameter is a full "Set-cookie:" line as received from a server. The function need to replace previously stored lines that this new @@ -47,8 +50,8 @@ int cookies_set(struct CookieInfo *cookie, char *cookie_line); SENDING COOKIE INFORMATION ========================== -struct Cookies *cookie_getlist(struct CookieInfo *cookie, - char *host, char *path, bool secure); +struct Cookies *Curl_cookie_getlist(struct CookieInfo *cookie, + char *host, char *path, bool secure); For a given host and path, return a linked list of cookies that the client should send to the server if used now. The secure @@ -95,6 +98,7 @@ Example set of cookies: #include "strtoofft.h" #include "rawstr.h" #include "curl_memrchr.h" +#include "inet_pton.h" /* The last #include file should be: */ #include "memdebug.h" @@ -258,6 +262,8 @@ static char *sanitize_cookie_path(const char *cookie_path) /* * Load cookies from all given cookie files (CURLOPT_COOKIEFILE). + * + * NOTE: OOM or cookie parsing failures are ignored. */ void Curl_cookie_loadfiles(struct SessionHandle *data) { @@ -265,10 +271,17 @@ void Curl_cookie_loadfiles(struct SessionHandle *data) if(list) { Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); while(list) { - data->cookies = Curl_cookie_init(data, - list->data, - data->cookies, - data->set.cookiesession); + struct CookieInfo *newcookies = Curl_cookie_init(data, + list->data, + data->cookies, + data->set.cookiesession); + if(!newcookies) + /* Failure may be due to OOM or a bad cookie; both are ignored + * but only the first should be + */ + infof(data, "ignoring failed cookie_init for %s\n", list->data); + else + data->cookies = newcookies; list = list->next; } curl_slist_free_all(data->change.cookielist); /* clean up list */ @@ -290,6 +303,56 @@ static void strstore(char **str, const char *newstr) *str = strdup(newstr); } +/* + * remove_expired() removes expired cookies. + */ +static void remove_expired(struct CookieInfo *cookies) +{ + struct Cookie *co, *nx, *pv; + curl_off_t now = (curl_off_t)time(NULL); + + co = cookies->cookies; + pv = NULL; + while(co) { + nx = co->next; + if((co->expirestr || co->maxage) && co->expires < now) { + if(co == cookies->cookies) { + cookies->cookies = co->next; + } + else { + pv->next = co->next; + } + cookies->numcookies--; + freecookie(co); + } + else { + pv = co; + } + co = nx; + } +} + +/* + * Return true if the given string is an IP(v4|v6) address. + */ +static bool isip(const char *domain) +{ + struct in_addr addr; +#ifdef ENABLE_IPV6 + struct in6_addr addr6; +#endif + + if(Curl_inet_pton(AF_INET, domain, &addr) +#ifdef ENABLE_IPV6 + || Curl_inet_pton(AF_INET6, domain, &addr6) +#endif + ) { + /* domain name given as IP address */ + return TRUE; + } + + return FALSE; +} /**************************************************************************** * @@ -300,6 +363,8 @@ static void strstore(char **str, const char *newstr) * Be aware that sometimes we get an IP-only host name, and that might also be * a numerical IPv6 address. * + * Returns NULL on out of memory or invalid cookie. This is suboptimal, + * as they should be treated separately. ***************************************************************************/ struct Cookie * @@ -411,24 +476,33 @@ Curl_cookie_add(struct SessionHandle *data, } } else if(Curl_raw_equal("domain", name)) { + bool is_ip; + const char *dotp; + /* Now, we make sure that our host is within the given domain, or the given domain is not valid and thus cannot be set. */ if('.' == whatptr[0]) whatptr++; /* ignore preceding dot */ - if(!domain || tailmatch(whatptr, domain)) { - const char *tailptr=whatptr; - if(tailptr[0] == '.') - tailptr++; - strstore(&co->domain, tailptr); /* don't prefix w/dots - internally */ + is_ip = isip(domain ? domain : whatptr); + + /* check for more dots */ + dotp = strchr(whatptr, '.'); + if(!dotp) + domain=":"; + + if(!domain + || (is_ip && !strcmp(whatptr, domain)) + || (!is_ip && tailmatch(whatptr, domain))) { + strstore(&co->domain, whatptr); if(!co->domain) { badcookie = TRUE; break; } - co->tailmatch=TRUE; /* we always do that if the domain name was - given */ + if(!is_ip) + co->tailmatch=TRUE; /* we always do that if the domain name was + given */ } else { /* we did not get a tailmatch and then the attempted set domain @@ -461,9 +535,6 @@ Curl_cookie_add(struct SessionHandle *data, badcookie = TRUE; break; } - co->expires = - strtol((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0],NULL,10) - + (long)now; } else if(Curl_raw_equal("expires", name)) { strstore(&co->expirestr, whatptr); @@ -471,17 +542,6 @@ Curl_cookie_add(struct SessionHandle *data, badcookie = TRUE; break; } - /* Note that if the date couldn't get parsed for whatever reason, - the cookie will be treated as a session cookie */ - co->expires = curl_getdate(what, &now); - - /* Session cookies have expires set to 0 so if we get that back - from the date parser let's add a second to make it a - non-session cookie */ - if(co->expires == 0) - co->expires = 1; - else if(co->expires < 0) - co->expires = 0; } else if(!co->name) { co->name = strdup(name); @@ -516,6 +576,30 @@ Curl_cookie_add(struct SessionHandle *data, semiptr=strchr(ptr, '\0'); } while(semiptr); + if(co->maxage) { + co->expires = + curlx_strtoofft((*co->maxage=='\"')? + &co->maxage[1]:&co->maxage[0], NULL, 10); + if(CURL_OFF_T_MAX - now < co->expires) + /* avoid overflow */ + co->expires = CURL_OFF_T_MAX; + else + co->expires += now; + } + else if(co->expirestr) { + /* Note that if the date couldn't get parsed for whatever reason, + the cookie will be treated as a session cookie */ + co->expires = curl_getdate(co->expirestr, NULL); + + /* Session cookies have expires set to 0 so if we get that back + from the date parser let's add a second to make it a + non-session cookie */ + if(co->expires == 0) + co->expires = 1; + else if(co->expires < 0) + co->expires = 0; + } + if(!badcookie && !co->domain) { if(domain) { /* no domain was given in the header line, set the default */ @@ -700,6 +784,9 @@ Curl_cookie_add(struct SessionHandle *data, superceeds an already existing cookie, which it may if the previous have the same domain and path as this */ + /* at first, remove expired cookies */ + remove_expired(c); + clist = c->cookies; replace_old = FALSE; while(clist) { @@ -784,7 +871,7 @@ Curl_cookie_add(struct SessionHandle *data, if(c->running) /* Only show this when NOT reading the cookies from a file */ infof(data, "%s cookie %s=\"%s\" for domain %s, path %s, " - "expire %" FORMAT_OFF_T "\n", + "expire %" CURL_FORMAT_CURL_OFF_T "\n", replace_old?"Replaced":"Added", co->name, co->value, co->domain, co->path, co->expires); @@ -809,6 +896,7 @@ Curl_cookie_add(struct SessionHandle *data, * * If 'newsession' is TRUE, discard all "session cookies" on read from file. * + * Returns NULL on out of memory. Invalid cookies are ignored. ****************************************************************************/ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, const char *file, @@ -816,8 +904,9 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, bool newsession) { struct CookieInfo *c; - FILE *fp; + FILE *fp = NULL; bool fromfile=TRUE; + char *line = NULL; if(NULL == inc) { /* we didn't get a struct, create one */ @@ -825,6 +914,8 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, if(!c) return NULL; /* failed to get memory */ c->filename = strdup(file?file:"none"); /* copy the name just in case */ + if(!c->filename) + goto fail; /* failed to get memory */ } else { /* we got an already existing one, use that */ @@ -849,25 +940,26 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, char *lineptr; bool headerline; - char *line = malloc(MAX_COOKIE_LINE); - if(line) { - while(fgets(line, MAX_COOKIE_LINE, fp)) { - if(checkprefix("Set-Cookie:", line)) { - /* This is a cookie line, get it! */ - lineptr=&line[11]; - headerline=TRUE; - } - else { - lineptr=line; - headerline=FALSE; - } - while(*lineptr && ISBLANK(*lineptr)) - lineptr++; - - Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL); + line = malloc(MAX_COOKIE_LINE); + if(!line) + goto fail; + while(fgets(line, MAX_COOKIE_LINE, fp)) { + if(checkprefix("Set-Cookie:", line)) { + /* This is a cookie line, get it! */ + lineptr=&line[11]; + headerline=TRUE; + } + else { + lineptr=line; + headerline=FALSE; } - free(line); /* free the line buffer */ + while(*lineptr && ISBLANK(*lineptr)) + lineptr++; + + Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL); } + free(line); /* free the line buffer */ + if(fromfile) fclose(fp); } @@ -875,6 +967,16 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, c->running = TRUE; /* now, we're running */ return c; + +fail: + Curl_safefree(line); + if(!inc) + /* Only clean up if we allocated it here, as the original could still be in + * use by a share handle */ + Curl_cookie_cleanup(c); + if(fromfile && fp) + fclose(fp); + return NULL; /* out of memory */ } /* sort this so that the longest path gets before the shorter path */ @@ -927,10 +1029,17 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, time_t now = time(NULL); struct Cookie *mainco=NULL; size_t matches = 0; + bool is_ip; if(!c || !c->cookies) return NULL; /* no cookie struct or no cookies in the struct */ + /* at first, remove expired cookies */ + remove_expired(c); + + /* check if host is an IP(v4|v6) address */ + is_ip = isip(host); + co = c->cookies; while(co) { @@ -942,8 +1051,8 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, /* now check if the domain is correct */ if(!co->domain || - (co->tailmatch && tailmatch(co->domain, host)) || - (!co->tailmatch && Curl_raw_equal(host, co->domain)) ) { + (co->tailmatch && !is_ip && tailmatch(co->domain, host)) || + ((!co->tailmatch || is_ip) && Curl_raw_equal(host, co->domain)) ) { /* the right part of the host matches the domain stuff in the cookie data */ @@ -1047,16 +1156,14 @@ void Curl_cookie_clearall(struct CookieInfo *cookies) void Curl_cookie_freelist(struct Cookie *co, bool cookiestoo) { struct Cookie *next; - if(co) { - while(co) { - next = co->next; - if(cookiestoo) - freecookie(co); - else - free(co); /* we only free the struct since the "members" are all just - pointed out in the main cookie list! */ - co = next; - } + while(co) { + next = co->next; + if(cookiestoo) + freecookie(co); + else + free(co); /* we only free the struct since the "members" are all just + pointed out in the main cookie list! */ + co = next; } } @@ -1103,23 +1210,15 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies) * * Curl_cookie_cleanup() * - * Free a "cookie object" previous created with cookie_init(). + * Free a "cookie object" previous created with Curl_cookie_init(). * ****************************************************************************/ void Curl_cookie_cleanup(struct CookieInfo *c) { - struct Cookie *co; - struct Cookie *next; if(c) { if(c->filename) free(c->filename); - co = c->cookies; - - while(co) { - next = co->next; - freecookie(co); - co = next; - } + Curl_cookie_freelist(c->cookies, TRUE); free(c); /* free the base struct as well */ } } @@ -1138,7 +1237,7 @@ static char *get_netscape_format(const struct Cookie *co) "%s\t" /* tailmatch */ "%s\t" /* path */ "%s\t" /* secure */ - "%" FORMAT_OFF_T "\t" /* expires */ + "%" CURL_FORMAT_CURL_OFF_T "\t" /* expires */ "%s\t" /* name */ "%s", /* value */ co->httponly?"#HttpOnly_":"", @@ -1173,6 +1272,9 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere) destination file */ return 0; + /* at first, remove expired cookies */ + remove_expired(c); + if(strequal("-", dumphere)) { /* use stdout */ out = stdout; diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c index 10652c6..1e359d5 100644 --- a/lib/curl_addrinfo.c +++ b/lib/curl_addrinfo.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -33,6 +33,9 @@ #ifdef HAVE_ARPA_INET_H # include #endif +#ifdef HAVE_SYS_UN_H +# include +#endif #ifdef __VMS # include @@ -354,7 +357,7 @@ Curl_he2ai(const struct hostent *he, int port) prevai = ai; } - if(result != CURLE_OK) { + if(result) { Curl_freeaddrinfo(firstai); firstai = NULL; } @@ -477,6 +480,42 @@ Curl_addrinfo *Curl_str2addr(char *address, int port) return NULL; /* bad input format */ } +#ifdef USE_UNIX_SOCKETS +/** + * Given a path to a Unix domain socket, return a newly allocated Curl_addrinfo + * struct initialized with this path. + */ +Curl_addrinfo *Curl_unix2addr(const char *path) +{ + Curl_addrinfo *ai; + struct sockaddr_un *sa_un; + size_t path_len; + + ai = calloc(1, sizeof(Curl_addrinfo)); + if(!ai) + return NULL; + if((ai->ai_addr = calloc(1, sizeof(struct sockaddr_un))) == NULL) { + free(ai); + return NULL; + } + /* sun_path must be able to store the NUL-terminated path */ + path_len = strlen(path); + if(path_len >= sizeof(sa_un->sun_path)) { + free(ai->ai_addr); + free(ai); + return NULL; + } + + ai->ai_family = AF_UNIX; + ai->ai_socktype = SOCK_STREAM; /* assume reliable transport for HTTP */ + ai->ai_addrlen = (curl_socklen_t) sizeof(struct sockaddr_un); + sa_un = (void *) ai->ai_addr; + sa_un->sun_family = AF_UNIX; + memcpy(sa_un->sun_path, path, path_len + 1); /* copy NUL byte */ + return ai; +} +#endif + #if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO) /* * curl_dofreeaddrinfo() diff --git a/lib/curl_addrinfo.h b/lib/curl_addrinfo.h index 6d2b753..4ef8827 100644 --- a/lib/curl_addrinfo.h +++ b/lib/curl_addrinfo.h @@ -79,6 +79,10 @@ Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port); Curl_addrinfo *Curl_str2addr(char *dotted, int port); +#ifdef USE_UNIX_SOCKETS +Curl_addrinfo *Curl_unix2addr(const char *path); +#endif + #if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO) void curl_dofreeaddrinfo(struct addrinfo *freethis, diff --git a/lib/curl_base64.h b/lib/curl_base64.h index 6e200d2..92896fe 100644 --- a/lib/curl_base64.h +++ b/lib/curl_base64.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -25,6 +25,9 @@ CURLcode Curl_base64_encode(struct SessionHandle *data, const char *inputbuff, size_t insize, char **outptr, size_t *outlen); +CURLcode Curl_base64url_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen); CURLcode Curl_base64_decode(const char *src, unsigned char **outptr, size_t *outlen); diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake index 454c9e6..87be9c7 100644 --- a/lib/curl_config.h.cmake +++ b/lib/curl_config.h.cmake @@ -1,7 +1,7 @@ /* lib/curl_config.h.in. Generated somehow by cmake. */ /* when building libcurl itself */ -#cmakedefine BUILDING_LIBCURL ${BUILDING_LIBCURL} +#cmakedefine BUILDING_LIBCURL 1 /* Location of default ca bundle */ #cmakedefine CURL_CA_BUNDLE ${CURL_CA_BUNDLE} @@ -10,62 +10,62 @@ #cmakedefine CURL_CA_PATH ${CURL_CA_PATH} /* to disable cookies support */ -#cmakedefine CURL_DISABLE_COOKIES ${CURL_DISABLE_COOKIES} +#cmakedefine CURL_DISABLE_COOKIES 1 /* to disable cryptographic authentication */ -#cmakedefine CURL_DISABLE_CRYPTO_AUTH ${CURL_DISABLE_CRYPTO_AUTH} +#cmakedefine CURL_DISABLE_CRYPTO_AUTH 1 /* to disable DICT */ -#cmakedefine CURL_DISABLE_DICT ${CURL_DISABLE_DICT} +#cmakedefine CURL_DISABLE_DICT 1 /* to disable FILE */ -#cmakedefine CURL_DISABLE_FILE ${CURL_DISABLE_FILE} +#cmakedefine CURL_DISABLE_FILE 1 /* to disable FTP */ -#cmakedefine CURL_DISABLE_FTP ${CURL_DISABLE_FTP} +#cmakedefine CURL_DISABLE_FTP 1 /* to disable HTTP */ -#cmakedefine CURL_DISABLE_HTTP ${CURL_DISABLE_HTTP} +#cmakedefine CURL_DISABLE_HTTP 1 /* to disable LDAP */ -#cmakedefine CURL_DISABLE_LDAP ${CURL_DISABLE_LDAP} +#cmakedefine CURL_DISABLE_LDAP 1 /* to disable LDAPS */ -#cmakedefine CURL_DISABLE_LDAPS ${CURL_DISABLE_LDAPS} +#cmakedefine CURL_DISABLE_LDAPS 1 /* to disable proxies */ -#cmakedefine CURL_DISABLE_PROXY ${CURL_DISABLE_PROXY} +#cmakedefine CURL_DISABLE_PROXY 1 /* to disable TELNET */ -#cmakedefine CURL_DISABLE_TELNET ${CURL_DISABLE_TELNET} +#cmakedefine CURL_DISABLE_TELNET 1 /* to disable TFTP */ -#cmakedefine CURL_DISABLE_TFTP ${CURL_DISABLE_TFTP} +#cmakedefine CURL_DISABLE_TFTP 1 /* to disable verbose strings */ -#cmakedefine CURL_DISABLE_VERBOSE_STRINGS ${CURL_DISABLE_VERBOSE_STRINGS} +#cmakedefine CURL_DISABLE_VERBOSE_STRINGS 1 /* to make a symbol visible */ -#cmakedefine CURL_EXTERN_SYMBOL ${CURL_EXTERN_SYMBOL} +#cmakedefine CURL_EXTERN_SYMBOL 1 /* Ensure using CURL_EXTERN_SYMBOL is possible */ #ifndef CURL_EXTERN_SYMBOL #define CURL_EXTERN_SYMBOL #endif /* Use Windows LDAP implementation */ -#cmakedefine CURL_LDAP_WIN ${CURL_LDAP_WIN} +#cmakedefine CURL_LDAP_WIN 1 /* when not building a shared library */ -#cmakedefine CURL_STATICLIB ${CURL_STATICLIB} +#cmakedefine CURL_STATICLIB 1 /* Set to explicitly specify we don't want to use thread-safe functions */ -#cmakedefine DISABLED_THREADSAFE ${DISABLED_THREADSAFE} +#cmakedefine DISABLED_THREADSAFE 1 /* your Entropy Gathering Daemon socket pathname */ #cmakedefine EGD_SOCKET ${EGD_SOCKET} /* Define if you want to enable IPv6 support */ -#cmakedefine ENABLE_IPV6 ${ENABLE_IPV6} +#cmakedefine ENABLE_IPV6 1 /* Define to the type qualifier of arg 1 for getnameinfo. */ #cmakedefine GETNAMEINFO_QUAL_ARG1 ${GETNAMEINFO_QUAL_ARG1} @@ -89,646 +89,660 @@ #cmakedefine GETSERVBYPORT_R_BUFSIZE ${GETSERVBYPORT_R_BUFSIZE} /* Define to 1 if you have the alarm function. */ -#cmakedefine HAVE_ALARM ${HAVE_ALARM} +#cmakedefine HAVE_ALARM 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ALLOCA_H ${HAVE_ALLOCA_H} +#cmakedefine HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ARPA_INET_H ${HAVE_ARPA_INET_H} +#cmakedefine HAVE_ARPA_INET_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ARPA_TFTP_H ${HAVE_ARPA_TFTP_H} +#cmakedefine HAVE_ARPA_TFTP_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ASSERT_H ${HAVE_ASSERT_H} +#cmakedefine HAVE_ASSERT_H 1 /* Define to 1 if you have the `basename' function. */ -#cmakedefine HAVE_BASENAME ${HAVE_BASENAME} +#cmakedefine HAVE_BASENAME 1 /* Define to 1 if bool is an available type. */ -#cmakedefine HAVE_BOOL_T ${HAVE_BOOL_T} +#cmakedefine HAVE_BOOL_T 1 /* Define to 1 if you have the clock_gettime function and monotonic timer. */ -#cmakedefine HAVE_CLOCK_GETTIME_MONOTONIC ${HAVE_CLOCK_GETTIME_MONOTONIC} +#cmakedefine HAVE_CLOCK_GETTIME_MONOTONIC 1 /* Define to 1 if you have the `closesocket' function. */ -#cmakedefine HAVE_CLOSESOCKET ${HAVE_CLOSESOCKET} +#cmakedefine HAVE_CLOSESOCKET 1 /* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */ -#cmakedefine HAVE_CRYPTO_CLEANUP_ALL_EX_DATA ${HAVE_CRYPTO_CLEANUP_ALL_EX_DATA} +#cmakedefine HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_CRYPTO_H ${HAVE_CRYPTO_H} +#cmakedefine HAVE_CRYPTO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_DES_H ${HAVE_DES_H} +#cmakedefine HAVE_DES_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_DLFCN_H ${HAVE_DLFCN_H} +#cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */ -#cmakedefine HAVE_ENGINE_LOAD_BUILTIN_ENGINES ${HAVE_ENGINE_LOAD_BUILTIN_ENGINES} +#cmakedefine HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ERRNO_H ${HAVE_ERRNO_H} +#cmakedefine HAVE_ERRNO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ERR_H ${HAVE_ERR_H} +#cmakedefine HAVE_ERR_H 1 /* Define to 1 if you have the fcntl function. */ -#cmakedefine HAVE_FCNTL ${HAVE_FCNTL} +#cmakedefine HAVE_FCNTL 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_FCNTL_H ${HAVE_FCNTL_H} +#cmakedefine HAVE_FCNTL_H 1 /* Define to 1 if you have a working fcntl O_NONBLOCK function. */ -#cmakedefine HAVE_FCNTL_O_NONBLOCK ${HAVE_FCNTL_O_NONBLOCK} +#cmakedefine HAVE_FCNTL_O_NONBLOCK 1 /* Define to 1 if you have the fdopen function. */ -#cmakedefine HAVE_FDOPEN ${HAVE_FDOPEN} +#cmakedefine HAVE_FDOPEN 1 /* Define to 1 if you have the `fork' function. */ -#cmakedefine HAVE_FORK ${HAVE_FORK} +#cmakedefine HAVE_FORK 1 /* Define to 1 if you have the freeaddrinfo function. */ -#cmakedefine HAVE_FREEADDRINFO ${HAVE_FREEADDRINFO} +#cmakedefine HAVE_FREEADDRINFO 1 /* Define to 1 if you have the freeifaddrs function. */ -#cmakedefine HAVE_FREEIFADDRS ${HAVE_FREEIFADDRS} +#cmakedefine HAVE_FREEIFADDRS 1 /* Define to 1 if you have the ftruncate function. */ -#cmakedefine HAVE_FTRUNCATE ${HAVE_FTRUNCATE} +#cmakedefine HAVE_FTRUNCATE 1 /* Define to 1 if you have a working getaddrinfo function. */ -#cmakedefine HAVE_GETADDRINFO ${HAVE_GETADDRINFO} +#cmakedefine HAVE_GETADDRINFO 1 /* Define to 1 if you have the `geteuid' function. */ -#cmakedefine HAVE_GETEUID ${HAVE_GETEUID} +#cmakedefine HAVE_GETEUID 1 /* Define to 1 if you have the gethostbyaddr function. */ -#cmakedefine HAVE_GETHOSTBYADDR ${HAVE_GETHOSTBYADDR} +#cmakedefine HAVE_GETHOSTBYADDR 1 /* Define to 1 if you have the gethostbyaddr_r function. */ -#cmakedefine HAVE_GETHOSTBYADDR_R ${HAVE_GETHOSTBYADDR_R} +#cmakedefine HAVE_GETHOSTBYADDR_R 1 /* gethostbyaddr_r() takes 5 args */ -#cmakedefine HAVE_GETHOSTBYADDR_R_5 ${HAVE_GETHOSTBYADDR_R_5} +#cmakedefine HAVE_GETHOSTBYADDR_R_5 1 /* gethostbyaddr_r() takes 7 args */ -#cmakedefine HAVE_GETHOSTBYADDR_R_7 ${HAVE_GETHOSTBYADDR_R_7} +#cmakedefine HAVE_GETHOSTBYADDR_R_7 1 /* gethostbyaddr_r() takes 8 args */ -#cmakedefine HAVE_GETHOSTBYADDR_R_8 ${HAVE_GETHOSTBYADDR_R_8} +#cmakedefine HAVE_GETHOSTBYADDR_R_8 1 /* Define to 1 if you have the gethostbyname function. */ -#cmakedefine HAVE_GETHOSTBYNAME ${HAVE_GETHOSTBYNAME} +#cmakedefine HAVE_GETHOSTBYNAME 1 /* Define to 1 if you have the gethostbyname_r function. */ -#cmakedefine HAVE_GETHOSTBYNAME_R ${HAVE_GETHOSTBYNAME_R} +#cmakedefine HAVE_GETHOSTBYNAME_R 1 /* gethostbyname_r() takes 3 args */ -#cmakedefine HAVE_GETHOSTBYNAME_R_3 ${HAVE_GETHOSTBYNAME_R_3} +#cmakedefine HAVE_GETHOSTBYNAME_R_3 1 /* gethostbyname_r() takes 5 args */ -#cmakedefine HAVE_GETHOSTBYNAME_R_5 ${HAVE_GETHOSTBYNAME_R_5} +#cmakedefine HAVE_GETHOSTBYNAME_R_5 1 /* gethostbyname_r() takes 6 args */ -#cmakedefine HAVE_GETHOSTBYNAME_R_6 ${HAVE_GETHOSTBYNAME_R_6} +#cmakedefine HAVE_GETHOSTBYNAME_R_6 1 /* Define to 1 if you have the gethostname function. */ -#cmakedefine HAVE_GETHOSTNAME ${HAVE_GETHOSTNAME} +#cmakedefine HAVE_GETHOSTNAME 1 /* Define to 1 if you have a working getifaddrs function. */ -#cmakedefine HAVE_GETIFADDRS ${HAVE_GETIFADDRS} +#cmakedefine HAVE_GETIFADDRS 1 /* Define to 1 if you have the getnameinfo function. */ -#cmakedefine HAVE_GETNAMEINFO ${HAVE_GETNAMEINFO} +#cmakedefine HAVE_GETNAMEINFO 1 /* Define to 1 if you have the `getpass_r' function. */ -#cmakedefine HAVE_GETPASS_R ${HAVE_GETPASS_R} +#cmakedefine HAVE_GETPASS_R 1 /* Define to 1 if you have the `getppid' function. */ -#cmakedefine HAVE_GETPPID ${HAVE_GETPPID} +#cmakedefine HAVE_GETPPID 1 /* Define to 1 if you have the `getprotobyname' function. */ -#cmakedefine HAVE_GETPROTOBYNAME ${HAVE_GETPROTOBYNAME} +#cmakedefine HAVE_GETPROTOBYNAME 1 /* Define to 1 if you have the `getpwuid' function. */ -#cmakedefine HAVE_GETPWUID ${HAVE_GETPWUID} +#cmakedefine HAVE_GETPWUID 1 /* Define to 1 if you have the `getrlimit' function. */ -#cmakedefine HAVE_GETRLIMIT ${HAVE_GETRLIMIT} +#cmakedefine HAVE_GETRLIMIT 1 /* Define to 1 if you have the getservbyport_r function. */ -#cmakedefine HAVE_GETSERVBYPORT_R ${HAVE_GETSERVBYPORT_R} +#cmakedefine HAVE_GETSERVBYPORT_R 1 /* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY ${HAVE_GETTIMEOFDAY} +#cmakedefine HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have a working glibc-style strerror_r function. */ -#cmakedefine HAVE_GLIBC_STRERROR_R ${HAVE_GLIBC_STRERROR_R} +#cmakedefine HAVE_GLIBC_STRERROR_R 1 /* Define to 1 if you have a working gmtime_r function. */ -#cmakedefine HAVE_GMTIME_R ${HAVE_GMTIME_R} +#cmakedefine HAVE_GMTIME_R 1 /* if you have the gssapi libraries */ -#cmakedefine HAVE_GSSAPI ${HAVE_GSSAPI} +#cmakedefine HAVE_GSSAPI 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_GSSAPI_GSSAPI_GENERIC_H ${HAVE_GSSAPI_GSSAPI_GENERIC_H} +#cmakedefine HAVE_GSSAPI_GSSAPI_GENERIC_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_GSSAPI_GSSAPI_H ${HAVE_GSSAPI_GSSAPI_H} +#cmakedefine HAVE_GSSAPI_GSSAPI_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_GSSAPI_GSSAPI_KRB5_H ${HAVE_GSSAPI_GSSAPI_KRB5_H} +#cmakedefine HAVE_GSSAPI_GSSAPI_KRB5_H 1 /* if you have the GNU gssapi libraries */ -#cmakedefine HAVE_GSSGNU ${HAVE_GSSGNU} +#cmakedefine HAVE_GSSGNU 1 /* if you have the Heimdal gssapi libraries */ -#cmakedefine HAVE_GSSHEIMDAL ${HAVE_GSSHEIMDAL} +#cmakedefine HAVE_GSSHEIMDAL 1 /* if you have the MIT gssapi libraries */ -#cmakedefine HAVE_GSSMIT ${HAVE_GSSMIT} +#cmakedefine HAVE_GSSMIT 1 /* Define to 1 if you have the `idna_strerror' function. */ -#cmakedefine HAVE_IDNA_STRERROR ${HAVE_IDNA_STRERROR} +#cmakedefine HAVE_IDNA_STRERROR 1 /* Define to 1 if you have the `idn_free' function. */ -#cmakedefine HAVE_IDN_FREE ${HAVE_IDN_FREE} +#cmakedefine HAVE_IDN_FREE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_IDN_FREE_H ${HAVE_IDN_FREE_H} +#cmakedefine HAVE_IDN_FREE_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_IFADDRS_H ${HAVE_IFADDRS_H} +#cmakedefine HAVE_IFADDRS_H 1 /* Define to 1 if you have the `inet_addr' function. */ -#cmakedefine HAVE_INET_ADDR ${HAVE_INET_ADDR} +#cmakedefine HAVE_INET_ADDR 1 /* Define to 1 if you have the inet_ntoa_r function. */ -#cmakedefine HAVE_INET_NTOA_R ${HAVE_INET_NTOA_R} +#cmakedefine HAVE_INET_NTOA_R 1 /* inet_ntoa_r() takes 2 args */ -#cmakedefine HAVE_INET_NTOA_R_2 ${HAVE_INET_NTOA_R_2} +#cmakedefine HAVE_INET_NTOA_R_2 1 /* inet_ntoa_r() takes 3 args */ -#cmakedefine HAVE_INET_NTOA_R_3 ${HAVE_INET_NTOA_R_3} +#cmakedefine HAVE_INET_NTOA_R_3 1 /* Define to 1 if you have a IPv6 capable working inet_ntop function. */ -#cmakedefine HAVE_INET_NTOP ${HAVE_INET_NTOP} +#cmakedefine HAVE_INET_NTOP 1 /* Define to 1 if you have a IPv6 capable working inet_pton function. */ -#cmakedefine HAVE_INET_PTON ${HAVE_INET_PTON} +#cmakedefine HAVE_INET_PTON 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} +#cmakedefine HAVE_INTTYPES_H 1 /* Define to 1 if you have the ioctl function. */ -#cmakedefine HAVE_IOCTL ${HAVE_IOCTL} +#cmakedefine HAVE_IOCTL 1 /* Define to 1 if you have the ioctlsocket function. */ -#cmakedefine HAVE_IOCTLSOCKET ${HAVE_IOCTLSOCKET} +#cmakedefine HAVE_IOCTLSOCKET 1 /* Define to 1 if you have the IoctlSocket camel case function. */ -#cmakedefine HAVE_IOCTLSOCKET_CAMEL ${HAVE_IOCTLSOCKET_CAMEL} +#cmakedefine HAVE_IOCTLSOCKET_CAMEL 1 /* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. */ -#cmakedefine HAVE_IOCTLSOCKET_CAMEL_FIONBIO ${HAVE_IOCTLSOCKET_CAMEL_FIONBIO} +#cmakedefine HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1 /* Define to 1 if you have a working ioctlsocket FIONBIO function. */ -#cmakedefine HAVE_IOCTLSOCKET_FIONBIO ${HAVE_IOCTLSOCKET_FIONBIO} +#cmakedefine HAVE_IOCTLSOCKET_FIONBIO 1 /* Define to 1 if you have a working ioctl FIONBIO function. */ -#cmakedefine HAVE_IOCTL_FIONBIO ${HAVE_IOCTL_FIONBIO} +#cmakedefine HAVE_IOCTL_FIONBIO 1 /* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ -#cmakedefine HAVE_IOCTL_SIOCGIFADDR ${HAVE_IOCTL_SIOCGIFADDR} +#cmakedefine HAVE_IOCTL_SIOCGIFADDR 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_IO_H ${HAVE_IO_H} +#cmakedefine HAVE_IO_H 1 /* if you have the Kerberos4 libraries (including -ldes) */ -#cmakedefine HAVE_KRB4 ${HAVE_KRB4} +#cmakedefine HAVE_KRB4 1 /* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */ -#cmakedefine HAVE_KRB_GET_OUR_IP_FOR_REALM ${HAVE_KRB_GET_OUR_IP_FOR_REALM} +#cmakedefine HAVE_KRB_GET_OUR_IP_FOR_REALM 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_KRB_H ${HAVE_KRB_H} +#cmakedefine HAVE_KRB_H 1 /* Define to 1 if you have the lber.h header file. */ -#cmakedefine HAVE_LBER_H ${HAVE_LBER_H} +#cmakedefine HAVE_LBER_H 1 /* Define to 1 if you have the ldapssl.h header file. */ -#cmakedefine HAVE_LDAPSSL_H ${HAVE_LDAPSSL_H} +#cmakedefine HAVE_LDAPSSL_H 1 /* Define to 1 if you have the ldap.h header file. */ -#cmakedefine HAVE_LDAP_H ${HAVE_LDAP_H} +#cmakedefine HAVE_LDAP_H 1 /* Use LDAPS implementation */ -#cmakedefine HAVE_LDAP_SSL ${HAVE_LDAP_SSL} +#cmakedefine HAVE_LDAP_SSL 1 /* Define to 1 if you have the ldap_ssl.h header file. */ -#cmakedefine HAVE_LDAP_SSL_H ${HAVE_LDAP_SSL_H} +#cmakedefine HAVE_LDAP_SSL_H 1 /* Define to 1 if you have the `ldap_url_parse' function. */ -#cmakedefine HAVE_LDAP_URL_PARSE ${HAVE_LDAP_URL_PARSE} +#cmakedefine HAVE_LDAP_URL_PARSE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LIBGEN_H ${HAVE_LIBGEN_H} +#cmakedefine HAVE_LIBGEN_H 1 /* Define to 1 if you have the `idn' library (-lidn). */ -#cmakedefine HAVE_LIBIDN ${HAVE_LIBIDN} +#cmakedefine HAVE_LIBIDN 1 /* Define to 1 if you have the `resolv' library (-lresolv). */ -#cmakedefine HAVE_LIBRESOLV ${HAVE_LIBRESOLV} +#cmakedefine HAVE_LIBRESOLV 1 /* Define to 1 if you have the `resolve' library (-lresolve). */ -#cmakedefine HAVE_LIBRESOLVE ${HAVE_LIBRESOLVE} +#cmakedefine HAVE_LIBRESOLVE 1 /* Define to 1 if you have the `socket' library (-lsocket). */ -#cmakedefine HAVE_LIBSOCKET ${HAVE_LIBSOCKET} +#cmakedefine HAVE_LIBSOCKET 1 /* Define to 1 if you have the `ssh2' library (-lssh2). */ -#cmakedefine HAVE_LIBSSH2 ${HAVE_LIBSSH2} +#cmakedefine HAVE_LIBSSH2 1 + +/* Define to 1 if libssh2 provides `libssh2_version'. */ +#cmakedefine HAVE_LIBSSH2_VERSION 1 + +/* Define to 1 if libssh2 provides `libssh2_init'. */ +#cmakedefine HAVE_LIBSSH2_INIT 1 + +/* Define to 1 if libssh2 provides `libssh2_exit'. */ +#cmakedefine HAVE_LIBSSH2_EXIT 1 + +/* Define to 1 if libssh2 provides `libssh2_scp_send64'. */ +#cmakedefine HAVE_LIBSSH2_SCP_SEND64 1 + +/* Define to 1 if libssh2 provides `libssh2_session_handshake'. */ +#cmakedefine HAVE_LIBSSH2_SESSION_HANDSHAKE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LIBSSH2_H ${HAVE_LIBSSH2_H} +#cmakedefine HAVE_LIBSSH2_H 1 /* Define to 1 if you have the `ssl' library (-lssl). */ -#cmakedefine HAVE_LIBSSL ${HAVE_LIBSSL} +#cmakedefine HAVE_LIBSSL 1 /* if zlib is available */ -#cmakedefine HAVE_LIBZ ${HAVE_LIBZ} +#cmakedefine HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LIMITS_H ${HAVE_LIMITS_H} +#cmakedefine HAVE_LIMITS_H 1 /* if your compiler supports LL */ -#cmakedefine HAVE_LL ${HAVE_LL} +#cmakedefine HAVE_LL 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LOCALE_H ${HAVE_LOCALE_H} +#cmakedefine HAVE_LOCALE_H 1 /* Define to 1 if you have a working localtime_r function. */ -#cmakedefine HAVE_LOCALTIME_R ${HAVE_LOCALTIME_R} +#cmakedefine HAVE_LOCALTIME_R 1 /* Define to 1 if the compiler supports the 'long long' data type. */ -#cmakedefine HAVE_LONGLONG ${HAVE_LONGLONG} +#cmakedefine HAVE_LONGLONG 1 /* Define to 1 if you have the malloc.h header file. */ -#cmakedefine HAVE_MALLOC_H ${HAVE_MALLOC_H} +#cmakedefine HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H} +#cmakedefine HAVE_MEMORY_H 1 /* Define to 1 if you have the MSG_NOSIGNAL flag. */ -#cmakedefine HAVE_MSG_NOSIGNAL ${HAVE_MSG_NOSIGNAL} +#cmakedefine HAVE_MSG_NOSIGNAL 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_NETDB_H ${HAVE_NETDB_H} +#cmakedefine HAVE_NETDB_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_NETINET_IN_H ${HAVE_NETINET_IN_H} +#cmakedefine HAVE_NETINET_IN_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_NETINET_TCP_H ${HAVE_NETINET_TCP_H} +#cmakedefine HAVE_NETINET_TCP_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_NET_IF_H ${HAVE_NET_IF_H} +#cmakedefine HAVE_NET_IF_H 1 /* Define to 1 if NI_WITHSCOPEID exists and works. */ -#cmakedefine HAVE_NI_WITHSCOPEID ${HAVE_NI_WITHSCOPEID} +#cmakedefine HAVE_NI_WITHSCOPEID 1 -/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE - */ -#cmakedefine HAVE_OLD_GSSMIT ${HAVE_OLD_GSSMIT} +/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE */ +#cmakedefine HAVE_OLD_GSSMIT 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_CRYPTO_H ${HAVE_OPENSSL_CRYPTO_H} +#cmakedefine HAVE_OPENSSL_CRYPTO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_ENGINE_H ${HAVE_OPENSSL_ENGINE_H} +#cmakedefine HAVE_OPENSSL_ENGINE_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_ERR_H ${HAVE_OPENSSL_ERR_H} +#cmakedefine HAVE_OPENSSL_ERR_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_PEM_H ${HAVE_OPENSSL_PEM_H} +#cmakedefine HAVE_OPENSSL_PEM_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_PKCS12_H ${HAVE_OPENSSL_PKCS12_H} +#cmakedefine HAVE_OPENSSL_PKCS12_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_RSA_H ${HAVE_OPENSSL_RSA_H} +#cmakedefine HAVE_OPENSSL_RSA_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_SSL_H ${HAVE_OPENSSL_SSL_H} +#cmakedefine HAVE_OPENSSL_SSL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_OPENSSL_X509_H ${HAVE_OPENSSL_X509_H} +#cmakedefine HAVE_OPENSSL_X509_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_PEM_H ${HAVE_PEM_H} +#cmakedefine HAVE_PEM_H 1 /* Define to 1 if you have the `perror' function. */ -#cmakedefine HAVE_PERROR ${HAVE_PERROR} +#cmakedefine HAVE_PERROR 1 /* Define to 1 if you have the `pipe' function. */ -#cmakedefine HAVE_PIPE ${HAVE_PIPE} +#cmakedefine HAVE_PIPE 1 /* Define to 1 if you have a working poll function. */ -#cmakedefine HAVE_POLL ${HAVE_POLL} +#cmakedefine HAVE_POLL 1 /* If you have a fine poll */ -#cmakedefine HAVE_POLL_FINE ${HAVE_POLL_FINE} +#cmakedefine HAVE_POLL_FINE 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_POLL_H ${HAVE_POLL_H} +#cmakedefine HAVE_POLL_H 1 /* Define to 1 if you have a working POSIX-style strerror_r function. */ -#cmakedefine HAVE_POSIX_STRERROR_R ${HAVE_POSIX_STRERROR_R} +#cmakedefine HAVE_POSIX_STRERROR_R 1 + +/* Define to 1 if you have the header file */ +#cmakedefine HAVE_PTHREAD_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_PWD_H ${HAVE_PWD_H} +#cmakedefine HAVE_PWD_H 1 /* Define to 1 if you have the `RAND_egd' function. */ -#cmakedefine HAVE_RAND_EGD ${HAVE_RAND_EGD} +#cmakedefine HAVE_RAND_EGD 1 /* Define to 1 if you have the `RAND_screen' function. */ -#cmakedefine HAVE_RAND_SCREEN ${HAVE_RAND_SCREEN} +#cmakedefine HAVE_RAND_SCREEN 1 /* Define to 1 if you have the `RAND_status' function. */ -#cmakedefine HAVE_RAND_STATUS ${HAVE_RAND_STATUS} +#cmakedefine HAVE_RAND_STATUS 1 /* Define to 1 if you have the recv function. */ -#cmakedefine HAVE_RECV ${HAVE_RECV} +#cmakedefine HAVE_RECV 1 /* Define to 1 if you have the recvfrom function. */ -#cmakedefine HAVE_RECVFROM ${HAVE_RECVFROM} +#cmakedefine HAVE_RECVFROM 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_RSA_H ${HAVE_RSA_H} +#cmakedefine HAVE_RSA_H 1 /* Define to 1 if you have the select function. */ -#cmakedefine HAVE_SELECT ${HAVE_SELECT} +#cmakedefine HAVE_SELECT 1 /* Define to 1 if you have the send function. */ -#cmakedefine HAVE_SEND ${HAVE_SEND} +#cmakedefine HAVE_SEND 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SETJMP_H ${HAVE_SETJMP_H} +#cmakedefine HAVE_SETJMP_H 1 /* Define to 1 if you have the `setlocale' function. */ -#cmakedefine HAVE_SETLOCALE ${HAVE_SETLOCALE} +#cmakedefine HAVE_SETLOCALE 1 /* Define to 1 if you have the `setmode' function. */ -#cmakedefine HAVE_SETMODE ${HAVE_SETMODE} +#cmakedefine HAVE_SETMODE 1 /* Define to 1 if you have the `setrlimit' function. */ -#cmakedefine HAVE_SETRLIMIT ${HAVE_SETRLIMIT} +#cmakedefine HAVE_SETRLIMIT 1 /* Define to 1 if you have the setsockopt function. */ -#cmakedefine HAVE_SETSOCKOPT ${HAVE_SETSOCKOPT} +#cmakedefine HAVE_SETSOCKOPT 1 /* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ -#cmakedefine HAVE_SETSOCKOPT_SO_NONBLOCK ${HAVE_SETSOCKOPT_SO_NONBLOCK} +#cmakedefine HAVE_SETSOCKOPT_SO_NONBLOCK 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SGTTY_H ${HAVE_SGTTY_H} +#cmakedefine HAVE_SGTTY_H 1 /* Define to 1 if you have the sigaction function. */ -#cmakedefine HAVE_SIGACTION ${HAVE_SIGACTION} +#cmakedefine HAVE_SIGACTION 1 /* Define to 1 if you have the siginterrupt function. */ -#cmakedefine HAVE_SIGINTERRUPT ${HAVE_SIGINTERRUPT} +#cmakedefine HAVE_SIGINTERRUPT 1 /* Define to 1 if you have the signal function. */ -#cmakedefine HAVE_SIGNAL ${HAVE_SIGNAL} +#cmakedefine HAVE_SIGNAL 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SIGNAL_H ${HAVE_SIGNAL_H} +#cmakedefine HAVE_SIGNAL_H 1 /* Define to 1 if you have the sigsetjmp function or macro. */ -#cmakedefine HAVE_SIGSETJMP ${HAVE_SIGSETJMP} +#cmakedefine HAVE_SIGSETJMP 1 /* Define to 1 if sig_atomic_t is an available typedef. */ -#cmakedefine HAVE_SIG_ATOMIC_T ${HAVE_SIG_ATOMIC_T} +#cmakedefine HAVE_SIG_ATOMIC_T 1 /* Define to 1 if sig_atomic_t is already defined as volatile. */ -#cmakedefine HAVE_SIG_ATOMIC_T_VOLATILE ${HAVE_SIG_ATOMIC_T_VOLATILE} +#cmakedefine HAVE_SIG_ATOMIC_T_VOLATILE 1 /* Define to 1 if struct sockaddr_in6 has the sin6_scope_id member */ -#cmakedefine HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID ${HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID} +#cmakedefine HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 /* Define to 1 if you have the `socket' function. */ -#cmakedefine HAVE_SOCKET ${HAVE_SOCKET} - -/* Define this if you have the SPNEGO library fbopenssl */ -#cmakedefine HAVE_SPNEGO ${HAVE_SPNEGO} +#cmakedefine HAVE_SOCKET 1 /* Define to 1 if you have the `SSL_get_shutdown' function. */ -#cmakedefine HAVE_SSL_GET_SHUTDOWN ${HAVE_SSL_GET_SHUTDOWN} +#cmakedefine HAVE_SSL_GET_SHUTDOWN 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SSL_H ${HAVE_SSL_H} +#cmakedefine HAVE_SSL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDBOOL_H ${HAVE_STDBOOL_H} +#cmakedefine HAVE_STDBOOL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} +#cmakedefine HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDIO_H ${HAVE_STDIO_H} +#cmakedefine HAVE_STDIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H ${HAVE_STDLIB_H} +#cmakedefine HAVE_STDLIB_H 1 /* Define to 1 if you have the strcasecmp function. */ -#cmakedefine HAVE_STRCASECMP ${HAVE_STRCASECMP} +#cmakedefine HAVE_STRCASECMP 1 /* Define to 1 if you have the strcasestr function. */ -#cmakedefine HAVE_STRCASESTR ${HAVE_STRCASESTR} +#cmakedefine HAVE_STRCASESTR 1 /* Define to 1 if you have the strcmpi function. */ -#cmakedefine HAVE_STRCMPI ${HAVE_STRCMPI} +#cmakedefine HAVE_STRCMPI 1 /* Define to 1 if you have the strdup function. */ -#cmakedefine HAVE_STRDUP ${HAVE_STRDUP} +#cmakedefine HAVE_STRDUP 1 /* Define to 1 if you have the strerror_r function. */ -#cmakedefine HAVE_STRERROR_R ${HAVE_STRERROR_R} +#cmakedefine HAVE_STRERROR_R 1 /* Define to 1 if you have the stricmp function. */ -#cmakedefine HAVE_STRICMP ${HAVE_STRICMP} +#cmakedefine HAVE_STRICMP 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H} +#cmakedefine HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H ${HAVE_STRING_H} +#cmakedefine HAVE_STRING_H 1 /* Define to 1 if you have the strlcat function. */ -#cmakedefine HAVE_STRLCAT ${HAVE_STRLCAT} +#cmakedefine HAVE_STRLCAT 1 /* Define to 1 if you have the `strlcpy' function. */ -#cmakedefine HAVE_STRLCPY ${HAVE_STRLCPY} +#cmakedefine HAVE_STRLCPY 1 /* Define to 1 if you have the strncasecmp function. */ -#cmakedefine HAVE_STRNCASECMP ${HAVE_STRNCASECMP} +#cmakedefine HAVE_STRNCASECMP 1 /* Define to 1 if you have the strncmpi function. */ -#cmakedefine HAVE_STRNCMPI ${HAVE_STRNCMPI} +#cmakedefine HAVE_STRNCMPI 1 /* Define to 1 if you have the strnicmp function. */ -#cmakedefine HAVE_STRNICMP ${HAVE_STRNICMP} +#cmakedefine HAVE_STRNICMP 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STROPTS_H ${HAVE_STROPTS_H} +#cmakedefine HAVE_STROPTS_H 1 /* Define to 1 if you have the strstr function. */ -#cmakedefine HAVE_STRSTR ${HAVE_STRSTR} +#cmakedefine HAVE_STRSTR 1 /* Define to 1 if you have the strtok_r function. */ -#cmakedefine HAVE_STRTOK_R ${HAVE_STRTOK_R} +#cmakedefine HAVE_STRTOK_R 1 /* Define to 1 if you have the strtoll function. */ -#cmakedefine HAVE_STRTOLL ${HAVE_STRTOLL} +#cmakedefine HAVE_STRTOLL 1 /* if struct sockaddr_storage is defined */ -#cmakedefine HAVE_STRUCT_SOCKADDR_STORAGE ${HAVE_STRUCT_SOCKADDR_STORAGE} +#cmakedefine HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define to 1 if you have the timeval struct. */ -#cmakedefine HAVE_STRUCT_TIMEVAL ${HAVE_STRUCT_TIMEVAL} +#cmakedefine HAVE_STRUCT_TIMEVAL 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_FILIO_H ${HAVE_SYS_FILIO_H} +#cmakedefine HAVE_SYS_FILIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_IOCTL_H ${HAVE_SYS_IOCTL_H} +#cmakedefine HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_PARAM_H ${HAVE_SYS_PARAM_H} +#cmakedefine HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_POLL_H ${HAVE_SYS_POLL_H} +#cmakedefine HAVE_SYS_POLL_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_RESOURCE_H ${HAVE_SYS_RESOURCE_H} +#cmakedefine HAVE_SYS_RESOURCE_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SELECT_H ${HAVE_SYS_SELECT_H} +#cmakedefine HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H} +#cmakedefine HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SOCKIO_H ${HAVE_SYS_SOCKIO_H} +#cmakedefine HAVE_SYS_SOCKIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H} +#cmakedefine HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIME_H ${HAVE_SYS_TIME_H} +#cmakedefine HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} +#cmakedefine HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_UIO_H ${HAVE_SYS_UIO_H} +#cmakedefine HAVE_SYS_UIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_UN_H ${HAVE_SYS_UN_H} +#cmakedefine HAVE_SYS_UN_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_UTIME_H ${HAVE_SYS_UTIME_H} +#cmakedefine HAVE_SYS_UTIME_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_TERMIOS_H ${HAVE_TERMIOS_H} +#cmakedefine HAVE_TERMIOS_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_TERMIO_H ${HAVE_TERMIO_H} +#cmakedefine HAVE_TERMIO_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_TIME_H ${HAVE_TIME_H} +#cmakedefine HAVE_TIME_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_TLD_H ${HAVE_TLD_H} +#cmakedefine HAVE_TLD_H 1 /* Define to 1 if you have the `tld_strerror' function. */ -#cmakedefine HAVE_TLD_STRERROR ${HAVE_TLD_STRERROR} +#cmakedefine HAVE_TLD_STRERROR 1 /* Define to 1 if you have the `uname' function. */ -#cmakedefine HAVE_UNAME ${HAVE_UNAME} +#cmakedefine HAVE_UNAME 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} +#cmakedefine HAVE_UNISTD_H 1 /* Define to 1 if you have the `utime' function. */ -#cmakedefine HAVE_UTIME ${HAVE_UTIME} +#cmakedefine HAVE_UTIME 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UTIME_H ${HAVE_UTIME_H} +#cmakedefine HAVE_UTIME_H 1 /* Define to 1 if compiler supports C99 variadic macro style. */ -#cmakedefine HAVE_VARIADIC_MACROS_C99 ${HAVE_VARIADIC_MACROS_C99} +#cmakedefine HAVE_VARIADIC_MACROS_C99 1 /* Define to 1 if compiler supports old gcc variadic macro style. */ -#cmakedefine HAVE_VARIADIC_MACROS_GCC ${HAVE_VARIADIC_MACROS_GCC} +#cmakedefine HAVE_VARIADIC_MACROS_GCC 1 /* Define to 1 if you have the winber.h header file. */ -#cmakedefine HAVE_WINBER_H ${HAVE_WINBER_H} +#cmakedefine HAVE_WINBER_H 1 /* Define to 1 if you have the windows.h header file. */ -#cmakedefine HAVE_WINDOWS_H ${HAVE_WINDOWS_H} +#cmakedefine HAVE_WINDOWS_H 1 /* Define to 1 if you have the winldap.h header file. */ -#cmakedefine HAVE_WINLDAP_H ${HAVE_WINLDAP_H} +#cmakedefine HAVE_WINLDAP_H 1 /* Define to 1 if you have the winsock2.h header file. */ -#cmakedefine HAVE_WINSOCK2_H ${HAVE_WINSOCK2_H} +#cmakedefine HAVE_WINSOCK2_H 1 /* Define to 1 if you have the winsock.h header file. */ -#cmakedefine HAVE_WINSOCK_H ${HAVE_WINSOCK_H} +#cmakedefine HAVE_WINSOCK_H 1 /* Define this symbol if your OS supports changing the contents of argv */ -#cmakedefine HAVE_WRITABLE_ARGV ${HAVE_WRITABLE_ARGV} +#cmakedefine HAVE_WRITABLE_ARGV 1 /* Define to 1 if you have the writev function. */ -#cmakedefine HAVE_WRITEV ${HAVE_WRITEV} +#cmakedefine HAVE_WRITEV 1 /* Define to 1 if you have the ws2tcpip.h header file. */ -#cmakedefine HAVE_WS2TCPIP_H ${HAVE_WS2TCPIP_H} +#cmakedefine HAVE_WS2TCPIP_H 1 /* Define to 1 if you have the header file. */ -#cmakedefine HAVE_X509_H ${HAVE_X509_H} +#cmakedefine HAVE_X509_H 1 /* Define if you have the header file. */ -#cmakedefine HAVE_PROCESS_H ${HAVE_PROCESS_H} +#cmakedefine HAVE_PROCESS_H 1 /* if you have the zlib.h header file */ -#cmakedefine HAVE_ZLIB_H ${HAVE_ZLIB_H} +#cmakedefine HAVE_ZLIB_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #cmakedefine LT_OBJDIR ${LT_OBJDIR} /* If you lack a fine basename() prototype */ -#cmakedefine NEED_BASENAME_PROTO ${NEED_BASENAME_PROTO} +#cmakedefine NEED_BASENAME_PROTO 1 /* Define to 1 if you need the lber.h header file even with ldap.h */ -#cmakedefine NEED_LBER_H ${NEED_LBER_H} +#cmakedefine NEED_LBER_H 1 /* Define to 1 if you need the malloc.h header file even with stdlib.h */ -#cmakedefine NEED_MALLOC_H ${NEED_MALLOC_H} +#cmakedefine NEED_MALLOC_H 1 /* Define to 1 if _REENTRANT preprocessor symbol must be defined. */ -#cmakedefine NEED_REENTRANT ${NEED_REENTRANT} +#cmakedefine NEED_REENTRANT 1 /* cpu-machine-OS */ #cmakedefine OS ${OS} @@ -761,7 +775,7 @@ #cmakedefine RECVFROM_TYPE_ARG2 ${RECVFROM_TYPE_ARG2} /* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ -#cmakedefine RECVFROM_TYPE_ARG2_IS_VOID ${RECVFROM_TYPE_ARG2_IS_VOID} +#cmakedefine RECVFROM_TYPE_ARG2_IS_VOID 1 /* Define to the type of arg 3 for recvfrom. */ #cmakedefine RECVFROM_TYPE_ARG3 ${RECVFROM_TYPE_ARG3} @@ -773,13 +787,13 @@ #cmakedefine RECVFROM_TYPE_ARG5 ${RECVFROM_TYPE_ARG5} /* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ -#cmakedefine RECVFROM_TYPE_ARG5_IS_VOID ${RECVFROM_TYPE_ARG5_IS_VOID} +#cmakedefine RECVFROM_TYPE_ARG5_IS_VOID 1 /* Define to the type pointed by arg 6 for recvfrom. */ #cmakedefine RECVFROM_TYPE_ARG6 ${RECVFROM_TYPE_ARG6} /* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ -#cmakedefine RECVFROM_TYPE_ARG6_IS_VOID ${RECVFROM_TYPE_ARG6_IS_VOID} +#cmakedefine RECVFROM_TYPE_ARG6_IS_VOID 1 /* Define to the function return type for recvfrom. */ #cmakedefine RECVFROM_TYPE_RETV ${RECVFROM_TYPE_RETV} @@ -857,56 +871,65 @@ #cmakedefine SIZEOF_VOIDP ${SIZEOF_VOIDP} /* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS ${STDC_HEADERS} +#cmakedefine STDC_HEADERS 1 /* Define to the type of arg 3 for strerror_r. */ #cmakedefine STRERROR_R_TYPE_ARG3 ${STRERROR_R_TYPE_ARG3} /* Define to 1 if you can safely include both and . */ -#cmakedefine TIME_WITH_SYS_TIME ${TIME_WITH_SYS_TIME} +#cmakedefine TIME_WITH_SYS_TIME 1 /* Define if you want to enable c-ares support */ -#cmakedefine USE_ARES ${USE_ARES} +#cmakedefine USE_ARES 1 + +/* Define if you want to enable POSIX threaded DNS lookup */ +#cmakedefine USE_THREADS_POSIX 1 /* Define to disable non-blocking sockets. */ -#cmakedefine USE_BLOCKING_SOCKETS ${USE_BLOCKING_SOCKETS} +#cmakedefine USE_BLOCKING_SOCKETS 1 /* if GnuTLS is enabled */ -#cmakedefine USE_GNUTLS ${USE_GNUTLS} +#cmakedefine USE_GNUTLS 1 /* if PolarSSL is enabled */ -#cmakedefine USE_POLARSSL ${USE_POLARSSL} +#cmakedefine USE_POLARSSL 1 /* if libSSH2 is in use */ -#cmakedefine USE_LIBSSH2 ${USE_LIBSSH2} +#cmakedefine USE_LIBSSH2 1 /* If you want to build curl with the built-in manual */ -#cmakedefine USE_MANUAL ${USE_MANUAL} +#cmakedefine USE_MANUAL 1 /* if NSS is enabled */ -#cmakedefine USE_NSS ${USE_NSS} +#cmakedefine USE_NSS 1 + +/* if you want to use OpenLDAP code instead of legacy ldap implementation */ +#cmakedefine USE_OPENLDAP 1 /* if OpenSSL is in use */ -#cmakedefine USE_OPENSSL ${USE_OPENSSL} +#cmakedefine USE_OPENSSL 1 /* if SSL is enabled */ -#cmakedefine USE_SSLEAY ${USE_SSLEAY} +#cmakedefine USE_SSLEAY 1 + +/* if Unix domain sockets are enabled */ +#cmakedefine USE_UNIX_SOCKETS /* Define to 1 if you are building a Windows target without large file support. */ -#cmakedefine USE_WIN32_LARGE_FILES ${USE_WIN32_LARGE_FILES} +#cmakedefine USE_WIN32_LARGE_FILES 1 /* to enable SSPI support */ -#cmakedefine USE_WINDOWS_SSPI ${USE_WINDOWS_SSPI} +#cmakedefine USE_WINDOWS_SSPI 1 /* Define to 1 if using yaSSL in OpenSSL compatibility mode. */ -#cmakedefine USE_YASSLEMUL ${USE_YASSLEMUL} +#cmakedefine USE_YASSLEMUL 1 /* Version number of package */ #cmakedefine VERSION ${VERSION} /* Define to avoid automatic inclusion of winsock.h */ -#cmakedefine WIN32_LEAN_AND_MEAN ${WIN32_LEAN_AND_MEAN} +#cmakedefine WIN32_LEAN_AND_MEAN 1 /* Define to 1 if OS is AIX. */ #ifndef _ALL_SOURCE diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in index 539f030..1318afc 100644 --- a/lib/curl_config.h.in +++ b/lib/curl_config.h.in @@ -48,6 +48,9 @@ /* to disable RTSP */ #undef CURL_DISABLE_RTSP +/* to disable SMB/CIFS */ +#undef CURL_DISABLE_SMB + /* to disable SMTP */ #undef CURL_DISABLE_SMTP @@ -138,8 +141,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_CRYPTO_H -/* Define to 1 if you have the header file. */ -#undef HAVE_DES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_CYASSL_ERROR_SSL_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H @@ -252,6 +255,9 @@ /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID +/* Define to 1 if you have the `getpwuid_r' function. */ +#undef HAVE_GETPWUID_R + /* Define to 1 if you have the `getrlimit' function. */ #undef HAVE_GETRLIMIT @@ -270,7 +276,7 @@ /* if you have the function gnutls_srp_verifier */ #undef HAVE_GNUTLS_SRP -/* if you have the gssapi libraries */ +/* if you have GSS-API libraries */ #undef HAVE_GSSAPI /* Define to 1 if you have the header file. */ @@ -282,13 +288,13 @@ /* Define to 1 if you have the header file. */ #undef HAVE_GSSAPI_GSSAPI_KRB5_H -/* if you have the GNU gssapi libraries */ +/* if you have GNU GSS */ #undef HAVE_GSSGNU -/* if you have the Heimdal gssapi libraries */ +/* if you have Heimdal */ #undef HAVE_GSSHEIMDAL -/* if you have the MIT gssapi libraries */ +/* if you have MIT Kerberos */ #undef HAVE_GSSMIT /* Define to 1 if you have the `idna_strerror' function. */ @@ -303,6 +309,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_IFADDRS_H +/* Define to 1 if you have the `if_nametoindex' function. */ +#undef HAVE_IF_NAMETOINDEX + /* Define to 1 if you have the `inet_addr' function. */ #undef HAVE_INET_ADDR @@ -349,15 +358,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_IO_H -/* if you have the Kerberos4 libraries (including -ldes) */ -#undef HAVE_KRB4 - -/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */ -#undef HAVE_KRB_GET_OUR_IP_FOR_REALM - -/* Define to 1 if you have the header file. */ -#undef HAVE_KRB_H - /* Define to 1 if you have the lber.h header file. */ #undef HAVE_LBER_H @@ -385,9 +385,6 @@ /* Define to 1 if you have the `idn' library (-lidn). */ #undef HAVE_LIBIDN -/* Define to 1 if you have the `resolv' library (-lresolv). */ -#undef HAVE_LIBRESOLV - /* Define to 1 if you have the `resolve' library (-lresolve). */ #undef HAVE_LIBRESOLVE @@ -397,24 +394,9 @@ /* Define to 1 if you have the `ssh2' library (-lssh2). */ #undef HAVE_LIBSSH2 -/* Define to 1 if you have the `libssh2_exit' function. */ -#undef HAVE_LIBSSH2_EXIT - /* Define to 1 if you have the header file. */ #undef HAVE_LIBSSH2_H -/* Define to 1 if you have the `libssh2_init' function. */ -#undef HAVE_LIBSSH2_INIT - -/* Define to 1 if you have the `libssh2_scp_send64' function. */ -#undef HAVE_LIBSSH2_SCP_SEND64 - -/* Define to 1 if you have the `libssh2_session_handshake' function. */ -#undef HAVE_LIBSSH2_SESSION_HANDSHAKE - -/* Define to 1 if you have the `libssh2_version' function. */ -#undef HAVE_LIBSSH2_VERSION - /* Define to 1 if you have the `ssl' library (-lssl). */ #undef HAVE_LIBSSL @@ -460,13 +442,13 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H +/* Define to 1 if you have the header file. */ +#undef HAVE_NGHTTP2_NGHTTP2_H + /* Define to 1 if NI_WITHSCOPEID exists and works. */ #undef HAVE_NI_WITHSCOPEID -/* if you have the NSS_InitContext function */ -#undef HAVE_NSS_INITCONTEXT - -/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE +/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE */ #undef HAVE_OLD_GSSMIT @@ -596,9 +578,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SOCKET_H -/* Define this if you have the SPNEGO library fbopenssl */ -#undef HAVE_SPNEGO - /* if you have the function SRP_Calc_client_key */ #undef HAVE_SSLEAY_SRP @@ -644,9 +623,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H -/* Define to 1 if you have the `strlcpy' function. */ -#undef HAVE_STRLCPY - /* Define to 1 if you have the strncasecmp function. */ #undef HAVE_STRNCASECMP @@ -804,9 +780,6 @@ /* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */ #undef NEED_THREAD_SAFE -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - /* Define to enable NTLM delegation to winbind's ntlm_auth helper. */ #undef NTLM_WB_ENABLED @@ -897,6 +870,9 @@ /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T @@ -951,6 +927,9 @@ /* Define to enable metalink support */ #undef USE_METALINK +/* if nghttp2 is in use */ +#undef USE_NGHTTP2 + /* if NSS is enabled */ #undef USE_NSS @@ -975,6 +954,9 @@ /* Use TLS-SRP authentication */ #undef USE_TLS_SRP +/* Use Unix domain sockets */ +#undef USE_UNIX_SOCKETS + /* Define to 1 if you have the `normaliz' (WinIDN) library (-lnormaliz). */ #undef USE_WIN32_IDN diff --git a/lib/curl_endian.c b/lib/curl_endian.c new file mode 100644 index 0000000..14a2883 --- /dev/null +++ b/lib/curl_endian.c @@ -0,0 +1,230 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#include "curl_endian.h" + +/* + * Curl_read16_le() + * + * This function converts a 16-bit integer from the little endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 2 byte buffer. + * + * Returns the integer. + */ +unsigned short Curl_read16_le(unsigned char *buf) +{ + return (unsigned short)(((unsigned short)buf[0]) | + ((unsigned short)buf[1] << 8)); +} + +/* + * Curl_read32_le() + * + * This function converts a 32-bit integer from the little endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 4 byte buffer. + * + * Returns the integer. + */ +unsigned int Curl_read32_le(unsigned char *buf) +{ + return ((unsigned int)buf[0]) | ((unsigned int)buf[1] << 8) | + ((unsigned int)buf[2] << 16) | ((unsigned int)buf[3] << 24); +} + +/* + * Curl_read64_le() + * + * This function converts a 64-bit integer from the little endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 8 byte buffer. + * + * Returns the integer. + */ +#if defined(HAVE_LONGLONG) +unsigned long long Curl_read64_le(unsigned char *buf) +{ + return ((unsigned long long)buf[0]) | + ((unsigned long long)buf[1] << 8) | + ((unsigned long long)buf[2] << 16) | + ((unsigned long long)buf[3] << 24) | + ((unsigned long long)buf[4] << 32) | + ((unsigned long long)buf[5] << 40) | + ((unsigned long long)buf[6] << 48) | + ((unsigned long long)buf[7] << 56); +} +#else +unsigned __int64 Curl_read64_le(unsigned char *buf) +{ + return ((unsigned __int64)buf[0]) | ((unsigned __int64)buf[1] << 8) | + ((unsigned __int64)buf[2] << 16) | ((unsigned __int64)buf[3] << 24) | + ((unsigned __int64)buf[4] << 32) | ((unsigned __int64)buf[5] << 40) | + ((unsigned __int64)buf[6] << 48) | ((unsigned __int64)buf[7] << 56); +} +#endif + +/* + * Curl_read16_be() + * + * This function converts a 16-bit integer from the big endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 2 byte buffer. + * + * Returns the integer. + */ +unsigned short Curl_read16_be(unsigned char *buf) +{ + return (unsigned short)(((unsigned short)buf[0] << 8) | + ((unsigned short)buf[1])); +} + +/* + * Curl_read32_be() + * + * This function converts a 32-bit integer from the big endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 4 byte buffer. + * + * Returns the integer. + */ +unsigned int Curl_read32_be(unsigned char *buf) +{ + return ((unsigned int)buf[0] << 24) | ((unsigned int)buf[1] << 16) | + ((unsigned int)buf[2] << 8) | ((unsigned int)buf[3]); +} + +/* + * Curl_read64_be() + * + * This function converts a 64-bit integer from the big endian format, as + * used in the incoming package to whatever endian format we're using + * natively. + * + * Parameters: + * + * buf [in] - A pointer to a 8 byte buffer. + * + * Returns the integer. + */ +#if defined(HAVE_LONGLONG) +unsigned long long Curl_read64_be(unsigned char *buf) +{ + return ((unsigned long long)buf[0] << 56) | + ((unsigned long long)buf[1] << 48) | + ((unsigned long long)buf[2] << 40) | + ((unsigned long long)buf[3] << 32) | + ((unsigned long long)buf[4] << 24) | + ((unsigned long long)buf[5] << 16) | + ((unsigned long long)buf[6] << 8) | + ((unsigned long long)buf[7]); +} +#else +unsigned __int64 Curl_read64_be(unsigned char *buf) +{ + return ((unsigned __int64)buf[0] << 56) | ((unsigned __int64)buf[1] << 48) | + ((unsigned __int64)buf[2] << 40) | ((unsigned __int64)buf[3] << 32) | + ((unsigned __int64)buf[4] << 24) | ((unsigned __int64)buf[5] << 16) | + ((unsigned __int64)buf[6] << 8) | ((unsigned __int64)buf[7]); +} +#endif + +/* + * Curl_write16_le() + * + * This function converts a 16-bit integer from the native endian format, + * to little endian format ready for sending down the wire. + * + * Parameters: + * + * value [in] - The 16-bit integer value. + * buffer [in] - A pointer to the output buffer. + */ +void Curl_write16_le(const short value, unsigned char *buffer) +{ + buffer[0] = (char)(value & 0x00FF); + buffer[1] = (char)((value & 0xFF00) >> 8); +} + +/* + * Curl_write32_le() + * + * This function converts a 32-bit integer from the native endian format, + * to little endian format ready for sending down the wire. + * + * Parameters: + * + * value [in] - The 32-bit integer value. + * buffer [in] - A pointer to the output buffer. + */ +void Curl_write32_le(const int value, unsigned char *buffer) +{ + buffer[0] = (char)(value & 0x000000FF); + buffer[1] = (char)((value & 0x0000FF00) >> 8); + buffer[2] = (char)((value & 0x00FF0000) >> 16); + buffer[3] = (char)((value & 0xFF000000) >> 24); +} + +#if (CURL_SIZEOF_CURL_OFF_T > 4) +/* + * Curl_write64_le() + * + * This function converts a 64-bit integer from the native endian format, + * to little endian format ready for sending down the wire. + * + * Parameters: + * + * value [in] - The 64-bit integer value. + * buffer [in] - A pointer to the output buffer. + */ +#if defined(HAVE_LONGLONG) +void Curl_write64_le(const long long value, unsigned char *buffer) +#else +void Curl_write64_le(const __int64 value, unsigned char *buffer) +#endif +{ + Curl_write32_le((int)value, buffer); + Curl_write32_le((int)(value >> 32), buffer + 4); +} +#endif diff --git a/lib/curl_endian.h b/lib/curl_endian.h new file mode 100644 index 0000000..e384279 --- /dev/null +++ b/lib/curl_endian.h @@ -0,0 +1,70 @@ +#ifndef HEADER_CURL_ENDIAN_H +#define HEADER_CURL_ENDIAN_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* Converts a 16-bit integer from little endian */ +unsigned short Curl_read16_le(unsigned char *buf); + +/* Converts a 32-bit integer from little endian */ +unsigned int Curl_read32_le(unsigned char *buf); + +#if (CURL_SIZEOF_CURL_OFF_T > 4) +/* Converts a 64-bit integer from little endian */ +#if defined(HAVE_LONGLONG) +unsigned long long Curl_read64_le(unsigned char *buf); +#else +unsigned __int64 Curl_read64_le(unsigned char *buf); +#endif +#endif + +/* Converts a 16-bit integer from big endian */ +unsigned short Curl_read16_be(unsigned char *buf); + +/* Converts a 32-bit integer from big endian */ +unsigned int Curl_read32_be(unsigned char *buf); + +#if (CURL_SIZEOF_CURL_OFF_T > 4) +/* Converts a 64-bit integer from big endian */ +#if defined(HAVE_LONGLONG) +unsigned long long Curl_read64_be(unsigned char *buf); +#else +unsigned __int64 Curl_read64_be(unsigned char *buf); +#endif +#endif + +/* Converts a 16-bit integer to little endian */ +void Curl_write16_le(const short value, unsigned char *buffer); + +/* Converts a 32-bit integer to little endian */ +void Curl_write32_le(const int value, unsigned char *buffer); + +#if (CURL_SIZEOF_CURL_OFF_T > 4) +/* Converts a 64-bit integer to little endian */ +#if defined(HAVE_LONGLONG) +void Curl_write64_le(const long long value, unsigned char *buffer); +#else +void Curl_write64_le(const __int64 value, unsigned char *buffer); +#endif +#endif + +#endif /* HEADER_CURL_ENDIAN_H */ diff --git a/lib/curl_gssapi.c b/lib/curl_gssapi.c index fabbe35..2cd14ff 100644 --- a/lib/curl_gssapi.c +++ b/lib/curl_gssapi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2011, Daniel Stenberg, , et al. + * Copyright (C) 2011 - 2014, 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 @@ -27,17 +27,27 @@ #include "curl_gssapi.h" #include "sendf.h" +static const char spnego_oid_bytes[] = "\x2b\x06\x01\x05\x05\x02"; +gss_OID_desc Curl_spnego_mech_oid = { 6, &spnego_oid_bytes }; +static const char krb5_oid_bytes[] = "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02"; +gss_OID_desc Curl_krb5_mech_oid = { 9, &krb5_oid_bytes }; + OM_uint32 Curl_gss_init_sec_context( struct SessionHandle *data, - OM_uint32 * minor_status, - gss_ctx_id_t * context, + OM_uint32 *minor_status, + gss_ctx_id_t *context, gss_name_t target_name, + gss_OID mech_type, gss_channel_bindings_t input_chan_bindings, gss_buffer_t input_token, gss_buffer_t output_token, - OM_uint32 * ret_flags) + const bool mutual_auth, + OM_uint32 *ret_flags) { - OM_uint32 req_flags = GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG; + OM_uint32 req_flags = GSS_C_REPLAY_FLAG; + + if(mutual_auth) + req_flags |= GSS_C_MUTUAL_FLAG; if(data->set.gssapi_delegation & CURLGSSAPI_DELEGATION_POLICY_FLAG) { #ifdef GSS_C_DELEG_POLICY_FLAG @@ -55,7 +65,7 @@ OM_uint32 Curl_gss_init_sec_context( GSS_C_NO_CREDENTIAL, /* cred_handle */ context, target_name, - GSS_C_NO_OID, /* mech_type */ + mech_type, req_flags, 0, /* time_req */ input_chan_bindings, @@ -66,4 +76,45 @@ OM_uint32 Curl_gss_init_sec_context( NULL /* time_rec */); } +/* + * Curl_gss_log_error() + * + * This is used to log a GSS-API error status. + * + * Parameters: + * + * data [in] - The session handle. + * status [in] - The status code. + * prefix [in] - The prefix of the log message. + */ +void Curl_gss_log_error(struct SessionHandle *data, OM_uint32 status, + const char *prefix) +{ + OM_uint32 maj_stat; + OM_uint32 min_stat; + OM_uint32 msg_ctx = 0; + gss_buffer_desc status_string; + char buf[1024]; + size_t len; + + snprintf(buf, sizeof(buf), "%s", prefix); + len = strlen(buf); + do { + maj_stat = gss_display_status(&min_stat, + status, + GSS_C_MECH_CODE, + GSS_C_NO_OID, + &msg_ctx, + &status_string); + if(sizeof(buf) > len + status_string.length + 1) { + snprintf(buf + len, sizeof(buf) - len, + ": %s", (char*)status_string.value); + len += status_string.length; + } + gss_release_buffer(&min_stat, &status_string); + } while(!GSS_ERROR(maj_stat) && msg_ctx != 0); + + infof(data, "%s\n", buf); +} + #endif /* HAVE_GSSAPI */ diff --git a/lib/curl_gssapi.h b/lib/curl_gssapi.h index ed33b51..35e4b24 100644 --- a/lib/curl_gssapi.h +++ b/lib/curl_gssapi.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2011, Daniel Stenberg, , et al. + * Copyright (C) 2011 - 2014, 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 @@ -39,18 +39,25 @@ # include #endif +extern gss_OID_desc Curl_spnego_mech_oid; +extern gss_OID_desc Curl_krb5_mech_oid; -/* Common method for using gss api */ - +/* Common method for using GSS-API */ OM_uint32 Curl_gss_init_sec_context( struct SessionHandle *data, - OM_uint32 * minor_status, - gss_ctx_id_t * context, + OM_uint32 *minor_status, + gss_ctx_id_t *context, gss_name_t target_name, + gss_OID mech_type, gss_channel_bindings_t input_chan_bindings, gss_buffer_t input_token, gss_buffer_t output_token, - OM_uint32 * ret_flags); + const bool mutual_auth, + OM_uint32 *ret_flags); + +/* Helper to log a GSS-API error status */ +void Curl_gss_log_error(struct SessionHandle *data, OM_uint32 status, + const char *prefix); #endif /* HAVE_GSSAPI */ diff --git a/lib/curl_md4.h b/lib/curl_md4.h index b0be9cf..13c7903 100644 --- a/lib/curl_md4.h +++ b/lib/curl_md4.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,10 +24,12 @@ #include "curl_setup.h" -/* NSS crypto library does not provide the MD4 hash algorithm, so that we have - * a local implementation of it */ -#ifdef USE_NSS +/* NSS and OS/400 crypto library do not provide the MD4 hash algorithm, so + * that we have a local implementation of it */ +#if defined(USE_NSS) || defined(USE_OS400CRYPTO) + void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len); -#endif /* USE_NSS */ + +#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) */ #endif /* HEADER_CURL_MD4_H */ diff --git a/lib/curl_multibyte.c b/lib/curl_multibyte.c index 6c02239..6e65722 100644 --- a/lib/curl_multibyte.c +++ b/lib/curl_multibyte.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -22,7 +22,8 @@ #include "curl_setup.h" -#if defined(USE_WIN32_IDN) || (defined(USE_WINDOWS_SSPI) && defined(UNICODE)) +#if defined(USE_WIN32_IDN) || ((defined(USE_WINDOWS_SSPI) || \ + defined(CURL_LDAP_WIN)) && defined(UNICODE)) /* * MultiByte conversions using Windows kernel32 library. @@ -79,4 +80,4 @@ char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w) return str_utf8; } -#endif /* USE_WIN32_IDN || (USE_WINDOWS_SSPI && UNICODE) */ +#endif /* USE_WIN32_IDN || ((USE_WINDOWS_SSPI || CURL_LDAP_WIN) && UNICODE) */ diff --git a/lib/curl_multibyte.h b/lib/curl_multibyte.h index 7ee5eae..d024755 100644 --- a/lib/curl_multibyte.h +++ b/lib/curl_multibyte.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -23,7 +23,8 @@ ***************************************************************************/ #include "curl_setup.h" -#if defined(USE_WIN32_IDN) || (defined(USE_WINDOWS_SSPI) && defined(UNICODE)) +#if defined(USE_WIN32_IDN) || ((defined(USE_WINDOWS_SSPI) || \ + defined(CURL_LDAP_WIN)) && defined(UNICODE)) /* * MultiByte conversions using Windows kernel32 library. @@ -32,10 +33,11 @@ wchar_t *Curl_convert_UTF8_to_wchar(const char *str_utf8); char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w); -#endif /* USE_WIN32_IDN || (USE_WINDOWS_SSPI && UNICODE) */ +#endif /* USE_WIN32_IDN || ((USE_WINDOWS_SSPI || CURL_LDAP_WIN) && UNICODE) */ -#if defined(USE_WIN32_IDN) || defined(USE_WINDOWS_SSPI) +#if defined(USE_WIN32_IDN) || defined(USE_WINDOWS_SSPI) || \ + defined(CURL_LDAP_WIN) /* * Macros Curl_convert_UTF8_to_tchar(), Curl_convert_tchar_to_UTF8() @@ -85,6 +87,6 @@ typedef union { #endif /* UNICODE */ -#endif /* USE_WIN32_IDN || USE_WINDOWS_SSPI */ +#endif /* USE_WIN32_IDN || USE_WINDOWS_SSPI || CURL_LDAP_WIN */ #endif /* HEADER_CURL_MULTIBYTE_H */ diff --git a/lib/curl_ntlm.c b/lib/curl_ntlm.c index 4d126a5..c77f055 100644 --- a/lib/curl_ntlm.c +++ b/lib/curl_ntlm.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ #include "curl_setup.h" -#ifdef USE_NTLM +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) /* * NTLM details: @@ -39,6 +39,7 @@ #include "curl_ntlm.h" #include "curl_ntlm_msgs.h" #include "curl_ntlm_wb.h" +#include "curl_sasl.h" #include "url.h" #include "curl_memory.h" @@ -46,7 +47,7 @@ #include #if defined(USE_NSS) -#include "nssg.h" +#include "vtls/nssg.h" #elif defined(USE_WINDOWS_SSPI) #include "curl_sspi.h" #endif @@ -69,18 +70,8 @@ CURLcode Curl_input_ntlm(struct connectdata *conn, struct ntlmdata *ntlm; CURLcode result = CURLE_OK; -#ifdef USE_NSS - result = Curl_nss_force_init(conn->data); - if(result) - return result; -#endif - ntlm = proxy ? &conn->proxyntlm : &conn->ntlm; - /* skip initial whitespaces */ - while(*header && ISSPACE(*header)) - header++; - if(checkprefix("NTLM", header)) { header += strlen("NTLM"); @@ -88,8 +79,8 @@ CURLcode Curl_input_ntlm(struct connectdata *conn, header++; if(*header) { - result = Curl_ntlm_decode_type2_message(conn->data, header, ntlm); - if(CURLE_OK != result) + result = Curl_sasl_decode_ntlm_type2_message(conn->data, header, ntlm); + if(result) return result; ntlm->state = NTLMSTATE_TYPE2; /* We got a type-2 message */ @@ -116,12 +107,11 @@ CURLcode Curl_input_ntlm(struct connectdata *conn, /* * This is for creating ntlm header output */ -CURLcode Curl_output_ntlm(struct connectdata *conn, - bool proxy) +CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy) { char *base64 = NULL; size_t len = 0; - CURLcode error; + CURLcode result; /* point to the address of the pointer that holds the string to send to the server, which is for a plain host or for a HTTP proxy */ @@ -179,10 +169,10 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, case NTLMSTATE_TYPE1: default: /* for the weird cases we (re)start here */ /* Create a type-1 message */ - error = Curl_ntlm_create_type1_message(userp, passwdp, ntlm, &base64, - &len); - if(error) - return error; + result = Curl_sasl_create_ntlm_type1_message(userp, passwdp, ntlm, &base64, + &len); + if(result) + return result; if(base64) { Curl_safefree(*allocuserpwd); @@ -192,16 +182,17 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, free(base64); if(!*allocuserpwd) return CURLE_OUT_OF_MEMORY; + DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd)); } break; case NTLMSTATE_TYPE2: /* We already received the type-2 message, create a type-3 message */ - error = Curl_ntlm_create_type3_message(conn->data, userp, passwdp, - ntlm, &base64, &len); - if(error) - return error; + result = Curl_sasl_create_ntlm_type3_message(conn->data, userp, passwdp, + ntlm, &base64, &len); + if(result) + return result; if(base64) { Curl_safefree(*allocuserpwd); @@ -211,6 +202,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, free(base64); if(!*allocuserpwd) return CURLE_OUT_OF_MEMORY; + DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd)); ntlm->state = NTLMSTATE_TYPE3; /* we send a type-3 */ @@ -231,14 +223,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, void Curl_http_ntlm_cleanup(struct connectdata *conn) { -#ifdef USE_WINDOWS_SSPI - Curl_ntlm_sspi_cleanup(&conn->ntlm); - Curl_ntlm_sspi_cleanup(&conn->proxyntlm); -#elif defined(NTLM_WB_ENABLED) + Curl_sasl_ntlm_cleanup(&conn->ntlm); + Curl_sasl_ntlm_cleanup(&conn->proxyntlm); + +#if defined(NTLM_WB_ENABLED) Curl_ntlm_wb_cleanup(conn); -#else - (void)conn; #endif } -#endif /* USE_NTLM */ +#endif /* !CURL_DISABLE_HTTP && USE_NTLM */ diff --git a/lib/curl_ntlm.h b/lib/curl_ntlm.h index 21a9e9e..947eac2 100644 --- a/lib/curl_ntlm.h +++ b/lib/curl_ntlm.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,7 @@ #include "curl_setup.h" -#ifdef USE_NTLM +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) /* this is for ntlm header input */ CURLcode Curl_input_ntlm(struct connectdata *conn, bool proxy, @@ -35,10 +35,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy); void Curl_http_ntlm_cleanup(struct connectdata *conn); -#else - -#define Curl_http_ntlm_cleanup(a) Curl_nop_stmt - -#endif +#endif /* !CURL_DISABLE_HTTP && USE_NTLM */ #endif /* HEADER_CURL_NTLM_H */ diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c index 79aeb08..2aaea4d 100644 --- a/lib/curl_ntlm_core.c +++ b/lib/curl_ntlm_core.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -22,7 +22,7 @@ #include "curl_setup.h" -#if defined(USE_NTLM) && !defined(USE_WINDOWS_SSPI) +#if defined(USE_NTLM) /* * NTLM details: @@ -31,6 +31,8 @@ * http://www.innovation.ch/java/ntlm.html */ +#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) + #ifdef USE_SSLEAY # ifdef USE_OPENSSL @@ -87,6 +89,11 @@ # include # include +#elif defined(USE_OS400CRYPTO) +# include "cipher.mih" /* mih/cipher */ +# include "curl_md4.h" +#elif defined(USE_WIN32_CRYPTO) +# include #else # error "Can't compile NTLM support without a crypto library." #endif @@ -96,6 +103,10 @@ #include "rawstr.h" #include "curl_memory.h" #include "curl_ntlm_core.h" +#include "curl_md5.h" +#include "curl_hmac.h" +#include "warnless.h" +#include "curl_endian.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -103,16 +114,15 @@ /* The last #include file should be: */ #include "memdebug.h" -#ifdef USE_SSLEAY +#define NTLM_HMAC_MD5_LEN (16) +#define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00" +#define NTLMv2_BLOB_LEN (44 -16 + ntlm->target_info_len + 4) + /* - * Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The - * key schedule ks is also set. - */ -static void setup_des_key(const unsigned char *key_56, - DES_key_schedule DESKEYARG(ks)) +* Turns a 56-bit key into being 64-bit wide. +*/ +static void extend_key_56_to_64(const unsigned char *key_56, char *key) { - DES_cblock key; - key[0] = key_56[0]; key[1] = (unsigned char)(((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1)); key[2] = (unsigned char)(((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2)); @@ -121,29 +131,24 @@ static void setup_des_key(const unsigned char *key_56, key[5] = (unsigned char)(((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5)); key[6] = (unsigned char)(((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6)); key[7] = (unsigned char) ((key_56[6] << 1) & 0xFF); - - DES_set_odd_parity(&key); - DES_set_key(&key, ks); } -#else /* defined(USE_SSLEAY) */ - +#ifdef USE_SSLEAY /* - * Turns a 56 bit key into the 64 bit, odd parity key. Used by GnuTLS and NSS. + * Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The + * key schedule ks is also set. */ -static void extend_key_56_to_64(const unsigned char *key_56, char *key) +static void setup_des_key(const unsigned char *key_56, + DES_key_schedule DESKEYARG(ks)) { - key[0] = key_56[0]; - key[1] = (unsigned char)(((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1)); - key[2] = (unsigned char)(((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2)); - key[3] = (unsigned char)(((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3)); - key[4] = (unsigned char)(((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4)); - key[5] = (unsigned char)(((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5)); - key[6] = (unsigned char)(((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6)); - key[7] = (unsigned char) ((key_56[6] << 1) & 0xFF); + DES_cblock key; + + extend_key_56_to_64(key_56, (char *) key); + DES_set_odd_parity(&key); + DES_set_key(&key, ks); } -#if defined(USE_GNUTLS_NETTLE) +#elif defined(USE_GNUTLS_NETTLE) static void setup_des_key(const unsigned char *key_56, struct des_ctx *des) @@ -242,9 +247,66 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out, return err == kCCSuccess; } -#endif /* defined(USE_DARWINSSL) */ +#elif defined(USE_OS400CRYPTO) -#endif /* defined(USE_SSLEAY) */ +static bool encrypt_des(const unsigned char *in, unsigned char *out, + const unsigned char *key_56) +{ + char key[8]; + _CIPHER_Control_T ctl; + + ctl.Func_ID = ENCRYPT_ONLY; + ctl.Data_Len = 8; + extend_key_56_to_64(key_56, ctl.Crypto_Key); + _CIPHER((_SPCPTR *) &out, &ctl, (_SPCPTR *) &in); + return TRUE; +} + +#elif defined(USE_WIN32_CRYPTO) + +static bool encrypt_des(const unsigned char *in, unsigned char *out, + const unsigned char *key_56) +{ + HCRYPTPROV hprov; + HCRYPTKEY hkey; + struct { + BLOBHEADER hdr; + unsigned int len; + char key[8]; + } blob; + DWORD len = 8; + + /* Acquire the crypto provider */ + if(!CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) + return FALSE; + + memset(&blob, 0, sizeof(blob)); + extend_key_56_to_64(key_56, blob.key); + blob.hdr.bType = PLAINTEXTKEYBLOB; + blob.hdr.bVersion = 2; + blob.hdr.aiKeyAlg = CALG_DES; + blob.len = sizeof(blob.key); + + /* Import the key */ + if(!CryptImportKey(hprov, (BYTE *) &blob, sizeof(blob), 0, 0, &hkey)) { + CryptReleaseContext(hprov, 0); + + return FALSE; + } + + memcpy(out, in, 8); + + /* Perform the encryption */ + CryptEncrypt(hkey, 0, FALSE, 0, out, &len, len); + + CryptDestroyKey(hkey); + CryptReleaseContext(hprov, 0); + + return TRUE; +} + +#endif /* defined(USE_WIN32_CRYPTO) */ /* * takes a 21 byte array and treats it as 3 56-bit DES keys. The @@ -294,7 +356,8 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys, setup_des_key(keys + 14, &des); gcry_cipher_encrypt(des, results + 16, 8, plaintext, 8); gcry_cipher_close(des); -#elif defined(USE_NSS) || defined(USE_DARWINSSL) +#elif defined(USE_NSS) || defined(USE_DARWINSSL) || defined(USE_OS400CRYPTO) \ + || defined(USE_WIN32_CRYPTO) encrypt_des(plaintext, results, keys); encrypt_des(plaintext, results + 8, keys + 7); encrypt_des(plaintext, results + 16, keys + 14); @@ -304,11 +367,11 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys, /* * Set up lanmanager hashed password */ -void Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, - const char *password, - unsigned char *lmbuffer /* 21 bytes */) +CURLcode Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, + const char *password, + unsigned char *lmbuffer /* 21 bytes */) { - CURLcode res; + CURLcode result; unsigned char pw[14]; static const unsigned char magic[] = { 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 /* i.e. KGS!@#$% */ @@ -322,9 +385,9 @@ void Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, * The LanManager hashed password needs to be created using the * password in the network encoding not the host encoding. */ - res = Curl_convert_to_network(data, (char *)pw, 14); - if(res) - return; + result = Curl_convert_to_network(data, (char *)pw, 14); + if(result) + return result; { /* Create LanManager hashed password. */ @@ -357,13 +420,16 @@ void Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, setup_des_key(pw + 7, &des); gcry_cipher_encrypt(des, lmbuffer + 8, 8, magic, 8); gcry_cipher_close(des); -#elif defined(USE_NSS) || defined(USE_DARWINSSL) +#elif defined(USE_NSS) || defined(USE_DARWINSSL) || defined(USE_OS400CRYPTO) \ + || defined(USE_WIN32_CRYPTO) encrypt_des(magic, lmbuffer, pw); encrypt_des(magic, lmbuffer + 8, pw + 7); #endif memset(lmbuffer + 16, 0, 21 - 16); } + + return CURLE_OK; } #if USE_NTRESPONSES @@ -377,6 +443,20 @@ static void ascii_to_unicode_le(unsigned char *dest, const char *src, } } +#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI) + +static void ascii_uppercase_to_unicode_le(unsigned char *dest, + const char *src, size_t srclen) +{ + size_t i; + for(i = 0; i < srclen; i++) { + dest[2 * i] = (unsigned char)(toupper(src[i])); + dest[2 * i + 1] = '\0'; + } +} + +#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */ + /* * Set up nt hashed passwords */ @@ -418,10 +498,23 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct SessionHandle *data, gcry_md_write(MD4pw, pw, 2 * len); memcpy (ntbuffer, gcry_md_read (MD4pw, 0), MD4_DIGEST_LENGTH); gcry_md_close(MD4pw); -#elif defined(USE_NSS) +#elif defined(USE_NSS) || defined(USE_OS400CRYPTO) Curl_md4it(ntbuffer, pw, 2 * len); #elif defined(USE_DARWINSSL) (void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer); +#elif defined(USE_WIN32_CRYPTO) + HCRYPTPROV hprov; + if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) { + HCRYPTHASH hhash; + if(CryptCreateHash(hprov, CALG_MD4, 0, 0, &hhash)) { + DWORD length = 16; + CryptHashData(hhash, pw, (unsigned int)len * 2, 0); + CryptGetHashParam(hhash, HP_HASHVAL, ntbuffer, &length, 0); + CryptDestroyHash(hhash); + } + CryptReleaseContext(hprov, 0); + } #endif memset(ntbuffer + 16, 0, 21 - 16); @@ -431,6 +524,193 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct SessionHandle *data, return CURLE_OK; } + +#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI) + +/* This returns the HMAC MD5 digest */ +CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen, + const unsigned char *data, unsigned int datalen, + unsigned char *output) +{ + HMAC_context *ctxt = Curl_HMAC_init(Curl_HMAC_MD5, key, keylen); + + if(!ctxt) + return CURLE_OUT_OF_MEMORY; + + /* Update the digest with the given challenge */ + Curl_HMAC_update(ctxt, data, datalen); + + /* Finalise the digest */ + Curl_HMAC_final(ctxt, output); + + return CURLE_OK; +} + +/* This creates the NTLMv2 hash by using NTLM hash as the key and Unicode + * (uppercase UserName + Domain) as the data + */ +CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen, + const char *domain, size_t domlen, + unsigned char *ntlmhash, + unsigned char *ntlmv2hash) +{ + /* Unicode representation */ + size_t identity_len = (userlen + domlen) * 2; + unsigned char *identity = malloc(identity_len); + CURLcode result = CURLE_OK; + + if(!identity) + return CURLE_OUT_OF_MEMORY; + + ascii_uppercase_to_unicode_le(identity, user, userlen); + ascii_to_unicode_le(identity + (userlen << 1), domain, domlen); + + result = Curl_hmac_md5(ntlmhash, 16, identity, curlx_uztoui(identity_len), + ntlmv2hash); + + Curl_safefree(identity); + + return result; +} + +/* + * Curl_ntlm_core_mk_ntlmv2_resp() + * + * This creates the NTLMv2 response as set in the ntlm type-3 message. + * + * Parameters: + * + * ntlmv2hash [in] - The ntlmv2 hash (16 bytes) + * challenge_client [in] - The client nonce (8 bytes) + * ntlm [in] - The ntlm data struct being used to read TargetInfo + and Server challenge received in the type-2 message + * ntresp [out] - The address where a pointer to newly allocated + * memory holding the NTLMv2 response. + * ntresp_len [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash, + unsigned char *challenge_client, + struct ntlmdata *ntlm, + unsigned char **ntresp, + unsigned int *ntresp_len) +{ +/* NTLMv2 response structure : +------------------------------------------------------------------------------ +0 HMAC MD5 16 bytes +------BLOB-------------------------------------------------------------------- +16 Signature 0x01010000 +20 Reserved long (0x00000000) +24 Timestamp LE, 64-bit signed value representing the number of + tenths of a microsecond since January 1, 1601. +32 Client Nonce 8 bytes +40 Unknown 4 bytes +44 Target Info N bytes (from the type-2 message) +44+N Unknown 4 bytes +------------------------------------------------------------------------------ +*/ + + unsigned int len = 0; + unsigned char *ptr = NULL; + unsigned char hmac_output[NTLM_HMAC_MD5_LEN]; +#if defined(HAVE_LONGLONG) + long long tw; +#else + __int64 tw; +#endif + CURLcode result = CURLE_OK; + + /* Calculate the timestamp */ +#ifdef DEBUGBUILD + char *force_timestamp = getenv("CURL_FORCETIME"); + if(force_timestamp) + tw = 11644473600ULL * 10000000ULL; + else +#endif + tw = ((long long)time(NULL) + 11644473600ULL) * 10000000ULL; + + /* Calculate the response len */ + len = NTLM_HMAC_MD5_LEN + NTLMv2_BLOB_LEN; + + /* Allocate the response */ + ptr = malloc(len); + if(!ptr) + return CURLE_OUT_OF_MEMORY; + + memset(ptr, 0, len); + + /* Create the BLOB structure */ + snprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN, + NTLMv2_BLOB_SIGNATURE + "%c%c%c%c", /* Reserved = 0 */ + 0, 0, 0, 0); + + Curl_write64_le(tw, ptr + 24); + memcpy(ptr + 32, challenge_client, 8); + memcpy(ptr + 44, ntlm->target_info, ntlm->target_info_len); + + /* Concatenate the Type 2 challenge with the BLOB and do HMAC MD5 */ + memcpy(ptr + 8, &ntlm->nonce[0], 8); + result = Curl_hmac_md5(ntlmv2hash, NTLM_HMAC_MD5_LEN, ptr + 8, + NTLMv2_BLOB_LEN + 8, hmac_output); + if(result) { + Curl_safefree(ptr); + + return result; + } + + /* Concatenate the HMAC MD5 output with the BLOB */ + memcpy(ptr, hmac_output, NTLM_HMAC_MD5_LEN); + + /* Return the response */ + *ntresp = ptr; + *ntresp_len = len; + + return result; +} + +/* + * Curl_ntlm_core_mk_lmv2_resp() + * + * This creates the LMv2 response as used in the ntlm type-3 message. + * + * Parameters: + * + * ntlmv2hash [in] - The ntlmv2 hash (16 bytes) + * challenge_client [in] - The client nonce (8 bytes) + * challenge_client [in] - The server challenge (8 bytes) + * lmresp [out] - The LMv2 response (24 bytes) + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash, + unsigned char *challenge_client, + unsigned char *challenge_server, + unsigned char *lmresp) +{ + unsigned char data[16]; + unsigned char hmac_output[16]; + CURLcode result = CURLE_OK; + + memcpy(&data[0], challenge_server, 8); + memcpy(&data[8], challenge_client, 8); + + result = Curl_hmac_md5(ntlmv2hash, 16, &data[0], 16, hmac_output); + if(result) + return result; + + /* Concatenate the HMAC MD5 output with the client nonce */ + memcpy(lmresp, hmac_output, 16); + memcpy(lmresp+16, challenge_client, 8); + + return result; +} + +#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */ + #endif /* USE_NTRESPONSES */ -#endif /* USE_NTLM && !USE_WINDOWS_SSPI */ +#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ + +#endif /* USE_NTLM */ diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h index 9aa126b..c168966 100644 --- a/lib/curl_ntlm_core.h +++ b/lib/curl_ntlm_core.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,9 @@ #include "curl_setup.h" -#if defined(USE_NTLM) && !defined(USE_WINDOWS_SSPI) +#if defined(USE_NTLM) + +#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) #ifdef USE_SSLEAY # if !defined(OPENSSL_VERSION_NUMBER) && \ @@ -34,35 +36,71 @@ # ifdef OPENSSL_NO_MD4 # define USE_NTRESPONSES 0 # define USE_NTLM2SESSION 0 +# define USE_NTLM_V2 0 # endif #endif -/* - * Define USE_NTRESPONSES to 1 in order to make the type-3 message include - * the NT response message. Define USE_NTLM2SESSION to 1 in order to make - * the type-3 message include the NTLM2Session response message, requires - * USE_NTRESPONSES defined to 1. - */ - +/* Define USE_NTRESPONSES to 1 in order to make the type-3 message include + * the NT response message. */ #ifndef USE_NTRESPONSES -# define USE_NTRESPONSES 1 -# define USE_NTLM2SESSION 1 +#define USE_NTRESPONSES 1 +#endif + +/* Define USE_NTLM2SESSION to 1 in order to make the type-3 message include the + NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and a + Crypto engine that we have curl_ssl_md5sum() for. */ +#if !defined(USE_NTLM2SESSION) && USE_NTRESPONSES && !defined(USE_WIN32_CRYPTO) +#define USE_NTLM2SESSION 1 +#endif + +/* Define USE_NTLM_V2 to 1 in order to allow the type-3 message to include the + LMv2 and NTLMv2 response messages, requires USE_NTRESPONSES defined to 1 + and support for 64-bit integers. */ +#if !defined(USE_NTLM_V2) && USE_NTRESPONSES && (CURL_SIZEOF_CURL_OFF_T > 4) +#define USE_NTLM_V2 1 #endif void Curl_ntlm_core_lm_resp(const unsigned char *keys, const unsigned char *plaintext, unsigned char *results); -void Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, - const char *password, - unsigned char *lmbuffer /* 21 bytes */); +CURLcode Curl_ntlm_core_mk_lm_hash(struct SessionHandle *data, + const char *password, + unsigned char *lmbuffer /* 21 bytes */); #if USE_NTRESPONSES CURLcode Curl_ntlm_core_mk_nt_hash(struct SessionHandle *data, const char *password, unsigned char *ntbuffer /* 21 bytes */); -#endif -#endif /* USE_NTLM && !USE_WINDOWS_SSPI */ +#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI) + +CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen, + const unsigned char *data, unsigned int datalen, + unsigned char *output); + +CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen, + const char *domain, size_t domlen, + unsigned char *ntlmhash, + unsigned char *ntlmv2hash); + +CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash, + unsigned char *challenge_client, + struct ntlmdata *ntlm, + unsigned char **ntresp, + unsigned int *ntresp_len); + +CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash, + unsigned char *challenge_client, + unsigned char *challenge_server, + unsigned char *lmresp); + +#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */ + +#endif /* USE_NTRESPONSES */ + +#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ + +#endif /* USE_NTLM */ #endif /* HEADER_CURL_NTLM_CORE_H */ diff --git a/lib/curl_ntlm_msgs.c b/lib/curl_ntlm_msgs.c index 125ce6e..865954d 100644 --- a/lib/curl_ntlm_msgs.c +++ b/lib/curl_ntlm_msgs.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ #include "curl_setup.h" -#ifdef USE_NTLM +#if defined(USE_NTLM) && !defined(USE_WINDOWS_SSPI) /* * NTLM details: @@ -43,14 +43,16 @@ #include "warnless.h" #include "curl_memory.h" -#ifdef USE_WINDOWS_SSPI -# include "curl_sspi.h" -#endif +#include "vtls/vtls.h" -#include "sslgen.h" +#ifdef USE_NSS +#include "vtls/nssg.h" /* for Curl_nss_force_init() */ +#endif #define BUILDING_CURL_NTLM_MSGS_C #include "curl_ntlm_msgs.h" +#include "curl_sasl.h" +#include "curl_endian.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -147,18 +149,52 @@ static void ntlm_print_hex(FILE *handle, const char *buf, size_t len) # define DEBUG_OUT(x) Curl_nop_stmt #endif -#ifndef USE_WINDOWS_SSPI /* - * This function converts from the little endian format used in the - * incoming package to whatever endian format we're using natively. - * Argument is a pointer to a 4 byte buffer. + * ntlm_decode_type2_target() + * + * This is used to decode the "target info" in the ntlm type-2 message + * received. + * + * Parameters: + * + * data [in] - The session handle. + * buffer [in] - The decoded type-2 message. + * size [in] - The input buffer size, at least 32 bytes. + * ntlm [in/out] - The ntlm data struct being used and modified. + * + * Returns CURLE_OK on success. */ -static unsigned int readint_le(unsigned char *buf) +static CURLcode ntlm_decode_type2_target(struct SessionHandle *data, + unsigned char *buffer, + size_t size, + struct ntlmdata *ntlm) { - return ((unsigned int)buf[0]) | ((unsigned int)buf[1] << 8) | - ((unsigned int)buf[2] << 16) | ((unsigned int)buf[3] << 24); + unsigned short target_info_len = 0; + unsigned int target_info_offset = 0; + + if(size >= 48) { + target_info_len = Curl_read16_le(&buffer[40]); + target_info_offset = Curl_read32_le(&buffer[44]); + if(target_info_len > 0) { + if(((target_info_offset + target_info_len) > size) || + (target_info_offset < 48)) { + infof(data, "NTLM handshake failure (bad type-2 message). " + "Target Info Offset Len is set incorrect by the peer\n"); + return CURLE_BAD_CONTENT_ENCODING; + } + + ntlm->target_info = malloc(target_info_len); + if(!ntlm->target_info) + return CURLE_OUT_OF_MEMORY; + + memcpy(ntlm->target_info, &buffer[target_info_offset], target_info_len); + } + } + + ntlm->target_info_len = target_info_len; + + return CURLE_OK; } -#endif /* NTLM message structure notes: @@ -177,29 +213,26 @@ static unsigned int readint_le(unsigned char *buf) */ /* - * Curl_ntlm_decode_type2_message() + * Curl_sasl_decode_ntlm_type2_message() * - * This is used to decode a ntlm type-2 message received from a HTTP or SASL - * based (such as SMTP, POP3 or IMAP) server. The message is first decoded - * from a base64 string into a raw ntlm message and checked for validity - * before the appropriate data for creating a type-3 message is written to - * the given ntlm data structure. + * This is used to decode an already encoded NTLM type-2 message. The message + * is first decoded from a base64 string into a raw NTLM message and checked + * for validity before the appropriate data for creating a type-3 message is + * written to the given NTLM data structure. * * Parameters: * - * data [in] - Pointer to session handle. - * header [in] - Pointer to the input buffer. - * ntlm [in] - Pointer to ntlm data struct being used and modified. + * data [in] - The session handle. + * type2msg [in] - The base64 encoded type-2 message. + * ntlm [in/out] - The ntlm data struct being used and modified. * * Returns CURLE_OK on success. */ -CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data, - const char* header, - struct ntlmdata* ntlm) +CURLcode Curl_sasl_decode_ntlm_type2_message(struct SessionHandle *data, + const char *type2msg, + struct ntlmdata *ntlm) { -#ifndef USE_WINDOWS_SSPI static const char type2_marker[] = { 0x02, 0x00, 0x00, 0x00 }; -#endif /* NTLM type-2 message structure: @@ -217,45 +250,54 @@ CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data, (*) -> Optional */ - size_t size = 0; - unsigned char *buffer = NULL; - CURLcode error; + CURLcode result = CURLE_OK; + unsigned char *type2 = NULL; + size_t type2_len = 0; -#if defined(CURL_DISABLE_VERBOSE_STRINGS) || defined(USE_WINDOWS_SSPI) +#if defined(USE_NSS) + /* Make sure the crypto backend is initialized */ + result = Curl_nss_force_init(data); + if(result) + return result; +#elif defined(CURL_DISABLE_VERBOSE_STRINGS) (void)data; #endif - error = Curl_base64_decode(header, &buffer, &size); - if(error) - return error; - - if(!buffer) { - infof(data, "NTLM handshake failure (unhandled condition)\n"); - return CURLE_REMOTE_ACCESS_DENIED; + /* Decode the base-64 encoded type-2 message */ + if(strlen(type2msg) && *type2msg != '=') { + result = Curl_base64_decode(type2msg, &type2, &type2_len); + if(result) + return result; } -#ifdef USE_WINDOWS_SSPI - ntlm->type_2 = malloc(size + 1); - if(ntlm->type_2 == NULL) { - free(buffer); - return CURLE_OUT_OF_MEMORY; + /* Ensure we have a valid type-2 message */ + if(!type2) { + infof(data, "NTLM handshake failure (empty type-2 message)\n"); + return CURLE_BAD_CONTENT_ENCODING; } - ntlm->n_type_2 = curlx_uztoul(size); - memcpy(ntlm->type_2, buffer, size); -#else + ntlm->flags = 0; - if((size < 32) || - (memcmp(buffer, NTLMSSP_SIGNATURE, 8) != 0) || - (memcmp(buffer + 8, type2_marker, sizeof(type2_marker)) != 0)) { + if((type2_len < 32) || + (memcmp(type2, NTLMSSP_SIGNATURE, 8) != 0) || + (memcmp(type2 + 8, type2_marker, sizeof(type2_marker)) != 0)) { /* This was not a good enough type-2 message */ - free(buffer); + free(type2); infof(data, "NTLM handshake failure (bad type-2 message)\n"); - return CURLE_REMOTE_ACCESS_DENIED; + return CURLE_BAD_CONTENT_ENCODING; } - ntlm->flags = readint_le(&buffer[20]); - memcpy(ntlm->nonce, &buffer[24], 8); + ntlm->flags = Curl_read32_le(&type2[20]); + memcpy(ntlm->nonce, &type2[24], 8); + + if(ntlm->flags & NTLMFLAG_NEGOTIATE_TARGET_INFO) { + result = ntlm_decode_type2_target(data, type2, type2_len, ntlm); + if(result) { + free(type2); + infof(data, "NTLM handshake failure (bad type-2 message)\n"); + return result; + } + } DEBUG_OUT({ fprintf(stderr, "**** TYPE2 header flags=0x%08.8lx ", ntlm->flags); @@ -265,35 +307,15 @@ CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data, fprintf(stderr, "\n****\n"); fprintf(stderr, "**** Header %s\n ", header); }); -#endif - free(buffer); - return CURLE_OK; -} + free(type2); -#ifdef USE_WINDOWS_SSPI -void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm) -{ - Curl_safefree(ntlm->type_2); - if(ntlm->has_handles) { - s_pSecFn->DeleteSecurityContext(&ntlm->c_handle); - s_pSecFn->FreeCredentialsHandle(&ntlm->handle); - ntlm->has_handles = 0; - } - if(ntlm->p_identity) { - Curl_safefree(ntlm->identity.User); - Curl_safefree(ntlm->identity.Password); - Curl_safefree(ntlm->identity.Domain); - ntlm->p_identity = NULL; - } + return result; } -#endif -#ifndef USE_WINDOWS_SSPI /* copy the source to the destination and fill in zeroes in every other destination byte! */ -static void unicodecpy(unsigned char *dest, - const char *src, size_t length) +static void unicodecpy(unsigned char *dest, const char *src, size_t length) { size_t i; for(i = 0; i < length; i++) { @@ -301,14 +323,12 @@ static void unicodecpy(unsigned char *dest, dest[2 * i + 1] = '\0'; } } -#endif /* - * Curl_ntlm_create_type1_message() + * Curl_sasl_create_ntlm_type1_message() * * This is used to generate an already encoded NTLM type-1 message ready for - * sending to the recipient, be it a HTTP or SASL based (such as SMTP, POP3 - * or IMAP) server, using the appropriate compile time crypo API. + * sending to the recipient using the appropriate compile time crypto API. * * Parameters: * @@ -321,11 +341,10 @@ static void unicodecpy(unsigned char *dest, * * Returns CURLE_OK on success. */ -CURLcode Curl_ntlm_create_type1_message(const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, - size_t *outlen) +CURLcode Curl_sasl_create_ntlm_type1_message(const char *userp, + const char *passwdp, + struct ntlmdata *ntlm, + char **outptr, size_t *outlen) { /* NTLM type-1 message structure: @@ -341,135 +360,9 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp, (*) -> Optional */ - unsigned char ntlmbuf[NTLM_BUFSIZE]; size_t size; -#ifdef USE_WINDOWS_SSPI - - SecBuffer buf; - SecBufferDesc desc; - SECURITY_STATUS status; - unsigned long attrs; - xcharp_u useranddomain; - xcharp_u user, dup_user; - xcharp_u domain, dup_domain; - xcharp_u passwd, dup_passwd; - size_t domlen = 0; - TimeStamp tsDummy; /* For Windows 9x compatibility of SSPI calls */ - - domain.const_tchar_ptr = TEXT(""); - - Curl_ntlm_sspi_cleanup(ntlm); - - if(userp && *userp) { - - /* null initialize ntlm identity's data to allow proper cleanup */ - ntlm->p_identity = &ntlm->identity; - memset(ntlm->p_identity, 0, sizeof(*ntlm->p_identity)); - - useranddomain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)userp); - if(!useranddomain.tchar_ptr) - return CURLE_OUT_OF_MEMORY; - - user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('\\')); - if(!user.const_tchar_ptr) - user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('/')); - - if(user.tchar_ptr) { - domain.tchar_ptr = useranddomain.tchar_ptr; - domlen = user.tchar_ptr - useranddomain.tchar_ptr; - user.tchar_ptr++; - } - else { - user.tchar_ptr = useranddomain.tchar_ptr; - domain.const_tchar_ptr = TEXT(""); - domlen = 0; - } - - /* setup ntlm identity's user and length */ - dup_user.tchar_ptr = _tcsdup(user.tchar_ptr); - if(!dup_user.tchar_ptr) { - Curl_unicodefree(useranddomain.tchar_ptr); - return CURLE_OUT_OF_MEMORY; - } - ntlm->identity.User = dup_user.tbyte_ptr; - ntlm->identity.UserLength = curlx_uztoul(_tcslen(dup_user.tchar_ptr)); - dup_user.tchar_ptr = NULL; - - /* setup ntlm identity's domain and length */ - dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1)); - if(!dup_domain.tchar_ptr) { - Curl_unicodefree(useranddomain.tchar_ptr); - return CURLE_OUT_OF_MEMORY; - } - _tcsncpy(dup_domain.tchar_ptr, domain.tchar_ptr, domlen); - *(dup_domain.tchar_ptr + domlen) = TEXT('\0'); - ntlm->identity.Domain = dup_domain.tbyte_ptr; - ntlm->identity.DomainLength = curlx_uztoul(domlen); - dup_domain.tchar_ptr = NULL; - - Curl_unicodefree(useranddomain.tchar_ptr); - - /* setup ntlm identity's password and length */ - passwd.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)passwdp); - if(!passwd.tchar_ptr) - return CURLE_OUT_OF_MEMORY; - dup_passwd.tchar_ptr = _tcsdup(passwd.tchar_ptr); - if(!dup_passwd.tchar_ptr) { - Curl_unicodefree(passwd.tchar_ptr); - return CURLE_OUT_OF_MEMORY; - } - ntlm->identity.Password = dup_passwd.tbyte_ptr; - ntlm->identity.PasswordLength = - curlx_uztoul(_tcslen(dup_passwd.tchar_ptr)); - dup_passwd.tchar_ptr = NULL; - - Curl_unicodefree(passwd.tchar_ptr); - - /* setup ntlm identity's flags */ - ntlm->identity.Flags = SECFLAG_WINNT_AUTH_IDENTITY; - } - else - ntlm->p_identity = NULL; - - status = s_pSecFn->AcquireCredentialsHandle(NULL, - (TCHAR *) TEXT("NTLM"), - SECPKG_CRED_OUTBOUND, NULL, - ntlm->p_identity, NULL, NULL, - &ntlm->handle, &tsDummy); - if(status != SEC_E_OK) - return CURLE_OUT_OF_MEMORY; - - desc.ulVersion = SECBUFFER_VERSION; - desc.cBuffers = 1; - desc.pBuffers = &buf; - buf.cbBuffer = NTLM_BUFSIZE; - buf.BufferType = SECBUFFER_TOKEN; - buf.pvBuffer = ntlmbuf; - - status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, NULL, - (TCHAR *) TEXT(""), - ISC_REQ_CONFIDENTIALITY | - ISC_REQ_REPLAY_DETECT | - ISC_REQ_CONNECTION, - 0, SECURITY_NETWORK_DREP, - NULL, 0, - &ntlm->c_handle, &desc, - &attrs, &tsDummy); - - if(status == SEC_I_COMPLETE_AND_CONTINUE || - status == SEC_I_CONTINUE_NEEDED) - s_pSecFn->CompleteAuthToken(&ntlm->c_handle, &desc); - else if(status != SEC_E_OK) { - s_pSecFn->FreeCredentialsHandle(&ntlm->handle); - return CURLE_RECV_ERROR; - } - - ntlm->has_handles = 1; - size = buf.cbBuffer; - -#else - + unsigned char ntlmbuf[NTLM_BUFSIZE]; const char *host = ""; /* empty */ const char *domain = ""; /* empty */ size_t hostlen = 0; @@ -479,9 +372,11 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp, domain are empty */ (void)userp; (void)passwdp; - (void)ntlm; -#if USE_NTLM2SESSION + /* Clean up any former leftovers and initialise to defaults */ + Curl_sasl_ntlm_cleanup(ntlm); + +#if USE_NTRESPONSES && USE_NTLM2SESSION #define NTLM2FLAG NTLMFLAG_NEGOTIATE_NTLM2_KEY #else #define NTLM2FLAG 0 @@ -522,8 +417,6 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp, /* Initial packet length */ size = 32 + hostlen + domlen; -#endif - DEBUG_OUT({ fprintf(stderr, "* TYPE1 header flags=0x%02.2x%02.2x%02.2x%02.2x " "0x%08.8x ", @@ -551,11 +444,10 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp, } /* - * Curl_ntlm_create_type3_message() + * Curl_sasl_create_ntlm_type3_message() * * This is used to generate an already encoded NTLM type-3 message ready for - * sending to the recipient, be it a HTTP or SASL based (such as SMTP, POP3 - * or IMAP) server, using the appropriate compile time crypo API. + * sending to the recipient using the appropriate compile time crypto API. * * Parameters: * @@ -569,12 +461,12 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp, * * Returns CURLE_OK on success. */ -CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, - const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, - size_t *outlen) +CURLcode Curl_sasl_create_ntlm_type3_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + struct ntlmdata *ntlm, + char **outptr, size_t *outlen) + { /* NTLM type-3 message structure: @@ -594,58 +486,17 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, (*) -> Optional */ - unsigned char ntlmbuf[NTLM_BUFSIZE]; + CURLcode result = CURLE_OK; size_t size; - -#ifdef USE_WINDOWS_SSPI - SecBuffer type_2; - SecBuffer type_3; - SecBufferDesc type_2_desc; - SecBufferDesc type_3_desc; - SECURITY_STATUS status; - unsigned long attrs; - TimeStamp tsDummy; /* For Windows 9x compatibility of SSPI calls */ - - (void)passwdp; - (void)userp; - (void)data; - - type_2_desc.ulVersion = type_3_desc.ulVersion = SECBUFFER_VERSION; - type_2_desc.cBuffers = type_3_desc.cBuffers = 1; - type_2_desc.pBuffers = &type_2; - type_3_desc.pBuffers = &type_3; - - type_2.BufferType = SECBUFFER_TOKEN; - type_2.pvBuffer = ntlm->type_2; - type_2.cbBuffer = ntlm->n_type_2; - type_3.BufferType = SECBUFFER_TOKEN; - type_3.pvBuffer = ntlmbuf; - type_3.cbBuffer = NTLM_BUFSIZE; - - status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, - &ntlm->c_handle, - (TCHAR *) TEXT(""), - ISC_REQ_CONFIDENTIALITY | - ISC_REQ_REPLAY_DETECT | - ISC_REQ_CONNECTION, - 0, SECURITY_NETWORK_DREP, - &type_2_desc, - 0, &ntlm->c_handle, - &type_3_desc, - &attrs, &tsDummy); - if(status != SEC_E_OK) - return CURLE_RECV_ERROR; - - size = type_3.cbBuffer; - - Curl_ntlm_sspi_cleanup(ntlm); - -#else + unsigned char ntlmbuf[NTLM_BUFSIZE]; int lmrespoff; unsigned char lmresp[24]; /* fixed-size */ #if USE_NTRESPONSES int ntrespoff; + unsigned int ntresplen = 24; unsigned char ntresp[24]; /* fixed-size */ + unsigned char *ptr_ntresp = &ntresp[0]; + unsigned char *ntlmv2resp = NULL; #endif bool unicode = (ntlm->flags & NTLMFLAG_NEGOTIATE_UNICODE) ? TRUE : FALSE; char host[HOSTNAME_MAX + 1] = ""; @@ -657,7 +508,6 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, size_t hostlen = 0; size_t userlen = 0; size_t domlen = 0; - CURLcode res; user = strchr(userp, '\\'); if(!user) @@ -684,22 +534,54 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, hostlen = strlen(host); } - if(unicode) { - domlen = domlen * 2; - userlen = userlen * 2; - hostlen = hostlen * 2; +#if USE_NTRESPONSES && USE_NTLM_V2 + if(ntlm->target_info_len) { + unsigned char ntbuffer[0x18]; + unsigned int entropy[2]; + unsigned char ntlmv2hash[0x18]; + + entropy[0] = Curl_rand(data); + entropy[1] = Curl_rand(data); + + result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer); + if(result) + return result; + + result = Curl_ntlm_core_mk_ntlmv2_hash(user, userlen, domain, domlen, + ntbuffer, ntlmv2hash); + if(result) + return result; + + /* LMv2 response */ + result = Curl_ntlm_core_mk_lmv2_resp(ntlmv2hash, + (unsigned char *)&entropy[0], + &ntlm->nonce[0], lmresp); + if(result) + return result; + + /* NTLMv2 response */ + result = Curl_ntlm_core_mk_ntlmv2_resp(ntlmv2hash, + (unsigned char *)&entropy[0], + ntlm, &ntlmv2resp, &ntresplen); + if(result) + return result; + + ptr_ntresp = ntlmv2resp; } + else +#endif -#if USE_NTLM2SESSION +#if USE_NTRESPONSES && USE_NTLM2SESSION /* We don't support NTLM2 if we don't have USE_NTRESPONSES */ if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) { unsigned char ntbuffer[0x18]; unsigned char tmp[0x18]; unsigned char md5sum[MD5_DIGEST_LENGTH]; - unsigned char entropy[8]; + unsigned int entropy[2]; /* Need to create 8 bytes random data */ - Curl_ssl_random(data, entropy, sizeof(entropy)); + entropy[0] = Curl_rand(data); + entropy[1] = Curl_rand(data); /* 8 bytes random data as challenge in lmresp */ memcpy(lmresp, entropy, 8); @@ -715,12 +597,14 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, /* We shall only use the first 8 bytes of md5sum, but the des code in Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */ - if(CURLE_OUT_OF_MEMORY == - Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer)) - return CURLE_OUT_OF_MEMORY; + result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer); + if(result) + return result; + Curl_ntlm_core_lm_resp(ntbuffer, md5sum, ntresp); /* End of NTLM2 Session code */ + } else #endif @@ -732,23 +616,34 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, unsigned char lmbuffer[0x18]; #if USE_NTRESPONSES - if(CURLE_OUT_OF_MEMORY == - Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer)) - return CURLE_OUT_OF_MEMORY; + result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer); + if(result) + return result; + Curl_ntlm_core_lm_resp(ntbuffer, &ntlm->nonce[0], ntresp); #endif - Curl_ntlm_core_mk_lm_hash(data, passwdp, lmbuffer); + result = Curl_ntlm_core_mk_lm_hash(data, passwdp, lmbuffer); + if(result) + return result; + Curl_ntlm_core_lm_resp(lmbuffer, &ntlm->nonce[0], lmresp); + /* A safer but less compatible alternative is: * Curl_ntlm_core_lm_resp(ntbuffer, &ntlm->nonce[0], lmresp); * See http://davenport.sourceforge.net/ntlm.html#ntlmVersion2 */ } + if(unicode) { + domlen = domlen * 2; + userlen = userlen * 2; + hostlen = hostlen * 2; + } + lmrespoff = 64; /* size of the message header */ #if USE_NTRESPONSES ntrespoff = lmrespoff + 0x18; - domoff = ntrespoff + 0x18; + domoff = ntrespoff + ntresplen; #else domoff = lmrespoff + 0x18; #endif @@ -807,8 +702,8 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, 0x0, 0x0, #if USE_NTRESPONSES - SHORTPAIR(0x18), /* NT-response length, twice */ - SHORTPAIR(0x18), + SHORTPAIR(ntresplen), /* NT-response length, twice */ + SHORTPAIR(ntresplen), SHORTPAIR(ntrespoff), 0x0, 0x0, #else @@ -854,17 +749,19 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, }); #if USE_NTRESPONSES - if(size < (NTLM_BUFSIZE - 0x18)) { + if(size < (NTLM_BUFSIZE - ntresplen)) { DEBUGASSERT(size == (size_t)ntrespoff); - memcpy(&ntlmbuf[size], ntresp, 0x18); - size += 0x18; + memcpy(&ntlmbuf[size], ptr_ntresp, ntresplen); + size += ntresplen; } DEBUG_OUT({ fprintf(stderr, "\n ntresp="); - ntlm_print_hex(stderr, (char *)&ntlmbuf[ntrespoff], 0x18); + ntlm_print_hex(stderr, (char *)&ntlmbuf[ntrespoff], ntresplen); }); + Curl_safefree(ntlmv2resp);/* Free the dynamic buffer allocated for NTLMv2 */ + #endif DEBUG_OUT({ @@ -906,15 +803,17 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, size += hostlen; /* Convert domain, user, and host to ASCII but leave the rest as-is */ - res = Curl_convert_to_network(data, (char *)&ntlmbuf[domoff], - size - domoff); - if(res) + result = Curl_convert_to_network(data, (char *)&ntlmbuf[domoff], + size - domoff); + if(result) return CURLE_CONV_FAILED; -#endif - /* Return with binary blob encoded into base64 */ - return Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, outlen); + result = Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, outlen); + + Curl_sasl_ntlm_cleanup(ntlm); + + return result; } -#endif /* USE_NTLM */ +#endif /* USE_NTLM && !USE_WINDOWS_SSPI */ diff --git a/lib/curl_ntlm_msgs.h b/lib/curl_ntlm_msgs.h index e7d185d..2a71431 100644 --- a/lib/curl_ntlm_msgs.h +++ b/lib/curl_ntlm_msgs.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,33 +26,6 @@ #ifdef USE_NTLM -/* This is to generate a base64 encoded NTLM type-1 message */ -CURLcode Curl_ntlm_create_type1_message(const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, - size_t *outlen); - -/* This is to generate a base64 encoded NTLM type-3 message */ -CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data, - const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, - size_t *outlen); - -/* This is to decode a NTLM type-2 message */ -CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data, - const char* header, - struct ntlmdata* ntlm); - -/* This is to clean up the ntlm data structure */ -#ifdef USE_WINDOWS_SSPI -void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm); -#else -#define Curl_ntlm_sspi_cleanup(x) -#endif - /* NTLM buffer fixed size, large enough for long user + host + domain */ #define NTLM_BUFSIZE 1024 @@ -163,14 +136,6 @@ void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm); #define NTLMFLAG_NEGOTIATE_56 (1<<31) /* Indicates that 56-bit encryption is supported. */ -#ifdef UNICODE -# define SECFLAG_WINNT_AUTH_IDENTITY \ - (unsigned long)SEC_WINNT_AUTH_IDENTITY_UNICODE -#else -# define SECFLAG_WINNT_AUTH_IDENTITY \ - (unsigned long)SEC_WINNT_AUTH_IDENTITY_ANSI -#endif - #endif /* BUILDING_CURL_NTLM_MSGS_C */ #endif /* USE_NTLM */ diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c index b1c20e1..5e2d79c 100644 --- a/lib/curl_ntlm_wb.c +++ b/lib/curl_ntlm_wb.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,8 @@ #include "curl_setup.h" -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ + defined(NTLM_WB_ENABLED) /* * NTLM details: @@ -39,10 +40,14 @@ #ifdef HAVE_SIGNAL_H #include #endif +#ifdef HAVE_PWD_H +#include +#endif #include "urldata.h" #include "sendf.h" #include "select.h" +#include "curl_ntlm_msgs.h" #include "curl_ntlm_wb.h" #include "url.h" #include "strerror.h" @@ -116,6 +121,10 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp) char *slash, *domain = NULL; const char *ntlm_auth = NULL; char *ntlm_auth_alloc = NULL; +#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID) + struct passwd pw, *pw_res; + char pwbuf[1024]; +#endif int error; /* Return if communication with ntlm_auth already set up */ @@ -124,6 +133,30 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp) return CURLE_OK; username = userp; + /* The real ntlm_auth really doesn't like being invoked with an + empty username. It won't make inferences for itself, and expects + the client to do so (mostly because it's really designed for + servers like squid to use for auth, and client support is an + afterthought for it). So try hard to provide a suitable username + if we don't already have one. But if we can't, provide the + empty one anyway. Perhaps they have an implementation of the + ntlm_auth helper which *doesn't* need it so we might as well try */ + if(!username || !username[0]) { + username = getenv("NTLMUSER"); + if(!username || !username[0]) + username = getenv("LOGNAME"); + if(!username || !username[0]) + username = getenv("USER"); +#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID) + if((!username || !username[0]) && + !getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res) && + pw_res) { + username = pw.pw_name; + } +#endif + if(!username || !username[0]) + username = userp; + } slash = strpbrk(username, "\\/"); if(slash) { if((domain = strdup(username)) == NULL) @@ -226,10 +259,11 @@ done: static CURLcode ntlm_wb_response(struct connectdata *conn, const char *input, curlntlm state) { - ssize_t size; - char buf[200]; /* enough, type 1, 3 message length is less then 200 */ - char *tmpbuf = buf; - size_t len_in = strlen(input), len_out = sizeof(buf); + char *buf = malloc(NTLM_BUFSIZE); + size_t len_in = strlen(input), len_out = 0; + + if(!buf) + return CURLE_OUT_OF_MEMORY; while(len_in > 0) { ssize_t written = swrite(conn->ntlm_auth_hlpr_socket, input, len_in); @@ -244,8 +278,11 @@ static CURLcode ntlm_wb_response(struct connectdata *conn, len_in -= written; } /* Read one line */ - while(len_out > 0) { - size = sread(conn->ntlm_auth_hlpr_socket, tmpbuf, len_out); + while(1) { + ssize_t size; + char *newbuf; + + size = sread(conn->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE); if(size == -1) { if(errno == EINTR) continue; @@ -253,22 +290,27 @@ static CURLcode ntlm_wb_response(struct connectdata *conn, } else if(size == 0) goto done; - else if(tmpbuf[size - 1] == '\n') { - tmpbuf[size - 1] = '\0'; - goto wrfinish; + + len_out += size; + if(buf[len_out - 1] == '\n') { + buf[len_out - 1] = '\0'; + break; } - tmpbuf += size; - len_out -= size; + newbuf = realloc(buf, len_out + NTLM_BUFSIZE); + if(!newbuf) { + free(buf); + return CURLE_OUT_OF_MEMORY; + } + buf = newbuf; } - goto done; -wrfinish: + /* Samba/winbind installed but not configured */ if(state == NTLMSTATE_TYPE1 && - size == 3 && + len_out == 3 && buf[0] == 'P' && buf[1] == 'W') return CURLE_REMOTE_ACCESS_DENIED; /* invalid response */ - if(size < 4) + if(len_out < 4) goto done; if(state == NTLMSTATE_TYPE1 && (buf[0]!='Y' || buf[1]!='R' || buf[2]!=' ')) @@ -278,9 +320,11 @@ wrfinish: (buf[0]!='A' || buf[1]!='F' || buf[2]!=' ')) goto done; - conn->response_header = aprintf("NTLM %.*s", size - 4, buf + 3); + conn->response_header = aprintf("NTLM %.*s", len_out - 4, buf + 3); + free(buf); return CURLE_OK; done: + free(buf); return CURLE_REMOTE_ACCESS_DENIED; } @@ -356,7 +400,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn, conn->response_header = NULL; break; case NTLMSTATE_TYPE2: - input = aprintf("TT %s", conn->challenge_header); + input = aprintf("TT %s\n", conn->challenge_header); if(!input) return CURLE_OUT_OF_MEMORY; res = ntlm_wb_response(conn, input, ntlm->state); @@ -388,4 +432,4 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn, return CURLE_OK; } -#endif /* USE_NTLM && NTLM_WB_ENABLED */ +#endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */ diff --git a/lib/curl_ntlm_wb.h b/lib/curl_ntlm_wb.h index db6bc16..828bb57 100644 --- a/lib/curl_ntlm_wb.h +++ b/lib/curl_ntlm_wb.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,8 @@ #include "curl_setup.h" -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ + defined(NTLM_WB_ENABLED) /* this is for creating ntlm header output by delegating challenge/response to Samba's winbind daemon helper ntlm_auth */ @@ -32,6 +33,6 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn, bool proxy); void Curl_ntlm_wb_cleanup(struct connectdata *conn); -#endif /* USE_NTLM && NTLM_WB_ENABLED */ +#endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */ #endif /* HEADER_CURL_NTLM_WB_H */ diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c index 45da35c..d1d79c3 100644 --- a/lib/curl_rtmp.c +++ b/lib/curl_rtmp.c @@ -5,6 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * + * Copyright (C) 2012 - 2014, Daniel Stenberg, , et al. * Copyright (C) 2010, Howard Chu, * * This software is licensed as described in the file COPYING, which @@ -48,7 +49,7 @@ #define DEF_BUFTIME (2*60*60*1000) /* 2 hours */ -static CURLcode rtmp_setup(struct connectdata *conn); +static CURLcode rtmp_setup_connection(struct connectdata *conn); static CURLcode rtmp_do(struct connectdata *conn, bool *done); static CURLcode rtmp_done(struct connectdata *conn, CURLcode, bool premature); static CURLcode rtmp_connect(struct connectdata *conn, bool *done); @@ -63,7 +64,7 @@ static Curl_send rtmp_send; const struct Curl_handler Curl_handler_rtmp = { "RTMP", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -83,7 +84,7 @@ const struct Curl_handler Curl_handler_rtmp = { const struct Curl_handler Curl_handler_rtmpt = { "RTMPT", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -103,7 +104,7 @@ const struct Curl_handler Curl_handler_rtmpt = { const struct Curl_handler Curl_handler_rtmpe = { "RTMPE", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -123,7 +124,7 @@ const struct Curl_handler Curl_handler_rtmpe = { const struct Curl_handler Curl_handler_rtmpte = { "RTMPTE", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -143,7 +144,7 @@ const struct Curl_handler Curl_handler_rtmpte = { const struct Curl_handler Curl_handler_rtmps = { "RTMPS", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -163,7 +164,7 @@ const struct Curl_handler Curl_handler_rtmps = { const struct Curl_handler Curl_handler_rtmpts = { "RTMPTS", /* scheme */ - rtmp_setup, /* setup_connection */ + rtmp_setup_connection, /* setup_connection */ rtmp_do, /* do_it */ rtmp_done, /* done */ ZERO_NULL, /* do_more */ @@ -181,10 +182,9 @@ const struct Curl_handler Curl_handler_rtmpts = { PROTOPT_NONE /* flags*/ }; -static CURLcode rtmp_setup(struct connectdata *conn) +static CURLcode rtmp_setup_connection(struct connectdata *conn) { RTMP *r = RTMP_Alloc(); - if(!r) return CURLE_OUT_OF_MEMORY; @@ -216,7 +216,7 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done) !(r->Link.protocol & RTMP_FEATURE_HTTP)) r->Link.lFlags |= RTMP_LF_BUFX; - curlx_nonblock(r->m_sb.sb_socket, FALSE); + (void)curlx_nonblock(r->m_sb.sb_socket, FALSE); setsockopt(r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); @@ -240,7 +240,7 @@ static CURLcode rtmp_do(struct connectdata *conn, bool *done) return CURLE_FAILED_INIT; if(conn->data->set.upload) { - Curl_pgrsSetUploadSize(conn->data, conn->data->set.infilesize); + Curl_pgrsSetUploadSize(conn->data, conn->data->state.infilesize); Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); } else diff --git a/lib/curl_sasl.c b/lib/curl_sasl.c index fcb0019..b944aa2 100644 --- a/lib/curl_sasl.c +++ b/lib/curl_sasl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -19,9 +19,12 @@ * KIND, either express or implied. * * RFC2195 CRAM-MD5 authentication + * RFC2617 Basic and Digest Access Authentication * RFC2831 DIGEST-MD5 authentication * RFC4422 Simple Authentication and Security Layer (SASL) * RFC4616 PLAIN authentication + * RFC6749 OAuth 2.0 Authorization Framework + * Draft LOGIN SASL Mechanism * ***************************************************************************/ @@ -32,12 +35,14 @@ #include "curl_base64.h" #include "curl_md5.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "curl_hmac.h" -#include "curl_ntlm_msgs.h" #include "curl_sasl.h" #include "warnless.h" #include "curl_memory.h" +#include "strtok.h" +#include "rawstr.h" +#include "non-ascii.h" /* included for Curl_convert_... prototypes */ #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -45,11 +50,142 @@ /* The last #include file should be: */ #include "memdebug.h" -#ifndef CURL_DISABLE_CRYPTO_AUTH +#if !defined(CURL_DISABLE_CRYPTO_AUTH) && !defined(USE_WINDOWS_SSPI) +#define DIGEST_QOP_VALUE_AUTH (1 << 0) +#define DIGEST_QOP_VALUE_AUTH_INT (1 << 1) +#define DIGEST_QOP_VALUE_AUTH_CONF (1 << 2) + +#define DIGEST_QOP_VALUE_STRING_AUTH "auth" +#define DIGEST_QOP_VALUE_STRING_AUTH_INT "auth-int" +#define DIGEST_QOP_VALUE_STRING_AUTH_CONF "auth-conf" + +#define DIGEST_MAX_VALUE_LENGTH 256 +#define DIGEST_MAX_CONTENT_LENGTH 1024 + +/* The CURL_OUTPUT_DIGEST_CONV macro below is for non-ASCII machines. + It converts digest text to ASCII so the MD5 will be correct for + what ultimately goes over the network. +*/ +#define CURL_OUTPUT_DIGEST_CONV(a, b) \ + result = Curl_convert_to_network(a, (char *)b, strlen((const char*)b)); \ + if(result) { \ + free(b); \ + return result; \ + } + +/* + * Return 0 on success and then the buffers are filled in fine. + * + * Non-zero means failure to parse. + */ +static int sasl_digest_get_pair(const char *str, char *value, char *content, + const char **endptr) +{ + int c; + bool starts_with_quote = FALSE; + bool escape = FALSE; + + for(c = DIGEST_MAX_VALUE_LENGTH - 1; (*str && (*str != '=') && c--); ) + *value++ = *str++; + *value = 0; + + if('=' != *str++) + /* eek, no match */ + return 1; + + if('\"' == *str) { + /* this starts with a quote so it must end with one as well! */ + str++; + starts_with_quote = TRUE; + } + + for(c = DIGEST_MAX_CONTENT_LENGTH - 1; *str && c--; str++) { + switch(*str) { + case '\\': + if(!escape) { + /* possibly the start of an escaped quote */ + escape = TRUE; + *content++ = '\\'; /* even though this is an escape character, we still + store it as-is in the target buffer */ + continue; + } + break; + case ',': + if(!starts_with_quote) { + /* this signals the end of the content if we didn't get a starting + quote and then we do "sloppy" parsing */ + c = 0; /* the end */ + continue; + } + break; + case '\r': + case '\n': + /* end of string */ + c = 0; + continue; + case '\"': + if(!escape && starts_with_quote) { + /* end of string */ + c = 0; + continue; + } + break; + } + escape = FALSE; + *content++ = *str; + } + *content = 0; + + *endptr = str; + + return 0; /* all is fine! */ +} + +/* Convert md5 chunk to RFC2617 (section 3.1.3) -suitable ascii string*/ +static void sasl_digest_md5_to_ascii(unsigned char *source, /* 16 bytes */ + unsigned char *dest) /* 33 bytes */ +{ + int i; + for(i = 0; i < 16; i++) + snprintf((char *)&dest[i*2], 3, "%02x", source[i]); +} + +/* Perform quoted-string escaping as described in RFC2616 and its errata */ +static char *sasl_digest_string_quoted(const char *source) +{ + char *dest, *d; + const char *s = source; + size_t n = 1; /* null terminator */ + + /* Calculate size needed */ + while(*s) { + ++n; + if(*s == '"' || *s == '\\') { + ++n; + } + ++s; + } + + dest = malloc(n); + if(dest) { + s = source; + d = dest; + while(*s) { + if(*s == '"' || *s == '\\') { + *d++ = '\\'; + } + *d++ = *s++; + } + *d = 0; + } + + return dest; +} + /* Retrieves the value for a corresponding key from the challenge string * returns TRUE if the key could be found, FALSE if it does not exists */ -static bool sasl_digest_get_key_value(const unsigned char *chlg, +static bool sasl_digest_get_key_value(const char *chlg, const char *key, char *value, size_t max_val_len, @@ -58,7 +194,7 @@ static bool sasl_digest_get_key_value(const unsigned char *chlg, char *find_pos; size_t i; - find_pos = strstr((const char *) chlg, key); + find_pos = strstr(chlg, key); if(!find_pos) return FALSE; @@ -70,6 +206,58 @@ static bool sasl_digest_get_key_value(const unsigned char *chlg, return TRUE; } + +static CURLcode sasl_digest_get_qop_values(const char *options, int *value) +{ + char *tmp; + char *token; + char *tok_buf; + + /* Initialise the output */ + *value = 0; + + /* Tokenise the list of qop values. Use a temporary clone of the buffer since + strtok_r() ruins it. */ + tmp = strdup(options); + if(!tmp) + return CURLE_OUT_OF_MEMORY; + + token = strtok_r(tmp, ",", &tok_buf); + while(token != NULL) { + if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH)) + *value |= DIGEST_QOP_VALUE_AUTH; + else if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH_INT)) + *value |= DIGEST_QOP_VALUE_AUTH_INT; + else if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH_CONF)) + *value |= DIGEST_QOP_VALUE_AUTH_CONF; + + token = strtok_r(NULL, ",", &tok_buf); + } + + Curl_safefree(tmp); + + return CURLE_OK; +} +#endif /* !CURL_DISABLE_CRYPTO_AUTH && !USE_WINDOWS_SSPI */ + +#if !defined(USE_WINDOWS_SSPI) +/* + * Curl_sasl_build_spn() + * + * This is used to build a SPN string in the format service/host. + * + * Parameters: + * + * serivce [in] - The service type such as www, smtp, pop or imap. + * host [in] - The host name or realm. + * + * Returns a pointer to the newly allocated SPN. + */ +char *Curl_sasl_build_spn(const char *service, const char *host) +{ + /* Generate and return our SPN */ + return aprintf("%s/%s", service, host); +} #endif /* @@ -94,18 +282,18 @@ CURLcode Curl_sasl_create_plain_message(struct SessionHandle *data, const char *passwdp, char **outptr, size_t *outlen) { - char plainauth[2 * MAX_CURL_USER_LENGTH + MAX_CURL_PASSWORD_LENGTH]; + CURLcode result; + char *plainauth; size_t ulen; size_t plen; ulen = strlen(userp); plen = strlen(passwdp); - if(2 * ulen + plen + 2 > sizeof(plainauth)) { + plainauth = malloc(2 * ulen + plen + 2); + if(!plainauth) { *outlen = 0; *outptr = NULL; - - /* Plainauth too small */ return CURLE_OUT_OF_MEMORY; } @@ -117,8 +305,10 @@ CURLcode Curl_sasl_create_plain_message(struct SessionHandle *data, memcpy(plainauth + 2 * ulen + 2, passwdp, plen); /* Base64 encode the reply */ - return Curl_base64_encode(data, plainauth, 2 * ulen + plen + 2, outptr, - outlen); + result = Curl_base64_encode(data, plainauth, 2 * ulen + plen + 2, outptr, + outlen); + Curl_safefree(plainauth); + return result; } /* @@ -160,7 +350,37 @@ CURLcode Curl_sasl_create_login_message(struct SessionHandle *data, } #ifndef CURL_DISABLE_CRYPTO_AUTH -/* + /* + * Curl_sasl_decode_cram_md5_message() + * + * This is used to decode an already encoded CRAM-MD5 challenge message. + * + * Parameters: + * + * chlg64 [in] - The base64 encoded challenge message. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_decode_cram_md5_message(const char *chlg64, char **outptr, + size_t *outlen) +{ + CURLcode result = CURLE_OK; + size_t chlg64len = strlen(chlg64); + + *outptr = NULL; + *outlen = 0; + + /* Decode the challenge if necessary */ + if(chlg64len && *chlg64 != '=') + result = Curl_base64_decode(chlg64, (unsigned char **) outptr, outlen); + + return result; + } + + /* * Curl_sasl_create_cram_md5_message() * * This is used to generate an already encoded CRAM-MD5 response message ready @@ -169,7 +389,7 @@ CURLcode Curl_sasl_create_login_message(struct SessionHandle *data, * Parameters: * * data [in] - The session handle. - * chlg64 [in] - Pointer to the base64 encoded challenge buffer. + * chlg [in] - The challenge. * userp [in] - The user name. * passdwp [in] - The user's password. * outptr [in/out] - The address where a pointer to newly allocated memory @@ -179,55 +399,122 @@ CURLcode Curl_sasl_create_login_message(struct SessionHandle *data, * Returns CURLE_OK on success. */ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data, - const char *chlg64, + const char *chlg, const char *userp, const char *passwdp, char **outptr, size_t *outlen) { CURLcode result = CURLE_OK; - size_t chlg64len = strlen(chlg64); - unsigned char *chlg = (unsigned char *) NULL; size_t chlglen = 0; HMAC_context *ctxt; unsigned char digest[MD5_DIGEST_LEN]; - char response[MAX_CURL_USER_LENGTH + 2 * MD5_DIGEST_LEN + 1]; + char *response; - /* Decode the challenge if necessary */ - if(chlg64len && *chlg64 != '=') { - result = Curl_base64_decode(chlg64, &chlg, &chlglen); - - if(result) - return result; - } + if(chlg) + chlglen = strlen(chlg); /* Compute the digest using the password as the key */ ctxt = Curl_HMAC_init(Curl_HMAC_MD5, (const unsigned char *) passwdp, curlx_uztoui(strlen(passwdp))); - - if(!ctxt) { - Curl_safefree(chlg); + if(!ctxt) return CURLE_OUT_OF_MEMORY; - } /* Update the digest with the given challenge */ if(chlglen > 0) - Curl_HMAC_update(ctxt, chlg, curlx_uztoui(chlglen)); - - Curl_safefree(chlg); + Curl_HMAC_update(ctxt, (const unsigned char *) chlg, + curlx_uztoui(chlglen)); /* Finalise the digest */ Curl_HMAC_final(ctxt, digest); - /* Prepare the response */ - snprintf(response, sizeof(response), + /* Generate the response */ + response = aprintf( "%s %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", userp, digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]); + if(!response) + return CURLE_OUT_OF_MEMORY; - /* Base64 encode the reply */ - return Curl_base64_encode(data, response, 0, outptr, outlen); + /* Base64 encode the response */ + result = Curl_base64_encode(data, response, 0, outptr, outlen); + + Curl_safefree(response); + + return result; +} + +#ifndef USE_WINDOWS_SSPI +/* + * sasl_decode_digest_md5_message() + * + * This is used internally to decode an already encoded DIGEST-MD5 challenge + * message into the seperate attributes. + * + * Parameters: + * + * chlg64 [in] - The base64 encoded challenge message. + * nonce [in/out] - The buffer where the nonce will be stored. + * nlen [in] - The length of the nonce buffer. + * realm [in/out] - The buffer where the realm will be stored. + * rlen [in] - The length of the realm buffer. + * alg [in/out] - The buffer where the algorithm will be stored. + * alen [in] - The length of the algorithm buffer. + * qop [in/out] - The buffer where the qop-options will be stored. + * qlen [in] - The length of the qop buffer. + * + * Returns CURLE_OK on success. + */ +static CURLcode sasl_decode_digest_md5_message(const char *chlg64, + char *nonce, size_t nlen, + char *realm, size_t rlen, + char *alg, size_t alen, + char *qop, size_t qlen) +{ + CURLcode result = CURLE_OK; + unsigned char *chlg = NULL; + size_t chlglen = 0; + size_t chlg64len = strlen(chlg64); + + /* Decode the base-64 encoded challenge message */ + if(chlg64len && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &chlg, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!chlg) + return CURLE_BAD_CONTENT_ENCODING; + + /* Retrieve nonce string from the challenge */ + if(!sasl_digest_get_key_value((char *)chlg, "nonce=\"", nonce, nlen, '\"')) { + Curl_safefree(chlg); + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Retrieve realm string from the challenge */ + if(!sasl_digest_get_key_value((char *)chlg, "realm=\"", realm, rlen, '\"')) { + /* Challenge does not have a realm, set empty string [RFC2831] page 6 */ + strcpy(realm, ""); + } + + /* Retrieve algorithm string from the challenge */ + if(!sasl_digest_get_key_value((char *)chlg, "algorithm=", alg, alen, ',')) { + Curl_safefree(chlg); + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Retrieve qop-options string from the challenge */ + if(!sasl_digest_get_key_value((char *)chlg, "qop=\"", qop, qlen, '\"')) { + Curl_safefree(chlg); + return CURLE_BAD_CONTENT_ENCODING; + } + + Curl_safefree(chlg); + + return CURLE_OK; } /* @@ -239,10 +526,10 @@ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data, * Parameters: * * data [in] - The session handle. - * chlg64 [in] - Pointer to the base64 encoded challenge buffer. + * chlg64 [in] - The base64 encoded challenge message. * userp [in] - The user name. * passdwp [in] - The user's password. - * service [in] - The service type such as www, smtp or pop + * service [in] - The service type such as www, smtp, pop or imap. * outptr [in/out] - The address where a pointer to newly allocated memory * holding the result will be stored upon completion. * outlen [out] - The length of the output message. @@ -256,65 +543,56 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, const char *service, char **outptr, size_t *outlen) { - static const char table16[] = "0123456789abcdef"; - CURLcode result = CURLE_OK; - unsigned char *chlg = (unsigned char *) NULL; - size_t chlglen = 0; size_t i; MD5_context *ctxt; + char *response = NULL; unsigned char digest[MD5_DIGEST_LEN]; char HA1_hex[2 * MD5_DIGEST_LEN + 1]; char HA2_hex[2 * MD5_DIGEST_LEN + 1]; char resp_hash_hex[2 * MD5_DIGEST_LEN + 1]; - char nonce[64]; char realm[128]; - char alg[64]; + char algorithm[64]; + char qop_options[64]; + int qop_values; + char cnonce[33]; + unsigned int entropy[4]; char nonceCount[] = "00000001"; - char cnonce[] = "12345678"; /* will be changed */ char method[] = "AUTHENTICATE"; - char qop[] = "auth"; - char uri[128]; - char response[512]; - - result = Curl_base64_decode(chlg64, &chlg, &chlglen); + char qop[] = DIGEST_QOP_VALUE_STRING_AUTH; + char *spn = NULL; + /* Decode the challange message */ + result = sasl_decode_digest_md5_message(chlg64, nonce, sizeof(nonce), + realm, sizeof(realm), + algorithm, sizeof(algorithm), + qop_options, sizeof(qop_options)); if(result) return result; - if(!chlg) - return CURLE_LOGIN_DENIED; - - /* Retrieve nonce string from the challenge */ - if(!sasl_digest_get_key_value(chlg, "nonce=\"", nonce, - sizeof(nonce), '\"')) { - Curl_safefree(chlg); - return CURLE_LOGIN_DENIED; - } - - /* Retrieve realm string from the challenge */ - if(!sasl_digest_get_key_value(chlg, "realm=\"", realm, - sizeof(realm), '\"')) { - /* Challenge does not have a realm, set empty string [RFC2831] page 6 */ - strcpy(realm, ""); - } + /* We only support md5 sessions */ + if(strcmp(algorithm, "md5-sess") != 0) + return CURLE_BAD_CONTENT_ENCODING; - /* Retrieve algorithm string from the challenge */ - if(!sasl_digest_get_key_value(chlg, "algorithm=", alg, sizeof(alg), ',')) { - Curl_safefree(chlg); - return CURLE_LOGIN_DENIED; - } + /* Get the qop-values from the qop-options */ + result = sasl_digest_get_qop_values(qop_options, &qop_values); + if(result) + return result; - Curl_safefree(chlg); + /* We only support auth quality-of-protection */ + if(!(qop_values & DIGEST_QOP_VALUE_AUTH)) + return CURLE_BAD_CONTENT_ENCODING; - /* We do not support other algorithms */ - if(strcmp(alg, "md5-sess") != 0) - return CURLE_LOGIN_DENIED; + /* Generate 16 bytes of random data */ + entropy[0] = Curl_rand(data); + entropy[1] = Curl_rand(data); + entropy[2] = Curl_rand(data); + entropy[3] = Curl_rand(data); - /* Generate 64 bits of random data */ - for(i = 0; i < 8; i++) - cnonce[i] = table16[Curl_rand(data)%16]; + /* Convert the random data into a 32 byte hex string */ + snprintf(cnonce, sizeof(cnonce), "%08x%08x%08x%08x", + entropy[0], entropy[1], entropy[2], entropy[3]); /* So far so good, now calculate A1 and H(A1) according to RFC 2831 */ ctxt = Curl_MD5_init(Curl_DIGEST_MD5); @@ -348,19 +626,24 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, for(i = 0; i < MD5_DIGEST_LEN; i++) snprintf(&HA1_hex[2 * i], 3, "%02x", digest[i]); - /* Prepare the URL string */ - snprintf(uri, sizeof(uri), "%s/%s", service, realm); + /* Generate our SPN */ + spn = Curl_sasl_build_spn(service, realm); + if(!spn) + return CURLE_OUT_OF_MEMORY; /* Calculate H(A2) */ ctxt = Curl_MD5_init(Curl_DIGEST_MD5); - if(!ctxt) + if(!ctxt) { + Curl_safefree(spn); + return CURLE_OUT_OF_MEMORY; + } Curl_MD5_update(ctxt, (const unsigned char *) method, curlx_uztoui(strlen(method))); Curl_MD5_update(ctxt, (const unsigned char *) ":", 1); - Curl_MD5_update(ctxt, (const unsigned char *) uri, - curlx_uztoui(strlen(uri))); + Curl_MD5_update(ctxt, (const unsigned char *) spn, + curlx_uztoui(strlen(spn))); Curl_MD5_final(ctxt, digest); for(i = 0; i < MD5_DIGEST_LEN; i++) @@ -368,8 +651,11 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, /* Now calculate the response hash */ ctxt = Curl_MD5_init(Curl_DIGEST_MD5); - if(!ctxt) + if(!ctxt) { + Curl_safefree(spn); + return CURLE_OUT_OF_MEMORY; + } Curl_MD5_update(ctxt, (const unsigned char *) HA1_hex, 2 * MD5_DIGEST_LEN); Curl_MD5_update(ctxt, (const unsigned char *) ":", 1); @@ -393,82 +679,473 @@ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, for(i = 0; i < MD5_DIGEST_LEN; i++) snprintf(&resp_hash_hex[2 * i], 3, "%02x", digest[i]); - snprintf(response, sizeof(response), - "username=\"%s\",realm=\"%s\",nonce=\"%s\"," - "cnonce=\"%s\",nc=\"%s\",digest-uri=\"%s\",response=%s", - userp, realm, nonce, - cnonce, nonceCount, uri, resp_hash_hex); + /* Generate the response */ + response = aprintf("username=\"%s\",realm=\"%s\",nonce=\"%s\"," + "cnonce=\"%s\",nc=\"%s\",digest-uri=\"%s\",response=%s," + "qop=%s", + userp, realm, nonce, + cnonce, nonceCount, spn, resp_hash_hex, qop); + Curl_safefree(spn); + if(!response) + return CURLE_OUT_OF_MEMORY; - /* Base64 encode the reply */ - return Curl_base64_encode(data, response, 0, outptr, outlen); + /* Base64 encode the response */ + result = Curl_base64_encode(data, response, 0, outptr, outlen); + + Curl_safefree(response); + + return result; } -#endif -#ifdef USE_NTLM /* - * Curl_sasl_create_ntlm_type1_message() + * Curl_sasl_decode_digest_http_message() * - * This is used to generate an already encoded NTLM type-1 message ready for - * sending to the recipient. + * This is used to decode a HTTP DIGEST challenge message into the seperate + * attributes. + * + * Parameters: + * + * chlg [in] - The challenge message. + * digest [in/out] - The digest data struct being used and modified. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_decode_digest_http_message(const char *chlg, + struct digestdata *digest) +{ + bool before = FALSE; /* got a nonce before */ + bool foundAuth = FALSE; + bool foundAuthInt = FALSE; + char *token = NULL; + char *tmp = NULL; + + /* If we already have received a nonce, keep that in mind */ + if(digest->nonce) + before = TRUE; + + /* Clean up any former leftovers and initialise to defaults */ + Curl_sasl_digest_cleanup(digest); + + for(;;) { + char value[DIGEST_MAX_VALUE_LENGTH]; + char content[DIGEST_MAX_CONTENT_LENGTH]; + + /* Pass all additional spaces here */ + while(*chlg && ISSPACE(*chlg)) + chlg++; + + /* Extract a value=content pair */ + if(!sasl_digest_get_pair(chlg, value, content, &chlg)) { + if(Curl_raw_equal(value, "nonce")) { + digest->nonce = strdup(content); + if(!digest->nonce) + return CURLE_OUT_OF_MEMORY; + } + else if(Curl_raw_equal(value, "stale")) { + if(Curl_raw_equal(content, "true")) { + digest->stale = TRUE; + digest->nc = 1; /* we make a new nonce now */ + } + } + else if(Curl_raw_equal(value, "realm")) { + digest->realm = strdup(content); + if(!digest->realm) + return CURLE_OUT_OF_MEMORY; + } + else if(Curl_raw_equal(value, "opaque")) { + digest->opaque = strdup(content); + if(!digest->opaque) + return CURLE_OUT_OF_MEMORY; + } + else if(Curl_raw_equal(value, "qop")) { + char *tok_buf; + /* Tokenize the list and choose auth if possible, use a temporary + clone of the buffer since strtok_r() ruins it */ + tmp = strdup(content); + if(!tmp) + return CURLE_OUT_OF_MEMORY; + + token = strtok_r(tmp, ",", &tok_buf); + while(token != NULL) { + if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH)) { + foundAuth = TRUE; + } + else if(Curl_raw_equal(token, DIGEST_QOP_VALUE_STRING_AUTH_INT)) { + foundAuthInt = TRUE; + } + token = strtok_r(NULL, ",", &tok_buf); + } + + free(tmp); + + /* Select only auth or auth-int. Otherwise, ignore */ + if(foundAuth) { + digest->qop = strdup(DIGEST_QOP_VALUE_STRING_AUTH); + if(!digest->qop) + return CURLE_OUT_OF_MEMORY; + } + else if(foundAuthInt) { + digest->qop = strdup(DIGEST_QOP_VALUE_STRING_AUTH_INT); + if(!digest->qop) + return CURLE_OUT_OF_MEMORY; + } + } + else if(Curl_raw_equal(value, "algorithm")) { + digest->algorithm = strdup(content); + if(!digest->algorithm) + return CURLE_OUT_OF_MEMORY; + + if(Curl_raw_equal(content, "MD5-sess")) + digest->algo = CURLDIGESTALGO_MD5SESS; + else if(Curl_raw_equal(content, "MD5")) + digest->algo = CURLDIGESTALGO_MD5; + else + return CURLE_BAD_CONTENT_ENCODING; + } + else { + /* unknown specifier, ignore it! */ + } + } + else + break; /* we're done here */ + + /* Pass all additional spaces here */ + while(*chlg && ISSPACE(*chlg)) + chlg++; + + /* Allow the list to be comma-separated */ + if(',' == *chlg) + chlg++; + } + + /* We had a nonce since before, and we got another one now without + 'stale=true'. This means we provided bad credentials in the previous + request */ + if(before && !digest->stale) + return CURLE_BAD_CONTENT_ENCODING; + + /* We got this header without a nonce, that's a bad Digest line! */ + if(!digest->nonce) + return CURLE_BAD_CONTENT_ENCODING; + + return CURLE_OK; +} + +/* + * Curl_sasl_create_digest_http_message() * - * Note: This is a simple wrapper of the NTLM function which means that any - * SASL based protocols don't have to include the NTLM functions directly. + * This is used to generate a HTTP DIGEST response message ready for sending + * to the recipient. * * Parameters: * - * userp [in] - The user name in the format User or Domain\User. + * data [in] - The session handle. + * userp [in] - The user name. * passdwp [in] - The user's password. - * ntlm [in/out] - The ntlm data struct being used and modified. + * request [in] - The HTTP request. + * uripath [in] - The path of the HTTP uri. + * digest [in/out] - The digest data struct being used and modified. * outptr [in/out] - The address where a pointer to newly allocated memory * holding the result will be stored upon completion. * outlen [out] - The length of the output message. * * Returns CURLE_OK on success. */ -CURLcode Curl_sasl_create_ntlm_type1_message(const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, size_t *outlen) +CURLcode Curl_sasl_create_digest_http_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const unsigned char *request, + const unsigned char *uripath, + struct digestdata *digest, + char **outptr, size_t *outlen) { - return Curl_ntlm_create_type1_message(userp, passwdp, ntlm, outptr, - outlen); + CURLcode result; + unsigned char md5buf[16]; /* 16 bytes/128 bits */ + unsigned char request_digest[33]; + unsigned char *md5this; + unsigned char ha1[33];/* 32 digits and 1 zero byte */ + unsigned char ha2[33];/* 32 digits and 1 zero byte */ + char cnoncebuf[33]; + char *cnonce = NULL; + size_t cnonce_sz = 0; + char *userp_quoted; + char *response = NULL; + char *tmp = NULL; + + if(!digest->nc) + digest->nc = 1; + + if(!digest->cnonce) { + snprintf(cnoncebuf, sizeof(cnoncebuf), "%08x%08x%08x%08x", + Curl_rand(data), Curl_rand(data), + Curl_rand(data), Curl_rand(data)); + + result = Curl_base64_encode(data, cnoncebuf, strlen(cnoncebuf), + &cnonce, &cnonce_sz); + if(result) + return result; + + digest->cnonce = cnonce; + } + + /* + if the algorithm is "MD5" or unspecified (which then defaults to MD5): + + A1 = unq(username-value) ":" unq(realm-value) ":" passwd + + if the algorithm is "MD5-sess" then: + + A1 = H( unq(username-value) ":" unq(realm-value) ":" passwd ) + ":" unq(nonce-value) ":" unq(cnonce-value) + */ + + md5this = (unsigned char *) + aprintf("%s:%s:%s", userp, digest->realm, passwdp); + if(!md5this) + return CURLE_OUT_OF_MEMORY; + + CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ + Curl_md5it(md5buf, md5this); + Curl_safefree(md5this); + sasl_digest_md5_to_ascii(md5buf, ha1); + + if(digest->algo == CURLDIGESTALGO_MD5SESS) { + /* nonce and cnonce are OUTSIDE the hash */ + tmp = aprintf("%s:%s:%s", ha1, digest->nonce, digest->cnonce); + if(!tmp) + return CURLE_OUT_OF_MEMORY; + + CURL_OUTPUT_DIGEST_CONV(data, tmp); /* convert on non-ASCII machines */ + Curl_md5it(md5buf, (unsigned char *)tmp); + Curl_safefree(tmp); + sasl_digest_md5_to_ascii(md5buf, ha1); + } + + /* + If the "qop" directive's value is "auth" or is unspecified, then A2 is: + + A2 = Method ":" digest-uri-value + + If the "qop" value is "auth-int", then A2 is: + + A2 = Method ":" digest-uri-value ":" H(entity-body) + + (The "Method" value is the HTTP request method as specified in section + 5.1.1 of RFC 2616) + */ + + md5this = (unsigned char *)aprintf("%s:%s", request, uripath); + + if(digest->qop && Curl_raw_equal(digest->qop, "auth-int")) { + /* We don't support auth-int for PUT or POST at the moment. + TODO: replace md5 of empty string with entity-body for PUT/POST */ + unsigned char *md5this2 = (unsigned char *) + aprintf("%s:%s", md5this, "d41d8cd98f00b204e9800998ecf8427e"); + Curl_safefree(md5this); + md5this = md5this2; + } + + if(!md5this) + return CURLE_OUT_OF_MEMORY; + + CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ + Curl_md5it(md5buf, md5this); + Curl_safefree(md5this); + sasl_digest_md5_to_ascii(md5buf, ha2); + + if(digest->qop) { + md5this = (unsigned char *)aprintf("%s:%s:%08x:%s:%s:%s", + ha1, + digest->nonce, + digest->nc, + digest->cnonce, + digest->qop, + ha2); + } + else { + md5this = (unsigned char *)aprintf("%s:%s:%s", + ha1, + digest->nonce, + ha2); + } + + if(!md5this) + return CURLE_OUT_OF_MEMORY; + + CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ + Curl_md5it(md5buf, md5this); + Curl_safefree(md5this); + sasl_digest_md5_to_ascii(md5buf, request_digest); + + /* for test case 64 (snooped from a Mozilla 1.3a request) + + Authorization: Digest username="testuser", realm="testrealm", \ + nonce="1053604145", uri="/64", response="c55f7f30d83d774a3d2dcacf725abaca" + + Digest parameters are all quoted strings. Username which is provided by + the user will need double quotes and backslashes within it escaped. For + the other fields, this shouldn't be an issue. realm, nonce, and opaque + are copied as is from the server, escapes and all. cnonce is generated + with web-safe characters. uri is already percent encoded. nc is 8 hex + characters. algorithm and qop with standard values only contain web-safe + chracters. + */ + userp_quoted = sasl_digest_string_quoted(userp); + if(!userp_quoted) + return CURLE_OUT_OF_MEMORY; + + if(digest->qop) { + response = aprintf("username=\"%s\", " + "realm=\"%s\", " + "nonce=\"%s\", " + "uri=\"%s\", " + "cnonce=\"%s\", " + "nc=%08x, " + "qop=%s, " + "response=\"%s\"", + userp_quoted, + digest->realm, + digest->nonce, + uripath, + digest->cnonce, + digest->nc, + digest->qop, + request_digest); + + if(Curl_raw_equal(digest->qop, "auth")) + digest->nc++; /* The nc (from RFC) has to be a 8 hex digit number 0 + padded which tells to the server how many times you are + using the same nonce in the qop=auth mode */ + } + else { + response = aprintf("username=\"%s\", " + "realm=\"%s\", " + "nonce=\"%s\", " + "uri=\"%s\", " + "response=\"%s\"", + userp_quoted, + digest->realm, + digest->nonce, + uripath, + request_digest); + } + Curl_safefree(userp_quoted); + if(!response) + return CURLE_OUT_OF_MEMORY; + + /* Add the optional fields */ + if(digest->opaque) { + /* Append the opaque */ + tmp = aprintf("%s, opaque=\"%s\"", response, digest->opaque); + free(response); + if(!tmp) + return CURLE_OUT_OF_MEMORY; + + response = tmp; + } + + if(digest->algorithm) { + /* Append the algorithm */ + tmp = aprintf("%s, algorithm=\"%s\"", response, digest->algorithm); + free(response); + if(!tmp) + return CURLE_OUT_OF_MEMORY; + + response = tmp; + } + + /* Return the output */ + *outptr = response; + *outlen = strlen(response); + + return CURLE_OK; } /* - * Curl_sasl_create_ntlm_type3_message() + * Curl_sasl_digest_cleanup() + * + * This is used to clean up the digest specific data. + * + * Parameters: * - * This is used to generate an already encoded NTLM type-3 message ready for + * digest [in/out] - The digest data struct being cleaned up. + * + */ +void Curl_sasl_digest_cleanup(struct digestdata *digest) +{ + Curl_safefree(digest->nonce); + Curl_safefree(digest->cnonce); + Curl_safefree(digest->realm); + Curl_safefree(digest->opaque); + Curl_safefree(digest->qop); + Curl_safefree(digest->algorithm); + + digest->nc = 0; + digest->algo = CURLDIGESTALGO_MD5; /* default algorithm */ + digest->stale = FALSE; /* default means normal, not stale */ +} +#endif /* !USE_WINDOWS_SSPI */ + +#endif /* CURL_DISABLE_CRYPTO_AUTH */ + +#if defined(USE_NTLM) && !defined(USE_WINDOWS_SSPI) +/* + * Curl_sasl_ntlm_cleanup() + * + * This is used to clean up the ntlm specific data. + * + * Parameters: + * + * ntlm [in/out] - The ntlm data struct being cleaned up. + * + */ +void Curl_sasl_ntlm_cleanup(struct ntlmdata *ntlm) +{ + /* Free the target info */ + Curl_safefree(ntlm->target_info); + + /* Reset any variables */ + ntlm->target_info_len = 0; +} +#endif /* USE_NTLM && !USE_WINDOWS_SSPI*/ + +/* + * Curl_sasl_create_xoauth2_message() + * + * This is used to generate an already encoded OAuth 2.0 message ready for * sending to the recipient. * * Parameters: * - * data [in] - Pointer to session handle. - * header [in] - Pointer to the base64 encoded type-2 message buffer. - * userp [in] - The user name in the format User or Domain\User. - * passdwp [in] - The user's password. - * ntlm [in/out] - The ntlm data struct being used and modified. + * data [in] - The session handle. + * user [in] - The user name. + * bearer [in] - The bearer token. * outptr [in/out] - The address where a pointer to newly allocated memory * holding the result will be stored upon completion. * outlen [out] - The length of the output message. * * Returns CURLE_OK on success. */ -CURLcode Curl_sasl_create_ntlm_type3_message(struct SessionHandle *data, - const char *header, - const char *userp, - const char *passwdp, - struct ntlmdata *ntlm, - char **outptr, size_t *outlen) +CURLcode Curl_sasl_create_xoauth2_message(struct SessionHandle *data, + const char *user, + const char *bearer, + char **outptr, size_t *outlen) { - CURLcode result = Curl_ntlm_decode_type2_message(data, header, ntlm); + CURLcode result = CURLE_OK; + char *xoauth = NULL; + + /* Generate the message */ + xoauth = aprintf("user=%s\1auth=Bearer %s\1\1", user, bearer); + if(!xoauth) + return CURLE_OUT_OF_MEMORY; + + /* Base64 encode the reply */ + result = Curl_base64_encode(data, xoauth, strlen(xoauth), outptr, outlen); - if(!result) - result = Curl_ntlm_create_type3_message(data, userp, passwdp, ntlm, - outptr, outlen); + Curl_safefree(xoauth); return result; } -#endif /* USE_NTLM */ /* * Curl_sasl_cleanup() @@ -478,18 +1155,26 @@ CURLcode Curl_sasl_create_ntlm_type3_message(struct SessionHandle *data, * * Parameters: * - * conn [in] - Pointer to the connection data. + * conn [in] - The connection data. * authused [in] - The authentication mechanism used. */ void Curl_sasl_cleanup(struct connectdata *conn, unsigned int authused) { -#ifdef USE_NTLM +#if defined(USE_KERBEROS5) + /* Cleanup the gssapi structure */ + if(authused == SASL_MECH_GSSAPI) { + Curl_sasl_gssapi_cleanup(&conn->krb5); + } +#endif + +#if defined(USE_NTLM) /* Cleanup the ntlm structure */ if(authused == SASL_MECH_NTLM) { - Curl_ntlm_sspi_cleanup(&conn->ntlm); + Curl_sasl_ntlm_cleanup(&conn->ntlm); } - (void)conn; -#else +#endif + +#if !defined(USE_KERBEROS5) && !defined(USE_NTLM) /* Reserved for future use */ (void)conn; (void)authused; diff --git a/lib/curl_sasl.h b/lib/curl_sasl.h index 22dcf80..41ef859 100644 --- a/lib/curl_sasl.h +++ b/lib/curl_sasl.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -22,20 +22,63 @@ * ***************************************************************************/ -#include "pingpong.h" +#include -/* Authentication mechanism flags */ -#define SASL_MECH_LOGIN (1 << 0) -#define SASL_MECH_PLAIN (1 << 1) -#define SASL_MECH_CRAM_MD5 (1 << 2) -#define SASL_MECH_DIGEST_MD5 (1 << 3) -#define SASL_MECH_GSSAPI (1 << 4) -#define SASL_MECH_EXTERNAL (1 << 5) -#define SASL_MECH_NTLM (1 << 6) +struct SessionHandle; +struct connectdata; + +#if !defined(CURL_DISABLE_CRYPTO_AUTH) +struct digestdata; +#endif + +#if defined(USE_NTLM) +struct ntlmdata; +#endif + +#if defined(USE_KERBEROS5) +struct kerberos5data; +#endif /* Authentication mechanism values */ #define SASL_AUTH_NONE 0 -#define SASL_AUTH_ANY ~0 +#define SASL_AUTH_ANY ~0U + +/* Authentication mechanism flags */ +#define SASL_MECH_LOGIN (1 << 0) +#define SASL_MECH_PLAIN (1 << 1) +#define SASL_MECH_CRAM_MD5 (1 << 2) +#define SASL_MECH_DIGEST_MD5 (1 << 3) +#define SASL_MECH_GSSAPI (1 << 4) +#define SASL_MECH_EXTERNAL (1 << 5) +#define SASL_MECH_NTLM (1 << 6) +#define SASL_MECH_XOAUTH2 (1 << 7) + +/* Authentication mechanism strings */ +#define SASL_MECH_STRING_LOGIN "LOGIN" +#define SASL_MECH_STRING_PLAIN "PLAIN" +#define SASL_MECH_STRING_CRAM_MD5 "CRAM-MD5" +#define SASL_MECH_STRING_DIGEST_MD5 "DIGEST-MD5" +#define SASL_MECH_STRING_GSSAPI "GSSAPI" +#define SASL_MECH_STRING_EXTERNAL "EXTERNAL" +#define SASL_MECH_STRING_NTLM "NTLM" +#define SASL_MECH_STRING_XOAUTH2 "XOAUTH2" + +enum { + CURLDIGESTALGO_MD5, + CURLDIGESTALGO_MD5SESS +}; + +/* This is used to test whether the line starts with the given mechanism */ +#define sasl_mech_equal(line, wordlen, mech) \ + (wordlen == (sizeof(mech) - 1) / sizeof(char) && \ + !memcmp(line, mech, wordlen)) + +/* This is used to build a SPN string */ +#if !defined(USE_WINDOWS_SSPI) +char *Curl_sasl_build_spn(const char *service, const char *instance); +#else +TCHAR *Curl_sasl_build_spn(const char *service, const char *instance); +#endif /* This is used to generate a base64 encoded PLAIN authentication message */ CURLcode Curl_sasl_create_plain_message(struct SessionHandle *data, @@ -50,9 +93,13 @@ CURLcode Curl_sasl_create_login_message(struct SessionHandle *data, size_t *outlen); #ifndef CURL_DISABLE_CRYPTO_AUTH +/* This is used to decode a base64 encoded CRAM-MD5 challange message */ +CURLcode Curl_sasl_decode_cram_md5_message(const char *chlg64, char **outptr, + size_t *outlen); + /* This is used to generate a base64 encoded CRAM-MD5 response message */ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data, - const char *chlg64, + const char *chlg, const char *user, const char *passwdp, char **outptr, size_t *outlen); @@ -60,10 +107,26 @@ CURLcode Curl_sasl_create_cram_md5_message(struct SessionHandle *data, /* This is used to generate a base64 encoded DIGEST-MD5 response message */ CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, const char *chlg64, - const char *user, + const char *userp, const char *passwdp, const char *service, char **outptr, size_t *outlen); + +/* This is used to decode a HTTP DIGEST challenge message */ +CURLcode Curl_sasl_decode_digest_http_message(const char *chlg, + struct digestdata *digest); + +/* This is used to generate a HTTP DIGEST response message */ +CURLcode Curl_sasl_create_digest_http_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const unsigned char *request, + const unsigned char *uri, + struct digestdata *digest, + char **outptr, size_t *outlen); + +/* This is used to clean up the digest specific data */ +void Curl_sasl_digest_cleanup(struct digestdata *digest); #endif #ifdef USE_NTLM @@ -74,17 +137,54 @@ CURLcode Curl_sasl_create_ntlm_type1_message(const char *userp, char **outptr, size_t *outlen); -/* This is used to decode an incoming NTLM type-2 message and generate a - base64 encoded type-3 response */ +/* This is used to decode a base64 encoded NTLM type-2 message */ +CURLcode Curl_sasl_decode_ntlm_type2_message(struct SessionHandle *data, + const char *type2msg, + struct ntlmdata *ntlm); + +/* This is used to generate a base64 encoded NTLM type-3 message */ CURLcode Curl_sasl_create_ntlm_type3_message(struct SessionHandle *data, - const char *header, const char *userp, const char *passwdp, struct ntlmdata *ntlm, char **outptr, size_t *outlen); +/* This is used to clean up the ntlm specific data */ +void Curl_sasl_ntlm_cleanup(struct ntlmdata *ntlm); + #endif /* USE_NTLM */ +#if defined(USE_KERBEROS5) +/* This is used to generate a base64 encoded GSSAPI (Kerberos V5) user token + message */ +CURLcode Curl_sasl_create_gssapi_user_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const char *service, + const bool mutual, + const char *chlg64, + struct kerberos5data *krb5, + char **outptr, size_t *outlen); + +/* This is used to generate a base64 encoded GSSAPI (Kerberos V5) security + token message */ +CURLcode Curl_sasl_create_gssapi_security_message(struct SessionHandle *data, + const char *input, + struct kerberos5data *krb5, + char **outptr, + size_t *outlen); + +/* This is used to clean up the gssapi specific data */ +void Curl_sasl_gssapi_cleanup(struct kerberos5data *krb5); +#endif /* USE_KERBEROS5 */ + +/* This is used to generate a base64 encoded XOAUTH2 authentication message + containing the user name and bearer token */ +CURLcode Curl_sasl_create_xoauth2_message(struct SessionHandle *data, + const char *user, + const char *bearer, + char **outptr, size_t *outlen); + /* This is used to cleanup any libraries or curl modules used by the sasl functions */ void Curl_sasl_cleanup(struct connectdata *conn, unsigned int authused); diff --git a/lib/curl_sasl_gssapi.c b/lib/curl_sasl_gssapi.c new file mode 100644 index 0000000..6dda0e9 --- /dev/null +++ b/lib/curl_sasl_gssapi.c @@ -0,0 +1,398 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2014, Steve Holme, . + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism + * + ***************************************************************************/ + +#include "curl_setup.h" + +#if defined(HAVE_GSSAPI) && defined(USE_KERBEROS5) + +#ifdef HAVE_OLD_GSSMIT +#define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name +#define NCOMPAT 1 +#endif + +#define GSSAUTH_P_NONE 1 +#define GSSAUTH_P_INTEGRITY 2 +#define GSSAUTH_P_PRIVACY 4 + +#include + +#include "curl_sasl.h" +#include "urldata.h" +#include "curl_base64.h" +#include "curl_gssapi.h" +#include "curl_memory.h" +#include "sendf.h" + +#define _MPRINTF_REPLACE /* use our functions only */ +#include + +/* The last #include file should be: */ +#include "memdebug.h" + +/* +* Curl_sasl_build_gssapi_spn() +* +* This is used to build a SPN string in the format service@host. +* +* Parameters: +* +* serivce [in] - The service type such as www, smtp, pop or imap. +* host [in] - The host name or realm. +* +* Returns a pointer to the newly allocated SPN. +*/ +static char *Curl_sasl_build_gssapi_spn(const char *service, const char *host) +{ + /* Generate and return our SPN */ + return aprintf("%s@%s", service, host); +} + +/* + * Curl_sasl_create_gssapi_user_message() + * + * This is used to generate an already encoded GSSAPI (Kerberos V5) user token + * message ready for sending to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * userp [in] - The user name. + * passdwp [in] - The user's password. + * service [in] - The service type such as www, smtp, pop or imap. + * mutual_auth [in] - Flag specifing whether or not mutual authentication + * is enabled. + * chlg64 [in] - Pointer to the optional base64 encoded challenge + * message. + * krb5 [in/out] - The gssapi data struct being used and modified. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_gssapi_user_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const char *service, + const bool mutual_auth, + const char *chlg64, + struct kerberos5data *krb5, + char **outptr, size_t *outlen) +{ + CURLcode result = CURLE_OK; + size_t chlglen = 0; + unsigned char *chlg = NULL; + OM_uint32 gss_status; + OM_uint32 gss_major_status; + OM_uint32 gss_minor_status; + gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER; + gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER; + gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; + + (void) userp; + (void) passwdp; + + if(krb5->context == GSS_C_NO_CONTEXT) { + /* Generate our SPN */ + char *spn = Curl_sasl_build_gssapi_spn(service, + data->easy_conn->host.name); + if(!spn) + return CURLE_OUT_OF_MEMORY; + + /* Populate the SPN structure */ + spn_token.value = spn; + spn_token.length = strlen(spn); + + /* Import the SPN */ + gss_major_status = gss_import_name(&gss_minor_status, &spn_token, + gss_nt_service_name, &krb5->spn); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, "gss_import_name() failed: "); + + return CURLE_OUT_OF_MEMORY; + } + } + else { + /* Decode the base-64 encoded challenge message */ + if(strlen(chlg64) && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &chlg, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!chlg) { + infof(data, "GSSAPI handshake failure (empty challenge message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Setup the challenge "input" security buffer */ + input_token.value = chlg; + input_token.length = chlglen; + } + + gss_major_status = Curl_gss_init_sec_context(data, + &gss_minor_status, + &krb5->context, + krb5->spn, + &Curl_krb5_mech_oid, + GSS_C_NO_CHANNEL_BINDINGS, + &input_token, + &output_token, + mutual_auth, + NULL); + + Curl_safefree(input_token.value); + + if(GSS_ERROR(gss_major_status)) { + if(output_token.value) + gss_release_buffer(&gss_status, &output_token); + + Curl_gss_log_error(data, gss_minor_status, + "gss_init_sec_context() failed: "); + + return CURLE_RECV_ERROR; + } + + if(output_token.value && output_token.length) { + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *) output_token.value, + output_token.length, outptr, outlen); + + gss_release_buffer(&gss_status, &output_token); + } + + return result; +} + +/* + * Curl_sasl_create_gssapi_security_message() + * + * This is used to generate an already encoded GSSAPI (Kerberos V5) security + * token message ready for sending to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * chlg64 [in] - Pointer to the optional base64 encoded challenge message. + * krb5 [in/out] - The gssapi data struct being used and modified. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_gssapi_security_message(struct SessionHandle *data, + const char *chlg64, + struct kerberos5data *krb5, + char **outptr, + size_t *outlen) +{ + CURLcode result = CURLE_OK; + size_t chlglen = 0; + size_t messagelen = 0; + unsigned char *chlg = NULL; + unsigned char *message = NULL; + OM_uint32 gss_status; + OM_uint32 gss_major_status; + OM_uint32 gss_minor_status; + gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER; + gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; + unsigned int indata = 0; + unsigned int outdata = 0; + gss_qop_t qop = GSS_C_QOP_DEFAULT; + unsigned int sec_layer = 0; + unsigned int max_size = 0; + gss_name_t username = GSS_C_NO_NAME; + gss_buffer_desc username_token; + + /* Decode the base-64 encoded input message */ + if(strlen(chlg64) && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &chlg, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!chlg) { + infof(data, "GSSAPI handshake failure (empty security message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Get the fully qualified username back from the context */ + gss_major_status = gss_inquire_context(&gss_minor_status, krb5->context, + &username, NULL, NULL, NULL, NULL, + NULL, NULL); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, + "gss_inquire_context() failed: "); + + Curl_safefree(chlg); + + return CURLE_OUT_OF_MEMORY; + } + + /* Convert the username from internal format to a displayable token */ + gss_major_status = gss_display_name(&gss_minor_status, username, + &username_token, NULL); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, "gss_display_name() failed: "); + + Curl_safefree(chlg); + + return CURLE_OUT_OF_MEMORY; + } + + /* Setup the challenge "input" security buffer */ + input_token.value = chlg; + input_token.length = chlglen; + + /* Decrypt the inbound challenge and obtain the qop */ + gss_major_status = gss_unwrap(&gss_minor_status, krb5->context, &input_token, + &output_token, NULL, &qop); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, "gss_unwrap() failed: "); + + gss_release_buffer(&gss_status, &username_token); + Curl_safefree(chlg); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Not 4 octets long so fail as per RFC4752 Section 3.1 */ + if(output_token.length != 4) { + infof(data, "GSSAPI handshake failure (invalid security data)\n"); + + gss_release_buffer(&gss_status, &username_token); + Curl_safefree(chlg); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Copy the data out and free the challenge as it is not required anymore */ + memcpy(&indata, output_token.value, 4); + gss_release_buffer(&gss_status, &output_token); + Curl_safefree(chlg); + + /* Extract the security layer */ + sec_layer = indata & 0x000000FF; + if(!(sec_layer & GSSAUTH_P_NONE)) { + infof(data, "GSSAPI handshake failure (invalid security layer)\n"); + + gss_release_buffer(&gss_status, &username_token); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Extract the maximum message size the server can receive */ + max_size = ntohl(indata & 0xFFFFFF00); + if(max_size > 0) { + /* The server has told us it supports a maximum receive buffer, however, as + we don't require one unless we are encrypting data, we tell the server + our receive buffer is zero. */ + max_size = 0; + } + + /* Allocate our message */ + messagelen = sizeof(outdata) + username_token.length + 1; + message = malloc(messagelen); + if(!message) { + gss_release_buffer(&gss_status, &username_token); + + return CURLE_OUT_OF_MEMORY; + } + + /* Populate the message with the security layer, client supported receive + message size and authorization identity including the 0x00 based + terminator. Note: Dispite RFC4752 Section 3.1 stating "The authorization + identity is not terminated with the zero-valued (%x00) octet." it seems + necessary to include it. */ + outdata = htonl(max_size) | sec_layer; + memcpy(message, &outdata, sizeof(outdata)); + memcpy(message + sizeof(outdata), username_token.value, + username_token.length); + message[messagelen - 1] = '\0'; + + /* Free the username token as it is not required anymore */ + gss_release_buffer(&gss_status, &username_token); + + /* Setup the "authentication data" security buffer */ + input_token.value = message; + input_token.length = messagelen; + + /* Encrypt the data */ + gss_major_status = gss_wrap(&gss_minor_status, krb5->context, 0, + GSS_C_QOP_DEFAULT, &input_token, NULL, + &output_token); + if(GSS_ERROR(gss_major_status)) { + Curl_gss_log_error(data, gss_minor_status, "gss_wrap() failed: "); + + Curl_safefree(message); + + return CURLE_OUT_OF_MEMORY; + } + + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *) output_token.value, + output_token.length, outptr, outlen); + + /* Free the output buffer */ + gss_release_buffer(&gss_status, &output_token); + + /* Free the message buffer */ + Curl_safefree(message); + + return result; +} + +/* + * Curl_sasl_gssapi_cleanup() + * + * This is used to clean up the gssapi specific data. + * + * Parameters: + * + * krb5 [in/out] - The kerberos 5 data struct being cleaned up. + * + */ +void Curl_sasl_gssapi_cleanup(struct kerberos5data *krb5) +{ + OM_uint32 minor_status; + + /* Free our security context */ + if(krb5->context != GSS_C_NO_CONTEXT) { + gss_delete_sec_context(&minor_status, &krb5->context, GSS_C_NO_BUFFER); + krb5->context = GSS_C_NO_CONTEXT; + } + + /* Free the SPN */ + if(krb5->spn != GSS_C_NO_NAME) { + gss_release_name(&minor_status, &krb5->spn); + krb5->spn = GSS_C_NO_NAME; + } +} + +#endif /* HAVE_GSSAPI && USE_KERBEROS5 */ diff --git a/lib/curl_sasl_sspi.c b/lib/curl_sasl_sspi.c new file mode 100644 index 0000000..0509b75 --- /dev/null +++ b/lib/curl_sasl_sspi.c @@ -0,0 +1,1209 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2014, Steve Holme, . + * Copyright (C) 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * RFC2617 Basic and Digest Access Authentication + * RFC2831 DIGEST-MD5 authentication + * RFC4422 Simple Authentication and Security Layer (SASL) + * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism + * + ***************************************************************************/ + +#include "curl_setup.h" + +#if defined(USE_WINDOWS_SSPI) + +#include + +#include "curl_sasl.h" +#include "urldata.h" +#include "curl_base64.h" +#include "warnless.h" +#include "curl_memory.h" +#include "curl_multibyte.h" +#include "sendf.h" +#include "strdup.h" + +#define _MPRINTF_REPLACE /* use our functions only */ +#include + +/* The last #include file should be: */ +#include "memdebug.h" + +/* + * Curl_sasl_build_spn() + * + * This is used to build a SPN string in the format service/host. + * + * Parameters: + * + * serivce [in] - The service type such as www, smtp, pop or imap. + * host [in] - The host name or realm. + * + * Returns a pointer to the newly allocated SPN. + */ +TCHAR *Curl_sasl_build_spn(const char *service, const char *host) +{ + char *utf8_spn = NULL; + TCHAR *tchar_spn = NULL; + + /* Note: We could use DsMakeSPN() or DsClientMakeSpnForTargetServer() rather + than doing this ourselves but the first is only available in Windows XP + and Windows Server 2003 and the latter is only available in Windows 2000 + but not Windows95/98/ME or Windows NT4.0 unless the Active Directory + Client Extensions are installed. As such it is far simpler for us to + formulate the SPN instead. */ + + /* Allocate our UTF8 based SPN */ + utf8_spn = aprintf("%s/%s", service, host); + if(!utf8_spn) { + return NULL; + } + + /* Allocate our TCHAR based SPN */ + tchar_spn = Curl_convert_UTF8_to_tchar(utf8_spn); + if(!tchar_spn) { + Curl_safefree(utf8_spn); + + return NULL; + } + + /* Release the UTF8 variant when operating with Unicode */ + Curl_unicodefree(utf8_spn); + + /* Return our newly allocated SPN */ + return tchar_spn; +} + +#if !defined(CURL_DISABLE_CRYPTO_AUTH) +/* + * Curl_sasl_create_digest_md5_message() + * + * This is used to generate an already encoded DIGEST-MD5 response message + * ready for sending to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * chlg64 [in] - The base64 encoded challenge message. + * userp [in] - The user name in the format User or Domain\User. + * passdwp [in] - The user's password. + * service [in] - The service type such as www, smtp, pop or imap. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data, + const char *chlg64, + const char *userp, + const char *passwdp, + const char *service, + char **outptr, size_t *outlen) +{ + CURLcode result = CURLE_OK; + TCHAR *spn = NULL; + size_t chlglen = 0; + size_t token_max = 0; + unsigned char *input_token = NULL; + unsigned char *output_token = NULL; + CredHandle credentials; + CtxtHandle context; + PSecPkgInfo SecurityPackage; + SEC_WINNT_AUTH_IDENTITY identity; + SEC_WINNT_AUTH_IDENTITY *p_identity; + SecBuffer chlg_buf; + SecBuffer resp_buf; + SecBufferDesc chlg_desc; + SecBufferDesc resp_desc; + SECURITY_STATUS status; + unsigned long attrs; + TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */ + + /* Decode the base-64 encoded challenge message */ + if(strlen(chlg64) && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &input_token, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!input_token) { + infof(data, "DIGEST-MD5 handshake failure (empty challenge message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Query the security package for DigestSSP */ + status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST), + &SecurityPackage); + if(status != SEC_E_OK) { + Curl_safefree(input_token); + + return CURLE_NOT_BUILT_IN; + } + + token_max = SecurityPackage->cbMaxToken; + + /* Release the package buffer as it is not required anymore */ + s_pSecFn->FreeContextBuffer(SecurityPackage); + + /* Allocate our response buffer */ + output_token = malloc(token_max); + if(!output_token) { + Curl_safefree(input_token); + + return CURLE_OUT_OF_MEMORY; + } + + /* Generate our SPN */ + spn = Curl_sasl_build_spn(service, data->easy_conn->host.name); + if(!spn) { + Curl_safefree(output_token); + Curl_safefree(input_token); + + return CURLE_OUT_OF_MEMORY; + } + + if(userp && *userp) { + /* Populate our identity structure */ + result = Curl_create_sspi_identity(userp, passwdp, &identity); + if(result) { + Curl_safefree(spn); + Curl_safefree(output_token); + Curl_safefree(input_token); + + return result; + } + + /* Allow proper cleanup of the identity structure */ + p_identity = &identity; + } + else + /* Use the current Windows user */ + p_identity = NULL; + + /* Acquire our credentials handle */ + status = s_pSecFn->AcquireCredentialsHandle(NULL, + (TCHAR *) TEXT(SP_NAME_DIGEST), + SECPKG_CRED_OUTBOUND, NULL, + p_identity, NULL, NULL, + &credentials, &expiry); + + if(status != SEC_E_OK) { + Curl_sspi_free_identity(p_identity); + Curl_safefree(spn); + Curl_safefree(output_token); + Curl_safefree(input_token); + + return CURLE_LOGIN_DENIED; + } + + /* Setup the challenge "input" security buffer */ + chlg_desc.ulVersion = SECBUFFER_VERSION; + chlg_desc.cBuffers = 1; + chlg_desc.pBuffers = &chlg_buf; + chlg_buf.BufferType = SECBUFFER_TOKEN; + chlg_buf.pvBuffer = input_token; + chlg_buf.cbBuffer = curlx_uztoul(chlglen); + + /* Setup the response "output" security buffer */ + resp_desc.ulVersion = SECBUFFER_VERSION; + resp_desc.cBuffers = 1; + resp_desc.pBuffers = &resp_buf; + resp_buf.BufferType = SECBUFFER_TOKEN; + resp_buf.pvBuffer = output_token; + resp_buf.cbBuffer = curlx_uztoul(token_max); + + /* Generate our response message */ + status = s_pSecFn->InitializeSecurityContext(&credentials, NULL, spn, + 0, 0, 0, &chlg_desc, 0, + &context, &resp_desc, &attrs, + &expiry); + + if(status == SEC_I_COMPLETE_NEEDED || + status == SEC_I_COMPLETE_AND_CONTINUE) + s_pSecFn->CompleteAuthToken(&credentials, &resp_desc); + else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) { + s_pSecFn->FreeCredentialsHandle(&credentials); + Curl_sspi_free_identity(p_identity); + Curl_safefree(spn); + Curl_safefree(output_token); + Curl_safefree(input_token); + + return CURLE_RECV_ERROR; + } + + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *) output_token, resp_buf.cbBuffer, + outptr, outlen); + + /* Free our handles */ + s_pSecFn->DeleteSecurityContext(&context); + s_pSecFn->FreeCredentialsHandle(&credentials); + + /* Free the identity structure */ + Curl_sspi_free_identity(p_identity); + + /* Free the SPN */ + Curl_safefree(spn); + + /* Free the response buffer */ + Curl_safefree(output_token); + + /* Free the decoded challenge message */ + Curl_safefree(input_token); + + return result; +} + +/* + * Curl_sasl_decode_digest_http_message() + * + * This is used to decode a HTTP DIGEST challenge message into the seperate + * attributes. + * + * Parameters: + * + * chlg [in] - The challenge message. + * digest [in/out] - The digest data struct being used and modified. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_decode_digest_http_message(const char *chlg, + struct digestdata *digest) +{ + size_t chlglen = strlen(chlg); + + /* We had an input token before and we got another one now. This means we + provided bad credentials in the previous request. */ + if(digest->input_token) + return CURLE_BAD_CONTENT_ENCODING; + + /* Simply store the challenge for use later */ + digest->input_token = (BYTE *) Curl_memdup(chlg, chlglen); + if(!digest->input_token) + return CURLE_OUT_OF_MEMORY; + + digest->input_token_len = chlglen; + + return CURLE_OK; +} + +/* + * Curl_sasl_create_digest_http_message() + * + * This is used to generate a HTTP DIGEST response message ready for sending + * to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * userp [in] - The user name in the format User or Domain\User. + * passdwp [in] - The user's password. + * request [in] - The HTTP request. + * uripath [in] - The path of the HTTP uri. + * digest [in/out] - The digest data struct being used and modified. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_digest_http_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const unsigned char *request, + const unsigned char *uripath, + struct digestdata *digest, + char **outptr, size_t *outlen) +{ + size_t token_max; + CredHandle credentials; + CtxtHandle context; + char *resp; + BYTE *output_token; + PSecPkgInfo SecurityPackage; + SEC_WINNT_AUTH_IDENTITY identity; + SEC_WINNT_AUTH_IDENTITY *p_identity; + SecBuffer chlg_buf[3]; + SecBuffer resp_buf; + SecBufferDesc chlg_desc; + SecBufferDesc resp_desc; + SECURITY_STATUS status; + unsigned long attrs; + TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */ + + (void) data; + + /* Query the security package for DigestSSP */ + status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST), + &SecurityPackage); + if(status != SEC_E_OK) + return CURLE_NOT_BUILT_IN; + + token_max = SecurityPackage->cbMaxToken; + + /* Release the package buffer as it is not required anymore */ + s_pSecFn->FreeContextBuffer(SecurityPackage); + + /* Allocate the output buffer according to the max token size as indicated + by the security package */ + output_token = malloc(token_max); + if(!output_token) + return CURLE_OUT_OF_MEMORY; + + if(userp && *userp) { + /* Populate our identity structure */ + if(Curl_create_sspi_identity(userp, passwdp, &identity)) + return CURLE_OUT_OF_MEMORY; + + /* Allow proper cleanup of the identity structure */ + p_identity = &identity; + } + else + /* Use the current Windows user */ + p_identity = NULL; + + /* Acquire our credentials handle */ + status = s_pSecFn->AcquireCredentialsHandle(NULL, + (TCHAR *) TEXT(SP_NAME_DIGEST), + SECPKG_CRED_OUTBOUND, NULL, + p_identity, NULL, NULL, + &credentials, &expiry); + if(status != SEC_E_OK) { + Curl_safefree(output_token); + + return CURLE_LOGIN_DENIED; + } + + /* Setup the challenge "input" security buffer if present */ + chlg_desc.ulVersion = SECBUFFER_VERSION; + chlg_desc.cBuffers = 3; + chlg_desc.pBuffers = chlg_buf; + chlg_buf[0].BufferType = SECBUFFER_TOKEN; + chlg_buf[0].pvBuffer = digest->input_token; + chlg_buf[0].cbBuffer = curlx_uztoul(digest->input_token_len); + chlg_buf[1].BufferType = SECBUFFER_PKG_PARAMS; + chlg_buf[1].pvBuffer = (void *)request; + chlg_buf[1].cbBuffer = curlx_uztoul(strlen((const char *) request)); + chlg_buf[2].BufferType = SECBUFFER_PKG_PARAMS; + chlg_buf[2].pvBuffer = NULL; + chlg_buf[2].cbBuffer = 0; + + /* Setup the response "output" security buffer */ + resp_desc.ulVersion = SECBUFFER_VERSION; + resp_desc.cBuffers = 1; + resp_desc.pBuffers = &resp_buf; + resp_buf.BufferType = SECBUFFER_TOKEN; + resp_buf.pvBuffer = output_token; + resp_buf.cbBuffer = curlx_uztoul(token_max); + + /* Generate our reponse message */ + status = s_pSecFn->InitializeSecurityContext(&credentials, NULL, + (TCHAR *) uripath, + ISC_REQ_USE_HTTP_STYLE, 0, 0, + &chlg_desc, 0, &context, + &resp_desc, &attrs, &expiry); + + if(status == SEC_I_COMPLETE_NEEDED || + status == SEC_I_COMPLETE_AND_CONTINUE) + s_pSecFn->CompleteAuthToken(&credentials, &resp_desc); + else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) { + s_pSecFn->FreeCredentialsHandle(&credentials); + + Curl_safefree(output_token); + + return CURLE_OUT_OF_MEMORY; + } + + resp = malloc(resp_buf.cbBuffer + 1); + if(!resp) { + s_pSecFn->DeleteSecurityContext(&context); + s_pSecFn->FreeCredentialsHandle(&credentials); + + Curl_safefree(output_token); + + return CURLE_OUT_OF_MEMORY; + } + + /* Copy the generated reponse */ + memcpy(resp, resp_buf.pvBuffer, resp_buf.cbBuffer); + resp[resp_buf.cbBuffer] = 0x00; + + /* Return the response */ + *outptr = resp; + *outlen = resp_buf.cbBuffer; + + /* Free our handles */ + s_pSecFn->DeleteSecurityContext(&context); + s_pSecFn->FreeCredentialsHandle(&credentials); + + /* Free the identity structure */ + Curl_sspi_free_identity(p_identity); + + /* Free the response buffer */ + Curl_safefree(output_token); + + return CURLE_OK; +} + +/* + * Curl_sasl_digest_cleanup() + * + * This is used to clean up the digest specific data. + * + * Parameters: + * + * digest [in/out] - The digest data struct being cleaned up. + * + */ +void Curl_sasl_digest_cleanup(struct digestdata *digest) +{ + /* Free the input token */ + Curl_safefree(digest->input_token); + + /* Reset any variables */ + digest->input_token_len = 0; +} +#endif /* !CURL_DISABLE_CRYPTO_AUTH */ + +#if defined USE_NTLM +/* +* Curl_sasl_create_ntlm_type1_message() +* +* This is used to generate an already encoded NTLM type-1 message ready for +* sending to the recipient. +* +* Parameters: +* +* userp [in] - The user name in the format User or Domain\User. +* passdwp [in] - The user's password. +* ntlm [in/out] - The ntlm data struct being used and modified. +* outptr [in/out] - The address where a pointer to newly allocated memory +* holding the result will be stored upon completion. +* outlen [out] - The length of the output message. +* +* Returns CURLE_OK on success. +*/ +CURLcode Curl_sasl_create_ntlm_type1_message(const char *userp, + const char *passwdp, + struct ntlmdata *ntlm, + char **outptr, size_t *outlen) +{ + PSecPkgInfo SecurityPackage; + SecBuffer type_1_buf; + SecBufferDesc type_1_desc; + SECURITY_STATUS status; + unsigned long attrs; + TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */ + + /* Clean up any former leftovers and initialise to defaults */ + Curl_sasl_ntlm_cleanup(ntlm); + + /* Query the security package for NTLM */ + status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM), + &SecurityPackage); + if(status != SEC_E_OK) + return CURLE_NOT_BUILT_IN; + + ntlm->token_max = SecurityPackage->cbMaxToken; + + /* Release the package buffer as it is not required anymore */ + s_pSecFn->FreeContextBuffer(SecurityPackage); + + /* Allocate our output buffer */ + ntlm->output_token = malloc(ntlm->token_max); + if(!ntlm->output_token) + return CURLE_OUT_OF_MEMORY; + + if(userp && *userp) { + CURLcode result; + + /* Populate our identity structure */ + result = Curl_create_sspi_identity(userp, passwdp, &ntlm->identity); + if(result) + return result; + + /* Allow proper cleanup of the identity structure */ + ntlm->p_identity = &ntlm->identity; + } + else + /* Use the current Windows user */ + ntlm->p_identity = NULL; + + /* Allocate our credentials handle */ + ntlm->credentials = malloc(sizeof(CredHandle)); + if(!ntlm->credentials) + return CURLE_OUT_OF_MEMORY; + + memset(ntlm->credentials, 0, sizeof(CredHandle)); + + /* Acquire our credentials handle */ + status = s_pSecFn->AcquireCredentialsHandle(NULL, + (TCHAR *) TEXT(SP_NAME_NTLM), + SECPKG_CRED_OUTBOUND, NULL, + ntlm->p_identity, NULL, NULL, + ntlm->credentials, &expiry); + if(status != SEC_E_OK) + return CURLE_LOGIN_DENIED; + + /* Allocate our new context handle */ + ntlm->context = malloc(sizeof(CtxtHandle)); + if(!ntlm->context) + return CURLE_OUT_OF_MEMORY; + + memset(ntlm->context, 0, sizeof(CtxtHandle)); + + /* Setup the type-1 "output" security buffer */ + type_1_desc.ulVersion = SECBUFFER_VERSION; + type_1_desc.cBuffers = 1; + type_1_desc.pBuffers = &type_1_buf; + type_1_buf.BufferType = SECBUFFER_TOKEN; + type_1_buf.pvBuffer = ntlm->output_token; + type_1_buf.cbBuffer = curlx_uztoul(ntlm->token_max); + + /* Generate our type-1 message */ + status = s_pSecFn->InitializeSecurityContext(ntlm->credentials, NULL, + (TCHAR *) TEXT(""), + 0, 0, SECURITY_NETWORK_DREP, + NULL, 0, + ntlm->context, &type_1_desc, + &attrs, &expiry); + if(status == SEC_I_COMPLETE_NEEDED || + status == SEC_I_COMPLETE_AND_CONTINUE) + s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc); + else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) + return CURLE_RECV_ERROR; + + /* Base64 encode the response */ + return Curl_base64_encode(NULL, (char *) ntlm->output_token, + type_1_buf.cbBuffer, outptr, outlen); +} + +/* +* Curl_sasl_decode_ntlm_type2_message() +* +* This is used to decode an already encoded NTLM type-2 message. +* +* Parameters: +* +* data [in] - The session handle. +* type2msg [in] - The base64 encoded type-2 message. +* ntlm [in/out] - The ntlm data struct being used and modified. +* +* Returns CURLE_OK on success. +*/ +CURLcode Curl_sasl_decode_ntlm_type2_message(struct SessionHandle *data, + const char *type2msg, + struct ntlmdata *ntlm) +{ + CURLcode result = CURLE_OK; + unsigned char *type2 = NULL; + size_t type2_len = 0; + +#if defined(CURL_DISABLE_VERBOSE_STRINGS) + (void) data; +#endif + + /* Decode the base-64 encoded type-2 message */ + if(strlen(type2msg) && *type2msg != '=') { + result = Curl_base64_decode(type2msg, &type2, &type2_len); + if(result) + return result; + } + + /* Ensure we have a valid type-2 message */ + if(!type2) { + infof(data, "NTLM handshake failure (empty type-2 message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Simply store the challenge for use later */ + ntlm->input_token = type2; + ntlm->input_token_len = type2_len; + + return result; +} + +/* +* Curl_sasl_create_ntlm_type3_message() +* +* This is used to generate an already encoded NTLM type-3 message ready for +* sending to the recipient. +* +* Parameters: +* +* data [in] - The session handle. +* userp [in] - The user name in the format User or Domain\User. +* passdwp [in] - The user's password. +* ntlm [in/out] - The ntlm data struct being used and modified. +* outptr [in/out] - The address where a pointer to newly allocated memory +* holding the result will be stored upon completion. +* outlen [out] - The length of the output message. +* +* Returns CURLE_OK on success. +*/ +CURLcode Curl_sasl_create_ntlm_type3_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + struct ntlmdata *ntlm, + char **outptr, size_t *outlen) +{ + CURLcode result = CURLE_OK; + SecBuffer type_2_buf; + SecBuffer type_3_buf; + SecBufferDesc type_2_desc; + SecBufferDesc type_3_desc; + SECURITY_STATUS status; + unsigned long attrs; + TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */ + + (void) passwdp; + (void) userp; + + /* Setup the type-2 "input" security buffer */ + type_2_desc.ulVersion = SECBUFFER_VERSION; + type_2_desc.cBuffers = 1; + type_2_desc.pBuffers = &type_2_buf; + type_2_buf.BufferType = SECBUFFER_TOKEN; + type_2_buf.pvBuffer = ntlm->input_token; + type_2_buf.cbBuffer = curlx_uztoul(ntlm->input_token_len); + + /* Setup the type-3 "output" security buffer */ + type_3_desc.ulVersion = SECBUFFER_VERSION; + type_3_desc.cBuffers = 1; + type_3_desc.pBuffers = &type_3_buf; + type_3_buf.BufferType = SECBUFFER_TOKEN; + type_3_buf.pvBuffer = ntlm->output_token; + type_3_buf.cbBuffer = curlx_uztoul(ntlm->token_max); + + /* Generate our type-3 message */ + status = s_pSecFn->InitializeSecurityContext(ntlm->credentials, + ntlm->context, + (TCHAR *) TEXT(""), + 0, 0, SECURITY_NETWORK_DREP, + &type_2_desc, + 0, ntlm->context, + &type_3_desc, + &attrs, &expiry); + if(status != SEC_E_OK) { + infof(data, "NTLM handshake failure (type-3 message): Status=%x\n", + status); + + return CURLE_RECV_ERROR; + } + + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *) ntlm->output_token, + type_3_buf.cbBuffer, outptr, outlen); + + Curl_sasl_ntlm_cleanup(ntlm); + + return result; +} + +/* + * Curl_sasl_ntlm_cleanup() + * + * This is used to clean up the ntlm specific data. + * + * Parameters: + * + * ntlm [in/out] - The ntlm data struct being cleaned up. + * + */ +void Curl_sasl_ntlm_cleanup(struct ntlmdata *ntlm) +{ + /* Free our security context */ + if(ntlm->context) { + s_pSecFn->DeleteSecurityContext(ntlm->context); + free(ntlm->context); + ntlm->context = NULL; + } + + /* Free our credentials handle */ + if(ntlm->credentials) { + s_pSecFn->FreeCredentialsHandle(ntlm->credentials); + free(ntlm->credentials); + ntlm->credentials = NULL; + } + + /* Free our identity */ + Curl_sspi_free_identity(ntlm->p_identity); + ntlm->p_identity = NULL; + + /* Free the input and output tokens */ + Curl_safefree(ntlm->input_token); + Curl_safefree(ntlm->output_token); + + /* Reset any variables */ + ntlm->token_max = 0; +} +#endif /* USE_NTLM */ + +#if defined(USE_KERBEROS5) +/* + * Curl_sasl_create_gssapi_user_message() + * + * This is used to generate an already encoded GSSAPI (Kerberos V5) user token + * message ready for sending to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * userp [in] - The user name in the format User or Domain\User. + * passdwp [in] - The user's password. + * service [in] - The service type such as www, smtp, pop or imap. + * mutual_auth [in] - Flag specifing whether or not mutual authentication + * is enabled. + * chlg64 [in] - The optional base64 encoded challenge message. + * krb5 [in/out] - The gssapi data struct being used and modified. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_gssapi_user_message(struct SessionHandle *data, + const char *userp, + const char *passwdp, + const char *service, + const bool mutual_auth, + const char *chlg64, + struct kerberos5data *krb5, + char **outptr, size_t *outlen) +{ + CURLcode result = CURLE_OK; + size_t chlglen = 0; + unsigned char *chlg = NULL; + CtxtHandle context; + PSecPkgInfo SecurityPackage; + SecBuffer chlg_buf; + SecBuffer resp_buf; + SecBufferDesc chlg_desc; + SecBufferDesc resp_desc; + SECURITY_STATUS status; + unsigned long attrs; + TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */ + + if(!krb5->credentials) { + /* Query the security package for Kerberos */ + status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) + TEXT(SP_NAME_KERBEROS), + &SecurityPackage); + if(status != SEC_E_OK) { + return CURLE_NOT_BUILT_IN; + } + + krb5->token_max = SecurityPackage->cbMaxToken; + + /* Release the package buffer as it is not required anymore */ + s_pSecFn->FreeContextBuffer(SecurityPackage); + + /* Allocate our response buffer */ + krb5->output_token = malloc(krb5->token_max); + if(!krb5->output_token) + return CURLE_OUT_OF_MEMORY; + + /* Generate our SPN */ + krb5->spn = Curl_sasl_build_spn(service, data->easy_conn->host.name); + if(!krb5->spn) + return CURLE_OUT_OF_MEMORY; + + if(userp && *userp) { + /* Populate our identity structure */ + result = Curl_create_sspi_identity(userp, passwdp, &krb5->identity); + if(result) + return result; + + /* Allow proper cleanup of the identity structure */ + krb5->p_identity = &krb5->identity; + } + else + /* Use the current Windows user */ + krb5->p_identity = NULL; + + /* Allocate our credentials handle */ + krb5->credentials = malloc(sizeof(CredHandle)); + if(!krb5->credentials) + return CURLE_OUT_OF_MEMORY; + + memset(krb5->credentials, 0, sizeof(CredHandle)); + + /* Acquire our credentials handle */ + status = s_pSecFn->AcquireCredentialsHandle(NULL, + (TCHAR *) + TEXT(SP_NAME_KERBEROS), + SECPKG_CRED_OUTBOUND, NULL, + krb5->p_identity, NULL, NULL, + krb5->credentials, &expiry); + if(status != SEC_E_OK) + return CURLE_LOGIN_DENIED; + + /* Allocate our new context handle */ + krb5->context = malloc(sizeof(CtxtHandle)); + if(!krb5->context) + return CURLE_OUT_OF_MEMORY; + + memset(krb5->context, 0, sizeof(CtxtHandle)); + } + else { + /* Decode the base-64 encoded challenge message */ + if(strlen(chlg64) && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &chlg, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!chlg) { + infof(data, "GSSAPI handshake failure (empty challenge message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Setup the challenge "input" security buffer */ + chlg_desc.ulVersion = SECBUFFER_VERSION; + chlg_desc.cBuffers = 1; + chlg_desc.pBuffers = &chlg_buf; + chlg_buf.BufferType = SECBUFFER_TOKEN; + chlg_buf.pvBuffer = chlg; + chlg_buf.cbBuffer = curlx_uztoul(chlglen); + } + + /* Setup the response "output" security buffer */ + resp_desc.ulVersion = SECBUFFER_VERSION; + resp_desc.cBuffers = 1; + resp_desc.pBuffers = &resp_buf; + resp_buf.BufferType = SECBUFFER_TOKEN; + resp_buf.pvBuffer = krb5->output_token; + resp_buf.cbBuffer = curlx_uztoul(krb5->token_max); + + /* Generate our challenge-response message */ + status = s_pSecFn->InitializeSecurityContext(krb5->credentials, + chlg ? krb5->context : NULL, + krb5->spn, + (mutual_auth ? + ISC_REQ_MUTUAL_AUTH : 0), + 0, SECURITY_NATIVE_DREP, + chlg ? &chlg_desc : NULL, 0, + &context, + &resp_desc, &attrs, + &expiry); + + if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) { + Curl_safefree(chlg); + + return CURLE_RECV_ERROR; + } + + if(memcmp(&context, krb5->context, sizeof(context))) { + s_pSecFn->DeleteSecurityContext(krb5->context); + + memcpy(krb5->context, &context, sizeof(context)); + } + + if(resp_buf.cbBuffer) { + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *)resp_buf.pvBuffer, + resp_buf.cbBuffer, outptr, outlen); + } + + /* Free the decoded challenge */ + Curl_safefree(chlg); + + return result; +} + +/* + * Curl_sasl_create_gssapi_security_message() + * + * This is used to generate an already encoded GSSAPI (Kerberos V5) security + * token message ready for sending to the recipient. + * + * Parameters: + * + * data [in] - The session handle. + * chlg64 [in] - The optional base64 encoded challenge message. + * krb5 [in/out] - The gssapi data struct being used and modified. + * outptr [in/out] - The address where a pointer to newly allocated memory + * holding the result will be stored upon completion. + * outlen [out] - The length of the output message. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_sasl_create_gssapi_security_message(struct SessionHandle *data, + const char *chlg64, + struct kerberos5data *krb5, + char **outptr, + size_t *outlen) +{ + CURLcode result = CURLE_OK; + size_t offset = 0; + size_t chlglen = 0; + size_t messagelen = 0; + size_t appdatalen = 0; + unsigned char *chlg = NULL; + unsigned char *trailer = NULL; + unsigned char *message = NULL; + unsigned char *padding = NULL; + unsigned char *appdata = NULL; + SecBuffer input_buf[2]; + SecBuffer wrap_buf[3]; + SecBufferDesc input_desc; + SecBufferDesc wrap_desc; + unsigned long indata = 0; + unsigned long outdata = 0; + unsigned long qop = 0; + unsigned long sec_layer = 0; + unsigned long max_size = 0; + SecPkgContext_Sizes sizes; + SecPkgCredentials_Names names; + SECURITY_STATUS status; + char *user_name; + + /* Decode the base-64 encoded input message */ + if(strlen(chlg64) && *chlg64 != '=') { + result = Curl_base64_decode(chlg64, &chlg, &chlglen); + if(result) + return result; + } + + /* Ensure we have a valid challenge message */ + if(!chlg) { + infof(data, "GSSAPI handshake failure (empty security message)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Get our response size information */ + status = s_pSecFn->QueryContextAttributes(krb5->context, + SECPKG_ATTR_SIZES, + &sizes); + if(status != SEC_E_OK) { + Curl_safefree(chlg); + + return CURLE_OUT_OF_MEMORY; + } + + /* Get the fully qualified username back from the context */ + status = s_pSecFn->QueryCredentialsAttributes(krb5->credentials, + SECPKG_CRED_ATTR_NAMES, + &names); + if(status != SEC_E_OK) { + Curl_safefree(chlg); + + return CURLE_RECV_ERROR; + } + + /* Setup the "input" security buffer */ + input_desc.ulVersion = SECBUFFER_VERSION; + input_desc.cBuffers = 2; + input_desc.pBuffers = input_buf; + input_buf[0].BufferType = SECBUFFER_STREAM; + input_buf[0].pvBuffer = chlg; + input_buf[0].cbBuffer = curlx_uztoul(chlglen); + input_buf[1].BufferType = SECBUFFER_DATA; + input_buf[1].pvBuffer = NULL; + input_buf[1].cbBuffer = 0; + + /* Decrypt the inbound challenge and obtain the qop */ + status = s_pSecFn->DecryptMessage(krb5->context, &input_desc, 0, &qop); + if(status != SEC_E_OK) { + infof(data, "GSSAPI handshake failure (empty security message)\n"); + + Curl_safefree(chlg); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Not 4 octets long so fail as per RFC4752 Section 3.1 */ + if(input_buf[1].cbBuffer != 4) { + infof(data, "GSSAPI handshake failure (invalid security data)\n"); + + Curl_safefree(chlg); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Copy the data out and free the challenge as it is not required anymore */ + memcpy(&indata, input_buf[1].pvBuffer, 4); + s_pSecFn->FreeContextBuffer(input_buf[1].pvBuffer); + Curl_safefree(chlg); + + /* Extract the security layer */ + sec_layer = indata & 0x000000FF; + if(!(sec_layer & KERB_WRAP_NO_ENCRYPT)) { + infof(data, "GSSAPI handshake failure (invalid security layer)\n"); + + return CURLE_BAD_CONTENT_ENCODING; + } + + /* Extract the maximum message size the server can receive */ + max_size = ntohl(indata & 0xFFFFFF00); + if(max_size > 0) { + /* The server has told us it supports a maximum receive buffer, however, as + we don't require one unless we are encrypting data, we tell the server + our receive buffer is zero. */ + max_size = 0; + } + + /* Allocate the trailer */ + trailer = malloc(sizes.cbSecurityTrailer); + if(!trailer) + return CURLE_OUT_OF_MEMORY; + + /* Convert the user name to UTF8 when operating with Unicode */ + user_name = Curl_convert_tchar_to_UTF8(names.sUserName); + if(!user_name) { + Curl_safefree(trailer); + + return CURLE_OUT_OF_MEMORY; + } + + /* Allocate our message */ + messagelen = sizeof(outdata) + strlen(user_name) + 1; + message = malloc(messagelen); + if(!message) { + Curl_safefree(trailer); + Curl_unicodefree(user_name); + + return CURLE_OUT_OF_MEMORY; + } + + /* Populate the message with the security layer, client supported receive + message size and authorization identity including the 0x00 based + terminator. Note: Dispite RFC4752 Section 3.1 stating "The authorization + identity is not terminated with the zero-valued (%x00) octet." it seems + necessary to include it. */ + outdata = htonl(max_size) | sec_layer; + memcpy(message, &outdata, sizeof(outdata)); + strcpy((char *) message + sizeof(outdata), user_name); + Curl_unicodefree(user_name); + + /* Allocate the padding */ + padding = malloc(sizes.cbBlockSize); + if(!padding) { + Curl_safefree(message); + Curl_safefree(trailer); + + return CURLE_OUT_OF_MEMORY; + } + + /* Setup the "authentication data" security buffer */ + wrap_desc.ulVersion = SECBUFFER_VERSION; + wrap_desc.cBuffers = 3; + wrap_desc.pBuffers = wrap_buf; + wrap_buf[0].BufferType = SECBUFFER_TOKEN; + wrap_buf[0].pvBuffer = trailer; + wrap_buf[0].cbBuffer = sizes.cbSecurityTrailer; + wrap_buf[1].BufferType = SECBUFFER_DATA; + wrap_buf[1].pvBuffer = message; + wrap_buf[1].cbBuffer = curlx_uztoul(messagelen); + wrap_buf[2].BufferType = SECBUFFER_PADDING; + wrap_buf[2].pvBuffer = padding; + wrap_buf[2].cbBuffer = sizes.cbBlockSize; + + /* Encrypt the data */ + status = s_pSecFn->EncryptMessage(krb5->context, KERB_WRAP_NO_ENCRYPT, + &wrap_desc, 0); + if(status != SEC_E_OK) { + Curl_safefree(padding); + Curl_safefree(message); + Curl_safefree(trailer); + + return CURLE_OUT_OF_MEMORY; + } + + /* Allocate the encryption (wrap) buffer */ + appdatalen = wrap_buf[0].cbBuffer + wrap_buf[1].cbBuffer + + wrap_buf[2].cbBuffer; + appdata = malloc(appdatalen); + if(!appdata) { + Curl_safefree(padding); + Curl_safefree(message); + Curl_safefree(trailer); + + return CURLE_OUT_OF_MEMORY; + } + + /* Populate the encryption buffer */ + memcpy(appdata, wrap_buf[0].pvBuffer, wrap_buf[0].cbBuffer); + offset += wrap_buf[0].cbBuffer; + memcpy(appdata + offset, wrap_buf[1].pvBuffer, wrap_buf[1].cbBuffer); + offset += wrap_buf[1].cbBuffer; + memcpy(appdata + offset, wrap_buf[2].pvBuffer, wrap_buf[2].cbBuffer); + + /* Base64 encode the response */ + result = Curl_base64_encode(data, (char *)appdata, appdatalen, outptr, + outlen); + + /* Free all of our local buffers */ + Curl_safefree(appdata); + Curl_safefree(padding); + Curl_safefree(message); + Curl_safefree(trailer); + + return result; +} + +/* + * Curl_sasl_gssapi_cleanup() + * + * This is used to clean up the gssapi specific data. + * + * Parameters: + * + * krb5 [in/out] - The kerberos 5 data struct being cleaned up. + * + */ +void Curl_sasl_gssapi_cleanup(struct kerberos5data *krb5) +{ + /* Free our security context */ + if(krb5->context) { + s_pSecFn->DeleteSecurityContext(krb5->context); + free(krb5->context); + krb5->context = NULL; + } + + /* Free our credentials handle */ + if(krb5->credentials) { + s_pSecFn->FreeCredentialsHandle(krb5->credentials); + free(krb5->credentials); + krb5->credentials = NULL; + } + + /* Free our identity */ + Curl_sspi_free_identity(krb5->p_identity); + krb5->p_identity = NULL; + + /* Free the SPN and output token */ + Curl_safefree(krb5->spn); + Curl_safefree(krb5->output_token); + + /* Reset any variables */ + krb5->token_max = 0; +} +#endif /* USE_KERBEROS5 */ + +#endif /* USE_WINDOWS_SSPI */ diff --git a/lib/krb4.h b/lib/curl_sec.h similarity index 82% rename from lib/krb4.h rename to lib/curl_sec.h index 3e29b25..6c48da2 100644 --- a/lib/krb4.h +++ b/lib/curl_sec.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_KRB4_H -#define HEADER_CURL_KRB4_H +#ifndef HEADER_CURL_SECURITY_H +#define HEADER_CURL_SECURITY_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -30,28 +30,22 @@ struct Curl_sec_client_mech { void (*end)(void *); int (*check_prot)(void *, int); int (*overhead)(void *, int, int); - int (*encode)(void *, const void*, int, int, void**, struct connectdata *); + int (*encode)(void *, const void*, int, int, void**); int (*decode)(void *, void*, int, int, struct connectdata *); }; - #define AUTH_OK 0 #define AUTH_CONTINUE 1 #define AUTH_ERROR 2 -#ifdef HAVE_KRB4 -extern struct Curl_sec_client_mech Curl_krb4_client_mech; -#endif #ifdef HAVE_GSSAPI -extern struct Curl_sec_client_mech Curl_krb5_client_mech; -#endif - -CURLcode Curl_krb_kauth(struct connectdata *conn); int Curl_sec_read_msg (struct connectdata *conn, char *, enum protection_level); void Curl_sec_end (struct connectdata *); CURLcode Curl_sec_login (struct connectdata *); int Curl_sec_request_prot (struct connectdata *conn, const char *level); -#endif /* HEADER_CURL_KRB4_H */ +extern struct Curl_sec_client_mech Curl_krb5_client_mech; +#endif +#endif /* HEADER_CURL_SECURITY_H */ diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 7edeca2..b046b77 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -112,6 +112,13 @@ # endif #endif +/* Solaris needs this to get a POSIX-conformant getpwuid_r */ +#if defined(sun) || defined(__sun) +# ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +# endif +#endif + /* ================================================================ */ /* If you need to include a system header file for your platform, */ /* please, do it beyond the point further indicated in this file. */ @@ -140,29 +147,6 @@ #endif /* - * Set up internal curl_off_t formatting string directives for - * exclusive use with libcurl's internal *printf functions. - */ - -#ifdef FORMAT_OFF_T -# error "FORMAT_OFF_T shall not be defined before this point!" - Error Compilation_aborted_FORMAT_OFF_T_already_defined -#endif - -#ifdef FORMAT_OFF_TU -# error "FORMAT_OFF_TU shall not be defined before this point!" - Error Compilation_aborted_FORMAT_OFF_TU_already_defined -#endif - -#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG) -# define FORMAT_OFF_T "lld" -# define FORMAT_OFF_TU "llu" -#else -# define FORMAT_OFF_T "ld" -# define FORMAT_OFF_TU "lu" -#endif - -/* * Disable other protocols when http is the only one desired. */ @@ -618,20 +602,29 @@ int netware_init(void); #define LIBIDN_REQUIRED_VERSION "0.4.1" #if defined(USE_GNUTLS) || defined(USE_SSLEAY) || defined(USE_NSS) || \ - defined(USE_QSOSSL) || defined(USE_POLARSSL) || defined(USE_AXTLS) || \ + defined(USE_POLARSSL) || defined(USE_AXTLS) || \ defined(USE_CYASSL) || defined(USE_SCHANNEL) || \ defined(USE_DARWINSSL) || defined(USE_GSKIT) #define USE_SSL /* SSL support has been enabled */ #endif -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) -#define USE_HTTP_NEGOTIATE +/* Single point where USE_SPNEGO definition might be defined */ +#if !defined(CURL_DISABLE_CRYPTO_AUTH) && \ + (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)) +#define USE_SPNEGO +#endif + +/* Single point where USE_KERBEROS5 definition might be defined */ +#if !defined(CURL_DISABLE_CRYPTO_AUTH) && \ + (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)) +#define USE_KERBEROS5 #endif -/* Single point where USE_NTLM definition might be done */ -#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_NTLM) +/* Single point where USE_NTLM definition might be defined */ +#if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH) #if defined(USE_SSLEAY) || defined(USE_WINDOWS_SSPI) || \ - defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_DARWINSSL) + defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_DARWINSSL) || \ + defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) #define USE_NTLM #endif #endif @@ -650,8 +643,10 @@ int netware_init(void); #if defined(__GNUC__) && ((__GNUC__ >= 3) || \ ((__GNUC__ == 2) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 7))) # define UNUSED_PARAM __attribute__((__unused__)) +# define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else # define UNUSED_PARAM /*NOTHING*/ +# define WARN_UNUSED_RESULT #endif /* diff --git a/lib/curl_setup_once.h b/lib/curl_setup_once.h index 6f3240a..69d6d47 100644 --- a/lib/curl_setup_once.h +++ b/lib/curl_setup_once.h @@ -440,7 +440,7 @@ typedef int sig_atomic_t; * (or equivalent) on this platform to hide platform details to code using it. */ -#ifdef WIN32 +#if defined(WIN32) && !defined(USE_LWIPSOCK) #define ERRNO ((int)GetLastError()) #define SET_ERRNO(x) (SetLastError((DWORD)(x))) #else diff --git a/lib/curl_sspi.c b/lib/curl_sspi.c index e747d86..f09d288 100644 --- a/lib/curl_sspi.c +++ b/lib/curl_sspi.c @@ -32,6 +32,9 @@ #include #include "curl_memory.h" +#include "curl_multibyte.h" +#include "warnless.h" + /* The last #include file should be: */ #include "memdebug.h" @@ -68,25 +71,52 @@ PSecurityFunctionTable s_pSecFn = NULL; */ CURLcode Curl_sspi_global_init(void) { - OSVERSIONINFO osver; + bool securityDll = FALSE; INITSECURITYINTERFACE_FN pInitSecurityInterface; /* If security interface is not yet initialized try to do this */ if(!s_hSecDll) { + /* Security Service Provider Interface (SSPI) functions are located in + * security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP + * have both these DLLs (security.dll forwards calls to secur32.dll) */ + DWORD majorVersion = 4; + DWORD platformId = VER_PLATFORM_WIN32_NT; + +#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_WIN2K) || \ + (_WIN32_WINNT < _WIN32_WINNT_WIN2K) + OSVERSIONINFO osver; - /* Find out Windows version */ memset(&osver, 0, sizeof(osver)); osver.dwOSVersionInfoSize = sizeof(osver); + + /* Find out Windows version */ if(!GetVersionEx(&osver)) return CURLE_FAILED_INIT; - /* Security Service Provider Interface (SSPI) functions are located in - * security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP - * have both these DLLs (security.dll forwards calls to secur32.dll) */ + /* Verify the major version number == 4 and platform id == WIN_NT */ + if(osver.dwMajorVersion == majorVersion && + osver.dwPlatformId == platformId) + securityDll = TRUE; +#else + ULONGLONG majorVersionMask; + ULONGLONG platformIdMask; + OSVERSIONINFOEX osver; + + memset(&osver, 0, sizeof(osver)); + osver.dwOSVersionInfoSize = sizeof(osver); + osver.dwMajorVersion = majorVersion; + osver.dwPlatformId = platformId; + majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); + platformIdMask = VerSetConditionMask(0, VER_PLATFORMID, VER_EQUAL); + + /* Verify the major version number == 4 and platform id == WIN_NT */ + if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask) && + VerifyVersionInfo(&osver, VER_PLATFORMID, platformIdMask)) + securityDll = TRUE; +#endif /* Load SSPI dll into the address space of the calling process */ - if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT - && osver.dwMajorVersion == 4) + if(securityDll) s_hSecDll = LoadLibrary(TEXT("security.dll")); else s_hSecDll = LoadLibrary(TEXT("secur32.dll")); @@ -123,4 +153,105 @@ void Curl_sspi_global_cleanup(void) } } +/* + * Curl_create_sspi_identity() + * + * This is used to populate a SSPI identity structure based on the supplied + * username and password. + * + * Parameters: + * + * userp [in] - The user name in the format User or Domain\User. + * passdwp [in] - The user's password. + * identity [in/out] - The identity structure. + * + * Returns CURLE_OK on success. + */ +CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp, + SEC_WINNT_AUTH_IDENTITY *identity) +{ + xcharp_u useranddomain; + xcharp_u user, dup_user; + xcharp_u domain, dup_domain; + xcharp_u passwd, dup_passwd; + size_t domlen = 0; + + domain.const_tchar_ptr = TEXT(""); + + /* Initialize the identity */ + memset(identity, 0, sizeof(*identity)); + + useranddomain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)userp); + if(!useranddomain.tchar_ptr) + return CURLE_OUT_OF_MEMORY; + + user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('\\')); + if(!user.const_tchar_ptr) + user.const_tchar_ptr = _tcschr(useranddomain.const_tchar_ptr, TEXT('/')); + + if(user.tchar_ptr) { + domain.tchar_ptr = useranddomain.tchar_ptr; + domlen = user.tchar_ptr - useranddomain.tchar_ptr; + user.tchar_ptr++; + } + else { + user.tchar_ptr = useranddomain.tchar_ptr; + domain.const_tchar_ptr = TEXT(""); + domlen = 0; + } + + /* Setup the identity's user and length */ + dup_user.tchar_ptr = _tcsdup(user.tchar_ptr); + if(!dup_user.tchar_ptr) { + Curl_unicodefree(useranddomain.tchar_ptr); + return CURLE_OUT_OF_MEMORY; + } + identity->User = dup_user.tbyte_ptr; + identity->UserLength = curlx_uztoul(_tcslen(dup_user.tchar_ptr)); + dup_user.tchar_ptr = NULL; + + /* Setup the identity's domain and length */ + dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1)); + if(!dup_domain.tchar_ptr) { + Curl_unicodefree(useranddomain.tchar_ptr); + return CURLE_OUT_OF_MEMORY; + } + _tcsncpy(dup_domain.tchar_ptr, domain.tchar_ptr, domlen); + *(dup_domain.tchar_ptr + domlen) = TEXT('\0'); + identity->Domain = dup_domain.tbyte_ptr; + identity->DomainLength = curlx_uztoul(domlen); + dup_domain.tchar_ptr = NULL; + + Curl_unicodefree(useranddomain.tchar_ptr); + + /* Setup ntlm identity's password and length */ + passwd.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)passwdp); + if(!passwd.tchar_ptr) + return CURLE_OUT_OF_MEMORY; + dup_passwd.tchar_ptr = _tcsdup(passwd.tchar_ptr); + if(!dup_passwd.tchar_ptr) { + Curl_unicodefree(passwd.tchar_ptr); + return CURLE_OUT_OF_MEMORY; + } + identity->Password = dup_passwd.tbyte_ptr; + identity->PasswordLength = curlx_uztoul(_tcslen(dup_passwd.tchar_ptr)); + dup_passwd.tchar_ptr = NULL; + + Curl_unicodefree(passwd.tchar_ptr); + + /* Setup the identity's flags */ + identity->Flags = SECFLAG_WINNT_AUTH_IDENTITY; + + return CURLE_OK; +} + +void Curl_sspi_free_identity(SEC_WINNT_AUTH_IDENTITY *identity) +{ + if(identity) { + Curl_safefree(identity->User); + Curl_safefree(identity->Password); + Curl_safefree(identity->Domain); + } +} + #endif /* USE_WINDOWS_SSPI */ diff --git a/lib/curl_sspi.h b/lib/curl_sspi.h index d525828..7fa308c 100644 --- a/lib/curl_sspi.h +++ b/lib/curl_sspi.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -43,251 +43,300 @@ CURLcode Curl_sspi_global_init(void); void Curl_sspi_global_cleanup(void); -/* Forward-declaration of global variables defined in curl_sspi.c */ +/* This is used to generate an SSPI identity structure */ +CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp, + SEC_WINNT_AUTH_IDENTITY *identity); + +/* This is used to free an SSPI identity structure */ +void Curl_sspi_free_identity(SEC_WINNT_AUTH_IDENTITY *identity); +/* Forward-declaration of global variables defined in curl_sspi.c */ extern HMODULE s_hSecDll; extern PSecurityFunctionTable s_pSecFn; /* Provide some definitions missing in old headers */ +#define SP_NAME_DIGEST "WDigest" +#define SP_NAME_NTLM "NTLM" +#define SP_NAME_NEGOTIATE "Negotiate" +#define SP_NAME_KERBEROS "Kerberos" + +#ifndef ISC_REQ_USE_HTTP_STYLE +#define ISC_REQ_USE_HTTP_STYLE 0x01000000 +#endif + +#ifndef ISC_RET_REPLAY_DETECT +#define ISC_RET_REPLAY_DETECT 0x00000004 +#endif + +#ifndef ISC_RET_SEQUENCE_DETECT +#define ISC_RET_SEQUENCE_DETECT 0x00000008 +#endif + +#ifndef ISC_RET_CONFIDENTIALITY +#define ISC_RET_CONFIDENTIALITY 0x00000010 +#endif + +#ifndef ISC_RET_ALLOCATED_MEMORY +#define ISC_RET_ALLOCATED_MEMORY 0x00000100 +#endif + +#ifndef ISC_RET_STREAM +#define ISC_RET_STREAM 0x00008000 +#endif #ifndef SEC_E_INSUFFICIENT_MEMORY -# define SEC_E_INSUFFICIENT_MEMORY ((HRESULT)0x80090300L) +# define SEC_E_INSUFFICIENT_MEMORY ((HRESULT)0x80090300L) #endif #ifndef SEC_E_INVALID_HANDLE -# define SEC_E_INVALID_HANDLE ((HRESULT)0x80090301L) +# define SEC_E_INVALID_HANDLE ((HRESULT)0x80090301L) #endif #ifndef SEC_E_UNSUPPORTED_FUNCTION -# define SEC_E_UNSUPPORTED_FUNCTION ((HRESULT)0x80090302L) +# define SEC_E_UNSUPPORTED_FUNCTION ((HRESULT)0x80090302L) #endif #ifndef SEC_E_TARGET_UNKNOWN -# define SEC_E_TARGET_UNKNOWN ((HRESULT)0x80090303L) +# define SEC_E_TARGET_UNKNOWN ((HRESULT)0x80090303L) #endif #ifndef SEC_E_INTERNAL_ERROR -# define SEC_E_INTERNAL_ERROR ((HRESULT)0x80090304L) +# define SEC_E_INTERNAL_ERROR ((HRESULT)0x80090304L) #endif #ifndef SEC_E_SECPKG_NOT_FOUND -# define SEC_E_SECPKG_NOT_FOUND ((HRESULT)0x80090305L) +# define SEC_E_SECPKG_NOT_FOUND ((HRESULT)0x80090305L) #endif #ifndef SEC_E_NOT_OWNER -# define SEC_E_NOT_OWNER ((HRESULT)0x80090306L) +# define SEC_E_NOT_OWNER ((HRESULT)0x80090306L) #endif #ifndef SEC_E_CANNOT_INSTALL -# define SEC_E_CANNOT_INSTALL ((HRESULT)0x80090307L) +# define SEC_E_CANNOT_INSTALL ((HRESULT)0x80090307L) #endif #ifndef SEC_E_INVALID_TOKEN -# define SEC_E_INVALID_TOKEN ((HRESULT)0x80090308L) +# define SEC_E_INVALID_TOKEN ((HRESULT)0x80090308L) #endif #ifndef SEC_E_CANNOT_PACK -# define SEC_E_CANNOT_PACK ((HRESULT)0x80090309L) +# define SEC_E_CANNOT_PACK ((HRESULT)0x80090309L) #endif #ifndef SEC_E_QOP_NOT_SUPPORTED -# define SEC_E_QOP_NOT_SUPPORTED ((HRESULT)0x8009030AL) +# define SEC_E_QOP_NOT_SUPPORTED ((HRESULT)0x8009030AL) #endif #ifndef SEC_E_NO_IMPERSONATION -# define SEC_E_NO_IMPERSONATION ((HRESULT)0x8009030BL) +# define SEC_E_NO_IMPERSONATION ((HRESULT)0x8009030BL) #endif #ifndef SEC_E_LOGON_DENIED -# define SEC_E_LOGON_DENIED ((HRESULT)0x8009030CL) +# define SEC_E_LOGON_DENIED ((HRESULT)0x8009030CL) #endif #ifndef SEC_E_UNKNOWN_CREDENTIALS -# define SEC_E_UNKNOWN_CREDENTIALS ((HRESULT)0x8009030DL) +# define SEC_E_UNKNOWN_CREDENTIALS ((HRESULT)0x8009030DL) #endif #ifndef SEC_E_NO_CREDENTIALS -# define SEC_E_NO_CREDENTIALS ((HRESULT)0x8009030EL) +# define SEC_E_NO_CREDENTIALS ((HRESULT)0x8009030EL) #endif #ifndef SEC_E_MESSAGE_ALTERED -# define SEC_E_MESSAGE_ALTERED ((HRESULT)0x8009030FL) +# define SEC_E_MESSAGE_ALTERED ((HRESULT)0x8009030FL) #endif #ifndef SEC_E_OUT_OF_SEQUENCE -# define SEC_E_OUT_OF_SEQUENCE ((HRESULT)0x80090310L) +# define SEC_E_OUT_OF_SEQUENCE ((HRESULT)0x80090310L) #endif #ifndef SEC_E_NO_AUTHENTICATING_AUTHORITY -# define SEC_E_NO_AUTHENTICATING_AUTHORITY ((HRESULT)0x80090311L) +# define SEC_E_NO_AUTHENTICATING_AUTHORITY ((HRESULT)0x80090311L) #endif #ifndef SEC_E_BAD_PKGID -# define SEC_E_BAD_PKGID ((HRESULT)0x80090316L) +# define SEC_E_BAD_PKGID ((HRESULT)0x80090316L) #endif #ifndef SEC_E_CONTEXT_EXPIRED -# define SEC_E_CONTEXT_EXPIRED ((HRESULT)0x80090317L) +# define SEC_E_CONTEXT_EXPIRED ((HRESULT)0x80090317L) #endif #ifndef SEC_E_INCOMPLETE_MESSAGE -# define SEC_E_INCOMPLETE_MESSAGE ((HRESULT)0x80090318L) +# define SEC_E_INCOMPLETE_MESSAGE ((HRESULT)0x80090318L) #endif #ifndef SEC_E_INCOMPLETE_CREDENTIALS -# define SEC_E_INCOMPLETE_CREDENTIALS ((HRESULT)0x80090320L) +# define SEC_E_INCOMPLETE_CREDENTIALS ((HRESULT)0x80090320L) #endif #ifndef SEC_E_BUFFER_TOO_SMALL -# define SEC_E_BUFFER_TOO_SMALL ((HRESULT)0x80090321L) +# define SEC_E_BUFFER_TOO_SMALL ((HRESULT)0x80090321L) #endif #ifndef SEC_E_WRONG_PRINCIPAL -# define SEC_E_WRONG_PRINCIPAL ((HRESULT)0x80090322L) +# define SEC_E_WRONG_PRINCIPAL ((HRESULT)0x80090322L) #endif #ifndef SEC_E_TIME_SKEW -# define SEC_E_TIME_SKEW ((HRESULT)0x80090324L) +# define SEC_E_TIME_SKEW ((HRESULT)0x80090324L) #endif #ifndef SEC_E_UNTRUSTED_ROOT -# define SEC_E_UNTRUSTED_ROOT ((HRESULT)0x80090325L) +# define SEC_E_UNTRUSTED_ROOT ((HRESULT)0x80090325L) #endif #ifndef SEC_E_ILLEGAL_MESSAGE -# define SEC_E_ILLEGAL_MESSAGE ((HRESULT)0x80090326L) +# define SEC_E_ILLEGAL_MESSAGE ((HRESULT)0x80090326L) #endif #ifndef SEC_E_CERT_UNKNOWN -# define SEC_E_CERT_UNKNOWN ((HRESULT)0x80090327L) +# define SEC_E_CERT_UNKNOWN ((HRESULT)0x80090327L) #endif #ifndef SEC_E_CERT_EXPIRED -# define SEC_E_CERT_EXPIRED ((HRESULT)0x80090328L) +# define SEC_E_CERT_EXPIRED ((HRESULT)0x80090328L) #endif #ifndef SEC_E_ENCRYPT_FAILURE -# define SEC_E_ENCRYPT_FAILURE ((HRESULT)0x80090329L) +# define SEC_E_ENCRYPT_FAILURE ((HRESULT)0x80090329L) #endif #ifndef SEC_E_DECRYPT_FAILURE -# define SEC_E_DECRYPT_FAILURE ((HRESULT)0x80090330L) +# define SEC_E_DECRYPT_FAILURE ((HRESULT)0x80090330L) #endif #ifndef SEC_E_ALGORITHM_MISMATCH -# define SEC_E_ALGORITHM_MISMATCH ((HRESULT)0x80090331L) +# define SEC_E_ALGORITHM_MISMATCH ((HRESULT)0x80090331L) #endif #ifndef SEC_E_SECURITY_QOS_FAILED -# define SEC_E_SECURITY_QOS_FAILED ((HRESULT)0x80090332L) +# define SEC_E_SECURITY_QOS_FAILED ((HRESULT)0x80090332L) #endif #ifndef SEC_E_UNFINISHED_CONTEXT_DELETED -# define SEC_E_UNFINISHED_CONTEXT_DELETED ((HRESULT)0x80090333L) +# define SEC_E_UNFINISHED_CONTEXT_DELETED ((HRESULT)0x80090333L) #endif #ifndef SEC_E_NO_TGT_REPLY -# define SEC_E_NO_TGT_REPLY ((HRESULT)0x80090334L) +# define SEC_E_NO_TGT_REPLY ((HRESULT)0x80090334L) #endif #ifndef SEC_E_NO_IP_ADDRESSES -# define SEC_E_NO_IP_ADDRESSES ((HRESULT)0x80090335L) +# define SEC_E_NO_IP_ADDRESSES ((HRESULT)0x80090335L) #endif #ifndef SEC_E_WRONG_CREDENTIAL_HANDLE -# define SEC_E_WRONG_CREDENTIAL_HANDLE ((HRESULT)0x80090336L) +# define SEC_E_WRONG_CREDENTIAL_HANDLE ((HRESULT)0x80090336L) #endif #ifndef SEC_E_CRYPTO_SYSTEM_INVALID -# define SEC_E_CRYPTO_SYSTEM_INVALID ((HRESULT)0x80090337L) +# define SEC_E_CRYPTO_SYSTEM_INVALID ((HRESULT)0x80090337L) #endif #ifndef SEC_E_MAX_REFERRALS_EXCEEDED -# define SEC_E_MAX_REFERRALS_EXCEEDED ((HRESULT)0x80090338L) +# define SEC_E_MAX_REFERRALS_EXCEEDED ((HRESULT)0x80090338L) #endif #ifndef SEC_E_MUST_BE_KDC -# define SEC_E_MUST_BE_KDC ((HRESULT)0x80090339L) +# define SEC_E_MUST_BE_KDC ((HRESULT)0x80090339L) #endif #ifndef SEC_E_STRONG_CRYPTO_NOT_SUPPORTED -# define SEC_E_STRONG_CRYPTO_NOT_SUPPORTED ((HRESULT)0x8009033AL) +# define SEC_E_STRONG_CRYPTO_NOT_SUPPORTED ((HRESULT)0x8009033AL) #endif #ifndef SEC_E_TOO_MANY_PRINCIPALS -# define SEC_E_TOO_MANY_PRINCIPALS ((HRESULT)0x8009033BL) +# define SEC_E_TOO_MANY_PRINCIPALS ((HRESULT)0x8009033BL) #endif #ifndef SEC_E_NO_PA_DATA -# define SEC_E_NO_PA_DATA ((HRESULT)0x8009033CL) +# define SEC_E_NO_PA_DATA ((HRESULT)0x8009033CL) #endif #ifndef SEC_E_PKINIT_NAME_MISMATCH -# define SEC_E_PKINIT_NAME_MISMATCH ((HRESULT)0x8009033DL) +# define SEC_E_PKINIT_NAME_MISMATCH ((HRESULT)0x8009033DL) #endif #ifndef SEC_E_SMARTCARD_LOGON_REQUIRED -# define SEC_E_SMARTCARD_LOGON_REQUIRED ((HRESULT)0x8009033EL) +# define SEC_E_SMARTCARD_LOGON_REQUIRED ((HRESULT)0x8009033EL) #endif #ifndef SEC_E_SHUTDOWN_IN_PROGRESS -# define SEC_E_SHUTDOWN_IN_PROGRESS ((HRESULT)0x8009033FL) +# define SEC_E_SHUTDOWN_IN_PROGRESS ((HRESULT)0x8009033FL) #endif #ifndef SEC_E_KDC_INVALID_REQUEST -# define SEC_E_KDC_INVALID_REQUEST ((HRESULT)0x80090340L) +# define SEC_E_KDC_INVALID_REQUEST ((HRESULT)0x80090340L) #endif #ifndef SEC_E_KDC_UNABLE_TO_REFER -# define SEC_E_KDC_UNABLE_TO_REFER ((HRESULT)0x80090341L) +# define SEC_E_KDC_UNABLE_TO_REFER ((HRESULT)0x80090341L) #endif #ifndef SEC_E_KDC_UNKNOWN_ETYPE -# define SEC_E_KDC_UNKNOWN_ETYPE ((HRESULT)0x80090342L) +# define SEC_E_KDC_UNKNOWN_ETYPE ((HRESULT)0x80090342L) #endif #ifndef SEC_E_UNSUPPORTED_PREAUTH -# define SEC_E_UNSUPPORTED_PREAUTH ((HRESULT)0x80090343L) +# define SEC_E_UNSUPPORTED_PREAUTH ((HRESULT)0x80090343L) #endif #ifndef SEC_E_DELEGATION_REQUIRED -# define SEC_E_DELEGATION_REQUIRED ((HRESULT)0x80090345L) +# define SEC_E_DELEGATION_REQUIRED ((HRESULT)0x80090345L) #endif #ifndef SEC_E_BAD_BINDINGS -# define SEC_E_BAD_BINDINGS ((HRESULT)0x80090346L) +# define SEC_E_BAD_BINDINGS ((HRESULT)0x80090346L) #endif #ifndef SEC_E_MULTIPLE_ACCOUNTS -# define SEC_E_MULTIPLE_ACCOUNTS ((HRESULT)0x80090347L) +# define SEC_E_MULTIPLE_ACCOUNTS ((HRESULT)0x80090347L) #endif #ifndef SEC_E_NO_KERB_KEY -# define SEC_E_NO_KERB_KEY ((HRESULT)0x80090348L) +# define SEC_E_NO_KERB_KEY ((HRESULT)0x80090348L) #endif #ifndef SEC_E_CERT_WRONG_USAGE -# define SEC_E_CERT_WRONG_USAGE ((HRESULT)0x80090349L) +# define SEC_E_CERT_WRONG_USAGE ((HRESULT)0x80090349L) #endif #ifndef SEC_E_DOWNGRADE_DETECTED -# define SEC_E_DOWNGRADE_DETECTED ((HRESULT)0x80090350L) +# define SEC_E_DOWNGRADE_DETECTED ((HRESULT)0x80090350L) #endif #ifndef SEC_E_SMARTCARD_CERT_REVOKED -# define SEC_E_SMARTCARD_CERT_REVOKED ((HRESULT)0x80090351L) +# define SEC_E_SMARTCARD_CERT_REVOKED ((HRESULT)0x80090351L) #endif #ifndef SEC_E_ISSUING_CA_UNTRUSTED -# define SEC_E_ISSUING_CA_UNTRUSTED ((HRESULT)0x80090352L) +# define SEC_E_ISSUING_CA_UNTRUSTED ((HRESULT)0x80090352L) #endif #ifndef SEC_E_REVOCATION_OFFLINE_C -# define SEC_E_REVOCATION_OFFLINE_C ((HRESULT)0x80090353L) +# define SEC_E_REVOCATION_OFFLINE_C ((HRESULT)0x80090353L) #endif #ifndef SEC_E_PKINIT_CLIENT_FAILURE -# define SEC_E_PKINIT_CLIENT_FAILURE ((HRESULT)0x80090354L) +# define SEC_E_PKINIT_CLIENT_FAILURE ((HRESULT)0x80090354L) #endif #ifndef SEC_E_SMARTCARD_CERT_EXPIRED -# define SEC_E_SMARTCARD_CERT_EXPIRED ((HRESULT)0x80090355L) +# define SEC_E_SMARTCARD_CERT_EXPIRED ((HRESULT)0x80090355L) #endif #ifndef SEC_E_NO_S4U_PROT_SUPPORT -# define SEC_E_NO_S4U_PROT_SUPPORT ((HRESULT)0x80090356L) +# define SEC_E_NO_S4U_PROT_SUPPORT ((HRESULT)0x80090356L) #endif #ifndef SEC_E_CROSSREALM_DELEGATION_FAILURE -# define SEC_E_CROSSREALM_DELEGATION_FAILURE ((HRESULT)0x80090357L) +# define SEC_E_CROSSREALM_DELEGATION_FAILURE ((HRESULT)0x80090357L) #endif #ifndef SEC_E_REVOCATION_OFFLINE_KDC -# define SEC_E_REVOCATION_OFFLINE_KDC ((HRESULT)0x80090358L) +# define SEC_E_REVOCATION_OFFLINE_KDC ((HRESULT)0x80090358L) #endif #ifndef SEC_E_ISSUING_CA_UNTRUSTED_KDC -# define SEC_E_ISSUING_CA_UNTRUSTED_KDC ((HRESULT)0x80090359L) +# define SEC_E_ISSUING_CA_UNTRUSTED_KDC ((HRESULT)0x80090359L) #endif #ifndef SEC_E_KDC_CERT_EXPIRED -# define SEC_E_KDC_CERT_EXPIRED ((HRESULT)0x8009035AL) +# define SEC_E_KDC_CERT_EXPIRED ((HRESULT)0x8009035AL) #endif #ifndef SEC_E_KDC_CERT_REVOKED -# define SEC_E_KDC_CERT_REVOKED ((HRESULT)0x8009035BL) +# define SEC_E_KDC_CERT_REVOKED ((HRESULT)0x8009035BL) #endif #ifndef SEC_E_INVALID_PARAMETER -# define SEC_E_INVALID_PARAMETER ((HRESULT)0x8009035DL) +# define SEC_E_INVALID_PARAMETER ((HRESULT)0x8009035DL) #endif #ifndef SEC_E_DELEGATION_POLICY -# define SEC_E_DELEGATION_POLICY ((HRESULT)0x8009035EL) +# define SEC_E_DELEGATION_POLICY ((HRESULT)0x8009035EL) #endif #ifndef SEC_E_POLICY_NLTM_ONLY -# define SEC_E_POLICY_NLTM_ONLY ((HRESULT)0x8009035FL) +# define SEC_E_POLICY_NLTM_ONLY ((HRESULT)0x8009035FL) #endif #ifndef SEC_I_CONTINUE_NEEDED -# define SEC_I_CONTINUE_NEEDED ((HRESULT)0x00090312L) +# define SEC_I_CONTINUE_NEEDED ((HRESULT)0x00090312L) #endif #ifndef SEC_I_COMPLETE_NEEDED -# define SEC_I_COMPLETE_NEEDED ((HRESULT)0x00090313L) +# define SEC_I_COMPLETE_NEEDED ((HRESULT)0x00090313L) #endif #ifndef SEC_I_COMPLETE_AND_CONTINUE -# define SEC_I_COMPLETE_AND_CONTINUE ((HRESULT)0x00090314L) +# define SEC_I_COMPLETE_AND_CONTINUE ((HRESULT)0x00090314L) #endif #ifndef SEC_I_LOCAL_LOGON -# define SEC_I_LOCAL_LOGON ((HRESULT)0x00090315L) +# define SEC_I_LOCAL_LOGON ((HRESULT)0x00090315L) #endif #ifndef SEC_I_CONTEXT_EXPIRED -# define SEC_I_CONTEXT_EXPIRED ((HRESULT)0x00090317L) +# define SEC_I_CONTEXT_EXPIRED ((HRESULT)0x00090317L) #endif #ifndef SEC_I_INCOMPLETE_CREDENTIALS -# define SEC_I_INCOMPLETE_CREDENTIALS ((HRESULT)0x00090320L) +# define SEC_I_INCOMPLETE_CREDENTIALS ((HRESULT)0x00090320L) #endif #ifndef SEC_I_RENEGOTIATE -# define SEC_I_RENEGOTIATE ((HRESULT)0x00090321L) +# define SEC_I_RENEGOTIATE ((HRESULT)0x00090321L) #endif #ifndef SEC_I_NO_LSA_CONTEXT -# define SEC_I_NO_LSA_CONTEXT ((HRESULT)0x00090323L) +# define SEC_I_NO_LSA_CONTEXT ((HRESULT)0x00090323L) #endif #ifndef SEC_I_SIGNATURE_NEEDED -# define SEC_I_SIGNATURE_NEEDED ((HRESULT)0x0009035CL) +# define SEC_I_SIGNATURE_NEEDED ((HRESULT)0x0009035CL) +#endif + +#ifdef UNICODE +# define SECFLAG_WINNT_AUTH_IDENTITY \ + (unsigned long)SEC_WINNT_AUTH_IDENTITY_UNICODE +#else +# define SECFLAG_WINNT_AUTH_IDENTITY \ + (unsigned long)SEC_WINNT_AUTH_IDENTITY_ANSI #endif +/* + * Definitions required from ntsecapi.h are directly provided below this point + * to avoid including ntsecapi.h due to a conflict with OpenSSL's safestack.h + */ +#define KERB_WRAP_NO_ENCRYPT 0x80000001 + #endif /* USE_WINDOWS_SSPI */ + #endif /* HEADER_CURL_SSPI_H */ diff --git a/lib/curl_threads.c b/lib/curl_threads.c index c9e91f6..5b70139 100644 --- a/lib/curl_threads.c +++ b/lib/curl_threads.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -63,32 +63,38 @@ static void *curl_thread_create_thunk(void *arg) curl_thread_t Curl_thread_create(unsigned int (*func) (void*), void *arg) { - curl_thread_t t; + curl_thread_t t = malloc(sizeof(pthread_t)); struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call)); - if(!ac) - return curl_thread_t_null; + if(!(ac && t)) + goto err; ac->func = func; ac->arg = arg; - if(pthread_create(&t, NULL, curl_thread_create_thunk, ac) != 0) { - free(ac); - return curl_thread_t_null; - } + if(pthread_create(t, NULL, curl_thread_create_thunk, ac) != 0) + goto err; return t; + +err: + Curl_safefree(t); + Curl_safefree(ac); + return curl_thread_t_null; } void Curl_thread_destroy(curl_thread_t hnd) { - if(hnd != curl_thread_t_null) - pthread_detach(hnd); + if(hnd != curl_thread_t_null) { + pthread_detach(*hnd); + free(hnd); + } } int Curl_thread_join(curl_thread_t *hnd) { - int ret = (pthread_join(*hnd, NULL) == 0); + int ret = (pthread_join(**hnd, NULL) == 0); + free(*hnd); *hnd = curl_thread_t_null; return ret; @@ -117,7 +123,12 @@ void Curl_thread_destroy(curl_thread_t hnd) int Curl_thread_join(curl_thread_t *hnd) { +#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \ + (_WIN32_WINNT < _WIN32_WINNT_VISTA) int ret = (WaitForSingleObject(*hnd, INFINITE) == WAIT_OBJECT_0); +#else + int ret = (WaitForSingleObjectEx(*hnd, INFINITE, FALSE) == WAIT_OBJECT_0); +#endif Curl_thread_destroy(*hnd); diff --git a/lib/curl_threads.h b/lib/curl_threads.h index d9cec6b..0f3191a 100644 --- a/lib/curl_threads.h +++ b/lib/curl_threads.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,8 +26,8 @@ #if defined(USE_THREADS_POSIX) # define CURL_STDCALL # define curl_mutex_t pthread_mutex_t -# define curl_thread_t pthread_t -# define curl_thread_t_null (pthread_t)0 +# define curl_thread_t pthread_t * +# define curl_thread_t_null (pthread_t *)0 # define Curl_mutex_init(m) pthread_mutex_init(m, NULL) # define Curl_mutex_acquire(m) pthread_mutex_lock(m) # define Curl_mutex_release(m) pthread_mutex_unlock(m) @@ -37,7 +37,12 @@ # define curl_mutex_t CRITICAL_SECTION # define curl_thread_t HANDLE # define curl_thread_t_null (HANDLE)0 -# define Curl_mutex_init(m) InitializeCriticalSection(m) +# if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \ + (_WIN32_WINNT < _WIN32_WINNT_VISTA) +# define Curl_mutex_init(m) InitializeCriticalSection(m) +# else +# define Curl_mutex_init(m) InitializeCriticalSectionEx(m, 0, 1) +# endif # define Curl_mutex_acquire(m) EnterCriticalSection(m) # define Curl_mutex_release(m) LeaveCriticalSection(m) # define Curl_mutex_destroy(m) DeleteCriticalSection(m) diff --git a/lib/dict.c b/lib/dict.c index f5c8921..86ddfb9 100644 --- a/lib/dict.c +++ b/lib/dict.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -122,9 +122,8 @@ static char *unescape_word(struct SessionHandle *data, const char *inputbuff) dictp[olen++] = byte; } dictp[olen]=0; - - free(newp); } + free(newp); return dictp; } diff --git a/lib/dotdot.c b/lib/dotdot.c index 41b73be..ae16941 100644 --- a/lib/dotdot.c +++ b/lib/dotdot.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -47,7 +47,7 @@ * * an allocated dedotdotified output string */ -char *Curl_dedotdotify(char *input) +char *Curl_dedotdotify(const char *input) { size_t inlen = strlen(input); char *clone; diff --git a/lib/dotdot.h b/lib/dotdot.h index c3487c1..cd57822 100644 --- a/lib/dotdot.h +++ b/lib/dotdot.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -21,5 +21,5 @@ * KIND, either express or implied. * ***************************************************************************/ -char *Curl_dedotdotify(char *input); +char *Curl_dedotdotify(const char *input); #endif diff --git a/lib/easy.c b/lib/easy.c index 041a831..619312b 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -50,16 +50,11 @@ #include #endif -#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) && defined(USE_OPENSSL) -#define SIGPIPE_IGNORE 1 -#include -#endif - #include "strequal.h" #include "urldata.h" #include #include "transfer.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "url.h" #include "getinfo.h" #include "hostip.h" @@ -78,6 +73,8 @@ #include "warnless.h" #include "conncache.h" #include "multiif.h" +#include "sigpipe.h" +#include "ssh.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -85,56 +82,6 @@ /* The last #include file should be: */ #include "memdebug.h" -#ifdef SIGPIPE_IGNORE -struct sigpipe_ignore { - struct sigaction old_pipe_act; - bool no_signal; -}; - -#define SIGPIPE_VARIABLE(x) struct sigpipe_ignore x - -/* - * sigpipe_ignore() makes sure we ignore SIGPIPE while running libcurl - * internals, and then sigpipe_restore() will restore the situation when we - * return from libcurl again. - */ -static void sigpipe_ignore(struct SessionHandle *data, - struct sigpipe_ignore *ig) -{ - /* get a local copy of no_signal because the SessionHandle might not be - around when we restore */ - ig->no_signal = data->set.no_signal; - if(!data->set.no_signal) { - struct sigaction action; - /* first, extract the existing situation */ - memset(&ig->old_pipe_act, 0, sizeof(struct sigaction)); - sigaction(SIGPIPE, NULL, &ig->old_pipe_act); - action = ig->old_pipe_act; - /* ignore this signal */ - action.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &action, NULL); - } -} - -/* - * sigpipe_restore() puts back the outside world's opinion of signal handler - * and SIGPIPE handling. It MUST only be called after a corresponding - * sigpipe_ignore() was used. - */ -static void sigpipe_restore(struct sigpipe_ignore *ig) -{ - if(!ig->no_signal) - /* restore the outside state */ - sigaction(SIGPIPE, &ig->old_pipe_act, NULL); -} - -#else -/* for systems without sigaction */ -#define sigpipe_ignore(x,y) Curl_nop_stmt -#define sigpipe_restore(x) Curl_nop_stmt -#define SIGPIPE_VARIABLE(x) -#endif - /* win32_cleanup() is for win32 socket cleanup functionality, the opposite of win32_init() */ static void win32_cleanup(void) @@ -190,9 +137,9 @@ static CURLcode win32_init(void) #ifdef USE_WINDOWS_SSPI { - CURLcode err = Curl_sspi_global_init(); - if(err != CURLE_OK) - return err; + CURLcode result = Curl_sspi_global_init(); + if(result) + return result; } #endif @@ -297,7 +244,7 @@ CURLcode curl_global_init(long flags) } if(flags & CURL_GLOBAL_WIN32) - if(win32_init() != CURLE_OK) { + if(win32_init()) { DEBUGF(fprintf(stderr, "Error: win32_init failed\n")); return CURLE_FAILED_INIT; } @@ -319,7 +266,7 @@ CURLcode curl_global_init(long flags) idna_init(); #endif - if(Curl_resolver_global_init() != CURLE_OK) { + if(Curl_resolver_global_init()) { DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n")); return CURLE_FAILED_INIT; } @@ -347,19 +294,23 @@ 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) { - CURLcode code = CURLE_OK; + CURLcode result = CURLE_OK; /* Invalid input, return immediately */ if(!m || !f || !r || !s || !c) return CURLE_FAILED_INIT; - /* Already initialized, don't do it again */ - if(initialized) + if(initialized) { + /* Already initialized, don't do it again, but bump the variable anyway to + work like curl_global_init() and require the same amount of cleanup + calls. */ + initialized++; return CURLE_OK; + } /* Call the actual init function first */ - code = curl_global_init(flags); - if(code == CURLE_OK) { + result = curl_global_init(flags); + if(!result) { Curl_cmalloc = m; Curl_cfree = f; Curl_cstrdup = s; @@ -367,7 +318,7 @@ CURLcode curl_global_init_mem(long flags, curl_malloc_callback m, Curl_ccalloc = c; } - return code; + return result; } /** @@ -407,13 +358,13 @@ void curl_global_cleanup(void) */ CURL *curl_easy_init(void) { - CURLcode res; + CURLcode result; struct SessionHandle *data; /* Make sure we inited the global SSL stuff */ if(!initialized) { - res = curl_global_init(CURL_GLOBAL_DEFAULT); - if(res) { + result = curl_global_init(CURL_GLOBAL_DEFAULT); + if(result) { /* something in the global init failed, return nothing */ DEBUGF(fprintf(stderr, "Error: curl_global_init failed\n")); return NULL; @@ -421,8 +372,8 @@ CURL *curl_easy_init(void) } /* We use curl_open() with undefined URL so far */ - res = Curl_open(&data); - if(res != CURLE_OK) { + result = Curl_open(&data); + if(result) { DEBUGF(fprintf(stderr, "Error: Curl_open failed\n")); return NULL; } @@ -440,86 +391,298 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) { va_list arg; struct SessionHandle *data = curl; - CURLcode ret; + CURLcode result; if(!curl) return CURLE_BAD_FUNCTION_ARGUMENT; va_start(arg, tag); - ret = Curl_setopt(data, tag, arg); + result = Curl_setopt(data, tag, arg); va_end(arg); - return ret; + return result; } +#ifdef CURLDEBUG + +struct socketmonitor { + struct socketmonitor *next; /* the next node in the list or NULL */ + struct pollfd socket; /* socket info of what to monitor */ +}; + +struct events { + long ms; /* timeout, run the timeout function when reached */ + bool msbump; /* set TRUE when timeout is set by callback */ + int num_sockets; /* number of nodes in the monitor list */ + struct socketmonitor *list; /* list of sockets to monitor */ + int running_handles; /* store the returned number */ +}; + +/* events_timer + * + * Callback that gets called with a new value when the timeout should be + * updated. + */ + +static int events_timer(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp) /* private callback pointer */ +{ + struct events *ev = userp; + (void)multi; + if(timeout_ms == -1) + /* timeout removed */ + timeout_ms = 0; + else if(timeout_ms == 0) + /* timeout is already reached! */ + timeout_ms = 1; /* trigger asap */ + + ev->ms = timeout_ms; + ev->msbump = TRUE; + return 0; +} + + +/* poll2cselect + * + * convert from poll() bit definitions to libcurl's CURL_CSELECT_* ones + */ +static int poll2cselect(int pollmask) +{ + int omask=0; + if(pollmask & POLLIN) + omask |= CURL_CSELECT_IN; + if(pollmask & POLLOUT) + omask |= CURL_CSELECT_OUT; + if(pollmask & POLLERR) + omask |= CURL_CSELECT_ERR; + return omask; +} + + +/* socketcb2poll + * + * convert from libcurl' CURL_POLL_* bit definitions to poll()'s + */ +static short socketcb2poll(int pollmask) +{ + short omask=0; + if(pollmask & CURL_POLL_IN) + omask |= POLLIN; + if(pollmask & CURL_POLL_OUT) + omask |= POLLOUT; + return omask; +} + +/* events_socket + * + * Callback that gets called with information about socket activity to + * monitor. + */ +static int events_socket(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp) /* private socket + pointer */ +{ + struct events *ev = userp; + struct socketmonitor *m; + struct socketmonitor *prev=NULL; + +#if defined(CURL_DISABLE_VERBOSE_STRINGS) + (void) easy; +#endif + (void)socketp; + + m = ev->list; + while(m) { + if(m->socket.fd == s) { + + if(what == CURL_POLL_REMOVE) { + struct socketmonitor *nxt = m->next; + /* remove this node from the list of monitored sockets */ + if(prev) + prev->next = nxt; + else + ev->list = nxt; + free(m); + m = nxt; + infof(easy, "socket cb: socket %d REMOVED\n", s); + } + else { + /* The socket 's' is already being monitored, update the activity + mask. Convert from libcurl bitmask to the poll one. */ + m->socket.events = socketcb2poll(what); + infof(easy, "socket cb: socket %d UPDATED as %s%s\n", s, + what&CURL_POLL_IN?"IN":"", + what&CURL_POLL_OUT?"OUT":""); + } + break; + } + prev = m; + m = m->next; /* move to next node */ + } + if(!m) { + if(what == CURL_POLL_REMOVE) { + /* this happens a bit too often, libcurl fix perhaps? */ + /* fprintf(stderr, + "%s: socket %d asked to be REMOVED but not present!\n", + __func__, s); */ + } + else { + m = malloc(sizeof(struct socketmonitor)); + m->next = ev->list; + m->socket.fd = s; + m->socket.events = socketcb2poll(what); + m->socket.revents = 0; + ev->list = m; + infof(easy, "socket cb: socket %d ADDED as %s%s\n", s, + what&CURL_POLL_IN?"IN":"", + what&CURL_POLL_OUT?"OUT":""); + } + } + + return 0; +} + + /* - * curl_easy_perform() is the external interface that performs a blocking - * transfer as previously setup. + * events_setup() * - * CONCEPT: This function creates a multi handle, adds the easy handle to it, - * runs curl_multi_perform() until the transfer is done, then detaches the - * easy handle, destroys the multi handle and returns the easy handle's return - * code. + * Do the multi handle setups that only event-based transfers need. + */ +static void events_setup(CURLM *multi, struct events *ev) +{ + /* timer callback */ + curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, events_timer); + curl_multi_setopt(multi, CURLMOPT_TIMERDATA, ev); + + /* socket callback */ + curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, events_socket); + curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, ev); +} + + +/* wait_or_timeout() * - * REALITY: it can't just create and destroy the multi handle that easily. It - * needs to keep it around since if this easy handle is used again by this - * function, the same multi handle must be re-used so that the same pools and - * caches can be used. + * waits for activity on any of the given sockets, or the timeout to trigger. */ -CURLcode curl_easy_perform(CURL *easy) + +static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev) { - CURLM *multi; - CURLMcode mcode; - CURLcode code = CURLE_OK; - CURLMsg *msg; bool done = FALSE; - int rc; - struct SessionHandle *data = easy; - int without_fds = 0; /* count number of consecutive returns from - curl_multi_wait() without any filedescriptors */ - struct timeval before; - SIGPIPE_VARIABLE(pipe_st); + CURLMcode mcode; + CURLcode result = CURLE_OK; - if(!easy) - return CURLE_BAD_FUNCTION_ARGUMENT; + while(!done) { + CURLMsg *msg; + struct socketmonitor *m; + struct pollfd *f; + struct pollfd fds[4]; + int numfds=0; + int pollrc; + int i; + struct timeval before; + struct timeval after; + + /* populate the fds[] array */ + for(m = ev->list, f=&fds[0]; m; m = m->next) { + f->fd = m->socket.fd; + f->events = m->socket.events; + f->revents = 0; + /* fprintf(stderr, "poll() %d check socket %d\n", numfds, f->fd); */ + f++; + numfds++; + } - if(data->multi) { - failf(data, "easy handled already used in multi handle"); - return CURLE_FAILED_INIT; - } + /* get the time stamp to use to figure out how long poll takes */ + before = curlx_tvnow(); - if(data->multi_easy) - multi = data->multi_easy; - else { - /* this multi handle will only ever have a single easy handled attached - to it, so make it use minimal hashes */ - multi = Curl_multi_handle(1, 3); - if(!multi) - return CURLE_OUT_OF_MEMORY; - data->multi_easy = multi; - } + /* wait for activity or timeout */ + pollrc = Curl_poll(fds, numfds, (int)ev->ms); - /* Copy the MAXCONNECTS option to the multi handle */ - curl_multi_setopt(multi, CURLMOPT_MAXCONNECTS, data->set.maxconnects); + after = curlx_tvnow(); - mcode = curl_multi_add_handle(multi, easy); - if(mcode) { - curl_multi_cleanup(multi); - if(mcode == CURLM_OUT_OF_MEMORY) - return CURLE_OUT_OF_MEMORY; + ev->msbump = FALSE; /* reset here */ + + if(0 == pollrc) { + /* timeout! */ + ev->ms = 0; + /* fprintf(stderr, "call curl_multi_socket_action( TIMEOUT )\n"); */ + mcode = curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, + &ev->running_handles); + } + else if(pollrc > 0) { + /* loop over the monitored sockets to see which ones had activity */ + for(i = 0; i< numfds; i++) { + if(fds[i].revents) { + /* socket activity, tell libcurl */ + int act = poll2cselect(fds[i].revents); /* convert */ + infof(multi->easyp, "call curl_multi_socket_action( socket %d )\n", + fds[i].fd); + mcode = curl_multi_socket_action(multi, fds[i].fd, act, + &ev->running_handles); + } + } + + if(!ev->msbump) + /* If nothing updated the timeout, we decrease it by the spent time. + * If it was updated, it has the new timeout time stored already. + */ + ev->ms += curlx_tvdiff(after, before); + + } else - return CURLE_FAILED_INIT; + return CURLE_RECV_ERROR; + + if(mcode) + return CURLE_URL_MALFORMAT; /* TODO: return a proper error! */ + + /* we don't really care about the "msgs_in_queue" value returned in the + second argument */ + msg = curl_multi_info_read(multi, &pollrc); + if(msg) { + result = msg->data.result; + done = TRUE; + } } - sigpipe_ignore(data, &pipe_st); + return result; +} - /* assign this after curl_multi_add_handle() since that function checks for - it and rejects this handle otherwise */ - data->multi = multi; + +/* easy_events() + * + * Runs a transfer in a blocking manner using the events-based API + */ +static CURLcode easy_events(CURLM *multi) +{ + struct events evs= {2, FALSE, 0, NULL, 0}; + + /* if running event-based, do some further multi inits */ + events_setup(multi, &evs); + + return wait_or_timeout(multi, &evs); +} +#else /* CURLDEBUG */ +/* when not built with debug, this function doesn't exist */ +#define easy_events(x) CURLE_NOT_BUILT_IN +#endif + +static CURLcode easy_transfer(CURLM *multi) +{ + bool done = FALSE; + CURLMcode mcode = CURLM_OK; + CURLcode result = CURLE_OK; + struct timeval before; + int without_fds = 0; /* count number of consecutive returns from + curl_multi_wait() without any filedescriptors */ while(!done && !mcode) { - int still_running; + int still_running = 0; int ret; before = curlx_tvnow(); @@ -528,7 +691,7 @@ CURLcode curl_easy_perform(CURL *easy) if(mcode == CURLM_OK) { if(ret == -1) { /* poll() failed not on EINTR, indicate a network problem */ - code = CURLE_RECV_ERROR; + result = CURLE_RECV_ERROR; break; } else if(ret == 0) { @@ -556,24 +719,123 @@ CURLcode curl_easy_perform(CURL *easy) /* only read 'still_running' if curl_multi_perform() return OK */ if((mcode == CURLM_OK) && !still_running) { - msg = curl_multi_info_read(multi, &rc); + int rc; + CURLMsg *msg = curl_multi_info_read(multi, &rc); if(msg) { - code = msg->data.result; + result = msg->data.result; done = TRUE; } } } + /* Make sure to return some kind of error if there was a multi problem */ + if(mcode) { + return (mcode == CURLM_OUT_OF_MEMORY) ? CURLE_OUT_OF_MEMORY : + /* The other multi errors should never happen, so return + something suitably generic */ + CURLE_BAD_FUNCTION_ARGUMENT; + } + + return result; +} + + +/* + * easy_perform() is the external interface that performs a blocking + * transfer as previously setup. + * + * CONCEPT: This function creates a multi handle, adds the easy handle to it, + * runs curl_multi_perform() until the transfer is done, then detaches the + * easy handle, destroys the multi handle and returns the easy handle's return + * code. + * + * REALITY: it can't just create and destroy the multi handle that easily. It + * needs to keep it around since if this easy handle is used again by this + * function, the same multi handle must be re-used so that the same pools and + * caches can be used. + * + * DEBUG: if 'events' is set TRUE, this function will use a replacement engine + * instead of curl_multi_perform() and use curl_multi_socket_action(). + */ +static CURLcode easy_perform(struct SessionHandle *data, bool events) +{ + CURLM *multi; + CURLMcode mcode; + CURLcode result = CURLE_OK; + SIGPIPE_VARIABLE(pipe_st); + + if(!data) + return CURLE_BAD_FUNCTION_ARGUMENT; + + if(data->multi) { + failf(data, "easy handle already used in multi handle"); + return CURLE_FAILED_INIT; + } + + if(data->multi_easy) + multi = data->multi_easy; + else { + /* this multi handle will only ever have a single easy handled attached + to it, so make it use minimal hashes */ + multi = Curl_multi_handle(1, 3); + if(!multi) + return CURLE_OUT_OF_MEMORY; + data->multi_easy = multi; + } + + /* Copy the MAXCONNECTS option to the multi handle */ + curl_multi_setopt(multi, CURLMOPT_MAXCONNECTS, data->set.maxconnects); + + mcode = curl_multi_add_handle(multi, data); + if(mcode) { + curl_multi_cleanup(multi); + if(mcode == CURLM_OUT_OF_MEMORY) + return CURLE_OUT_OF_MEMORY; + else + return CURLE_FAILED_INIT; + } + + sigpipe_ignore(data, &pipe_st); + + /* assign this after curl_multi_add_handle() since that function checks for + it and rejects this handle otherwise */ + data->multi = multi; + + /* run the transfer */ + result = events ? easy_events(multi) : easy_transfer(multi); + /* ignoring the return code isn't nice, but atm we can't really handle a failure here, room for future improvement! */ - (void)curl_multi_remove_handle(multi, easy); + (void)curl_multi_remove_handle(multi, data); sigpipe_restore(&pipe_st); /* The multi handle is kept alive, owned by the easy handle */ - return code; + return result; +} + + +/* + * curl_easy_perform() is the external interface that performs a blocking + * transfer as previously setup. + */ +CURLcode curl_easy_perform(CURL *easy) +{ + return easy_perform(easy, FALSE); } +#ifdef CURLDEBUG +/* + * curl_easy_perform_ev() is the external interface that performs a blocking + * transfer using the event-based API internally. + */ +CURLcode curl_easy_perform_ev(CURL *easy) +{ + return easy_perform(easy, TRUE); +} + +#endif + /* * curl_easy_cleanup() is the external interface to cleaning/freeing the given * easy handle. @@ -592,22 +854,6 @@ void curl_easy_cleanup(CURL *curl) } /* - * Store a pointed to the multi handle within the easy handle's data struct. - */ -void Curl_easy_addmulti(struct SessionHandle *data, - void *multi) -{ - data->multi = multi; -} - -void Curl_easy_initHandleData(struct SessionHandle *data) -{ - memset(&data->req, 0, sizeof(struct SingleRequest)); - - data->req.maxdownload = -1; -} - -/* * curl_easy_getinfo() is an external interface that allows an app to retrieve * information from a performed transfer and similar. */ @@ -616,16 +862,16 @@ CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...) { va_list arg; void *paramp; - CURLcode ret; + CURLcode result; struct SessionHandle *data = (struct SessionHandle *)curl; va_start(arg, info); paramp = va_arg(arg, void *); - ret = Curl_getinfo(data, info, paramp); + result = Curl_getinfo(data, info, paramp); va_end(arg); - return ret; + return result; } /* @@ -652,7 +898,7 @@ CURL *curl_easy_duphandle(CURL *incurl) outcurl->state.headersize = HEADERSIZE; /* copy all userdefined values */ - if(Curl_dupset(outcurl, data) != CURLE_OK) + if(Curl_dupset(outcurl, data)) goto fail; /* the connection cache is setup on demand */ @@ -698,13 +944,11 @@ CURL *curl_easy_duphandle(CURL *incurl) /* Clone the resolver handle, if present, for the new handle */ if(Curl_resolver_duphandle(&outcurl->state.resolver, - data->state.resolver) != CURLE_OK) + data->state.resolver)) goto fail; Curl_convert_setup(outcurl); - Curl_easy_initHandleData(outcurl); - outcurl->magic = CURLEASY_MAGIC_NUMBER; /* we reach this point and thus we are OK */ @@ -738,7 +982,7 @@ void curl_easy_reset(CURL *curl) data->state.path = NULL; - Curl_safefree(data->state.proto.generic); + Curl_free_request_state(data); /* zero out UserDefined data: */ Curl_freeset(data); @@ -748,9 +992,6 @@ void curl_easy_reset(CURL *curl) /* zero out Progress data: */ memset(&data->progress, 0, sizeof(struct Progress)); - /* init Handle data */ - Curl_easy_initHandleData(data); - data->progress.flags |= PGRS_HIDE; data->state.current_speed = -1; /* init to negative == impossible */ } @@ -785,73 +1026,15 @@ CURLcode curl_easy_pause(CURL *curl, int action) /* we have a buffer for sending that we now seem to be able to deliver since the receive pausing is lifted! */ - /* get the pointer, type and length in local copies since the function may - return PAUSE again and then we'll get a new copy allocted and stored in + /* get the pointer in local copy since the function may return PAUSE + again and then we'll get a new copy allocted and stored in the tempwrite variables */ char *tempwrite = data->state.tempwrite; - char *freewrite = tempwrite; /* store this pointer to free it later */ - size_t tempsize = data->state.tempwritesize; - int temptype = data->state.tempwritetype; - size_t chunklen; - - /* clear tempwrite here just to make sure it gets cleared if there's no - further use of it, and make sure we don't clear it after the function - invoke as it may have been set to a new value by then */ - data->state.tempwrite = NULL; - - /* since the write callback API is define to never exceed - CURL_MAX_WRITE_SIZE bytes in a single call, and since we may in fact - have more data than that in our buffer here, we must loop sending the - data in multiple calls until there's no data left or we get another - pause returned. - - A tricky part is that the function we call will "buffer" the data - itself when it pauses on a particular buffer, so we may need to do some - extra trickery if we get a pause return here. - */ - do { - chunklen = (tempsize > CURL_MAX_WRITE_SIZE)?CURL_MAX_WRITE_SIZE:tempsize; - - result = Curl_client_write(data->easy_conn, - temptype, tempwrite, chunklen); - if(result) - /* failures abort the loop at once */ - break; - if(data->state.tempwrite && (tempsize - chunklen)) { - /* Ouch, the reading is again paused and the block we send is now - "cached". If this is the final chunk we can leave it like this, but - if we have more chunks that are cached after this, we need to free - the newly cached one and put back a version that is truly the entire - contents that is saved for later - */ - char *newptr; - - /* note that tempsize is still the size as before the callback was - used, and thus the whole piece of data to keep */ - newptr = realloc(data->state.tempwrite, tempsize); - - if(!newptr) { - free(data->state.tempwrite); /* free old area */ - data->state.tempwrite = NULL; - result = CURLE_OUT_OF_MEMORY; - /* tempwrite will be freed further down */ - break; - } - data->state.tempwrite = newptr; /* store new pointer */ - memcpy(newptr, tempwrite, tempsize); - data->state.tempwritesize = tempsize; /* store new size */ - /* tempwrite will be freed further down */ - break; /* go back to pausing until further notice */ - } - else { - tempsize -= chunklen; /* left after the call above */ - tempwrite += chunklen; /* advance the pointer */ - } - - } while((result == CURLE_OK) && tempsize); - - free(freewrite); /* this is unconditionally no longer used */ + data->state.tempwrite = NULL; + result = Curl_client_chop_write(data->easy_conn, data->state.tempwritetype, + tempwrite, data->state.tempwritesize); + free(tempwrite); } /* if there's no error and we're not pausing both directions, we want @@ -896,20 +1079,20 @@ static CURLcode easy_connection(struct SessionHandle *data, CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, size_t *n) { curl_socket_t sfd; - CURLcode ret; + CURLcode result; ssize_t n1; struct connectdata *c; struct SessionHandle *data = (struct SessionHandle *)curl; - ret = easy_connection(data, &sfd, &c); - if(ret) - return ret; + result = easy_connection(data, &sfd, &c); + if(result) + return result; *n = 0; - ret = Curl_read(c, sfd, buffer, buflen, &n1); + result = Curl_read(c, sfd, buffer, buflen, &n1); - if(ret != CURLE_OK) - return ret; + if(result) + return result; *n = (size_t)n1; @@ -924,26 +1107,26 @@ CURLcode curl_easy_send(CURL *curl, const void *buffer, size_t buflen, size_t *n) { curl_socket_t sfd; - CURLcode ret; + CURLcode result; ssize_t n1; struct connectdata *c = NULL; struct SessionHandle *data = (struct SessionHandle *)curl; - ret = easy_connection(data, &sfd, &c); - if(ret) - return ret; + result = easy_connection(data, &sfd, &c); + if(result) + return result; *n = 0; - ret = Curl_write(c, sfd, buffer, buflen, &n1); + result = Curl_write(c, sfd, buffer, buflen, &n1); if(n1 == -1) return CURLE_SEND_ERROR; /* detect EAGAIN */ - if((CURLE_OK == ret) && (0 == n1)) + if(!result && !n1) return CURLE_AGAIN; *n = (size_t)n1; - return ret; + return result; } diff --git a/lib/easyif.h b/lib/easyif.h index 1f52168..043ff43 100644 --- a/lib/easyif.h +++ b/lib/easyif.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -25,9 +25,9 @@ /* * Prototypes for library-wide functions provided by easy.c */ -void Curl_easy_addmulti(struct SessionHandle *data, void *multi); - -void Curl_easy_initHandleData(struct SessionHandle *data); +#ifdef CURLDEBUG +CURL_EXTERN CURLcode curl_easy_perform_ev(CURL *easy); +#endif #endif /* HEADER_CURL_EASYIF_H */ diff --git a/lib/escape.c b/lib/escape.c index aa7db2c..9923e64 100644 --- a/lib/escape.c +++ b/lib/escape.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -87,7 +87,7 @@ char *curl_easy_escape(CURL *handle, const char *string, int inlength) size_t newlen = alloc; size_t strindex=0; size_t length; - CURLcode res; + CURLcode result; ns = malloc(alloc); if(!ns) @@ -115,8 +115,8 @@ char *curl_easy_escape(CURL *handle, const char *string, int inlength) } } - res = Curl_convert_to_network(handle, &in, 1); - if(res) { + result = Curl_convert_to_network(handle, &in, 1); + if(result) { /* Curl_convert_to_network calls failf if unsuccessful */ free(ns); return NULL; @@ -152,7 +152,7 @@ CURLcode Curl_urldecode(struct SessionHandle *data, unsigned char in; size_t strindex=0; unsigned long hex; - CURLcode res; + CURLcode result; if(!ns) return CURLE_OUT_OF_MEMORY; @@ -172,16 +172,17 @@ CURLcode Curl_urldecode(struct SessionHandle *data, in = curlx_ultouc(hex); /* this long is never bigger than 255 anyway */ - res = Curl_convert_from_network(data, &in, 1); - if(res) { + result = Curl_convert_from_network(data, &in, 1); + if(result) { /* Curl_convert_from_network calls failf if unsuccessful */ free(ns); - return res; + return result; } string+=2; alloc-=2; } + if(reject_ctrl && (in < 0x20)) { free(ns); return CURLE_URL_MALFORMAT; @@ -196,9 +197,8 @@ CURLcode Curl_urldecode(struct SessionHandle *data, /* store output size */ *olen = strindex; - if(ostring) - /* store output string */ - *ostring = ns; + /* store output string */ + *ostring = ns; return CURLE_OK; } diff --git a/lib/file.c b/lib/file.c index 038bf42..dd2c564 100644 --- a/lib/file.c +++ b/lib/file.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -90,7 +90,7 @@ static CURLcode file_done(struct connectdata *conn, static CURLcode file_connect(struct connectdata *conn, bool *done); static CURLcode file_disconnect(struct connectdata *conn, bool dead_connection); - +static CURLcode file_setup_connection(struct connectdata *conn); /* * FILE scheme handler. @@ -98,7 +98,7 @@ static CURLcode file_disconnect(struct connectdata *conn, const struct Curl_handler Curl_handler_file = { "FILE", /* scheme */ - ZERO_NULL, /* setup_connection */ + file_setup_connection, /* setup_connection */ file_do, /* do_it */ file_done, /* done */ ZERO_NULL, /* do_more */ @@ -117,6 +117,16 @@ const struct Curl_handler Curl_handler_file = { }; +static CURLcode file_setup_connection(struct connectdata *conn) +{ + /* allocate the FILE specific struct */ + conn->data->req.protop = calloc(1, sizeof(struct FILEPROTO)); + if(!conn->data->req.protop) + return CURLE_OUT_OF_MEMORY; + + return CURLE_OK; +} + /* Check if this is a range download, and if so, set the internal variables properly. This code is copied from the FTP implementation and might as @@ -142,14 +152,14 @@ static CURLcode file_range(struct connectdata *conn) if((-1 == to) && (from>=0)) { /* X - */ data->state.resume_from = from; - DEBUGF(infof(data, "RANGE %" FORMAT_OFF_T " to end of file\n", + DEBUGF(infof(data, "RANGE %" CURL_FORMAT_CURL_OFF_T " to end of file\n", from)); } else if(from < 0) { /* -Y */ data->req.maxdownload = -from; data->state.resume_from = from; - DEBUGF(infof(data, "RANGE the last %" FORMAT_OFF_T " bytes\n", + DEBUGF(infof(data, "RANGE the last %" CURL_FORMAT_CURL_OFF_T " bytes\n", -from)); } else { @@ -157,12 +167,13 @@ static CURLcode file_range(struct connectdata *conn) totalsize = to-from; data->req.maxdownload = totalsize+1; /* include last byte */ data->state.resume_from = from; - DEBUGF(infof(data, "RANGE from %" FORMAT_OFF_T - " getting %" FORMAT_OFF_T " bytes\n", + DEBUGF(infof(data, "RANGE from %" CURL_FORMAT_CURL_OFF_T + " getting %" CURL_FORMAT_CURL_OFF_T " bytes\n", from, data->req.maxdownload)); } - DEBUGF(infof(data, "range-download from %" FORMAT_OFF_T - " to %" FORMAT_OFF_T ", totally %" FORMAT_OFF_T " bytes\n", + DEBUGF(infof(data, "range-download from %" CURL_FORMAT_CURL_OFF_T + " to %" CURL_FORMAT_CURL_OFF_T ", totally %" + CURL_FORMAT_CURL_OFF_T " bytes\n", from, to, data->req.maxdownload)); } else @@ -179,39 +190,18 @@ static CURLcode file_connect(struct connectdata *conn, bool *done) { struct SessionHandle *data = conn->data; char *real_path; - struct FILEPROTO *file; + struct FILEPROTO *file = data->req.protop; int fd; #ifdef DOS_FILESYSTEM int i; char *actual_path; #endif + int real_path_len; - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - real_path = curl_easy_unescape(data, data->state.path, 0, NULL); + real_path = curl_easy_unescape(data, data->state.path, 0, &real_path_len); if(!real_path) return CURLE_OUT_OF_MEMORY; - if(!data->state.proto.file) { - file = calloc(1, sizeof(struct FILEPROTO)); - if(!file) { - free(real_path); - return CURLE_OUT_OF_MEMORY; - } - data->state.proto.file = file; - } - else { - /* file is not a protocol that can deal with "persistancy" */ - file = data->state.proto.file; - Curl_safefree(file->freepath); - file->path = NULL; - if(file->fd != -1) - close(file->fd); - file->fd = -1; - } - #ifdef DOS_FILESYSTEM /* If the first character is a slash, and there's something that looks like a drive at the beginning of @@ -233,16 +223,23 @@ static CURLcode file_connect(struct connectdata *conn, bool *done) (actual_path[2] == ':' || actual_path[2] == '|')) { actual_path[2] = ':'; actual_path++; + real_path_len--; } /* change path separators from '/' to '\\' for DOS, Windows and OS/2 */ - for(i=0; actual_path[i] != '\0'; ++i) + for(i=0; i < real_path_len; ++i) if(actual_path[i] == '/') actual_path[i] = '\\'; + else if(!actual_path[i]) /* binary zero */ + return CURLE_URL_MALFORMAT; fd = open_readonly(actual_path, O_RDONLY|O_BINARY); file->path = actual_path; #else + if(memchr(real_path, 0, real_path_len)) + /* binary zeroes indicate foul play */ + return CURLE_URL_MALFORMAT; + fd = open_readonly(real_path, O_RDONLY); file->path = real_path; #endif @@ -262,7 +259,7 @@ static CURLcode file_connect(struct connectdata *conn, bool *done) static CURLcode file_done(struct connectdata *conn, CURLcode status, bool premature) { - struct FILEPROTO *file = conn->data->state.proto.file; + struct FILEPROTO *file = conn->data->req.protop; (void)status; /* not used */ (void)premature; /* not used */ @@ -280,7 +277,7 @@ static CURLcode file_done(struct connectdata *conn, static CURLcode file_disconnect(struct connectdata *conn, bool dead_connection) { - struct FILEPROTO *file = conn->data->state.proto.file; + struct FILEPROTO *file = conn->data->req.protop; (void)dead_connection; /* not used */ if(file) { @@ -302,11 +299,11 @@ static CURLcode file_disconnect(struct connectdata *conn, static CURLcode file_upload(struct connectdata *conn) { - struct FILEPROTO *file = conn->data->state.proto.file; + struct FILEPROTO *file = conn->data->req.protop; const char *dir = strchr(file->path, DIRSEP); int fd; int mode; - CURLcode res=CURLE_OK; + CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; char *buf = data->state.buffer; size_t nread; @@ -347,9 +344,9 @@ static CURLcode file_upload(struct connectdata *conn) return CURLE_WRITE_ERROR; } - if(-1 != data->set.infilesize) + if(-1 != data->state.infilesize) /* known size of data to "upload" */ - Curl_pgrsSetUploadSize(data, data->set.infilesize); + Curl_pgrsSetUploadSize(data, data->state.infilesize); /* treat the negative resume offset value as the case of "-" */ if(data->state.resume_from < 0) { @@ -362,10 +359,10 @@ static CURLcode file_upload(struct connectdata *conn) data->state.resume_from = (curl_off_t)file_stat.st_size; } - while(res == CURLE_OK) { + while(!result) { int readcount; - res = Curl_fillreadbuffer(conn, BUFSIZE, &readcount); - if(res) + result = Curl_fillreadbuffer(conn, BUFSIZE, &readcount); + if(result) break; if(readcount <= 0) /* fix questionable compare error. curlvms */ @@ -392,7 +389,7 @@ static CURLcode file_upload(struct connectdata *conn) /* write the data to the target */ nwrite = write(fd, buf2, nread); if(nwrite != nread) { - res = CURLE_SEND_ERROR; + result = CURLE_SEND_ERROR; break; } @@ -401,16 +398,16 @@ static CURLcode file_upload(struct connectdata *conn) Curl_pgrsSetUploadCounter(data, bytecount); if(Curl_pgrsUpdate(conn)) - res = CURLE_ABORTED_BY_CALLBACK; + result = CURLE_ABORTED_BY_CALLBACK; else - res = Curl_speedcheck(data, now); + result = Curl_speedcheck(data, now); } - if(!res && Curl_pgrsUpdate(conn)) - res = CURLE_ABORTED_BY_CALLBACK; + if(!result && Curl_pgrsUpdate(conn)) + result = CURLE_ABORTED_BY_CALLBACK; close(fd); - return res; + return result; } /* @@ -428,7 +425,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done) are supported. This means that files on remotely mounted directories (via NFS, Samba, NT sharing) can be accessed through a file:// URL */ - CURLcode res = CURLE_OK; + CURLcode result = CURLE_OK; struct_stat statbuf; /* struct_stat instead of struct stat just to allow the Windows version to have a different struct without having to redefine the simple word 'stat' */ @@ -440,6 +437,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done) curl_off_t bytecount = 0; int fd; struct timeval now = Curl_tvnow(); + struct FILEPROTO *file; *done = TRUE; /* unconditionally */ @@ -449,8 +447,10 @@ static CURLcode file_do(struct connectdata *conn, bool *done) if(data->set.upload) return file_upload(conn); + file = conn->data->req.protop; + /* get the fd from the connection phase */ - fd = conn->data->state.proto.file->fd; + fd = file->fd; /* VMS: This only works reliable for STREAMLF files */ if(-1 != fstat(fd, &statbuf)) { @@ -472,9 +472,8 @@ static CURLcode file_do(struct connectdata *conn, bool *done) information. Which for FILE can't be much more than the file size and date. */ if(data->set.opt_no_body && data->set.include_header && fstated) { - CURLcode result; snprintf(buf, sizeof(data->state.buffer), - "Content-Length: %" FORMAT_OFF_T "\r\n", expected_size); + "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", expected_size); result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0); if(result) return result; @@ -554,7 +553,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done) Curl_pgrsTime(data, TIMER_STARTTRANSFER); - while(res == CURLE_OK) { + while(!result) { /* Don't fill a whole buffer if we want less than all data */ size_t bytestoread = (expected_size < CURL_OFF_T_C(BUFSIZE) - CURL_OFF_T_C(1)) ? @@ -571,21 +570,21 @@ static CURLcode file_do(struct connectdata *conn, bool *done) bytecount += nread; expected_size -= nread; - res = Curl_client_write(conn, CLIENTWRITE_BODY, buf, nread); - if(res) - return res; + result = Curl_client_write(conn, CLIENTWRITE_BODY, buf, nread); + if(result) + return result; Curl_pgrsSetDownloadCounter(data, bytecount); if(Curl_pgrsUpdate(conn)) - res = CURLE_ABORTED_BY_CALLBACK; + result = CURLE_ABORTED_BY_CALLBACK; else - res = Curl_speedcheck(data, now); + result = Curl_speedcheck(data, now); } if(Curl_pgrsUpdate(conn)) - res = CURLE_ABORTED_BY_CALLBACK; + result = CURLE_ABORTED_BY_CALLBACK; - return res; + return result; } #endif diff --git a/lib/formdata.c b/lib/formdata.c index f718a3e..73d3b6d 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,7 @@ #include -#if !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) +#ifndef CURL_DISABLE_HTTP #if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME) #include @@ -32,10 +32,11 @@ #include "urldata.h" /* for struct SessionHandle */ #include "formdata.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "strequal.h" #include "curl_memory.h" #include "sendf.h" +#include "strdup.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -43,10 +44,6 @@ /* The last #include file should be: */ #include "memdebug.h" -#endif /* !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) */ - -#ifndef CURL_DISABLE_HTTP - #ifndef HAVE_BASENAME static char *Curl_basename(char *path); #define basename(x) Curl_basename((x)) @@ -214,46 +211,6 @@ static const char *ContentTypeForFilename(const char *filename, /*************************************************************************** * - * memdup() - * - * Copies the 'source' data to a newly allocated buffer buffer (that is - * returned). Uses buffer_length if not null, else uses strlen to determine - * the length of the buffer to be copied - * - * Returns the new pointer or NULL on failure. - * - ***************************************************************************/ -static char *memdup(const char *src, size_t buffer_length) -{ - size_t length; - bool add = FALSE; - char *buffer; - - if(buffer_length) - length = buffer_length; - else if(src) { - length = strlen(src); - add = TRUE; - } - else - /* no length and a NULL src pointer! */ - return strdup(""); - - buffer = malloc(length+add); - if(!buffer) - return NULL; /* fail */ - - memcpy(buffer, src, length); - - /* if length unknown do null termination */ - if(add) - buffer[length] = '\0'; - - return buffer; -} - -/*************************************************************************** - * * FormAdd() * * Stores a formpost parameter and builds the appropriate linked list. @@ -682,9 +639,12 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, (form == first_form) ) { /* Note that there's small risk that form->name is NULL here if the app passed in a bad combo, so we better check for that first. */ - if(form->name) + if(form->name) { /* copy name (without strdup; possibly contains null characters) */ - form->name = memdup(form->name, form->namelength); + form->name = Curl_memdup(form->name, form->namelength? + form->namelength: + strlen(form->name)+1); + } if(!form->name) { return_value = CURL_FORMADD_MEMORY; break; @@ -693,9 +653,11 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, } if(!(form->flags & (HTTPPOST_FILENAME | HTTPPOST_READFILE | HTTPPOST_PTRCONTENTS | HTTPPOST_PTRBUFFER | - HTTPPOST_CALLBACK)) ) { + HTTPPOST_CALLBACK)) && form->value) { /* copy value (without strdup; possibly contains null characters) */ - form->value = memdup(form->value, form->contentslength); + form->value = Curl_memdup(form->value, form->contentslength? + form->contentslength: + strlen(form->value)+1); if(!form->value) { return_value = CURL_FORMADD_MEMORY; break; @@ -954,13 +916,13 @@ void Curl_formclean(struct FormData **form_ptr) int curl_formget(struct curl_httppost *form, void *arg, curl_formget_callback append) { - CURLcode rc; + CURLcode result; curl_off_t size; struct FormData *data, *ptr; - rc = Curl_getformdata(NULL, &data, form, NULL, &size); - if(rc != CURLE_OK) - return (int)rc; + result = Curl_getformdata(NULL, &data, form, NULL, &size); + if(result) + return (int)result; for(ptr = data; ptr; ptr = ptr->next) { if((ptr->type == FORM_FILE) || (ptr->type == FORM_CALLBACK)) { @@ -1110,8 +1072,10 @@ static CURLcode formdata_add_filename(const struct curl_httppost *file, /* filename need be escaped */ filename_escaped = malloc(strlen(filename)*2+1); - if(!filename_escaped) + if(!filename_escaped) { + Curl_safefree(filebasename); return CURLE_OUT_OF_MEMORY; + } p0 = filename_escaped; p1 = filename; while(*p1) { @@ -1227,7 +1191,7 @@ CURLcode Curl_getformdata(struct SessionHandle *data, } result = AddFormDataf(&form, &size, - "\r\nContent-Type: multipart/mixed," + "\r\nContent-Type: multipart/mixed;" " boundary=%s\r\n", fileboundary); if(result) @@ -1367,10 +1331,8 @@ CURLcode Curl_getformdata(struct SessionHandle *data, } while((post = post->next) != NULL); /* for each field */ /* end-boundary for everything */ - if(CURLE_OK == result) - result = AddFormDataf(&form, &size, - "\r\n--%s--\r\n", - boundary); + if(!result) + result = AddFormDataf(&form, &size, "\r\n--%s--\r\n", boundary); if(result) { Curl_formclean(&firstform); diff --git a/lib/ftp.c b/lib/ftp.c index c9b97dd..2f4351e 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -59,14 +59,10 @@ #include "ftp.h" #include "fileinfo.h" #include "ftplistparser.h" - -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) -#include "krb4.h" -#endif - +#include "curl_sec.h" #include "strtoofft.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" #include "strerror.h" #include "inet_ntop.h" @@ -161,7 +157,7 @@ static CURLcode ftp_dophase_done(struct connectdata *conn, bool connected); /* easy-to-use macro: */ -#define PPSENDF(x,y,z) if((result = Curl_pp_sendf(x,y,z)) != CURLE_OK) \ +#define PPSENDF(x,y,z) if((result = Curl_pp_sendf(x,y,z))) \ return result @@ -212,7 +208,7 @@ const struct Curl_handler Curl_handler_ftps = { ftp_disconnect, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_FTPS, /* defport */ - CURLPROTO_FTP | CURLPROTO_FTPS, /* protocol */ + CURLPROTO_FTPS, /* protocol */ PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY /* flags */ }; @@ -225,7 +221,7 @@ const struct Curl_handler Curl_handler_ftps = { static const struct Curl_handler Curl_handler_ftp_proxy = { "FTP", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -251,7 +247,7 @@ static const struct Curl_handler Curl_handler_ftp_proxy = { static const struct Curl_handler Curl_handler_ftps_proxy = { "FTPS", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -350,7 +346,7 @@ static CURLcode AcceptServerConnect(struct connectdata *conn) infof(data, "Connection accepted from server\n"); conn->sock[SECONDARYSOCKET] = s; - curlx_nonblock(s, TRUE); /* enable non-blocking */ + (void)curlx_nonblock(s, TRUE); /* enable non-blocking */ conn->sock_accepted[SECONDARYSOCKET] = TRUE; if(data->set.fsockopt) { @@ -493,7 +489,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received) static CURLcode InitiateTransfer(struct connectdata *conn) { struct SessionHandle *data = conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; CURLcode result = CURLE_OK; if(conn->ssl[SECONDARYSOCKET].use) { @@ -511,7 +507,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn) /* When we know we're uploading a specified file, we can get the file size prior to the actual upload. */ - Curl_pgrsSetUploadSize(data, data->set.infilesize); + Curl_pgrsSetUploadSize(data, data->state.infilesize); /* set the SO_SNDBUF for the secondary socket for those who need it */ Curl_sndbufset(conn->sock[SECONDARYSOCKET]); @@ -545,7 +541,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected) { struct SessionHandle *data = conn->data; long timeout_ms; - CURLcode ret = CURLE_OK; + CURLcode result = CURLE_OK; *connected = FALSE; infof(data, "Preparing for accepting server on data port\n"); @@ -561,22 +557,22 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected) } /* see if the connection request is already here */ - ret = ReceivedServerConnect(conn, connected); - if(ret) - return ret; + result = ReceivedServerConnect(conn, connected); + if(result) + return result; if(*connected) { - ret = AcceptServerConnect(conn); - if(ret) - return ret; + result = AcceptServerConnect(conn); + if(result) + return result; - ret = InitiateTransfer(conn); - if(ret) - return ret; + result = InitiateTransfer(conn); + if(result) + return result; } else { /* Add timeout to multi handle and break out of the loop */ - if(ret == CURLE_OK && *connected == FALSE) { + if(!result && *connected == FALSE) { if(data->set.accepttimeout > 0) Curl_expire(data, data->set.accepttimeout); else @@ -584,7 +580,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected) } } - return ret; + return result; } /* macro to check for a three-digit ftp status code at the start of the @@ -615,7 +611,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, { struct connectdata *conn = pp->conn; struct SessionHandle *data = conn->data; -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI char * const buf = data->state.buffer; #endif CURLcode result = CURLE_OK; @@ -623,7 +619,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, result = Curl_pp_readresp(sockfd, pp, &code, size); -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#if defined(HAVE_GSSAPI) /* handle the security-oriented responses 6xx ***/ /* FIXME: some errorchecking perhaps... ***/ switch(code) { @@ -775,6 +771,47 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ return result; } +#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) + /* for debug purposes */ +static const char * const ftp_state_names[]={ + "STOP", + "WAIT220", + "AUTH", + "USER", + "PASS", + "ACCT", + "PBSZ", + "PROT", + "CCC", + "PWD", + "SYST", + "NAMEFMT", + "QUOTE", + "RETR_PREQUOTE", + "STOR_PREQUOTE", + "POSTQUOTE", + "CWD", + "MKD", + "MDTM", + "TYPE", + "LIST_TYPE", + "RETR_TYPE", + "STOR_TYPE", + "SIZE", + "RETR_SIZE", + "STOR_SIZE", + "REST", + "RETR_REST", + "PORT", + "PRET", + "PASV", + "LIST", + "RETR", + "STOR", + "QUIT" +}; +#endif + /* This is the ONLY way to change FTP state! */ static void _state(struct connectdata *conn, ftpstate newstate @@ -783,59 +820,27 @@ static void _state(struct connectdata *conn, #endif ) { -#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) - /* for debug purposes */ - static const char * const names[]={ - "STOP", - "WAIT220", - "AUTH", - "USER", - "PASS", - "ACCT", - "PBSZ", - "PROT", - "CCC", - "PWD", - "SYST", - "NAMEFMT", - "QUOTE", - "RETR_PREQUOTE", - "STOR_PREQUOTE", - "POSTQUOTE", - "CWD", - "MKD", - "MDTM", - "TYPE", - "LIST_TYPE", - "RETR_TYPE", - "STOR_TYPE", - "SIZE", - "RETR_SIZE", - "STOR_SIZE", - "REST", - "RETR_REST", - "PORT", - "PRET", - "PASV", - "LIST", - "RETR", - "STOR", - "QUIT" - }; -#endif struct ftp_conn *ftpc = &conn->proto.ftpc; -#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) + +#if defined(DEBUGBUILD) + +#if defined(CURL_DISABLE_VERBOSE_STRINGS) + (void) lineno; +#else if(ftpc->state != newstate) infof(conn->data, "FTP %p (line %d) state change from %s to %s\n", - (void *)ftpc, lineno, names[ftpc->state], names[newstate]); + (void *)ftpc, lineno, ftp_state_names[ftpc->state], + ftp_state_names[newstate]); +#endif #endif + ftpc->state = newstate; } static CURLcode ftp_state_user(struct connectdata *conn) { CURLcode result; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; /* send USER */ PPSENDF(&conn->proto.ftpc.pp, "USER %s", ftp->user?ftp->user:""); @@ -874,31 +879,38 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks, return GETSOCK_BLANK; /* When in DO_MORE state, we could be either waiting for us to connect to a - remote site, or we could wait for that site to connect to us. Or just - handle ordinary commands. - - When waiting for a connect, we can be in FTP_STOP state (or we're in - FTP_STOR when we do an upload) and then we wait for the secondary socket - to become writeable. . If we're in another state, we're still handling - commands on the control (primary) connection. - - */ + * remote site, or we could wait for that site to connect to us. Or just + * handle ordinary commands. + */ - switch(ftpc->state) { - case FTP_STOP: - case FTP_STOR: - break; - default: - return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks); - } + if(FTP_STOP == ftpc->state) { + int bits = GETSOCK_READSOCK(0); + + /* if stopped and still in this state, then we're also waiting for a + connect on the secondary connection */ + socks[0] = conn->sock[FIRSTSOCKET]; + + if(!conn->data->set.ftp_use_port) { + int s; + int i; + /* PORT is used to tell the server to connect to us, and during that we + don't do happy eyeballs, but we do if we connect to the server */ + for(s=1, i=0; i<2; i++) { + if(conn->tempsock[i] != CURL_SOCKET_BAD) { + socks[s] = conn->tempsock[i]; + bits |= GETSOCK_WRITESOCK(s++); + } + } + } + else { + socks[1] = conn->sock[SECONDARYSOCKET]; + bits |= GETSOCK_WRITESOCK(1); + } - socks[0] = conn->sock[SECONDARYSOCKET]; - if(ftpc->wait_data_conn) { - socks[1] = conn->sock[FIRSTSOCKET]; - return GETSOCK_READSOCK(0) | GETSOCK_READSOCK(1); + return bits; } - - return GETSOCK_READSOCK(0); + else + return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks); } /* This is called after the FTP_QUOTE state is passed. @@ -1067,8 +1079,9 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, if(*addr != '\0') { /* attempt to get the address of the given interface name */ - switch(Curl_if2ip(conn->ip_addr->ai_family, conn->scope, addr, - hbuf, sizeof(hbuf))) { + switch(Curl_if2ip(conn->ip_addr->ai_family, + Curl_ipv6_scope(conn->ip_addr->ai_addr), + conn->scope_id, addr, hbuf, sizeof(hbuf))) { case IF2IP_NOT_FOUND: /* not an interface, use the given string as host name instead */ host = addr; @@ -1241,10 +1254,10 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, continue; if((PORT == fcmd) && sa->sa_family != AF_INET) - /* PORT is ipv4 only */ + /* PORT is IPv4 only */ continue; - switch (sa->sa_family) { + switch(sa->sa_family) { case AF_INET: port = ntohs(sa4->sin_port); break; @@ -1382,7 +1395,7 @@ static CURLcode ftp_state_use_pasv(struct connectdata *conn) static CURLcode ftp_state_prepare_transfer(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct SessionHandle *data = conn->data; if(ftp->transfer != FTPTRANSFER_BODY) { @@ -1425,7 +1438,7 @@ static CURLcode ftp_state_prepare_transfer(struct connectdata *conn) static CURLcode ftp_state_rest(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; if((ftp->transfer != FTPTRANSFER_BODY) && ftpc->file) { @@ -1446,7 +1459,7 @@ static CURLcode ftp_state_rest(struct connectdata *conn) static CURLcode ftp_state_size(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; if((ftp->transfer == FTPTRANSFER_INFO) && ftpc->file) { @@ -1524,7 +1537,7 @@ static CURLcode ftp_state_list(struct connectdata *conn) free(cmd); - if(result != CURLE_OK) + if(result) return result; state(conn, FTP_LIST); @@ -1557,7 +1570,7 @@ static CURLcode ftp_state_stor_prequote(struct connectdata *conn) static CURLcode ftp_state_type(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct SessionHandle *data = conn->data; struct ftp_conn *ftpc = &conn->proto.ftpc; @@ -1614,7 +1627,7 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn, bool sizechecked) { CURLcode result = CURLE_OK; - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct SessionHandle *data = conn->data; struct ftp_conn *ftpc = &conn->proto.ftpc; int seekerr = CURL_SEEKFUNC_OK; @@ -1678,10 +1691,10 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn, } } /* now, decrease the size of the read */ - if(data->set.infilesize>0) { - data->set.infilesize -= data->state.resume_from; + if(data->state.infilesize>0) { + data->state.infilesize -= data->state.resume_from; - if(data->set.infilesize <= 0) { + if(data->state.infilesize <= 0) { infof(data, "File already completely uploaded\n"); /* no data to transfer */ @@ -1712,7 +1725,7 @@ static CURLcode ftp_state_quote(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; bool quote=FALSE; struct curl_slist *item; @@ -1814,23 +1827,94 @@ static CURLcode ftp_epsv_disable(struct connectdata *conn) return result; } +/* + * Perform the necessary magic that needs to be done once the TCP connection + * to the proxy has completed. + */ +static CURLcode proxy_magic(struct connectdata *conn, + char *newhost, unsigned short newport, + bool *magicdone) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + +#if defined(CURL_DISABLE_PROXY) + (void) newhost; + (void) newport; +#endif + + *magicdone = FALSE; + + switch(conn->proxytype) { + case CURLPROXY_SOCKS5: + case CURLPROXY_SOCKS5_HOSTNAME: + result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, newhost, + newport, SECONDARYSOCKET, conn); + *magicdone = TRUE; + break; + case CURLPROXY_SOCKS4: + result = Curl_SOCKS4(conn->proxyuser, newhost, newport, + SECONDARYSOCKET, conn, FALSE); + *magicdone = TRUE; + break; + case CURLPROXY_SOCKS4A: + result = Curl_SOCKS4(conn->proxyuser, newhost, newport, + SECONDARYSOCKET, conn, TRUE); + *magicdone = TRUE; + break; + case CURLPROXY_HTTP: + case CURLPROXY_HTTP_1_0: + /* do nothing here. handled later. */ + break; + default: + failf(data, "unknown proxytype option given"); + result = CURLE_COULDNT_CONNECT; + break; + } + + if(conn->bits.tunnel_proxy && conn->bits.httpproxy) { + /* BLOCKING */ + /* We want "seamless" FTP operations through HTTP proxy tunnel */ + + /* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the + * member conn->proto.http; we want FTP through HTTP and we have to + * change the member temporarily for connecting to the HTTP proxy. After + * Curl_proxyCONNECT we have to set back the member to the original + * struct FTP pointer + */ + struct HTTP http_proxy; + struct FTP *ftp_save = data->req.protop; + memset(&http_proxy, 0, sizeof(http_proxy)); + data->req.protop = &http_proxy; + + result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport); + + data->req.protop = ftp_save; + + if(result) + return result; + + if(conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE) { + /* the CONNECT procedure is not complete, the tunnel is not yet up */ + state(conn, FTP_STOP); /* this phase is completed */ + return result; + } + else + *magicdone = TRUE; + } + + return result; +} + static CURLcode ftp_state_pasv_resp(struct connectdata *conn, int ftpcode) { struct ftp_conn *ftpc = &conn->proto.ftpc; CURLcode result; struct SessionHandle *data=conn->data; - Curl_addrinfo *conninfo; struct Curl_dns_entry *addr=NULL; int rc; unsigned short connectport; /* the local port connect() should use! */ - unsigned short newport=0; /* remote port */ - bool connected; - - /* newhost must be able to hold a full IP-style address in ASCII, which - in the IPv6 case means 5*8-1 = 39 letters */ -#define NEWHOST_BUFSIZE 48 - char newhost[NEWHOST_BUFSIZE]; char *str=&data->state.buffer[4]; /* start on the first letter */ if((ftpc->count1 == 0) && @@ -1863,7 +1947,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, return CURLE_FTP_WEIRD_PASV_REPLY; } if(ptr) { - newport = (unsigned short)(num & 0xffff); + ftpc->newport = (unsigned short)(num & 0xffff); if(conn->bits.tunnel_proxy || conn->proxytype == CURLPROXY_SOCKS5 || @@ -1872,10 +1956,11 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, conn->proxytype == CURLPROXY_SOCKS4A) /* proxy tunnel -> use other host info because ip_addr_str is the proxy address not the ftp host */ - snprintf(newhost, sizeof(newhost), "%s", conn->host.name); + snprintf(ftpc->newhost, sizeof(ftpc->newhost), "%s", + conn->host.name); else /* use the same IP we are already connected to */ - snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str); + snprintf(ftpc->newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str); } } else @@ -1928,14 +2013,15 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, conn->proxytype == CURLPROXY_SOCKS4A) /* proxy tunnel -> use other host info because ip_addr_str is the proxy address not the ftp host */ - snprintf(newhost, sizeof(newhost), "%s", conn->host.name); + snprintf(ftpc->newhost, sizeof(ftpc->newhost), "%s", conn->host.name); else - snprintf(newhost, sizeof(newhost), "%s", conn->ip_addr_str); + snprintf(ftpc->newhost, sizeof(ftpc->newhost), "%s", + conn->ip_addr_str); } else - snprintf(newhost, sizeof(newhost), + snprintf(ftpc->newhost, sizeof(ftpc->newhost), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); - newport = (unsigned short)(((port[0]<<8) + port[1]) & 0xffff); + ftpc->newport = (unsigned short)(((port[0]<<8) + port[1]) & 0xffff); } else if(ftpc->count1 == 0) { /* EPSV failed, move on to PASV */ @@ -1969,24 +2055,21 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, } else { /* normal, direct, ftp connection */ - rc = Curl_resolv(conn, newhost, newport, &addr); + rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, &addr); if(rc == CURLRESOLV_PENDING) /* BLOCKING */ (void)Curl_resolver_wait_resolv(conn, &addr); - connectport = newport; /* we connect to the remote port */ + connectport = ftpc->newport; /* we connect to the remote port */ if(!addr) { - failf(data, "Can't resolve new host %s:%hu", newhost, connectport); + failf(data, "Can't resolve new host %s:%hu", ftpc->newhost, connectport); return CURLE_FTP_CANT_GET_HOST; } } - result = Curl_connecthost(conn, - addr, - &conn->sock[SECONDARYSOCKET], - &conninfo, - &connected); + conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE; + result = Curl_connecthost(conn, addr); Curl_resolv_unlock(data, addr); /* we're done using this address */ @@ -1997,88 +2080,17 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, return result; } - conn->bits.tcpconnect[SECONDARYSOCKET] = connected; /* * When this is used from the multi interface, this might've returned with * the 'connected' set to FALSE and thus we are now awaiting a non-blocking - * connect to connect and we should not be "hanging" here waiting. + * connect to connect. */ if(data->set.verbose) /* this just dumps information about this second connection */ - ftp_pasv_verbose(conn, conninfo, newhost, connectport); + ftp_pasv_verbose(conn, conn->ip_addr, ftpc->newhost, connectport); - switch(conn->proxytype) { - /* FIX: this MUST wait for a proper connect first if 'connected' is - * FALSE */ - case CURLPROXY_SOCKS5: - case CURLPROXY_SOCKS5_HOSTNAME: - result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, newhost, newport, - SECONDARYSOCKET, conn); - connected = TRUE; - break; - case CURLPROXY_SOCKS4: - result = Curl_SOCKS4(conn->proxyuser, newhost, newport, - SECONDARYSOCKET, conn, FALSE); - connected = TRUE; - break; - case CURLPROXY_SOCKS4A: - result = Curl_SOCKS4(conn->proxyuser, newhost, newport, - SECONDARYSOCKET, conn, TRUE); - connected = TRUE; - break; - case CURLPROXY_HTTP: - case CURLPROXY_HTTP_1_0: - /* do nothing here. handled later. */ - break; - default: - failf(data, "unknown proxytype option given"); - result = CURLE_COULDNT_CONNECT; - break; - } - - if(result) { - if(ftpc->count1 == 0 && ftpcode == 229) - return ftp_epsv_disable(conn); - return result; - } - - if(conn->bits.tunnel_proxy && conn->bits.httpproxy) { - /* FIX: this MUST wait for a proper connect first if 'connected' is - * FALSE */ - - /* BLOCKING */ - /* We want "seamless" FTP operations through HTTP proxy tunnel */ - - /* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member - * conn->proto.http; we want FTP through HTTP and we have to change the - * member temporarily for connecting to the HTTP proxy. After - * Curl_proxyCONNECT we have to set back the member to the original struct - * FTP pointer - */ - struct HTTP http_proxy; - struct FTP *ftp_save = data->state.proto.ftp; - memset(&http_proxy, 0, sizeof(http_proxy)); - data->state.proto.http = &http_proxy; - - result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport); - - data->state.proto.ftp = ftp_save; - - if(result) - return result; - - if(conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE) { - /* the CONNECT procedure is not complete, the tunnel is not yet up */ - state(conn, FTP_STOP); /* this phase is completed */ - conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE; - - return result; - } - } - - conn->bits.tcpconnect[SECONDARYSOCKET] = connected; conn->bits.do_more = TRUE; state(conn, FTP_STOP); /* this phase is completed */ @@ -2124,7 +2136,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data=conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; switch(ftpcode) { @@ -2258,7 +2270,7 @@ static CURLcode ftp_state_retr(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data=conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; if(data->set.max_filesize && (filesize > data->set.max_filesize)) { @@ -2283,8 +2295,8 @@ static CURLcode ftp_state_retr(struct connectdata *conn, if(data->state.resume_from< 0) { /* We're supposed to download the last abs(from) bytes */ if(filesize < -data->state.resume_from) { - failf(data, "Offset (%" FORMAT_OFF_T - ") was beyond file size (%" FORMAT_OFF_T ")", + failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T + ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")", data->state.resume_from, filesize); return CURLE_BAD_DOWNLOAD_RESUME; } @@ -2295,8 +2307,8 @@ static CURLcode ftp_state_retr(struct connectdata *conn, } else { if(filesize < data->state.resume_from) { - failf(data, "Offset (%" FORMAT_OFF_T - ") was beyond file size (%" FORMAT_OFF_T ")", + failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T + ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")", data->state.resume_from, filesize); return CURLE_BAD_DOWNLOAD_RESUME; } @@ -2318,13 +2330,13 @@ static CURLcode ftp_state_retr(struct connectdata *conn, } /* Set resume file transfer offset */ - infof(data, "Instructs server to resume from offset %" FORMAT_OFF_T - "\n", data->state.resume_from); + infof(data, "Instructs server to resume from offset %" + CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from); - PPSENDF(&ftpc->pp, "REST %" FORMAT_OFF_T, data->state.resume_from); + PPSENDF(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T, + data->state.resume_from); state(conn, FTP_RETR_REST); - } else { /* no resume */ @@ -2351,7 +2363,7 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn, #ifdef CURL_FTP_HTTPSTYLE_HEAD if(-1 != filesize) { snprintf(buf, sizeof(data->state.buffer), - "Content-Length: %" FORMAT_OFF_T "\r\n", filesize); + "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", filesize); result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0); if(result) return result; @@ -2427,6 +2439,8 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn, if(data->set.ftp_use_port) { bool connected; + state(conn, FTP_STOP); /* no longer in STOR state */ + result = AllowServerConnect(conn, &connected); if(result) return result; @@ -2450,7 +2464,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; char *buf = data->state.buffer; if((ftpcode == 150) || (ftpcode == 125)) { @@ -2526,10 +2540,12 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, else if((instate != FTP_LIST) && (data->set.prefer_ascii)) size = -1; /* kludge for servers that understate ASCII mode file size */ - infof(data, "Maxdownload = %" FORMAT_OFF_T "\n", data->req.maxdownload); + infof(data, "Maxdownload = %" CURL_FORMAT_CURL_OFF_T "\n", + data->req.maxdownload); if(instate != FTP_LIST) - infof(data, "Getting file with size: %" FORMAT_OFF_T "\n", size); + infof(data, "Getting file with size: %" CURL_FORMAT_CURL_OFF_T "\n", + size); /* FTP download: */ conn->proto.ftpc.state_saved = instate; @@ -2574,19 +2590,6 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn) { CURLcode result = CURLE_OK; -#ifdef HAVE_KRB4 - if(conn->data->set.krb) { - /* We may need to issue a KAUTH here to have access to the files - * do it if user supplied a password - */ - if(conn->passwd && *conn->passwd) { - /* BLOCKING */ - result = Curl_krb_kauth(conn); - if(result) - return result; - } - } -#endif if(conn->ssl[FIRSTSOCKET].use) { /* PBSZ = PROTECTION BUFFER SIZE. @@ -2618,7 +2621,7 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; (void)instate; /* no use for this yet */ @@ -2716,7 +2719,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) } /* We have received a 220 response fine, now we proceed. */ -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI if(data->set.krb) { /* If not anonymous login, try a secure login. Note that this procedure is still BLOCKING. */ @@ -2726,7 +2729,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) set a valid level */ Curl_sec_request_prot(conn, data->set.str[STRING_KRB_LEVEL]); - if(Curl_sec_login(conn) != CURLE_OK) + if(Curl_sec_login(conn)) infof(data, "Logging in with password in cleartext!\n"); else infof(data, "Authentication successful\n"); @@ -2777,7 +2780,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if((ftpcode == 234) || (ftpcode == 334)) { /* Curl_ssl_connect is BLOCKING */ result = Curl_ssl_connect(conn, FIRSTSOCKET); - if(CURLE_OK == result) { + if(!result) { conn->ssl[SECONDARYSOCKET].use = FALSE; /* clear-text data */ result = ftp_state_user(conn); } @@ -2919,7 +2922,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if(!ftpc->server_os && dir[0] != '/') { result = Curl_pp_sendf(&ftpc->pp, "%s", "SYST"); - if(result != CURLE_OK) { + if(result) { free(dir); return result; } @@ -2972,7 +2975,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if(strequal(os, "OS/400")) { /* Force OS400 name format 1. */ result = Curl_pp_sendf(&ftpc->pp, "%s", "SITE NAMEFMT 1"); - if(result != CURLE_OK) { + if(result) { free(os); return result; } @@ -3159,56 +3162,6 @@ static CURLcode ftp_block_statemach(struct connectdata *conn) } /* - * Allocate and initialize the struct FTP for the current SessionHandle. If - * need be. - */ - -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 910) && \ - defined(__OPTIMIZE__) && defined(__unix__) && defined(__i386__) - /* workaround icc 9.1 optimizer issue */ -#pragma optimize("", off) -#endif - -static CURLcode ftp_init(struct connectdata *conn) -{ - struct FTP *ftp; - - if(NULL == conn->data->state.proto.ftp) { - conn->data->state.proto.ftp = malloc(sizeof(struct FTP)); - if(NULL == conn->data->state.proto.ftp) - return CURLE_OUT_OF_MEMORY; - } - - ftp = conn->data->state.proto.ftp; - - /* get some initial data into the ftp struct */ - ftp->bytecountp = &conn->data->req.bytecount; - ftp->transfer = FTPTRANSFER_BODY; - ftp->downloadsize = 0; - - /* No need to duplicate user+password, the connectdata struct won't change - during a session, but we re-init them here since on subsequent inits - since the conn struct may have changed or been replaced. - */ - ftp->user = conn->user; - ftp->passwd = conn->passwd; - if(isBadFtpString(ftp->user)) - return CURLE_URL_MALFORMAT; - if(isBadFtpString(ftp->passwd)) - return CURLE_URL_MALFORMAT; - - conn->proto.ftpc.known_filesize = -1; /* unknown size for now */ - - return CURLE_OK; -} - -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 910) && \ - defined(__OPTIMIZE__) && defined(__unix__) && defined(__i386__) - /* workaround icc 9.1 optimizer issue */ -#pragma optimize("", on) -#endif - -/* * ftp_connect() should do everything that is to be considered a part of * the connection phase. * @@ -3225,16 +3178,8 @@ static CURLcode ftp_connect(struct connectdata *conn, *done = FALSE; /* default to not done yet */ - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - result = ftp_init(conn); - if(CURLE_OK != result) - return result; - /* We always support persistent connections on ftp */ - conn->bits.close = FALSE; + connkeep(conn, "FTP default"); pp->response_time = RESP_TIMEOUT; /* set default response time-out */ pp->statemach_act = ftp_statemach_act; @@ -3272,7 +3217,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, bool premature) { struct SessionHandle *data = conn->data; - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; struct pingpong *pp = &ftpc->pp; ssize_t nread; @@ -3318,7 +3263,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, ftpc->ctl_valid = FALSE; ftpc->cwdfail = TRUE; /* set this TRUE to prevent us to remember the current path, as this connection is going */ - conn->bits.close = TRUE; /* marked for closure */ + connclose(conn, "FTP ended with bad error code"); result = status; /* use the already set error code */ break; } @@ -3342,7 +3287,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, if(!result) result = CURLE_OUT_OF_MEMORY; ftpc->ctl_valid = FALSE; /* mark control connection as bad */ - conn->bits.close = TRUE; /* mark for connection closure */ + connclose(conn, "FTP: out of memory!"); /* mark for connection closure */ ftpc->prevpath = NULL; /* no path remembering */ } else { @@ -3385,7 +3330,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, failf(data, "Failure sending ABOR command: %s", curl_easy_strerror(result)); ftpc->ctl_valid = FALSE; /* mark control connection as bad */ - conn->bits.close = TRUE; /* mark for connection closure */ + connclose(conn, "ABOR command failed"); /* connection closure */ } } @@ -3424,7 +3369,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, if(!nread && (CURLE_OPERATION_TIMEDOUT == result)) { failf(data, "control connection looks dead"); ftpc->ctl_valid = FALSE; /* mark control connection as bad */ - conn->bits.close = TRUE; /* mark for closure */ + connclose(conn, "Timeout or similar in FTP DONE operation"); /* close */ } if(result) @@ -3434,7 +3379,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, /* we have just sent ABOR and there is no reliable way to check if it was * successful or not; we have to close the connection now */ infof(data, "partial download completed, closing connection\n"); - conn->bits.close = TRUE; /* mark for closure */ + connclose(conn, "Partial download with no ability to check"); return result; } @@ -3452,13 +3397,13 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, use checking further */ ; else if(data->set.upload) { - if((-1 != data->set.infilesize) && - (data->set.infilesize != *ftp->bytecountp) && + if((-1 != data->state.infilesize) && + (data->state.infilesize != *ftp->bytecountp) && !data->set.crlf && (ftp->transfer == FTPTRANSFER_BODY)) { - failf(data, "Uploaded unaligned file size (%" FORMAT_OFF_T - " out of %" FORMAT_OFF_T " bytes)", - *ftp->bytecountp, data->set.infilesize); + failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T + " out of %" CURL_FORMAT_CURL_OFF_T " bytes)", + *ftp->bytecountp, data->state.infilesize); result = CURLE_PARTIAL_FILE; } } @@ -3474,8 +3419,8 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, *ftp->bytecountp) && #endif /* CURL_DO_LINEEND_CONV */ (data->req.maxdownload != *ftp->bytecountp)) { - failf(data, "Received only partial file: %" FORMAT_OFF_T " bytes", - *ftp->bytecountp); + failf(data, "Received only partial file: %" CURL_FORMAT_CURL_OFF_T + " bytes", *ftp->bytecountp); result = CURLE_PARTIAL_FILE; } else if(!ftpc->dont_check && @@ -3640,26 +3585,27 @@ static CURLcode ftp_range(struct connectdata *conn) if((-1 == to) && (from>=0)) { /* X - */ data->state.resume_from = from; - DEBUGF(infof(conn->data, "FTP RANGE %" FORMAT_OFF_T " to end of file\n", - from)); + DEBUGF(infof(conn->data, "FTP RANGE %" CURL_FORMAT_CURL_OFF_T + " to end of file\n", from)); } else if(from < 0) { /* -Y */ data->req.maxdownload = -from; data->state.resume_from = from; - DEBUGF(infof(conn->data, "FTP RANGE the last %" FORMAT_OFF_T " bytes\n", - -from)); + DEBUGF(infof(conn->data, "FTP RANGE the last %" CURL_FORMAT_CURL_OFF_T + " bytes\n", -from)); } else { /* X-Y */ data->req.maxdownload = (to-from)+1; /* include last byte */ data->state.resume_from = from; - DEBUGF(infof(conn->data, "FTP RANGE from %" FORMAT_OFF_T - " getting %" FORMAT_OFF_T " bytes\n", + DEBUGF(infof(conn->data, "FTP RANGE from %" CURL_FORMAT_CURL_OFF_T + " getting %" CURL_FORMAT_CURL_OFF_T " bytes\n", from, data->req.maxdownload)); } - DEBUGF(infof(conn->data, "range-download from %" FORMAT_OFF_T - " to %" FORMAT_OFF_T ", totally %" FORMAT_OFF_T " bytes\n", + DEBUGF(infof(conn->data, "range-download from %" CURL_FORMAT_CURL_OFF_T + " to %" CURL_FORMAT_CURL_OFF_T ", totally %" + CURL_FORMAT_CURL_OFF_T " bytes\n", from, to, data->req.maxdownload)); ftpc->dont_check = TRUE; /* dont check for successful transfer */ } @@ -3689,7 +3635,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep) bool complete = FALSE; /* the ftp struct is inited in ftp_connect() */ - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; /* if the second connection isn't done yet, wait for it */ if(!conn->bits.tcpconnect[SECONDARYSOCKET]) { @@ -3706,6 +3652,10 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep) /* Ready to do more? */ if(connected) { DEBUGF(infof(data, "DO-MORE connected phase starts\n")); + if(conn->bits.proxy) { + infof(data, "Connection to proxy confirmed\n"); + result = proxy_magic(conn, ftpc->newhost, ftpc->newport, &connected); + } } else { if(result && (ftpc->count1 == 0)) { @@ -3801,7 +3751,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep) return result; } - if((result == CURLE_OK) && (ftp->transfer != FTPTRANSFER_BODY)) + if(!result && (ftp->transfer != FTPTRANSFER_BODY)) /* no data to transfer. FIX: it feels like a kludge to have this here too! */ Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); @@ -3837,7 +3787,7 @@ CURLcode ftp_perform(struct connectdata *conn, if(conn->data->set.opt_no_body) { /* requested no body means no transfer... */ - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; ftp->transfer = FTPTRANSFER_INFO; } @@ -3874,7 +3824,7 @@ static CURLcode init_wc_data(struct connectdata *conn) char *last_slash; char *path = conn->data->state.path; struct WildcardData *wildcard = &(conn->data->wildcard); - CURLcode ret = CURLE_OK; + CURLcode result = CURLE_OK; struct ftp_wc_tmpdata *ftp_tmp; last_slash = strrchr(conn->data->state.path, '/'); @@ -3882,8 +3832,8 @@ static CURLcode init_wc_data(struct connectdata *conn) last_slash++; if(last_slash[0] == '\0') { wildcard->state = CURLWC_CLEAN; - ret = ftp_parse_url_path(conn); - return ret; + result = ftp_parse_url_path(conn); + return result; } else { wildcard->pattern = strdup(last_slash); @@ -3901,8 +3851,8 @@ static CURLcode init_wc_data(struct connectdata *conn) } else { /* only list */ wildcard->state = CURLWC_CLEAN; - ret = ftp_parse_url_path(conn); - return ret; + result = ftp_parse_url_path(conn); + return result; } } @@ -3932,13 +3882,13 @@ static CURLcode init_wc_data(struct connectdata *conn) conn->data->set.ftp_filemethod = FTPFILE_MULTICWD; /* try to parse ftp url */ - ret = ftp_parse_url_path(conn); - if(ret) { + result = ftp_parse_url_path(conn); + if(result) { Curl_safefree(wildcard->pattern); wildcard->tmp_dtor(wildcard->tmp); wildcard->tmp_dtor = ZERO_NULL; wildcard->tmp = NULL; - return ret; + return result; } wildcard->path = strdup(conn->data->state.path); @@ -3967,16 +3917,16 @@ static CURLcode init_wc_data(struct connectdata *conn) static CURLcode wc_statemach(struct connectdata *conn) { struct WildcardData * const wildcard = &(conn->data->wildcard); - CURLcode ret = CURLE_OK; + CURLcode result = CURLE_OK; switch (wildcard->state) { case CURLWC_INIT: - ret = init_wc_data(conn); + result = init_wc_data(conn); if(wildcard->state == CURLWC_CLEAN) /* only listing! */ break; else - wildcard->state = ret ? CURLWC_ERROR : CURLWC_MATCHING; + wildcard->state = result ? CURLWC_ERROR : CURLWC_MATCHING; break; case CURLWC_MATCHING: { @@ -4040,10 +3990,9 @@ static CURLcode wc_statemach(struct connectdata *conn) if(finfo->flags & CURLFINFOFLAG_KNOWN_SIZE) ftpc->known_filesize = finfo->size; - ret = ftp_parse_url_path(conn); - if(ret) { - return ret; - } + result = ftp_parse_url_path(conn); + if(result) + return result; /* we don't need the Curl_fileinfo of first file anymore */ Curl_llist_remove(wildcard->filelist, wildcard->filelist->head, NULL); @@ -4067,11 +4016,11 @@ static CURLcode wc_statemach(struct connectdata *conn) case CURLWC_CLEAN: { struct ftp_wc_tmpdata *ftp_tmp = wildcard->tmp; - ret = CURLE_OK; - if(ftp_tmp) { - ret = Curl_ftp_parselist_geterror(ftp_tmp->parser); - } - wildcard->state = ret ? CURLWC_ERROR : CURLWC_DONE; + result = CURLE_OK; + if(ftp_tmp) + result = Curl_ftp_parselist_geterror(ftp_tmp->parser); + + wildcard->state = result ? CURLWC_ERROR : CURLWC_DONE; } break; case CURLWC_DONE: @@ -4079,7 +4028,7 @@ static CURLcode wc_statemach(struct connectdata *conn) break; } - return ret; + return result; } /*********************************************************************** @@ -4093,42 +4042,31 @@ static CURLcode wc_statemach(struct connectdata *conn) */ static CURLcode ftp_do(struct connectdata *conn, bool *done) { - CURLcode retcode = CURLE_OK; + CURLcode result = CURLE_OK; struct ftp_conn *ftpc = &conn->proto.ftpc; *done = FALSE; /* default to false */ ftpc->wait_data_conn = FALSE; /* default to no such wait */ - /* - Since connections can be re-used between SessionHandles, this might be a - connection already existing but on a fresh SessionHandle struct so we must - make sure we have a good 'struct FTP' to play with. For new connections, - the struct FTP is allocated and setup in the ftp_connect() function. - */ - Curl_reset_reqproto(conn); - retcode = ftp_init(conn); - if(retcode) - return retcode; - if(conn->data->set.wildcardmatch) { - retcode = wc_statemach(conn); + result = wc_statemach(conn); if(conn->data->wildcard.state == CURLWC_SKIP || conn->data->wildcard.state == CURLWC_DONE) { /* do not call ftp_regular_transfer */ return CURLE_OK; } - if(retcode) /* error, loop or skipping the file */ - return retcode; + if(result) /* error, loop or skipping the file */ + return result; } else { /* no wildcard FSM needed */ - retcode = ftp_parse_url_path(conn); - if(retcode) - return retcode; + result = ftp_parse_url_path(conn); + if(result) + return result; } - retcode = ftp_regular_transfer(conn, done); + result = ftp_regular_transfer(conn, done); - return retcode; + return result; } @@ -4140,8 +4078,8 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, char s[SBUF_SIZE]; size_t write_len; char *sptr=s; - CURLcode res = CURLE_OK; -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) + CURLcode result = CURLE_OK; +#ifdef HAVE_GSSAPI enum protection_level data_sec = conn->data_prot; #endif @@ -4155,23 +4093,23 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, bytes_written=0; - res = Curl_convert_to_network(conn->data, s, write_len); + result = Curl_convert_to_network(conn->data, s, write_len); /* Curl_convert_to_network calls failf if unsuccessful */ - if(res) - return(res); + if(result) + return(result); for(;;) { -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI conn->data_prot = PROT_CMD; #endif - res = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len, - &bytes_written); -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) + result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len, + &bytes_written); +#ifdef HAVE_GSSAPI DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST); conn->data_prot = data_sec; #endif - if(CURLE_OK != res) + if(result) break; if(conn->data->set.verbose) @@ -4186,7 +4124,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, break; } - return res; + return result; } /*********************************************************************** @@ -4209,7 +4147,7 @@ static CURLcode ftp_quit(struct connectdata *conn) failf(conn->data, "Failure sending QUIT command: %s", curl_easy_strerror(result)); conn->proto.ftpc.ctl_valid = FALSE; /* mark control connection as bad */ - conn->bits.close = TRUE; /* mark for connection closure */ + connclose(conn, "QUIT command failed"); /* mark for connection closure */ state(conn, FTP_STOP); return result; } @@ -4268,7 +4206,7 @@ static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection) Curl_pp_disconnect(pp); -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI Curl_sec_end(conn); #endif @@ -4287,7 +4225,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn) { struct SessionHandle *data = conn->data; /* the ftp struct is already inited in ftp_connect() */ - struct FTP *ftp = data->state.proto.ftp; + struct FTP *ftp = data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; const char *slash_pos; /* position of the first '/' char in curpos */ const char *path_to_use = data->state.path; @@ -4342,7 +4280,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn) dirlen++; ftpc->dirs[0] = curl_easy_unescape(conn->data, slash_pos ? cur_pos : "/", - slash_pos ? curlx_sztosi(dirlen) : 1, + slash_pos ? curlx_uztosi(dirlen) : 1, NULL); if(!ftpc->dirs[0]) { freedirs(ftpc); @@ -4477,7 +4415,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn) static CURLcode ftp_dophase_done(struct connectdata *conn, bool connected) { - struct FTP *ftp = conn->data->state.proto.ftp; + struct FTP *ftp = conn->data->req.protop; struct ftp_conn *ftpc = &conn->proto.ftpc; if(connected) { @@ -4546,8 +4484,8 @@ CURLcode ftp_regular_transfer(struct connectdata *conn, Curl_pgrsSetUploadCounter(data, 0); Curl_pgrsSetDownloadCounter(data, 0); - Curl_pgrsSetUploadSize(data, 0); - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetUploadSize(data, -1); + Curl_pgrsSetDownloadSize(data, -1); ftpc->ctl_valid = TRUE; /* starts good */ @@ -4555,7 +4493,7 @@ CURLcode ftp_regular_transfer(struct connectdata *conn, &connected, /* have we connected after PASV/PORT */ dophase_done); /* all commands in the DO-phase done? */ - if(CURLE_OK == result) { + if(!result) { if(!*dophase_done) /* the DO phase has not completed yet */ @@ -4572,11 +4510,12 @@ CURLcode ftp_regular_transfer(struct connectdata *conn, return result; } -static CURLcode ftp_setup_connection(struct connectdata * conn) +static CURLcode ftp_setup_connection(struct connectdata *conn) { struct SessionHandle *data = conn->data; - char * type; + char *type; char command; + struct FTP *ftp; if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) { /* Unless we have asked to tunnel ftp operations through the proxy, we @@ -4592,18 +4531,18 @@ static CURLcode ftp_setup_connection(struct connectdata * conn) return CURLE_UNSUPPORTED_PROTOCOL; #endif } - /* - * We explicitly mark this connection as persistent here as we're doing - * FTP over HTTP and thus we accidentally avoid setting this value - * otherwise. - */ - conn->bits.close = FALSE; + /* set it up as a HTTP connection instead */ + return conn->handler->setup_connection(conn); #else failf(data, "FTP over http proxy requires HTTP support built-in!"); return CURLE_UNSUPPORTED_PROTOCOL; #endif } + conn->data->req.protop = ftp = malloc(sizeof(struct FTP)); + if(NULL == ftp) + return CURLE_OUT_OF_MEMORY; + data->state.path++; /* don't include the initial slash */ data->state.slash_removed = TRUE; /* we've skipped the slash */ @@ -4636,6 +4575,24 @@ static CURLcode ftp_setup_connection(struct connectdata * conn) } } + /* get some initial data into the ftp struct */ + ftp->bytecountp = &conn->data->req.bytecount; + ftp->transfer = FTPTRANSFER_BODY; + ftp->downloadsize = 0; + + /* No need to duplicate user+password, the connectdata struct won't change + during a session, but we re-init them here since on subsequent inits + since the conn struct may have changed or been replaced. + */ + ftp->user = conn->user; + ftp->passwd = conn->passwd; + if(isBadFtpString(ftp->user)) + return CURLE_URL_MALFORMAT; + if(isBadFtpString(ftp->passwd)) + return CURLE_URL_MALFORMAT; + + conn->proto.ftpc.known_filesize = -1; /* unknown size for now */ + return CURLE_OK; } diff --git a/lib/ftp.h b/lib/ftp.h index bdd59c9..b6bfc02 100644 --- a/lib/ftp.h +++ b/lib/ftp.h @@ -147,6 +147,12 @@ struct ftp_conn { curl_off_t known_filesize; /* file size is different from -1, if wildcard LIST parsing was done and wc_statemach set it */ + /* newhost must be able to hold a full IP-style address in ASCII, which + in the IPv6 case means 5*8-1 = 39 letters */ +#define NEWHOST_BUFSIZE 48 + char newhost[NEWHOST_BUFSIZE]; /* this is the pair to connect the DATA... */ + unsigned short newport; /* connection to */ + }; #define DEFAULT_ACCEPT_TIMEOUT 60000 /* milliseconds == one minute */ diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c index cb3601f..9aacad9 100644 --- a/lib/ftplistparser.c +++ b/lib/ftplistparser.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,13 +23,13 @@ /** * Now implemented: * - * 1) UNIX version 1 + * 1) Unix version 1 * drwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog - * 2) UNIX version 2 + * 2) Unix version 2 * drwxr-xr-x 1 user01 ftp 512 Jan 29 1997 prog - * 3) UNIX version 3 + * 3) Unix version 3 * drwxr-xr-x 1 1 1 512 Jan 29 23:32 prog - * 4) UNIX symlink + * 4) Unix symlink * lrwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog -> prog2000 * 5) DOS style * 01-29-97 11:32PM

    prog @@ -365,7 +365,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, struct ftp_parselist_data *parser = tmpdata->parser; struct curl_fileinfo *finfo; unsigned long i = 0; - CURLcode rc; + CURLcode result; if(parser->error) { /* error in previous call */ /* scenario: @@ -449,9 +449,12 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, finfo->b_data[parser->item_length - 1] = 0; if(strncmp("total ", finfo->b_data, 6) == 0) { char *endptr = finfo->b_data+6; - /* here we can deal with directory size */ + /* here we can deal with directory size, pass the leading white + spaces and then the digits */ while(ISSPACE(*endptr)) endptr++; + while(ISDIGIT(*endptr)) + endptr++; if(*endptr != 0) { PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST); return bufflen; @@ -755,9 +758,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, finfo->b_data[parser->item_offset + parser->item_length - 1] = 0; parser->offsets.filename = parser->item_offset; parser->state.UNIX.main = PL_UNIX_FILETYPE; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } } @@ -767,9 +770,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, finfo->b_data[parser->item_offset + parser->item_length] = 0; parser->offsets.filename = parser->item_offset; parser->state.UNIX.main = PL_UNIX_FILETYPE; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } } @@ -863,9 +866,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, else if(c == '\n') { finfo->b_data[parser->item_offset + parser->item_length - 1] = 0; parser->offsets.symlink_target = parser->item_offset; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } parser->state.UNIX.main = PL_UNIX_FILETYPE; @@ -875,9 +878,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, if(c == '\n') { finfo->b_data[parser->item_offset + parser->item_length - 1] = 0; parser->offsets.symlink_target = parser->item_offset; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } parser->state.UNIX.main = PL_UNIX_FILETYPE; @@ -1008,9 +1011,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, parser->offsets.filename = parser->item_offset; finfo->b_data[finfo->b_used - 1] = 0; parser->offsets.filename = parser->item_offset; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } parser->state.NT.main = PL_WINNT_DATE; @@ -1020,9 +1023,9 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, case PL_WINNT_FILENAME_WINEOL: if(c == '\n') { parser->offsets.filename = parser->item_offset; - rc = ftp_pl_insert_finfo(conn, finfo); - if(rc) { - PL_ERROR(conn, rc); + result = ftp_pl_insert_finfo(conn, finfo); + if(result) { + PL_ERROR(conn, result); return bufflen; } parser->state.NT.main = PL_WINNT_DATE; @@ -1038,7 +1041,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, } break; default: - return bufflen+1; + return bufflen + 1; } i++; diff --git a/lib/getinfo.c b/lib/getinfo.c index 3d09dc6..0ffdd74 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -28,7 +28,7 @@ #include "getinfo.h" #include "curl_memory.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" /* Curl_getconnectinfo() */ #include "progress.h" @@ -42,7 +42,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data) { struct Progress *pro = &data->progress; - struct PureInfo *info =&data->info; + struct PureInfo *info = &data->info; pro->t_nslookup = 0; pro->t_connect = 0; @@ -53,6 +53,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data) pro->t_redirect = 0; info->httpcode = 0; + info->httpproxycode = 0; info->httpversion = 0; info->filetime = -1; /* -1 is an illegal time and thus means unknown */ info->timecond = FALSE; @@ -115,6 +116,7 @@ static CURLcode getinfo_char(struct SessionHandle *data, CURLINFO info, default: return CURLE_BAD_FUNCTION_ARGUMENT; } + return CURLE_OK; } @@ -201,6 +203,7 @@ static CURLcode getinfo_long(struct SessionHandle *data, CURLINFO info, default: return CURLE_BAD_FUNCTION_ARGUMENT; } + return CURLE_OK; } @@ -253,6 +256,7 @@ static CURLcode getinfo_double(struct SessionHandle *data, CURLINFO info, default: return CURLE_BAD_FUNCTION_ARGUMENT; } + return CURLE_OK; } @@ -260,8 +264,8 @@ static CURLcode getinfo_slist(struct SessionHandle *data, CURLINFO info, struct curl_slist **param_slistp) { union { - struct curl_certinfo * to_certinfo; - struct curl_slist * to_slist; + struct curl_certinfo *to_certinfo; + struct curl_slist *to_slist; } ptr; switch(info) { @@ -277,26 +281,73 @@ static CURLcode getinfo_slist(struct SessionHandle *data, CURLINFO info, ptr.to_certinfo = &data->info.certs; *param_slistp = ptr.to_slist; break; + case CURLINFO_TLS_SESSION: + { + struct curl_tlssessioninfo **tsip = (struct curl_tlssessioninfo **) + param_slistp; + struct curl_tlssessioninfo *tsi = &data->tsi; + struct connectdata *conn = data->easy_conn; + unsigned int sockindex = 0; + void *internals = NULL; + + *tsip = tsi; + tsi->backend = CURLSSLBACKEND_NONE; + tsi->internals = NULL; + + if(!conn) + break; + /* Find the active ("in use") SSL connection, if any */ + while((sockindex < sizeof(conn->ssl) / sizeof(conn->ssl[0])) && + (!conn->ssl[sockindex].use)) + sockindex++; + + if(sockindex == sizeof(conn->ssl) / sizeof(conn->ssl[0])) + break; /* no SSL session found */ + + /* Return the TLS session information from the relevant backend */ +#ifdef USE_SSLEAY + internals = conn->ssl[sockindex].ctx; +#endif +#ifdef USE_GNUTLS + internals = conn->ssl[sockindex].session; +#endif +#ifdef USE_NSS + internals = conn->ssl[sockindex].handle; +#endif +#ifdef USE_GSKIT + internals = conn->ssl[sockindex].handle; +#endif + if(internals) { + tsi->backend = Curl_ssl_backend(); + tsi->internals = internals; + } + /* NOTE: For other SSL backends, it is not immediately clear what data + to return from 'struct ssl_connect_data'; thus, for now we keep the + backend as CURLSSLBACKEND_NONE in those cases, which should be + interpreted as "not supported" */ + } + break; default: return CURLE_BAD_FUNCTION_ARGUMENT; } + return CURLE_OK; } CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) { va_list arg; - long *param_longp=NULL; - double *param_doublep=NULL; - char **param_charp=NULL; - struct curl_slist **param_slistp=NULL; + long *param_longp = NULL; + double *param_doublep = NULL; + char **param_charp = NULL; + struct curl_slist **param_slistp = NULL; int type; /* default return code is to error out! */ - CURLcode ret = CURLE_BAD_FUNCTION_ARGUMENT; + CURLcode result = CURLE_BAD_FUNCTION_ARGUMENT; if(!data) - return ret; + return result; va_start(arg, info); @@ -304,28 +355,29 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) switch(type) { case CURLINFO_STRING: param_charp = va_arg(arg, char **); - if(NULL != param_charp) - ret = getinfo_char(data, info, param_charp); + if(param_charp) + result = getinfo_char(data, info, param_charp); break; case CURLINFO_LONG: param_longp = va_arg(arg, long *); - if(NULL != param_longp) - ret = getinfo_long(data, info, param_longp); + if(param_longp) + result = getinfo_long(data, info, param_longp); break; case CURLINFO_DOUBLE: param_doublep = va_arg(arg, double *); - if(NULL != param_doublep) - ret = getinfo_double(data, info, param_doublep); + if(param_doublep) + result = getinfo_double(data, info, param_doublep); break; case CURLINFO_SLIST: param_slistp = va_arg(arg, struct curl_slist **); - if(NULL != param_slistp) - ret = getinfo_slist(data, info, param_slistp); + if(param_slistp) + result = getinfo_slist(data, info, param_slistp); break; default: break; } va_end(arg); - return ret; + + return result; } diff --git a/lib/gopher.c b/lib/gopher.c index b1dd65f..f3fd065 100644 --- a/lib/gopher.c +++ b/lib/gopher.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -121,7 +121,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done) for(;;) { result = Curl_write(conn, sockfd, sel, k, &amount); - if(CURLE_OK == result) { /* Which may not have written it all! */ + if(!result) { /* Which may not have written it all! */ result = Curl_client_write(conn, CLIENTWRITE_HEADER, sel, amount); if(result) { Curl_safefree(sel_org); @@ -154,7 +154,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done) /* We can use Curl_sendf to send the terminal \r\n relatively safely and save allocing another string/doing another _write loop. */ result = Curl_sendf(sockfd, conn, "\r\n"); - if(result != CURLE_OK) { + if(result) { failf(data, "Failed sending Gopher request"); return result; } diff --git a/lib/gskit.c b/lib/gskit.c deleted file mode 100644 index 5cda85b..0000000 --- a/lib/gskit.c +++ /dev/null @@ -1,906 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2013, 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 http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#include "curl_setup.h" - -#ifdef USE_GSKIT - -#include -#include - -/* Some symbols are undefined/unsupported on OS400 versions < V7R1. */ -#ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST -#define GSK_SSL_EXTN_SERVERNAME_REQUEST 230 -#endif - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include -#include "urldata.h" -#include "sendf.h" -#include "gskit.h" -#include "sslgen.h" -#include "connect.h" /* for the connect timeout */ -#include "select.h" -#include "strequal.h" -#include "x509asn1.h" - -#define _MPRINTF_REPLACE /* use our functions only */ -#include - -#include "curl_memory.h" -/* The last #include file should be: */ -#include "memdebug.h" - - -/* Supported ciphers. */ -typedef struct { - const char * name; /* Cipher name. */ - const char * gsktoken; /* Corresponding token for GSKit String. */ - int sslver; /* SSL version. */ -} gskit_cipher; - -static const gskit_cipher ciphertable[] = { - { "null-md5", "01", CURL_SSLVERSION_SSLv3 }, - { "null-sha", "02", CURL_SSLVERSION_SSLv3 }, - { "exp-rc4-md5", "03", CURL_SSLVERSION_SSLv3 }, - { "rc4-md5", "04", CURL_SSLVERSION_SSLv3 }, - { "rc4-sha", "05", CURL_SSLVERSION_SSLv3 }, - { "exp-rc2-cbc-md5", "06", CURL_SSLVERSION_SSLv3 }, - { "exp-des-cbc-sha", "09", CURL_SSLVERSION_SSLv3 }, - { "des-cbc3-sha", "0A", CURL_SSLVERSION_SSLv3 }, - { "aes128-sha", "2F", CURL_SSLVERSION_TLSv1 }, - { "aes256-sha", "35", CURL_SSLVERSION_TLSv1 }, - { "rc4-md5", "1", CURL_SSLVERSION_SSLv2 }, - { "exp-rc4-md5", "2", CURL_SSLVERSION_SSLv2 }, - { "rc2-md5", "3", CURL_SSLVERSION_SSLv2 }, - { "exp-rc2-md5", "4", CURL_SSLVERSION_SSLv2 }, - { "des-cbc-md5", "6", CURL_SSLVERSION_SSLv2 }, - { "des-cbc3-md5", "7", CURL_SSLVERSION_SSLv2 }, - { (const char *) NULL, (const char *) NULL, 0 } -}; - - -static bool is_separator(char c) -{ - /* Return whether character is a cipher list separator. */ - switch (c) { - case ' ': - case '\t': - case ':': - case ',': - case ';': - return true; - } - return false; -} - - -static CURLcode gskit_status(struct SessionHandle * data, int rc, - const char * procname, CURLcode defcode) -{ - CURLcode cc; - - /* Process GSKit status and map it to a CURLcode. */ - switch (rc) { - case GSK_OK: - case GSK_OS400_ASYNCHRONOUS_SOC_INIT: - return CURLE_OK; - case GSK_KEYRING_OPEN_ERROR: - case GSK_OS400_ERROR_NO_ACCESS: - return CURLE_SSL_CACERT_BADFILE; - case GSK_INSUFFICIENT_STORAGE: - return CURLE_OUT_OF_MEMORY; - case GSK_ERROR_BAD_V2_CIPHER: - case GSK_ERROR_BAD_V3_CIPHER: - case GSK_ERROR_NO_CIPHERS: - return CURLE_SSL_CIPHER; - case GSK_OS400_ERROR_NOT_TRUSTED_ROOT: - case GSK_ERROR_CERT_VALIDATION: - return CURLE_PEER_FAILED_VERIFICATION; - case GSK_OS400_ERROR_TIMED_OUT: - return CURLE_OPERATION_TIMEDOUT; - case GSK_WOULD_BLOCK: - return CURLE_AGAIN; - case GSK_OS400_ERROR_NOT_REGISTERED: - break; - case GSK_ERROR_IO: - switch (errno) { - case ENOMEM: - return CURLE_OUT_OF_MEMORY; - default: - failf(data, "%s I/O error: %s", procname, strerror(errno)); - break; - } - break; - default: - failf(data, "%s: %s", procname, gsk_strerror(rc)); - break; - } - return defcode; -} - - -static CURLcode set_enum(struct SessionHandle * data, - gsk_handle h, GSK_ENUM_ID id, GSK_ENUM_VALUE value) -{ - int rc = gsk_attribute_set_enum(h, id, value); - - switch (rc) { - case GSK_OK: - return CURLE_OK; - case GSK_ERROR_IO: - failf(data, "gsk_attribute_set_enum() I/O error: %s", strerror(errno)); - break; - default: - failf(data, "gsk_attribute_set_enum(): %s", gsk_strerror(rc)); - break; - } - return CURLE_SSL_CONNECT_ERROR; -} - - -static CURLcode set_buffer(struct SessionHandle * data, - gsk_handle h, GSK_BUF_ID id, const char * buffer) -{ - int rc = gsk_attribute_set_buffer(h, id, buffer, 0); - - switch (rc) { - case GSK_OK: - return CURLE_OK; - case GSK_ERROR_IO: - failf(data, "gsk_attribute_set_buffer() I/O error: %s", strerror(errno)); - break; - default: - failf(data, "gsk_attribute_set_buffer(): %s", gsk_strerror(rc)); - break; - } - return CURLE_SSL_CONNECT_ERROR; -} - - -static CURLcode set_numeric(struct SessionHandle * data, - gsk_handle h, GSK_NUM_ID id, int value) -{ - int rc = gsk_attribute_set_numeric_value(h, id, value); - - switch (rc) { - case GSK_OK: - return CURLE_OK; - case GSK_ERROR_IO: - failf(data, "gsk_attribute_set_numeric_value() I/O error: %s", - strerror(errno)); - break; - default: - failf(data, "gsk_attribute_set_numeric_value(): %s", gsk_strerror(rc)); - break; - } - return CURLE_SSL_CONNECT_ERROR; -} - - -static CURLcode set_callback(struct SessionHandle * data, - gsk_handle h, GSK_CALLBACK_ID id, void * info) -{ - int rc = gsk_attribute_set_callback(h, id, info); - - switch (rc) { - case GSK_OK: - return CURLE_OK; - case GSK_ERROR_IO: - failf(data, "gsk_attribute_set_callback() I/O error: %s", strerror(errno)); - break; - default: - failf(data, "gsk_attribute_set_callback(): %s", gsk_strerror(rc)); - break; - } - return CURLE_SSL_CONNECT_ERROR; -} - - -static CURLcode set_ciphers(struct SessionHandle * data, gsk_handle h) -{ - const char * cipherlist = data->set.str[STRING_SSL_CIPHER_LIST]; - char * sslv2ciphers; - char * sslv3ciphers; - const char * clp; - const gskit_cipher * ctp; - char * v2p; - char * v3p; - int i; - CURLcode cc; - - /* Compile cipher list into GSKit-compatible cipher lists. */ - - if(!cipherlist) - return CURLE_OK; - while(is_separator(*cipherlist)) /* Skip initial separators. */ - cipherlist++; - if(!*cipherlist) - return CURLE_OK; - - /* We allocate GSKit buffers of the same size as the input string: since - GSKit tokens are always shorter than their cipher names, allocated buffers - will always be large enough to accomodate the result. */ - i = strlen(cipherlist) + 1; - v2p = malloc(i); - if(!v2p) - return CURLE_OUT_OF_MEMORY; - v3p = malloc(i); - if(!v3p) { - free(v2p); - return CURLE_OUT_OF_MEMORY; - } - sslv2ciphers = v2p; - sslv3ciphers = v3p; - - /* Process each cipher in input string. */ - for(;;) { - for(clp = cipherlist; *cipherlist && !is_separator(*cipherlist);) - cipherlist++; - i = cipherlist - clp; - if(!i) - break; - /* Search the cipher in our table. */ - for(ctp = ciphertable; ctp->name; ctp++) - if(strnequal(ctp->name, clp, i) && !ctp->name[i]) - break; - if(!ctp->name) - failf(data, "Unknown cipher %.*s: ignored", i, clp); - else { - switch (ctp->sslver) { - case CURL_SSLVERSION_SSLv2: - strcpy(v2p, ctp->gsktoken); - v2p += strlen(v2p); - break; - default: - /* GSKit wants TLSv1 ciphers with SSLv3 ciphers. */ - strcpy(v3p, ctp->gsktoken); - v3p += strlen(v3p); - break; - } - } - - /* Advance to next cipher name or end of string. */ - while(is_separator(*cipherlist)) - cipherlist++; - } - *v2p = '\0'; - *v3p = '\0'; - cc = set_buffer(data, h, GSK_V2_CIPHER_SPECS, sslv2ciphers); - if(cc == CURLE_OK) - cc = set_buffer(data, h, GSK_V3_CIPHER_SPECS, sslv3ciphers); - free(sslv2ciphers); - free(sslv3ciphers); - return cc; -} - - -int Curl_gskit_init(void) -{ - /* No initialisation needed. */ - - return 1; -} - - -void Curl_gskit_cleanup(void) -{ - /* Nothing to do. */ -} - - -static CURLcode init_environment(struct SessionHandle * data, - gsk_handle * envir, const char * appid, - const char * file, const char * label, - const char * password) -{ - int rc; - CURLcode c; - gsk_handle h; - - /* Creates the GSKit environment. */ - - rc = gsk_environment_open(&h); - switch (rc) { - case GSK_OK: - break; - case GSK_INSUFFICIENT_STORAGE: - return CURLE_OUT_OF_MEMORY; - default: - failf(data, "gsk_environment_open(): %s", gsk_strerror(rc)); - return CURLE_SSL_CONNECT_ERROR; - } - - c = set_enum(data, h, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); - if(c == CURLE_OK && appid) - c = set_buffer(data, h, GSK_OS400_APPLICATION_ID, appid); - if(c == CURLE_OK && file) - c = set_buffer(data, h, GSK_KEYRING_FILE, file); - if(c == CURLE_OK && label) - c = set_buffer(data, h, GSK_KEYRING_LABEL, label); - if(c == CURLE_OK && password) - c = set_buffer(data, h, GSK_KEYRING_PW, password); - - if(c == CURLE_OK) { - /* Locate CAs, Client certificate and key according to our settings. - Note: this call may be blocking for some tenths of seconds. */ - c = gskit_status(data, gsk_environment_init(h), - "gsk_environment_init()", CURLE_SSL_CERTPROBLEM); - if(c == CURLE_OK) { - *envir = h; - return c; - } - } - /* Error: rollback. */ - gsk_environment_close(&h); - return c; -} - - -static void cancel_async_handshake(struct connectdata * conn, int sockindex) -{ - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - Qso_OverlappedIO_t cstat; - - if(QsoCancelOperation(conn->sock[sockindex], 0) > 0) - QsoWaitForIOCompletion(connssl->iocport, &cstat, (struct timeval *) NULL); -} - - -static void close_async_handshake(struct ssl_connect_data * connssl) -{ - QsoDestroyIOCompletionPort(connssl->iocport); - connssl->iocport = -1; -} - - -static void close_one(struct ssl_connect_data * conn, - struct SessionHandle * data) -{ - if(conn->handle) { - gskit_status(data, gsk_secure_soc_close(&conn->handle), - "gsk_secure_soc_close()", 0); - conn->handle = (gsk_handle) NULL; - } - if(conn->iocport >= 0) - close_async_handshake(conn); -} - - -static ssize_t gskit_send(struct connectdata * conn, int sockindex, - const void * mem, size_t len, CURLcode * curlcode) -{ - struct SessionHandle * data = conn->data; - CURLcode cc; - int written; - - cc = gskit_status(data, - gsk_secure_soc_write(conn->ssl[sockindex].handle, - (char *) mem, (int) len, &written), - "gsk_secure_soc_write()", CURLE_SEND_ERROR); - if(cc != CURLE_OK) { - *curlcode = cc; - written = -1; - } - return (ssize_t) written; /* number of bytes */ -} - - -static ssize_t gskit_recv(struct connectdata * conn, int num, char * buf, - size_t buffersize, CURLcode * curlcode) -{ - struct SessionHandle * data = conn->data; - int buffsize; - int nread; - CURLcode cc; - - buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize; - cc = gskit_status(data, gsk_secure_soc_read(conn->ssl[num].handle, - buf, buffsize, &nread), - "gsk_secure_soc_read()", CURLE_RECV_ERROR); - if(cc != CURLE_OK) { - *curlcode = cc; - nread = -1; - } - return (ssize_t) nread; -} - - -static CURLcode gskit_connect_step1(struct connectdata * conn, int sockindex) -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - gsk_handle envir; - CURLcode cc; - int rc; - char * keyringfile; - char * keyringpwd; - char * keyringlabel; - char * v2ciphers; - char * v3ciphers; - char * sni; - bool sslv2enable, sslv3enable, tlsv1enable; - long timeout; - Qso_OverlappedIO_t commarea; - - /* Create SSL environment, start (preferably asynchronous) handshake. */ - - connssl->handle = (gsk_handle) NULL; - connssl->iocport = -1; - - /* GSKit supports two ways of specifying an SSL context: either by - * application identifier (that should have been defined at the system - * level) or by keyring file, password and certificate label. - * Local certificate name (CURLOPT_SSLCERT) is used to hold either the - * application identifier of the certificate label. - * Key password (CURLOPT_KEYPASSWD) holds the keyring password. - * It is not possible to have different keyrings for the CAs and the - * local certificate. We thus use the CA file (CURLOPT_CAINFO) to identify - * the keyring file. - * If no key password is given and the keyring is the system keyring, - * application identifier mode is tried first, as recommended in IBM doc. - */ - - keyringfile = data->set.str[STRING_SSL_CAFILE]; - keyringpwd = data->set.str[STRING_KEY_PASSWD]; - keyringlabel = data->set.str[STRING_CERT]; - envir = (gsk_handle) NULL; - - if(keyringlabel && *keyringlabel && !keyringpwd && - !strcmp(keyringfile, CURL_CA_BUNDLE)) { - /* Try application identifier mode. */ - init_environment(data, &envir, keyringlabel, (const char *) NULL, - (const char *) NULL, (const char *) NULL); - } - - if(!envir) { - /* Use keyring mode. */ - cc = init_environment(data, &envir, (const char *) NULL, - keyringfile, keyringlabel, keyringpwd); - if(cc != CURLE_OK) - return cc; - } - - /* Create secure session. */ - cc = gskit_status(data, gsk_secure_soc_open(envir, &connssl->handle), - "gsk_secure_soc_open()", CURLE_SSL_CONNECT_ERROR); - gsk_environment_close(&envir); - if(cc != CURLE_OK) - return cc; - - /* Determine which SSL/TLS version should be enabled. */ - sslv2enable = sslv3enable = tlsv1enable = false; - sni = conn->host.name; - switch (data->set.ssl.version) { - case CURL_SSLVERSION_SSLv2: - sslv2enable = true; - sni = (char *) NULL; - break; - case CURL_SSLVERSION_SSLv3: - sslv3enable = true; - sni = (char *) NULL; - break; - case CURL_SSLVERSION_TLSv1: - tlsv1enable = true; - break; - default: /* CURL_SSLVERSION_DEFAULT. */ - sslv3enable = true; - tlsv1enable = true; - break; - } - - /* Process SNI. Ignore if not supported (on OS400 < V7R1). */ - if(sni) { - rc = gsk_attribute_set_buffer(connssl->handle, - GSK_SSL_EXTN_SERVERNAME_REQUEST, sni, 0); - switch (rc) { - case GSK_OK: - case GSK_ATTRIBUTE_INVALID_ID: - break; - case GSK_ERROR_IO: - failf(data, "gsk_attribute_set_buffer() I/O error: %s", strerror(errno)); - cc = CURLE_SSL_CONNECT_ERROR; - break; - default: - failf(data, "gsk_attribute_set_buffer(): %s", gsk_strerror(rc)); - cc = CURLE_SSL_CONNECT_ERROR; - break; - } - } - - /* Set session parameters. */ - if(cc == CURLE_OK) { - /* Compute the handshake timeout. Since GSKit granularity is 1 second, - we round up the required value. */ - timeout = Curl_timeleft(data, NULL, TRUE); - if(timeout < 0) - cc = CURLE_OPERATION_TIMEDOUT; - else - cc = set_numeric(data, connssl->handle, GSK_HANDSHAKE_TIMEOUT, - (timeout + 999) / 1000); - } - if(cc == CURLE_OK) - cc = set_numeric(data, connssl->handle, GSK_FD, conn->sock[sockindex]); - if(cc == CURLE_OK) - cc = set_ciphers(data, connssl->handle); - if(cc == CURLE_OK) - cc = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV2, - sslv2enable? GSK_PROTOCOL_SSLV2_ON: - GSK_PROTOCOL_SSLV2_OFF); - if(cc == CURLE_OK) - cc = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV3, - sslv3enable? GSK_PROTOCOL_SSLV3_ON: - GSK_PROTOCOL_SSLV3_OFF); - if(cc == CURLE_OK) - cc = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV1, - sslv3enable? GSK_PROTOCOL_TLSV1_ON: - GSK_PROTOCOL_TLSV1_OFF); - if(cc == CURLE_OK) - cc = set_enum(data, connssl->handle, GSK_SERVER_AUTH_TYPE, - data->set.ssl.verifypeer? GSK_SERVER_AUTH_FULL: - GSK_SERVER_AUTH_PASSTHRU); - - if(cc == CURLE_OK) { - /* Start handshake. Try asynchronous first. */ - memset(&commarea, 0, sizeof commarea); - connssl->iocport = QsoCreateIOCompletionPort(); - if(connssl->iocport != -1) { - cc = gskit_status(data, gsk_secure_soc_startInit(connssl->handle, - connssl->iocport, &commarea), - "gsk_secure_soc_startInit()", CURLE_SSL_CONNECT_ERROR); - if(cc == CURLE_OK) { - connssl->connecting_state = ssl_connect_2; - return CURLE_OK; - } - else - close_async_handshake(connssl); - } - else if(errno != ENOBUFS) - cc = gskit_status(data, GSK_ERROR_IO, "QsoCreateIOCompletionPort()", 0); - else { - /* No more completion port available. Use synchronous IO. */ - cc = gskit_status(data, gsk_secure_soc_init(connssl->handle), - "gsk_secure_soc_init()", CURLE_SSL_CONNECT_ERROR); - if(cc == CURLE_OK) { - connssl->connecting_state = ssl_connect_3; - return CURLE_OK; - } - } - } - - /* Error: rollback. */ - close_one(connssl, data); - return cc; -} - - -static CURLcode gskit_connect_step2(struct connectdata * conn, int sockindex, - bool nonblocking) -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - Qso_OverlappedIO_t cstat; - long timeout_ms; - struct timeval stmv; - CURLcode cc; - - /* Poll or wait for end of SSL asynchronous handshake. */ - - for(;;) { - timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE); - if(timeout_ms < 0) - timeout_ms = 0; - stmv.tv_sec = timeout_ms / 1000; - stmv.tv_usec = (timeout_ms - stmv.tv_sec * 1000) * 1000; - switch (QsoWaitForIOCompletion(connssl->iocport, &cstat, &stmv)) { - case 1: /* Operation complete. */ - break; - case -1: /* An error occurred: handshake still in progress. */ - if(errno == EINTR) { - if(nonblocking) - return CURLE_OK; - continue; /* Retry. */ - } - if(errno != ETIME) { - failf(data, "QsoWaitForIOCompletion() I/O error: %s", strerror(errno)); - cancel_async_handshake(conn, sockindex); - close_async_handshake(connssl); - return CURLE_SSL_CONNECT_ERROR; - } - /* FALL INTO... */ - case 0: /* Handshake in progress, timeout occurred. */ - if(nonblocking) - return CURLE_OK; - cancel_async_handshake(conn, sockindex); - close_async_handshake(connssl); - return CURLE_OPERATION_TIMEDOUT; - } - break; - } - cc = gskit_status(data, cstat.returnValue, "SSL handshake", - CURLE_SSL_CONNECT_ERROR); - if(cc == CURLE_OK) - connssl->connecting_state = ssl_connect_3; - close_async_handshake(connssl); - return cc; -} - - -static CURLcode gskit_connect_step3(struct connectdata * conn, int sockindex) -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - const gsk_cert_data_elem * cdev; - int cdec; - const gsk_cert_data_elem * p; - const char * cert = (const char *) NULL; - const char * certend; - int i; - CURLcode cc; - - /* SSL handshake done: gather certificate info and verify host. */ - - if(gskit_status(data, gsk_attribute_get_cert_info(connssl->handle, - GSK_PARTNER_CERT_INFO, - &cdev, &cdec), - "gsk_attribute_get_cert_info()", CURLE_SSL_CONNECT_ERROR) == - CURLE_OK) { - infof(data, "Server certificate:\n"); - p = cdev; - for(i = 0; i++ < cdec; p++) - switch (p->cert_data_id) { - case CERT_BODY_DER: - cert = p->cert_data_p; - certend = cert + cdev->cert_data_l; - break; - case CERT_DN_PRINTABLE: - infof(data, "\t subject: %.*s\n", p->cert_data_l, p->cert_data_p); - break; - case CERT_ISSUER_DN_PRINTABLE: - infof(data, "\t issuer: %.*s\n", p->cert_data_l, p->cert_data_p); - break; - case CERT_VALID_FROM: - infof(data, "\t start date: %.*s\n", p->cert_data_l, p->cert_data_p); - break; - case CERT_VALID_TO: - infof(data, "\t expire date: %.*s\n", p->cert_data_l, p->cert_data_p); - break; - } - } - - /* Verify host. */ - cc = Curl_verifyhost(conn, cert, certend); - if(cc != CURLE_OK) - return cc; - - /* The only place GSKit can get the whole CA chain is a validation - callback where no user data pointer is available. Therefore it's not - possible to copy this chain into our structures for CAINFO. - However the server certificate may be available, thus we can return - info about it. */ - if(data->set.ssl.certinfo) { - if(Curl_ssl_init_certinfo(data, 1)) - return CURLE_OUT_OF_MEMORY; - if(cert) { - cc = Curl_extract_certinfo(conn, 0, cert, certend); - if(cc != CURLE_OK) - return cc; - } - } - - connssl->connecting_state = ssl_connect_done; - return CURLE_OK; -} - - -static CURLcode gskit_connect_common(struct connectdata * conn, int sockindex, - bool nonblocking, bool * done) -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - long timeout_ms; - Qso_OverlappedIO_t cstat; - CURLcode cc = CURLE_OK; - - *done = connssl->state == ssl_connection_complete; - if(*done) - return CURLE_OK; - - /* Step 1: create session, start handshake. */ - if(connssl->connecting_state == ssl_connect_1) { - /* check allowed time left */ - timeout_ms = Curl_timeleft(data, NULL, TRUE); - - if(timeout_ms < 0) { - /* no need to continue if time already is up */ - failf(data, "SSL connection timeout"); - cc = CURLE_OPERATION_TIMEDOUT; - } - else - cc = gskit_connect_step1(conn, sockindex); - } - - /* Step 2: check if handshake is over. */ - if(cc == CURLE_OK && connssl->connecting_state == ssl_connect_2) { - /* check allowed time left */ - timeout_ms = Curl_timeleft(data, NULL, TRUE); - - if(timeout_ms < 0) { - /* no need to continue if time already is up */ - failf(data, "SSL connection timeout"); - cc = CURLE_OPERATION_TIMEDOUT; - } - else - cc = gskit_connect_step2(conn, sockindex, nonblocking); - } - - /* Step 3: gather certificate info, verify host. */ - if(cc == CURLE_OK && connssl->connecting_state == ssl_connect_3) - cc = gskit_connect_step3(conn, sockindex); - - if(cc != CURLE_OK) - close_one(connssl, data); - else if(connssl->connecting_state == ssl_connect_done) { - connssl->state = ssl_connection_complete; - connssl->connecting_state = ssl_connect_1; - conn->recv[sockindex] = gskit_recv; - conn->send[sockindex] = gskit_send; - *done = TRUE; - } - - return cc; -} - - -CURLcode Curl_gskit_connect_nonblocking(struct connectdata * conn, - int sockindex, - bool * done) -{ - CURLcode cc; - - cc = gskit_connect_common(conn, sockindex, TRUE, done); - if(*done || cc != CURLE_OK) - conn->ssl[sockindex].connecting_state = ssl_connect_1; - return cc; -} - - -CURLcode Curl_gskit_connect(struct connectdata * conn, int sockindex) -{ - CURLcode retcode; - bool done; - - conn->ssl[sockindex].connecting_state = ssl_connect_1; - retcode = gskit_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; - - DEBUGASSERT(done); - - return CURLE_OK; -} - - -void Curl_gskit_close(struct connectdata * conn, int sockindex) -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - - if(connssl->use) - close_one(connssl, data); -} - - -int Curl_gskit_close_all(struct SessionHandle * data) -{ - /* Unimplemented. */ - (void) data; - return 0; -} - - -int Curl_gskit_shutdown(struct connectdata * conn, int sockindex) -{ - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - struct SessionHandle * data = conn->data; - ssize_t nread; - int what; - int rc; - char buf[120]; - - if(!connssl->handle) - return 0; - - if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE) - return 0; - - close_one(connssl, data); - rc = 0; - what = Curl_socket_ready(conn->sock[sockindex], - CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT); - - for(;;) { - if(what < 0) { - /* anything that gets here is fatally bad */ - failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO); - rc = -1; - break; - } - - if(!what) { /* timeout */ - failf(data, "SSL shutdown timeout"); - break; - } - - /* Something to read, let's do it and hope that it is the close - notify alert from the server. No way to gsk_secure_soc_read() now, so - use read(). */ - - nread = read(conn->sock[sockindex], buf, sizeof(buf)); - - if(nread < 0) { - failf(data, "read: %s", strerror(errno)); - rc = -1; - } - - if(nread <= 0) - break; - - what = Curl_socket_ready(conn->sock[sockindex], CURL_SOCKET_BAD, 0); - } - - return rc; -} - - -size_t Curl_gskit_version(char * buffer, size_t size) -{ - strncpy(buffer, "GSKit", size); - return strlen(buffer); -} - - -int Curl_gskit_check_cxn(struct connectdata * cxn) -{ - int err; - int errlen; - - /* The only thing that can be tested here is at the socket level. */ - - if(!cxn->ssl[FIRSTSOCKET].handle) - return 0; /* connection has been closed */ - - err = 0; - errlen = sizeof err; - - if(getsockopt(cxn->sock[FIRSTSOCKET], SOL_SOCKET, SO_ERROR, - (unsigned char *) &err, &errlen) || - errlen != sizeof err || err) - return 0; /* connection has been closed */ - - return -1; /* connection status unknown */ -} - -#endif /* USE_GSKIT */ diff --git a/lib/hostasyn.c b/lib/hostasyn.c index 8151b67..3cf8004 100644 --- a/lib/hostasyn.c +++ b/lib/hostasyn.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -75,7 +75,7 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, struct Curl_addrinfo *ai) { struct Curl_dns_entry *dns = NULL; - CURLcode rc = CURLE_OK; + CURLcode result = CURLE_OK; conn->async.status = status; @@ -92,14 +92,14 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, if(!dns) { /* failed to store, cleanup and return error */ Curl_freeaddrinfo(ai); - rc = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; } if(data->share) Curl_share_unlock(data, CURL_LOCK_DATA_DNS); } else { - rc = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; } } @@ -110,9 +110,9 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, async struct */ conn->async.done = TRUE; - /* ipv4: The input hostent struct will be freed by ares when we return from + /* IPv4: The input hostent struct will be freed by ares when we return from this function */ - return rc; + return result; } /* Call this function after Curl_connect() has returned async=TRUE and diff --git a/lib/hostcheck.c b/lib/hostcheck.c index abd1fa0..21af8fa 100644 --- a/lib/hostcheck.c +++ b/lib/hostcheck.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,12 +22,20 @@ #include "curl_setup.h" -#if defined(USE_SSLEAY) || defined(USE_AXTLS) || defined(USE_QSOSSL) || \ - defined(USE_GSKIT) +#if defined(USE_SSLEAY) || defined(USE_AXTLS) || defined(USE_GSKIT) /* these backends use functions from this file */ +#ifdef HAVE_NETINET_IN_H +#include +#endif + #include "hostcheck.h" #include "rawstr.h" +#include "inet_pton.h" + +#include "curl_memory.h" +/* The last #include file should be: */ +#include "memdebug.h" /* * Match a hostname against a wildcard pattern. @@ -36,18 +44,50 @@ * * We use the matching rule described in RFC6125, section 6.4.3. * http://tools.ietf.org/html/rfc6125#section-6.4.3 + * + * In addition: ignore trailing dots in the host names and wildcards, so that + * the names are used normalized. This is what the browsers do. + * + * Do not allow wildcard matching on IP numbers. There are apparently + * certificates being used with an IP address in the CN field, thus making no + * apparent distinction between a name and an IP. We need to detect the use of + * an IP address and not wildcard match on such names. + * + * NOTE: hostmatch() gets called with copied buffers so that it can modify the + * contents at will. */ -static int hostmatch(const char *hostname, const char *pattern) +static int hostmatch(char *hostname, char *pattern) { const char *pattern_label_end, *pattern_wildcard, *hostname_label_end; int wildcard_enabled; size_t prefixlen, suffixlen; + struct in_addr ignored; +#ifdef ENABLE_IPV6 + struct sockaddr_in6 si6; +#endif + + /* normalize pattern and hostname by stripping off trailing dots */ + size_t len = strlen(hostname); + if(hostname[len-1]=='.') + hostname[len-1]=0; + len = strlen(pattern); + if(pattern[len-1]=='.') + pattern[len-1]=0; + pattern_wildcard = strchr(pattern, '*'); if(pattern_wildcard == NULL) return Curl_raw_equal(pattern, hostname) ? CURL_HOST_MATCH : CURL_HOST_NOMATCH; + /* detect IP address as hostname and fail the match if so */ + if(Curl_inet_pton(AF_INET, hostname, &ignored) > 0) + return CURL_HOST_NOMATCH; +#ifdef ENABLE_IPV6 + else if(Curl_inet_pton(AF_INET6, hostname, &si6.sin6_addr) > 0) + return CURL_HOST_NOMATCH; +#endif + /* We require at least 2 dots in pattern to avoid too wide wildcard match. */ wildcard_enabled = 1; @@ -82,16 +122,26 @@ static int hostmatch(const char *hostname, const char *pattern) int Curl_cert_hostcheck(const char *match_pattern, const char *hostname) { + char *matchp; + char *hostp; + int res = 0; if(!match_pattern || !*match_pattern || !hostname || !*hostname) /* sanity check */ - return 0; - - if(Curl_raw_equal(hostname, match_pattern)) /* trivial case */ - return 1; + ; + else { + matchp = strdup(match_pattern); + if(matchp) { + hostp = strdup(hostname); + if(hostp) { + if(hostmatch(hostp, matchp) == CURL_HOST_MATCH) + res= 1; + free(hostp); + } + free(matchp); + } + } - if(hostmatch(hostname,match_pattern) == CURL_HOST_MATCH) - return 1; - return 0; + return res; } -#endif /* SSLEAY or AXTLS or QSOSSL or GSKIT */ +#endif /* SSLEAY or AXTLS or GSKIT */ diff --git a/lib/hostip.c b/lib/hostip.c index f37b492..2ea0ab6 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -98,8 +98,8 @@ * hostip.c - method-independent resolver functions and utility functions * hostasyn.c - functions for asynchronous name resolves * hostsyn.c - functions for synchronous name resolves - * hostip4.c - ipv4-specific functions - * hostip6.c - ipv6-specific functions + * hostip4.c - IPv4 specific functions + * hostip6.c - IPv6 specific functions * * The two asynchronous name resolver backends are implemented in: * asyn-ares.c - functions for ares-using name resolves @@ -237,7 +237,7 @@ hostcache_timestamp_remove(void *datap, void *hc) (struct hostcache_prune_data *) datap; struct Curl_dns_entry *c = (struct Curl_dns_entry *) hc; - return (data->now - c->timestamp >= data->cache_timeout); + return !c->inuse && (data->now - c->timestamp >= data->cache_timeout); } /* @@ -291,9 +291,10 @@ remove_entry_if_stale(struct SessionHandle *data, struct Curl_dns_entry *dns) { struct hostcache_prune_data user; - if(!dns || (data->set.dns_cache_timeout == -1) || !data->dns.hostcache) - /* cache forever means never prune, and NULL hostcache means - we can't do it */ + if(!dns || (data->set.dns_cache_timeout == -1) || !data->dns.hostcache || + dns->inuse) + /* cache forever means never prune, and NULL hostcache means we can't do + it, if it still is in use then we leave it */ return 0; time(&user.now); @@ -317,6 +318,51 @@ remove_entry_if_stale(struct SessionHandle *data, struct Curl_dns_entry *dns) sigjmp_buf curl_jmpenv; #endif +/* + * Curl_fetch_addr() fetches a 'Curl_dns_entry' already in the DNS cache. + * + * Curl_resolv() checks initially and multi_runsingle() checks each time + * it discovers the handle in the state WAITRESOLVE whether the hostname + * has already been resolved and the address has already been stored in + * the DNS cache. This short circuits waiting for a lot of pending + * lookups for the same hostname requested by different handles. + * + * Returns the Curl_dns_entry entry pointer or NULL if not in the cache. + */ +struct Curl_dns_entry * +Curl_fetch_addr(struct connectdata *conn, + const char *hostname, + int port) +{ + char *entry_id = NULL; + struct Curl_dns_entry *dns = NULL; + size_t entry_len; + struct SessionHandle *data = conn->data; + int stale; + + /* Create an entry id, based upon the hostname and port */ + entry_id = create_hostcache_id(hostname, port); + /* If we can't create the entry id, fail */ + if(!entry_id) + return dns; + + entry_len = strlen(entry_id); + + /* See if its already in our dns cache */ + dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len+1); + + /* free the allocated entry_id again */ + free(entry_id); + + /* See whether the returned entry is stale. Done before we release lock */ + stale = remove_entry_if_stale(data, dns); + if(stale) { + infof(data, "Hostname in DNS cache was stale, zapped\n"); + dns = NULL; /* the memory deallocation is being handled by the hash */ + } + + return dns; +} /* * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache. @@ -402,37 +448,20 @@ int Curl_resolv(struct connectdata *conn, int port, struct Curl_dns_entry **entry) { - char *entry_id = NULL; struct Curl_dns_entry *dns = NULL; - size_t entry_len; struct SessionHandle *data = conn->data; CURLcode result; int rc = CURLRESOLV_ERROR; /* default to failure */ *entry = NULL; - /* Create an entry id, based upon the hostname and port */ - entry_id = create_hostcache_id(hostname, port); - /* If we can't create the entry id, fail */ - if(!entry_id) - return rc; - - entry_len = strlen(entry_id); - if(data->share) Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE); - /* See if its already in our dns cache */ - dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len+1); - - /* free the allocated entry_id again */ - free(entry_id); - - /* See whether the returned entry is stale. Done before we release lock */ - if(remove_entry_if_stale(data, dns)) - dns = NULL; /* the memory deallocation is being handled by the hash */ + dns = Curl_fetch_addr(conn, hostname, port); if(dns) { + infof(data, "Hostname %s was found in DNS cache\n", hostname); dns->inuse++; /* we use it! */ rc = CURLRESOLV_RESOLVED; } diff --git a/lib/hostip.h b/lib/hostip.h index a38f732..e1e880e 100644 --- a/lib/hostip.h +++ b/lib/hostip.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -92,7 +92,7 @@ int Curl_resolv_timeout(struct connectdata *conn, const char *hostname, #ifdef CURLRES_IPV6 /* - * Curl_ipv6works() returns TRUE if ipv6 seems to work. + * Curl_ipv6works() returns TRUE if IPv6 seems to work. */ bool Curl_ipv6works(void); #else @@ -172,6 +172,15 @@ const char *Curl_printable_address(const Curl_addrinfo *ip, char *buf, size_t bufsize); /* + * Curl_fetch_addr() fetches a 'Curl_dns_entry' already in the DNS cache. + * + * Returns the Curl_dns_entry entry pointer or NULL if not in the cache. + */ +struct Curl_dns_entry * +Curl_fetch_addr(struct connectdata *conn, + const char *hostname, + int port); +/* * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache. * * Returns the Curl_dns_entry entry pointer or NULL if the storage failed. @@ -201,6 +210,27 @@ extern sigjmp_buf curl_jmpenv; CURLcode Curl_set_dns_servers(struct SessionHandle *data, char *servers); /* + * Function provided by the resolver backend to set + * outgoing interface to use for DNS requests + */ +CURLcode Curl_set_dns_interface(struct SessionHandle *data, + const char *interf); + +/* + * Function provided by the resolver backend to set + * local IPv4 address to use as source address for DNS requests + */ +CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, + const char *local_ip4); + +/* + * Function provided by the resolver backend to set + * local IPv6 address to use as source address for DNS requests + */ +CURLcode Curl_set_dns_local_ip6(struct SessionHandle *data, + const char *local_ip6); + +/* * Clean off entries from the cache */ void Curl_hostcache_clean(struct SessionHandle *data, struct curl_hash *hash); diff --git a/lib/hostip4.c b/lib/hostip4.c index 3a38b32..3a05d10 100644 --- a/lib/hostip4.c +++ b/lib/hostip4.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -57,9 +57,9 @@ #include "memdebug.h" /*********************************************************************** - * Only for plain-ipv4 builds + * Only for plain IPv4 builds **********************************************************************/ -#ifdef CURLRES_IPV4 /* plain ipv4 code coming up */ +#ifdef CURLRES_IPV4 /* plain IPv4 code coming up */ /* * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've * been set and returns TRUE if they are OK. @@ -67,7 +67,7 @@ bool Curl_ipvalid(struct connectdata *conn) { if(conn->ip_version == CURL_IPRESOLVE_V6) - /* an ipv6 address was requested and we can't get/use one */ + /* An IPv6 address was requested and we can't get/use one */ return FALSE; return TRUE; /* OK, proceed */ @@ -76,7 +76,7 @@ bool Curl_ipvalid(struct connectdata *conn) #ifdef CURLRES_SYNCH /* - * Curl_getaddrinfo() - the ipv4 synchronous version. + * Curl_getaddrinfo() - the IPv4 synchronous version. * * The original code to this function was from the Dancer source code, written * by Bjorn Reese, it has since been patched and modified considerably. @@ -140,7 +140,7 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, #if defined(HAVE_GETADDRINFO_THREADSAFE) else { struct addrinfo hints; - char sbuf[NI_MAXSERV]; + char sbuf[12]; char *sbufptr = NULL; memset(&hints, 0, sizeof(hints)); diff --git a/lib/hostip6.c b/lib/hostip6.c index c42760a..bb72391 100644 --- a/lib/hostip6.c +++ b/lib/hostip6.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -58,7 +58,7 @@ #include "memdebug.h" /*********************************************************************** - * Only for ipv6-enabled builds + * Only for IPv6-enabled builds **********************************************************************/ #ifdef CURLRES_IPV6 @@ -97,7 +97,7 @@ int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa, #endif /* defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO) */ /* - * Curl_ipv6works() returns TRUE if ipv6 seems to work. + * Curl_ipv6works() returns TRUE if IPv6 seems to work. */ bool Curl_ipv6works(void) { @@ -109,7 +109,7 @@ bool Curl_ipv6works(void) /* probe to see if we have a working IPv6 stack */ curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); if(s == CURL_SOCKET_BAD) - /* an ipv6 address was requested but we can't get/use one */ + /* an IPv6 address was requested but we can't get/use one */ ipv6_works = 0; else { ipv6_works = 1; @@ -152,7 +152,7 @@ static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai) #endif /* - * Curl_getaddrinfo() when built ipv6-enabled (non-threading and + * Curl_getaddrinfo() when built IPv6-enabled (non-threading and * non-ares version). * * Returns name information about the given hostname and port number. If @@ -168,7 +168,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn, struct addrinfo hints; Curl_addrinfo *res; int error; - char sbuf[NI_MAXSERV]; + char sbuf[12]; char *sbufptr = NULL; char addrbuf[128]; int pf; @@ -192,7 +192,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn, } if((pf != PF_INET) && !Curl_ipv6works()) - /* the stack seems to be a non-ipv6 one */ + /* The stack seems to be a non-IPv6 one */ pf = PF_INET; memset(&hints, 0, sizeof(hints)); diff --git a/lib/hostsyn.c b/lib/hostsyn.c index 65a4035..4ad3c63 100644 --- a/lib/hostsyn.c +++ b/lib/hostsyn.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -72,4 +72,40 @@ CURLcode Curl_set_dns_servers(struct SessionHandle *data, } +/* + * Function provided by the resolver backend to set + * outgoing interface to use for DNS requests + */ +CURLcode Curl_set_dns_interface(struct SessionHandle *data, + const char *interf) +{ + (void)data; + (void)interf; + return CURLE_NOT_BUILT_IN; +} + +/* + * Function provided by the resolver backend to set + * local IPv4 address to use as source address for DNS requests + */ +CURLcode Curl_set_dns_local_ip4(struct SessionHandle *data, + const char *local_ip4) +{ + (void)data; + (void)local_ip4; + return CURLE_NOT_BUILT_IN; +} + +/* + * Function provided by the resolver backend to set + * local IPv6 address to use as source address for DNS requests + */ +CURLcode Curl_set_dns_local_ip6(struct SessionHandle *data, + const char *local_ip6) +{ + (void)data; + (void)local_ip6; + return CURLE_NOT_BUILT_IN; +} + #endif /* truly sync */ diff --git a/lib/http.c b/lib/http.c index f4b7a48..ee0a9a4 100644 --- a/lib/http.c +++ b/lib/http.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -54,7 +54,7 @@ #include "curl_base64.h" #include "cookie.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "http_digest.h" #include "curl_ntlm.h" #include "curl_ntlm_wb.h" @@ -75,6 +75,8 @@ #include "non-ascii.h" #include "bundles.h" #include "pipeline.h" +#include "http2.h" +#include "connect.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -105,7 +107,7 @@ static int https_getsock(struct connectdata *conn, */ const struct Curl_handler Curl_handler_http = { "HTTP", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -120,7 +122,7 @@ const struct Curl_handler Curl_handler_http = { ZERO_NULL, /* readwrite */ PORT_HTTP, /* defport */ CURLPROTO_HTTP, /* protocol */ - PROTOPT_NONE /* flags */ + PROTOPT_CREDSPERREQUEST /* flags */ }; #ifdef USE_SSL @@ -129,7 +131,7 @@ const struct Curl_handler Curl_handler_http = { */ const struct Curl_handler Curl_handler_https = { "HTTPS", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -143,24 +145,65 @@ const struct Curl_handler Curl_handler_https = { ZERO_NULL, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_HTTPS, /* defport */ - CURLPROTO_HTTP | CURLPROTO_HTTPS, /* protocol */ - PROTOPT_SSL /* flags */ + CURLPROTO_HTTPS, /* protocol */ + PROTOPT_SSL | PROTOPT_CREDSPERREQUEST /* flags */ }; #endif +CURLcode Curl_http_setup_conn(struct connectdata *conn) +{ + /* allocate the HTTP-specific struct for the SessionHandle, only to survive + during this request */ + DEBUGASSERT(conn->data->req.protop == NULL); + + conn->data->req.protop = calloc(1, sizeof(struct HTTP)); + if(!conn->data->req.protop) + return CURLE_OUT_OF_MEMORY; + + return CURLE_OK; +} + /* * checkheaders() checks the linked list of custom HTTP headers for a * particular header (prefix). * * Returns a pointer to the first matching header or NULL if none matched. */ -char *Curl_checkheaders(struct SessionHandle *data, const char *thisheader) +char *Curl_checkheaders(const struct connectdata *conn, + const char *thisheader) { struct curl_slist *head; size_t thislen = strlen(thisheader); + struct SessionHandle *data = conn->data; - for(head = data->set.headers; head; head=head->next) { + for(head = data->set.headers;head; head=head->next) { + if(Curl_raw_nequal(head->data, thisheader, thislen)) + return head->data; + } + return NULL; +} + +/* + * checkProxyHeaders() checks the linked list of custom proxy headers + * if proxy headers are not available, then it will lookup into http header + * link list + * + * It takes a connectdata struct as input instead of the SessionHandle simply + * to know if this is a proxy request or not, as it then might check a + * different header list. + * + */ +char *Curl_checkProxyheaders(const struct connectdata *conn, + const char *thisheader) +{ + struct curl_slist *head; + size_t thislen = strlen(thisheader); + struct SessionHandle *data = conn->data; + + for(head = (conn->bits.proxy && data->set.sep_headers)? + data->set.proxyheaders:data->set.headers; + head; head=head->next) { if(Curl_raw_nequal(head->data, thisheader, thislen)) return head->data; } @@ -173,25 +216,25 @@ char *Curl_checkheaders(struct SessionHandle *data, const char *thisheader) * case of allocation failure. Returns an empty string if the header value * consists entirely of whitespace. */ -static char *copy_header_value(const char *h) +char *Curl_copy_header_value(const char *header) { const char *start; const char *end; char *value; size_t len; - DEBUGASSERT(h); + DEBUGASSERT(header); /* Find the end of the header name */ - while(*h && (*h != ':')) - ++h; + while(*header && (*header != ':')) + ++header; - if(*h) + if(*header) /* Skip over colon */ - ++h; + ++header; /* Find the first non-space letter */ - start = h; + start = header; while(*start && ISSPACE(*start)) start++; @@ -210,7 +253,7 @@ static char *copy_header_value(const char *h) end--; /* get length of the type */ - len = end-start+1; + len = end - start + 1; value = malloc(len + 1); if(!value) @@ -236,7 +279,7 @@ static CURLcode http_output_basic(struct connectdata *conn, bool proxy) char **userp; const char *user; const char *pwd; - CURLcode error; + CURLcode result; if(proxy) { userp = &conn->allocptr.proxyuserpwd; @@ -251,11 +294,11 @@ static CURLcode http_output_basic(struct connectdata *conn, bool proxy) snprintf(data->state.buffer, sizeof(data->state.buffer), "%s:%s", user, pwd); - error = Curl_base64_encode(data, - data->state.buffer, strlen(data->state.buffer), - &authorization, &size); - if(error) - return error; + result = Curl_base64_encode(data, + data->state.buffer, strlen(data->state.buffer), + &authorization, &size); + if(result) + return result; if(!authorization) return CURLE_REMOTE_ACCESS_DENIED; @@ -285,8 +328,8 @@ static bool pickoneauth(struct auth *pick) /* The order of these checks is highly relevant, as this will be the order of preference in case of the existence of multiple accepted types. */ - if(avail & CURLAUTH_GSSNEGOTIATE) - pick->picked = CURLAUTH_GSSNEGOTIATE; + if(avail & CURLAUTH_NEGOTIATE) + pick->picked = CURLAUTH_NEGOTIATE; else if(avail & CURLAUTH_DIGEST) pick->picked = CURLAUTH_DIGEST; else if(avail & CURLAUTH_NTLM) @@ -304,6 +347,82 @@ static bool pickoneauth(struct auth *pick) return picked; } +/* whether to complete request (for authentication) in current connection */ +static bool complete_request(struct connectdata *conn, + curl_off_t remaining_bytes) +{ +#if defined(USE_NTLM) || defined(USE_SPNEGO) + struct SessionHandle *data = conn->data; + bool have_ntlm_or_negotiate = FALSE; + bool auth_started = FALSE; + + /* don't reset connection when we're in NTLM or Negotiate authentication; + * those authenticate the connection - creating a new connection breaks the + * authentication. + */ + +#if defined(USE_NTLM) + /* proxy NTLM authentication */ + if((data->state.authproxy.picked == CURLAUTH_NTLM) || + (data->state.authproxy.picked == CURLAUTH_NTLM_WB)) { + have_ntlm_or_negotiate = TRUE; + auth_started = auth_started + || (conn->proxyntlm.state != NTLMSTATE_NONE); + } + + /* normal NTLM authentication */ + if((data->state.authhost.picked == CURLAUTH_NTLM) || + (data->state.authhost.picked == CURLAUTH_NTLM_WB)) { + have_ntlm_or_negotiate = TRUE; + auth_started = auth_started + || (conn->ntlm.state != NTLMSTATE_NONE); + } +#endif + +#if defined(USE_SPNEGO) + /* proxy Negotiate authentication */ + if(data->state.authproxy.picked == CURLAUTH_NEGOTIATE) { + have_ntlm_or_negotiate = TRUE; + auth_started = auth_started + || (data->state.proxyneg.state != GSS_AUTHNONE); + } + + /* normal Negotiate authentication */ + if(data->state.authhost.picked == CURLAUTH_NEGOTIATE) { + have_ntlm_or_negotiate = TRUE; + auth_started = auth_started + || (data->state.negotiate.state != GSS_AUTHNONE); + } +#endif + + if(have_ntlm_or_negotiate) { + if(remaining_bytes < 2000 || auth_started) { + /* NTLM/Negotiation has started *OR* there is just a little (<2K) + * data left to send, keep on sending. + */ + + /* rewind data when completely done sending! */ + if(!conn->bits.authneg) { + conn->bits.rewindaftersend = TRUE; + infof(data, "Rewind stream after send\n"); + } + + return TRUE; + } + + infof(data, "NTLM/Negotiate send, close instead of sending %" + CURL_FORMAT_CURL_OFF_T " bytes\n", + remaining_bytes); + } +#else + /* unused parameters: */ + (void)conn; + (void)remaining_bytes; +#endif + + return FALSE; +} + /* * Curl_http_perhapsrewind() * @@ -330,7 +449,7 @@ static bool pickoneauth(struct auth *pick) static CURLcode http_perhapsrewind(struct connectdata *conn) { struct SessionHandle *data = conn->data; - struct HTTP *http = data->state.proto.http; + struct HTTP *http = data->req.protop; curl_off_t bytessent; curl_off_t expectsend = -1; /* default is unknown */ @@ -349,10 +468,15 @@ static CURLcode http_perhapsrewind(struct connectdata *conn) bytessent = http->writebytecount; - if(conn->bits.authneg) + if(conn->bits.authneg) { /* This is a state where we are known to be negotiating and we don't send any data then. */ expectsend = 0; + } + else if(!conn->bits.protoconnstart) { + /* HTTP CONNECT in progress: there is no body */ + expectsend = 0; + } else { /* figure out how much data we are expected to send */ switch(data->set.httpreq) { @@ -363,8 +487,8 @@ static CURLcode http_perhapsrewind(struct connectdata *conn) expectsend = (curl_off_t)strlen(data->set.postfields); break; case HTTPREQ_PUT: - if(data->set.infilesize != -1) - expectsend = data->set.infilesize; + if(data->state.infilesize != -1) + expectsend = data->state.infilesize; break; case HTTPREQ_POST_FORM: expectsend = http->postsize; @@ -377,36 +501,15 @@ static CURLcode http_perhapsrewind(struct connectdata *conn) conn->bits.rewindaftersend = FALSE; /* default */ if((expectsend == -1) || (expectsend > bytessent)) { - /* There is still data left to send */ - if((data->state.authproxy.picked == CURLAUTH_NTLM) || - (data->state.authhost.picked == CURLAUTH_NTLM) || - (data->state.authproxy.picked == CURLAUTH_NTLM_WB) || - (data->state.authhost.picked == CURLAUTH_NTLM_WB)) { - if(((expectsend - bytessent) < 2000) || - (conn->ntlm.state != NTLMSTATE_NONE) || - (conn->proxyntlm.state != NTLMSTATE_NONE)) { - /* The NTLM-negotiation has started *OR* there is just a little (<2K) - data left to send, keep on sending. */ - - /* rewind data when completely done sending! */ - if(!conn->bits.authneg) { - conn->bits.rewindaftersend = TRUE; - infof(data, "Rewind stream after send\n"); - } + if(conn->bits.close) + /* this is already marked to get closed */ + return CURLE_OK; - return CURLE_OK; - } - if(conn->bits.close) - /* this is already marked to get closed */ - return CURLE_OK; - - infof(data, "NTLM send, close instead of sending %" FORMAT_OFF_T - " bytes\n", (curl_off_t)(expectsend - bytessent)); - } + if(complete_request(conn, (curl_off_t)(expectsend - bytessent))) + return CURLE_OK; - /* This is not NTLM or many bytes left to send: close - */ - conn->bits.close = TRUE; + /* This is not NTLM or many bytes left to send: close */ + connclose(conn, "Mid-auth HTTP and much data left to send"); data->req.size = 0; /* don't download any more than 0 bytes */ /* There still is data left to send, but this connection is marked for @@ -414,7 +517,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn) } if(bytessent) - /* we rewind now at once since if we already sent something */ + /* we rewind now at once since we already sent something */ return Curl_readrewind(conn); return CURLE_OK; @@ -432,7 +535,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) struct SessionHandle *data = conn->data; bool pickhost = FALSE; bool pickproxy = FALSE; - CURLcode code = CURLE_OK; + CURLcode result = CURLE_OK; if(100 <= data->req.httpcode && 199 >= data->req.httpcode) /* this is a transient response code, ignore */ @@ -468,9 +571,9 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) if((data->set.httpreq != HTTPREQ_GET) && (data->set.httpreq != HTTPREQ_HEAD) && !conn->bits.rewindaftersend) { - code = http_perhapsrewind(conn); - if(code) - return code; + result = http_perhapsrewind(conn); + if(result) + return result; } } @@ -492,10 +595,10 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) if(http_should_fail(conn)) { failf (data, "The requested URL returned error: %d", data->req.httpcode); - code = CURLE_HTTP_RETURNED_ERROR; + result = CURLE_HTTP_RETURNED_ERROR; } - return code; + return result; } @@ -510,10 +613,12 @@ output_auth_headers(struct connectdata *conn, const char *path, bool proxy) { - struct SessionHandle *data = conn->data; - const char *auth=NULL; + const char *auth = NULL; CURLcode result = CURLE_OK; -#ifdef USE_HTTP_NEGOTIATE +#if defined(USE_SPNEGO) || !defined(CURL_DISABLE_VERBOSE_STRINGS) + struct SessionHandle *data = conn->data; +#endif +#ifdef USE_SPNEGO struct negotiatedata *negdata = proxy? &data->state.proxyneg:&data->state.negotiate; #endif @@ -523,11 +628,11 @@ output_auth_headers(struct connectdata *conn, (void)path; #endif -#ifdef USE_HTTP_NEGOTIATE +#ifdef USE_SPNEGO negdata->state = GSS_AUTHNONE; - if((authstatus->picked == CURLAUTH_GSSNEGOTIATE) && + if((authstatus->picked == CURLAUTH_NEGOTIATE) && negdata->context && !GSS_ERROR(negdata->status)) { - auth="GSS-Negotiate"; + auth="Negotiate"; result = Curl_output_negotiate(conn, proxy); if(result) return result; @@ -569,9 +674,9 @@ output_auth_headers(struct connectdata *conn, if(authstatus->picked == CURLAUTH_BASIC) { /* Basic */ if((proxy && conn->bits.proxy_user_passwd && - !Curl_checkheaders(data, "Proxy-authorization:")) || + !Curl_checkProxyheaders(conn, "Proxy-authorization:")) || (!proxy && conn->bits.user_passwd && - !Curl_checkheaders(data, "Authorization:"))) { + !Curl_checkheaders(conn, "Authorization:"))) { auth="Basic"; result = http_output_basic(conn, proxy); if(result) @@ -685,34 +790,30 @@ Curl_http_output_auth(struct connectdata *conn, * proxy CONNECT loop. */ -CURLcode Curl_http_input_auth(struct connectdata *conn, - int httpcode, - const char *header) /* the first non-space */ +CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, + const char *auth) /* the first non-space */ { /* * This resource requires authentication */ struct SessionHandle *data = conn->data; +#ifdef USE_SPNEGO + struct negotiatedata *negdata = proxy? + &data->state.proxyneg:&data->state.negotiate; +#endif unsigned long *availp; - const char *start; struct auth *authp; - if(httpcode == 407) { - start = header+strlen("Proxy-authenticate:"); + if(proxy) { availp = &data->info.proxyauthavail; authp = &data->state.authproxy; } else { - start = header+strlen("WWW-Authenticate:"); availp = &data->info.httpauthavail; authp = &data->state.authhost; } - /* pass all white spaces */ - while(*start && ISSPACE(*start)) - start++; - /* * Here we check if we want the specific single authentication (using ==) and * if we do, we initiate usage of it. @@ -730,31 +831,24 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, * */ - while(*start) { -#ifdef USE_HTTP_NEGOTIATE - if(checkprefix("GSS-Negotiate", start) || - checkprefix("Negotiate", start)) { + while(*auth) { +#ifdef USE_SPNEGO + if(checkprefix("Negotiate", auth)) { int neg; - *availp |= CURLAUTH_GSSNEGOTIATE; - authp->avail |= CURLAUTH_GSSNEGOTIATE; - - if(authp->picked == CURLAUTH_GSSNEGOTIATE) { - if(data->state.negotiate.state == GSS_AUTHSENT) { - /* if we sent GSS authentication in the outgoing request and we get - this back, we're in trouble */ - infof(data, "Authentication problem. Ignoring this.\n"); - data->state.authproblem = TRUE; - } - else { - neg = Curl_input_negotiate(conn, (bool)(httpcode == 407), start); + *availp |= CURLAUTH_NEGOTIATE; + authp->avail |= CURLAUTH_NEGOTIATE; + + if(authp->picked == CURLAUTH_NEGOTIATE) { + if(negdata->state == GSS_AUTHSENT || negdata->state == GSS_AUTHNONE) { + neg = Curl_input_negotiate(conn, proxy, auth); if(neg == 0) { DEBUGASSERT(!data->req.newurl); data->req.newurl = strdup(data->change.url); if(!data->req.newurl) return CURLE_OUT_OF_MEMORY; data->state.authproblem = FALSE; - /* we received GSS auth info and we dealt with it fine */ - data->state.negotiate.state = GSS_AUTHRECV; + /* we received a GSS auth token and we dealt with it fine */ + negdata->state = GSS_AUTHRECV; } else data->state.authproblem = TRUE; @@ -765,15 +859,14 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, #endif #ifdef USE_NTLM /* NTLM support requires the SSL crypto libs */ - if(checkprefix("NTLM", start)) { + if(checkprefix("NTLM", auth)) { *availp |= CURLAUTH_NTLM; authp->avail |= CURLAUTH_NTLM; if(authp->picked == CURLAUTH_NTLM || authp->picked == CURLAUTH_NTLM_WB) { /* NTLM authentication is picked and activated */ - CURLcode ntlm = - Curl_input_ntlm(conn, (httpcode == 407)?TRUE:FALSE, start); - if(CURLE_OK == ntlm) { + CURLcode result = Curl_input_ntlm(conn, proxy, auth); + if(!result) { data->state.authproblem = FALSE; #ifdef NTLM_WB_ENABLED if(authp->picked == CURLAUTH_NTLM_WB) { @@ -784,14 +877,14 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, /* Get the challenge-message which will be passed to * ntlm_auth for generating the type 3 message later */ - while(*start && ISSPACE(*start)) - start++; - if(checkprefix("NTLM", start)) { - start += strlen("NTLM"); - while(*start && ISSPACE(*start)) - start++; - if(*start) - if((conn->challenge_header = strdup(start)) == NULL) + while(*auth && ISSPACE(*auth)) + auth++; + if(checkprefix("NTLM", auth)) { + auth += strlen("NTLM"); + while(*auth && ISSPACE(*auth)) + auth++; + if(*auth) + if((conn->challenge_header = strdup(auth)) == NULL) return CURLE_OUT_OF_MEMORY; } } @@ -806,12 +899,12 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, else #endif #ifndef CURL_DISABLE_CRYPTO_AUTH - if(checkprefix("Digest", start)) { + if(checkprefix("Digest", auth)) { if((authp->avail & CURLAUTH_DIGEST) != 0) { infof(data, "Ignoring duplicate digest auth header.\n"); } else { - CURLdigest dig; + CURLcode result; *availp |= CURLAUTH_DIGEST; authp->avail |= CURLAUTH_DIGEST; @@ -819,9 +912,8 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, * authentication isn't activated yet, as we need to store the * incoming data from this header in case we are gonna use * Digest. */ - dig = Curl_input_digest(conn, (httpcode == 407)?TRUE:FALSE, start); - - if(CURLDIGEST_FINE != dig) { + result = Curl_input_digest(conn, proxy, auth); + if(result) { infof(data, "Authentication problem. Ignoring this.\n"); data->state.authproblem = TRUE; } @@ -829,7 +921,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, } else #endif - if(checkprefix("Basic", start)) { + if(checkprefix("Basic", auth)) { *availp |= CURLAUTH_BASIC; authp->avail |= CURLAUTH_BASIC; if(authp->picked == CURLAUTH_BASIC) { @@ -843,12 +935,12 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, } /* there may be multiple methods on one line, so keep reading */ - while(*start && *start != ',') /* read up to the next comma */ - start++; - if(*start == ',') /* if we're on a comma, skip it */ - start++; - while(*start && ISSPACE(*start)) - start++; + while(*auth && *auth != ',') /* read up to the next comma */ + auth++; + if(*auth == ',') /* if we're on a comma, skip it */ + auth++; + while(*auth && ISSPACE(*auth)) + auth++; } return CURLE_OK; } @@ -887,14 +979,6 @@ static int http_should_fail(struct connectdata *conn) if(httpcode < 400) return 0; - if(data->state.resume_from && - (data->set.httpreq==HTTPREQ_GET) && - (httpcode == 416)) { - /* "Requested Range Not Satisfiable", just proceed and - pretend this is no error */ - return 0; - } - /* ** Any code >= 400 that's not 401 or 407 is always ** a terminal error @@ -948,7 +1032,7 @@ static size_t readmoredata(char *buffer, void *userp) { struct connectdata *conn = (struct connectdata *)userp; - struct HTTP *http = conn->data->state.proto.http; + struct HTTP *http = conn->data->req.protop; size_t fullsize = size * nitems; if(0 == http->postsize) @@ -1016,10 +1100,10 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in, { ssize_t amount; - CURLcode res; + CURLcode result; char *ptr; size_t size; - struct HTTP *http = conn->data->state.proto.http; + struct HTTP *http = conn->data->req.protop; size_t sendsize; curl_socket_t sockfd; size_t headersize; @@ -1039,16 +1123,17 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in, DEBUGASSERT(size > included_body_bytes); - res = Curl_convert_to_network(conn->data, ptr, headersize); + result = Curl_convert_to_network(conn->data, ptr, headersize); /* Curl_convert_to_network calls failf if unsuccessful */ - if(res) { + if(result) { /* conversion failed, free memory and return to the caller */ if(in->buffer) free(in->buffer); free(in); - return res; + return result; } + if(conn->handler->flags & PROTOPT_SSL) { /* We never send more than CURL_MAX_WRITE_SIZE bytes in one single chunk when we speak HTTPS, as if only a fraction of it is sent now, this data @@ -1070,9 +1155,9 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in, else sendsize = size; - res = Curl_write(conn, sockfd, ptr, sendsize, &amount); + result = Curl_write(conn, sockfd, ptr, sendsize, &amount); - if(CURLE_OK == res) { + if(!result) { /* * Note that we may not send the entire chunk at once, and we have a set * number of data bytes at the end of the big buffer (out of which we may @@ -1150,7 +1235,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in, free(in->buffer); free(in); - return res; + return result; } @@ -1301,7 +1386,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done) /* We default to persistent connections. We set this already in this connect function to make the re-use checks properly be able to check this bit. */ - conn->bits.close = FALSE; + connkeep(conn, "HTTP default"); /* the CONNECT procedure might not have been completed */ result = Curl_proxy_connect(conn); @@ -1346,15 +1431,15 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done) /* perform SSL initialization for this socket */ result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done); if(result) - conn->bits.close = TRUE; /* a failed connection is marked for closure - to prevent (bad) re-use or similar */ + connclose(conn, "Failed HTTPS connection"); + return result; } #endif #if defined(USE_SSLEAY) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \ - defined(USE_DARWINSSL) -/* This function is for OpenSSL, GnuTLS, darwinssl, and schannel only. + defined(USE_DARWINSSL) || defined(USE_POLARSSL) || defined(USE_NSS) +/* This function is for OpenSSL, GnuTLS, darwinssl, schannel and polarssl only. It should be made to query the generic SSL layer instead. */ static int https_getsock(struct connectdata *conn, curl_socket_t *socks, @@ -1402,10 +1487,16 @@ CURLcode Curl_http_done(struct connectdata *conn, CURLcode status, bool premature) { struct SessionHandle *data = conn->data; - struct HTTP *http =data->state.proto.http; + struct HTTP *http =data->req.protop; Curl_unencode_cleanup(conn); +#ifdef USE_SPNEGO + if(data->state.proxyneg.state == GSS_AUTHSENT || + data->state.negotiate.state == GSS_AUTHSENT) + Curl_cleanup_negotiate(data); +#endif + /* set the proper values (possibly modified on POST) */ conn->fread_func = data->set.fread_func; /* restore */ conn->fread_in = data->set.in; /* restore */ @@ -1436,12 +1527,13 @@ CURLcode Curl_http_done(struct connectdata *conn, else if(HTTPREQ_PUT == data->set.httpreq) data->req.bytecount = http->readbytecount + http->writebytecount; - if(status != CURLE_OK) - return (status); + if(status) + return status; if(!premature && /* this check is pointless when DONE is called before the entire operation is complete */ !conn->bits.retry && + !data->set.connect_only && ((http->readbytecount + data->req.headerbytecount - data->req.deductheadercount)) <= 0) { @@ -1456,14 +1548,19 @@ CURLcode Curl_http_done(struct connectdata *conn, } -/* Determine if we should use HTTP 1.1 for this request. Reasons to avoid it - are if the user specifically requested HTTP 1.0, if the server we are - connected to only supports 1.0, or if any server previously contacted to - handle this request only supports 1.0. */ -static bool use_http_1_1(const struct SessionHandle *data, - const struct connectdata *conn) +/* + * Determine if we should use HTTP 1.1 (OR BETTER) for this request. Reasons + * to avoid it include: + * + * - if the user specifically requested HTTP 1.0 + * - if the server we are connected to only supports 1.0 + * - if any server previously contacted to handle this request only supports + * 1.0. + */ +static bool use_http_1_1plus(const struct SessionHandle *data, + const struct connectdata *conn) { - return ((data->set.httpversion == CURL_HTTP_VERSION_1_1) || + return ((data->set.httpversion >= CURL_HTTP_VERSION_1_1) || ((data->set.httpversion != CURL_HTTP_VERSION_1_0) && ((conn->httpversion == 11) || ((conn->httpversion != 10) && @@ -1479,11 +1576,11 @@ static CURLcode expect100(struct SessionHandle *data, const char *ptr; data->state.expect100header = FALSE; /* default to false unless it is set to TRUE below */ - if(use_http_1_1(data, conn)) { + if(use_http_1_1plus(data, conn)) { /* if not doing HTTP 1.0 or disabled explicitly, we add a Expect: 100-continue to the headers which actually speeds up post operations (as there is one packet coming back from the web server) */ - ptr = Curl_checkheaders(data, "Expect:"); + ptr = Curl_checkheaders(conn, "Expect:"); if(ptr) { data->state.expect100header = Curl_compareheader(ptr, "Expect:", "100-continue"); @@ -1491,84 +1588,127 @@ static CURLcode expect100(struct SessionHandle *data, else { result = Curl_add_bufferf(req_buffer, "Expect: 100-continue\r\n"); - if(result == CURLE_OK) + if(!result) data->state.expect100header = TRUE; } } return result; } +enum proxy_use { + HEADER_SERVER, /* direct to server */ + HEADER_PROXY, /* regular request to proxy */ + HEADER_CONNECT /* sending CONNECT to a proxy */ +}; + CURLcode Curl_add_custom_headers(struct connectdata *conn, - Curl_send_buffer *req_buffer) + bool is_connect, + Curl_send_buffer *req_buffer) { char *ptr; - struct curl_slist *headers=conn->data->set.headers; - - while(headers) { - ptr = strchr(headers->data, ':'); - if(ptr) { - /* we require a colon for this to be a true header */ + struct curl_slist *h[2]; + struct curl_slist *headers; + int numlists=1; /* by default */ + struct SessionHandle *data = conn->data; + int i; - ptr++; /* pass the colon */ - while(*ptr && ISSPACE(*ptr)) - ptr++; + enum proxy_use proxy; - if(*ptr) { - /* only send this if the contents was non-blank */ + if(is_connect) + proxy = HEADER_CONNECT; + else + proxy = conn->bits.httpproxy && !conn->bits.tunnel_proxy? + HEADER_PROXY:HEADER_SERVER; - if(conn->allocptr.host && - /* a Host: header was sent already, don't pass on any custom Host: - header as that will produce *two* in the same request! */ - checkprefix("Host:", headers->data)) - ; - else if(conn->data->set.httpreq == HTTPREQ_POST_FORM && - /* this header (extended by formdata.c) is sent later */ - checkprefix("Content-Type:", headers->data)) - ; - else if(conn->bits.authneg && - /* while doing auth neg, don't allow the custom length since - we will force length zero then */ - checkprefix("Content-Length", headers->data)) - ; - else if(conn->allocptr.te && - /* when asking for Transfer-Encoding, don't pass on a custom - Connection: */ - checkprefix("Connection", headers->data)) - ; - else { - CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n", - headers->data); - if(result) - return result; - } - } + switch(proxy) { + case HEADER_SERVER: + h[0] = data->set.headers; + break; + case HEADER_PROXY: + h[0] = data->set.headers; + if(data->set.sep_headers) { + h[1] = data->set.proxyheaders; + numlists++; } - else { - ptr = strchr(headers->data, ';'); + break; + case HEADER_CONNECT: + if(data->set.sep_headers) + h[0] = data->set.proxyheaders; + else + h[0] = data->set.headers; + break; + } + + /* loop through one or two lists */ + for(i=0; i < numlists; i++) { + headers = h[i]; + + while(headers) { + ptr = strchr(headers->data, ':'); if(ptr) { + /* we require a colon for this to be a true header */ - ptr++; /* pass the semicolon */ + ptr++; /* pass the colon */ while(*ptr && ISSPACE(*ptr)) ptr++; if(*ptr) { - /* this may be used for something else in the future */ - } - else { - if(*(--ptr) == ';') { - CURLcode result; - - /* send no-value custom header if terminated by semicolon */ - *ptr = ':'; - result = Curl_add_bufferf(req_buffer, "%s\r\n", - headers->data); + /* only send this if the contents was non-blank */ + + if(conn->allocptr.host && + /* a Host: header was sent already, don't pass on any custom Host: + header as that will produce *two* in the same request! */ + checkprefix("Host:", headers->data)) + ; + else if(data->set.httpreq == HTTPREQ_POST_FORM && + /* this header (extended by formdata.c) is sent later */ + checkprefix("Content-Type:", headers->data)) + ; + else if(conn->bits.authneg && + /* while doing auth neg, don't allow the custom length since + we will force length zero then */ + checkprefix("Content-Length", headers->data)) + ; + else if(conn->allocptr.te && + /* when asking for Transfer-Encoding, don't pass on a custom + Connection: */ + checkprefix("Connection", headers->data)) + ; + else { + CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n", + headers->data); if(result) return result; } } } + else { + ptr = strchr(headers->data, ';'); + if(ptr) { + + ptr++; /* pass the semicolon */ + while(*ptr && ISSPACE(*ptr)) + ptr++; + + if(*ptr) { + /* this may be used for something else in the future */ + } + else { + if(*(--ptr) == ';') { + CURLcode result; + + /* send no-value custom header if terminated by semicolon */ + *ptr = ':'; + result = Curl_add_bufferf(req_buffer, "%s\r\n", + headers->data); + if(result) + return result; + } + } + } + } + headers = headers->next; } - headers = headers->next; } return CURLE_OK; } @@ -1578,10 +1718,8 @@ CURLcode Curl_add_timecondition(struct SessionHandle *data, { const struct tm *tm; char *buf = data->state.buffer; - CURLcode result = CURLE_OK; struct tm keeptime; - - result = Curl_gmtime(data->set.timevalue, &keeptime); + CURLcode result = Curl_gmtime(data->set.timevalue, &keeptime); if(result) { failf(data, "Invalid TIMEVALUE"); return result; @@ -1632,8 +1770,8 @@ CURLcode Curl_add_timecondition(struct SessionHandle *data, */ CURLcode Curl_http(struct connectdata *conn, bool *done) { - struct SessionHandle *data=conn->data; - CURLcode result=CURLE_OK; + struct SessionHandle *data = conn->data; + CURLcode result = CURLE_OK; struct HTTP *http; const char *ppath = data->state.path; bool paste_ftp_userpwd = FALSE; @@ -1643,7 +1781,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) const char *ptr; const char *request; Curl_HttpReq httpreq = data->set.httpreq; +#if !defined(CURL_DISABLE_COOKIES) char *addcookies = NULL; +#endif curl_off_t included_body = 0; const char *httpstring; Curl_send_buffer *req_buffer; @@ -1655,20 +1795,38 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) the rest of the request in the PERFORM phase. */ *done = TRUE; - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); + if(conn->httpversion < 20) { /* unless the connection is re-used and already + http2 */ + switch(conn->negnpn) { + case NPN_HTTP2: + result = Curl_http2_init(conn); + if(result) + return result; - if(!data->state.proto.http) { - /* Only allocate this struct if we don't already have it! */ + result = Curl_http2_setup(conn); + if(result) + return result; - http = calloc(1, sizeof(struct HTTP)); - if(!http) - return CURLE_OUT_OF_MEMORY; - data->state.proto.http = http; + result = Curl_http2_switched(conn, NULL, 0); + if(result) + return result; + break; + case NPN_HTTP1_1: + /* continue with HTTP/1.1 when explicitly requested */ + break; + default: + /* and as fallback */ + break; + } } - else - http = data->state.proto.http; + else { + /* prepare for a http2 request */ + result = Curl_http2_setup(conn); + if(result) + return result; + } + + http = data->req.protop; if(!data->state.this_is_a_follow) { /* this is not a followed location, get the original host name */ @@ -1682,7 +1840,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } http->writebytecount = http->readbytecount = 0; - if((conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_FTP)) && + if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) && data->set.upload) { httpreq = HTTPREQ_PUT; } @@ -1718,7 +1876,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) it might have been used in the proxy connect, but if we have got a header with the user-agent string specified, we erase the previously made string here. */ - if(Curl_checkheaders(data, "User-Agent:") && conn->allocptr.uagent) { + if(Curl_checkheaders(conn, "User-Agent:") && conn->allocptr.uagent) { free(conn->allocptr.uagent); conn->allocptr.uagent=NULL; } @@ -1739,7 +1897,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) conn->bits.authneg = FALSE; Curl_safefree(conn->allocptr.ref); - if(data->change.referer && !Curl_checkheaders(data, "Referer:")) { + if(data->change.referer && !Curl_checkheaders(conn, "Referer:")) { conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer); if(!conn->allocptr.ref) return CURLE_OUT_OF_MEMORY; @@ -1747,10 +1905,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) else conn->allocptr.ref = NULL; - if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(data, "Cookie:")) +#if !defined(CURL_DISABLE_COOKIES) + if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(conn, "Cookie:")) addcookies = data->set.str[STRING_COOKIE]; +#endif - if(!Curl_checkheaders(data, "Accept-Encoding:") && + if(!Curl_checkheaders(conn, "Accept-Encoding:") && data->set.str[STRING_ENCODING]) { Curl_safefree(conn->allocptr.accept_encoding); conn->allocptr.accept_encoding = @@ -1762,13 +1922,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) #ifdef HAVE_LIBZ /* we only consider transfer-encoding magic if libz support is built-in */ - if(!Curl_checkheaders(data, "TE:") && data->set.http_transfer_encoding) { + if(!Curl_checkheaders(conn, "TE:") && + data->set.http_transfer_encoding) { /* When we are to insert a TE: header in the request, we must also insert TE in a Connection: header, so we need to merge the custom provided Connection: header and prevent the original to get sent. Note that if the user has inserted his/hers own TE: header we don't do this magic but then assume that the user will handle it all! */ - char *cptr = Curl_checkheaders(data, "Connection:"); + char *cptr = Curl_checkheaders(conn, "Connection:"); #define TE_HEADER "TE: gzip\r\n" Curl_safefree(conn->allocptr.te); @@ -1782,40 +1943,45 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } #endif - ptr = Curl_checkheaders(data, "Transfer-Encoding:"); - if(ptr) { - /* Some kind of TE is requested, check if 'chunked' is chosen */ - data->req.upload_chunky = - Curl_compareheader(ptr, "Transfer-Encoding:", "chunked"); - } + if(conn->httpversion == 20) + /* In HTTP2 forbids Transfer-Encoding: chunked */ + ptr = NULL; else { - if((conn->handler->protocol&CURLPROTO_HTTP) && - data->set.upload && - (data->set.infilesize == -1)) { - if(conn->bits.authneg) - /* don't enable chunked during auth neg */ - ; - else if(use_http_1_1(data, conn)) { - /* HTTP, upload, unknown file size and not HTTP 1.0 */ - data->req.upload_chunky = TRUE; + ptr = Curl_checkheaders(conn, "Transfer-Encoding:"); + if(ptr) { + /* Some kind of TE is requested, check if 'chunked' is chosen */ + data->req.upload_chunky = + Curl_compareheader(ptr, "Transfer-Encoding:", "chunked"); + } + else { + if((conn->handler->protocol&PROTO_FAMILY_HTTP) && + data->set.upload && + (data->state.infilesize == -1)) { + if(conn->bits.authneg) + /* don't enable chunked during auth neg */ + ; + else if(use_http_1_1plus(data, conn)) { + /* HTTP, upload, unknown file size and not HTTP 1.0 */ + data->req.upload_chunky = TRUE; + } + else { + failf(data, "Chunky upload is not supported by HTTP 1.0"); + return CURLE_UPLOAD_FAILED; + } } else { - failf(data, "Chunky upload is not supported by HTTP 1.0"); - return CURLE_UPLOAD_FAILED; + /* else, no chunky upload */ + data->req.upload_chunky = FALSE; } - } - else { - /* else, no chunky upload */ - data->req.upload_chunky = FALSE; - } - if(data->req.upload_chunky) - te = "Transfer-Encoding: chunked\r\n"; + if(data->req.upload_chunky) + te = "Transfer-Encoding: chunked\r\n"; + } } Curl_safefree(conn->allocptr.host); - ptr = Curl_checkheaders(data, "Host:"); + ptr = Curl_checkheaders(conn, "Host:"); if(ptr && (!data->state.this_is_a_follow || Curl_raw_equal(data->state.first_host, conn->host.name))) { #if !defined(CURL_DISABLE_COOKIES) @@ -1824,7 +1990,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) custom Host: header if this is NOT a redirect, as setting Host: in the redirected request is being out on thin ice. Except if the host name is the same as the first one! */ - char *cookiehost = copy_header_value(ptr); + char *cookiehost = Curl_copy_header_value(ptr); if(!cookiehost) return CURLE_OUT_OF_MEMORY; if(!*cookiehost) @@ -1960,13 +2126,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) /* we must build the whole post sequence first, so that we have a size of the whole transfer before we start to send it */ result = Curl_getformdata(data, &http->sendit, data->set.httppost, - Curl_checkheaders(data, "Content-Type:"), + Curl_checkheaders(conn, "Content-Type:"), &http->postsize); if(result) return result; } - http->p_accept = Curl_checkheaders(data, "Accept:")?NULL:"Accept: */*\r\n"; + http->p_accept = Curl_checkheaders(conn, "Accept:")?NULL:"Accept: */*\r\n"; if(( (HTTPREQ_POST == httpreq) || (HTTPREQ_POST_FORM == httpreq) || @@ -2019,9 +2185,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if((actuallyread == 0) || (actuallyread > readthisamountnow)) { /* this checks for greater-than only to make sure that the CURL_READFUNC_ABORT return code still aborts */ - failf(data, "Could only read %" FORMAT_OFF_T - " bytes from the input", - passed); + failf(data, "Could only read %" CURL_FORMAT_CURL_OFF_T + " bytes from the input", passed); return CURLE_READ_ERROR; } } while(passed < data->state.resume_from); @@ -2029,10 +2194,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } /* now, decrease the size of the read */ - if(data->set.infilesize>0) { - data->set.infilesize -= data->state.resume_from; + if(data->state.infilesize>0) { + data->state.infilesize -= data->state.resume_from; - if(data->set.infilesize <= 0) { + if(data->state.infilesize <= 0) { failf(data, "File already completely uploaded"); return CURLE_PARTIAL_FILE; } @@ -2047,7 +2212,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) * ones if any such are specified. */ if(((httpreq == HTTPREQ_GET) || (httpreq == HTTPREQ_HEAD)) && - !Curl_checkheaders(data, "Range:")) { + !Curl_checkheaders(conn, "Range:")) { /* if a line like this was already allocated, free the previous one */ if(conn->allocptr.rangeline) free(conn->allocptr.rangeline); @@ -2055,7 +2220,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) data->state.range); } else if((httpreq != HTTPREQ_GET) && - !Curl_checkheaders(data, "Content-Range:")) { + !Curl_checkheaders(conn, "Content-Range:")) { /* if a line like this was already allocated, free the previous one */ if(conn->allocptr.rangeline) @@ -2066,18 +2231,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) remote part so we tell the server (and act accordingly) that we upload the whole file (again) */ conn->allocptr.rangeline = - aprintf("Content-Range: bytes 0-%" FORMAT_OFF_T - "/%" FORMAT_OFF_T "\r\n", - data->set.infilesize - 1, data->set.infilesize); + aprintf("Content-Range: bytes 0-%" CURL_FORMAT_CURL_OFF_T + "/%" CURL_FORMAT_CURL_OFF_T "\r\n", + data->state.infilesize - 1, data->state.infilesize); } else if(data->state.resume_from) { /* This is because "resume" was selected */ curl_off_t total_expected_size= - data->state.resume_from + data->set.infilesize; + data->state.resume_from + data->state.infilesize; conn->allocptr.rangeline = - aprintf("Content-Range: bytes %s%" FORMAT_OFF_T - "/%" FORMAT_OFF_T "\r\n", + aprintf("Content-Range: bytes %s%" CURL_FORMAT_CURL_OFF_T + "/%" CURL_FORMAT_CURL_OFF_T "\r\n", data->state.range, total_expected_size-1, total_expected_size); } @@ -2085,8 +2250,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) /* Range was selected and then we just pass the incoming range and append total size */ conn->allocptr.rangeline = - aprintf("Content-Range: bytes %s/%" FORMAT_OFF_T "\r\n", - data->state.range, data->set.infilesize); + aprintf("Content-Range: bytes %s/%" CURL_FORMAT_CURL_OFF_T "\r\n", + data->state.range, data->state.infilesize); } if(!conn->allocptr.rangeline) return CURLE_OUT_OF_MEMORY; @@ -2095,7 +2260,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) /* Use 1.1 unless the user specifically asked for 1.0 or the server only supports 1.0 */ - httpstring= use_http_1_1(data, conn)?"1.1":"1.0"; + httpstring= use_http_1_1plus(data, conn)?"1.1":"1.0"; /* initialize a dynamic send-buffer */ req_buffer = Curl_add_buffer_init(); @@ -2157,22 +2322,47 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) conn->allocptr.ref:"" /* Referer: */, (conn->bits.httpproxy && !conn->bits.tunnel_proxy && - !Curl_checkheaders(data, "Proxy-Connection:"))? + !Curl_checkProxyheaders(conn, "Proxy-Connection:"))? "Proxy-Connection: Keep-Alive\r\n":"", te ); /* - * Free userpwd now --- cannot reuse this for Negotiate and possibly NTLM - * with basic and digest, it will be freed anyway by the next request + * Free userpwd for Negotiate/NTLM. Cannot reuse as it is associated with + * the connection and shouldn't be repeated over it either. */ + switch (data->state.authhost.picked) { + case CURLAUTH_NEGOTIATE: + case CURLAUTH_NTLM: + case CURLAUTH_NTLM_WB: + Curl_safefree(conn->allocptr.userpwd); + break; + } - Curl_safefree (conn->allocptr.userpwd); - conn->allocptr.userpwd = NULL; + /* + * Same for proxyuserpwd + */ + switch (data->state.authproxy.picked) { + case CURLAUTH_NEGOTIATE: + case CURLAUTH_NTLM: + case CURLAUTH_NTLM_WB: + Curl_safefree(conn->allocptr.proxyuserpwd); + break; + } if(result) return result; + if(!(conn->handler->flags&PROTOPT_SSL) && + conn->httpversion != 20 && + (data->set.httpversion == CURL_HTTP_VERSION_2_0)) { + /* append HTTP2 upgrade magic stuff to the HTTP request if it isn't done + over SSL */ + result = Curl_http2_request_upgrade(req_buffer, conn); + if(result) + return result; + } + #if !defined(CURL_DISABLE_COOKIES) if(data->cookies || addcookies) { struct Cookie *co=NULL; /* no cookies from start */ @@ -2209,17 +2399,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } Curl_cookie_freelist(store, FALSE); /* free the cookie list */ } - if(addcookies && (CURLE_OK == result)) { + if(addcookies && !result) { if(!count) result = Curl_add_bufferf(req_buffer, "Cookie: "); - if(CURLE_OK == result) { - result = Curl_add_bufferf(req_buffer, "%s%s", - count?"; ":"", + if(!result) { + result = Curl_add_bufferf(req_buffer, "%s%s", count?"; ":"", addcookies); count++; } } - if(count && (CURLE_OK == result)) + if(count && !result) result = Curl_add_buffer(req_buffer, "\r\n", 2); if(result) @@ -2233,12 +2422,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) return result; } - result = Curl_add_custom_headers(conn, req_buffer); + result = Curl_add_custom_headers(conn, FALSE, req_buffer); if(result) return result; http->postdata = NULL; /* nothing to post at this point */ - Curl_pgrsSetUploadSize(data, 0); /* upload size is 0 atm */ + Curl_pgrsSetUploadSize(data, -1); /* upload size is unknown atm */ /* If 'authdone' is FALSE, we must not set the write socket index to the Curl_transfer() call below, as we're not ready to actually upload any @@ -2283,11 +2472,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) http->sending = HTTPSEND_BODY; if(!data->req.upload_chunky && - !Curl_checkheaders(data, "Content-Length:")) { + !Curl_checkheaders(conn, "Content-Length:")) { /* only add Content-Length if not uploading chunked */ result = Curl_add_bufferf(req_buffer, - "Content-Length: %" FORMAT_OFF_T "\r\n", - http->postsize); + "Content-Length: %" CURL_FORMAT_CURL_OFF_T + "\r\n", http->postsize); if(result) return result; } @@ -2352,21 +2541,23 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(conn->bits.authneg) postsize = 0; else - postsize = data->set.infilesize; + postsize = data->state.infilesize; if((postsize != -1) && !data->req.upload_chunky && - !Curl_checkheaders(data, "Content-Length:")) { + !Curl_checkheaders(conn, "Content-Length:")) { /* only add Content-Length if not uploading chunked */ result = Curl_add_bufferf(req_buffer, - "Content-Length: %" FORMAT_OFF_T "\r\n", - postsize ); + "Content-Length: %" CURL_FORMAT_CURL_OFF_T + "\r\n", postsize); if(result) return result; } - result = expect100(data, conn, req_buffer); - if(result) - return result; + if(postsize != 0) { + result = expect100(data, conn, req_buffer); + if(result) + return result; + } result = Curl_add_buffer(req_buffer, "\r\n", 2); /* end of headers */ if(result) @@ -2400,23 +2591,22 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) data->set.postfieldsize: (data->set.postfields? (curl_off_t)strlen(data->set.postfields):-1); } - if(!data->req.upload_chunky) { - /* We only set Content-Length and allow a custom Content-Length if - we don't upload data chunked, as RFC2616 forbids us to set both - kinds of headers (Transfer-Encoding: chunked and Content-Length) */ - - if(conn->bits.authneg || !Curl_checkheaders(data, "Content-Length:")) { - /* we allow replacing this header if not during auth negotiation, - although it isn't very wise to actually set your own */ - result = Curl_add_bufferf(req_buffer, - "Content-Length: %" FORMAT_OFF_T"\r\n", - postsize); - if(result) - return result; - } + + /* We only set Content-Length and allow a custom Content-Length if + we don't upload data chunked, as RFC2616 forbids us to set both + kinds of headers (Transfer-Encoding: chunked and Content-Length) */ + if((postsize != -1) && !data->req.upload_chunky && + !Curl_checkheaders(conn, "Content-Length:")) { + /* we allow replacing this header if not during auth negotiation, + although it isn't very wise to actually set your own */ + result = Curl_add_bufferf(req_buffer, + "Content-Length: %" CURL_FORMAT_CURL_OFF_T + "\r\n", postsize); + if(result) + return result; } - if(!Curl_checkheaders(data, "Content-Type:")) { + if(!Curl_checkheaders(conn, "Content-Type:")) { result = Curl_add_bufferf(req_buffer, "Content-Type: application/" "x-www-form-urlencoded\r\n"); @@ -2428,7 +2618,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) the somewhat bigger ones we allow the app to disable it. Just make sure that the expect100header is always set to the preferred value here. */ - ptr = Curl_checkheaders(data, "Expect:"); + ptr = Curl_checkheaders(conn, "Expect:"); if(ptr) { data->state.expect100header = Curl_compareheader(ptr, "Expect:", "100-continue"); @@ -2443,7 +2633,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(data->set.postfields) { - if(!data->state.expect100header && + /* In HTTP2, we send request body in DATA frame regardless of + its size. */ + if(conn->httpversion != 20 && + !data->state.expect100header && (postsize < MAX_INITIAL_POST_SIZE)) { /* if we don't use expect: 100 AND postsize is less than MAX_INITIAL_POST_SIZE @@ -2467,17 +2660,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(postsize) { /* Append the POST data chunky-style */ result = Curl_add_bufferf(req_buffer, "%x\r\n", (int)postsize); - if(CURLE_OK == result) { + if(!result) { result = Curl_add_buffer(req_buffer, data->set.postfields, (size_t)postsize); - if(CURLE_OK == result) - result = Curl_add_buffer(req_buffer, "\r\n", 2); + if(!result) + result = Curl_add_buffer(req_buffer, "\r\n", 2); included_body = postsize + 2; } } - if(CURLE_OK == result) - result = Curl_add_buffer(req_buffer, - "\x30\x0d\x0a\x0d\x0a", 5); + if(!result) + result = Curl_add_buffer(req_buffer, "\x30\x0d\x0a\x0d\x0a", 5); /* 0 CR LF CR LF */ included_body += 5; } @@ -2574,8 +2766,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(http->writebytecount >= postsize) { /* already sent the entire request body, mark the "upload" as complete */ - infof(data, "upload completely sent off: %" FORMAT_OFF_T " out of " - "%" FORMAT_OFF_T " bytes\n", + infof(data, "upload completely sent off: %" CURL_FORMAT_CURL_OFF_T + " out of %" CURL_FORMAT_CURL_OFF_T " bytes\n", http->writebytecount, postsize); data->req.upload_done = TRUE; data->req.keepon &= ~KEEP_SEND; /* we're done writing */ @@ -2865,17 +3057,38 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, k->header = TRUE; k->headerline = 0; /* restart the header line counter */ - /* if we did wait for this do enable write now! */ - if(k->exp100) { - k->exp100 = EXP100_SEND_DATA; - k->keepon |= KEEP_SEND; + /* "A user agent MAY ignore unexpected 1xx status responses." */ + switch(k->httpcode) { + case 100: + /* if we did wait for this do enable write now! */ + if(k->exp100) { + k->exp100 = EXP100_SEND_DATA; + k->keepon |= KEEP_SEND; + } + break; + case 101: + /* Switching Protocols */ + if(k->upgr101 == UPGR101_REQUESTED) { + infof(data, "Received 101\n"); + k->upgr101 = UPGR101_RECEIVED; + + /* switch to http2 now. The bytes after response headers + are also processed here, otherwise they are lost. */ + result = Curl_http2_switched(conn, k->str, *nread); + if(result) + return result; + *nread = 0; + } + break; + default: + break; } } else { k->header = FALSE; /* no more header to parse! */ if((k->size == -1) && !k->chunk && !conn->bits.close && - (conn->httpversion >= 11) && + (conn->httpversion == 11) && !(conn->handler->protocol & CURLPROTO_RTSP) && data->set.httpreq != HTTPREQ_HEAD) { /* On HTTP 1.1, when connection is not to get closed, but no @@ -2885,7 +3098,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, signal the end of the document. */ infof(data, "no chunk, no close, no size. Assume close to " "signal end\n"); - conn->bits.close = TRUE; + connclose(conn, "HTTP: No end-of-message indicator"); } } @@ -2954,7 +3167,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, */ if(!k->upload_done) { infof(data, "HTTP error before end of send, stop sending\n"); - conn->bits.close = TRUE; /* close after this */ + connclose(conn, "Stop sending data before everything sent"); k->upload_done = TRUE; k->keepon &= ~KEEP_SEND; /* don't send */ if(data->state.expect100header) @@ -3066,14 +3279,27 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, #define HEADER1 k->p /* no conversion needed, just use k->p */ #endif /* CURL_DOES_CONVERSIONS */ - if(conn->handler->protocol & CURLPROTO_HTTP) { + if(conn->handler->protocol & PROTO_FAMILY_HTTP) { + /* + * https://tools.ietf.org/html/rfc7230#section-3.1.2 + * + * The reponse code is always a three-digit number in HTTP as the spec + * says. We try to allow any number here, but we cannot make + * guarantees on future behaviors since it isn't within the protocol. + */ nc = sscanf(HEADER1, - " HTTP/%d.%d %3d", + " HTTP/%d.%d %d", &httpversion_major, &conn->httpversion, &k->httpcode); if(nc==3) { conn->httpversion += 10 * httpversion_major; + + if(k->upgr101 == UPGR101_RECEIVED) { + /* supposedly upgraded to http2 now */ + if(conn->httpversion != 20) + infof(data, "Lying server, not serving HTTP/2\n"); + } } else { /* this is the real world, not a Nirvana @@ -3149,7 +3375,17 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, we get one of those fancy headers that tell us the server keeps it open for us! */ infof(data, "HTTP 1.0, assume close after body\n"); - conn->bits.close = TRUE; + connclose(conn, "HTTP/1.0 close after body"); + } + else if(conn->httpversion == 20 || + (k->upgr101 == UPGR101_REQUESTED && k->httpcode == 101)) { + /* Don't enable pipelining for HTTP/2 or upgraded connection. For + HTTP/2, we do not support multiplexing. In general, requests + cannot be pipelined in upgraded connection, since it is now + different protocol. */ + DEBUGF(infof(data, + "HTTP 2 or upgraded connection do not support " + "pipelining for now\n")); } else if(conn->httpversion >= 11 && !conn->bits.close) { @@ -3224,14 +3460,14 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, /* Negative Content-Length is really odd, and we know it happens for example when older Apache servers send large files */ - conn->bits.close = TRUE; - infof(data, "Negative content-length: %" FORMAT_OFF_T + connclose(conn, "negative content-length"); + infof(data, "Negative content-length: %" CURL_FORMAT_CURL_OFF_T ", closing after transfer\n", contentlength); } } /* check for Content-Type: header lines to get the MIME-type */ else if(checkprefix("Content-Type:", k->p)) { - char *contenttype = copy_header_value(k->p); + char *contenttype = Curl_copy_header_value(k->p); if(!contenttype) return CURLE_OUT_OF_MEMORY; if(!*contenttype) @@ -3243,7 +3479,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, } } else if(checkprefix("Server:", k->p)) { - char *server_name = copy_header_value(k->p); + char *server_name = Curl_copy_header_value(k->p); /* Turn off pipelining if the server version is blacklisted */ if(conn->bundle && conn->bundle->server_supports_pipelining) { @@ -3262,7 +3498,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, * connection will be kept alive for our pleasure. * Default action for 1.0 is to close. */ - conn->bits.close = FALSE; /* don't close when done */ + connkeep(conn, "Proxy-Connection keep-alive"); /* don't close */ infof(data, "HTTP/1.0 proxy connection set to keep alive!\n"); } else if((conn->httpversion == 11) && @@ -3273,7 +3509,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, * We get a HTTP/1.1 response from a proxy and it says it'll * close down after this transfer. */ - conn->bits.close = TRUE; /* close when done */ + connclose(conn, "Proxy-Connection: asked to close after done"); infof(data, "HTTP/1.1 proxy connection set close!\n"); } else if((conn->httpversion == 10) && @@ -3284,7 +3520,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, * pleasure. Default action for 1.0 is to close. * * [RFC2068, section 19.7.1] */ - conn->bits.close = FALSE; /* don't close when done */ + connkeep(conn, "Connection keep-alive"); infof(data, "HTTP/1.0 connection set to keep alive!\n"); } else if(Curl_compareheader(k->p, "Connection:", "close")) { @@ -3294,7 +3530,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, * the connection will close when this request has been * served. */ - conn->bits.close = TRUE; /* close when done */ + connclose(conn, "Connection: close used"); } else if(checkprefix("Transfer-Encoding:", k->p)) { /* One or more encodings. We check for chunked and/or a compression @@ -3363,7 +3599,8 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, } else if(checkprefix("Content-Encoding:", k->p) && - data->set.str[STRING_ENCODING]) { + (data->set.str[STRING_ENCODING] || + conn->httpversion == 20)) { /* * Process Content-Encoding. Look for the values: identity, * gzip, deflate, compress, x-gzip and x-compress. x-gzip and @@ -3394,23 +3631,30 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, /* Content-Range: bytes [num]- Content-Range: bytes: [num]- Content-Range: [num]- + Content-Range: [asterisk]/[total] The second format was added since Sun's webserver JavaWebServer/1.1.1 obviously sends the header this way! The third added since some servers use that! + The forth means the requested range was unsatisfied. */ char *ptr = k->p + 14; - /* Move forward until first digit */ - while(*ptr && !ISDIGIT(*ptr)) + /* Move forward until first digit or asterisk */ + while(*ptr && !ISDIGIT(*ptr) && *ptr != '*') ptr++; - k->offset = curlx_strtoofft(ptr, NULL, 10); + /* if it truly stopped on a digit */ + if(ISDIGIT(*ptr)) { + k->offset = curlx_strtoofft(ptr, NULL, 10); - if(data->state.resume_from == k->offset) - /* we asked for a resume and we got it */ - k->content_range = TRUE; + if(data->state.resume_from == k->offset) + /* we asked for a resume and we got it */ + k->content_range = TRUE; + } + else + data->state.resume_from = 0; /* get everything */ } #if !defined(CURL_DISABLE_COOKIES) else if(data->cookies && @@ -3439,7 +3683,16 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, (401 == k->httpcode)) || (checkprefix("Proxy-authenticate:", k->p) && (407 == k->httpcode))) { - result = Curl_http_input_auth(conn, k->httpcode, k->p); + + bool proxy = (k->httpcode == 407) ? TRUE : FALSE; + char *auth = Curl_copy_header_value(k->p); + if(!auth) + return CURLE_OUT_OF_MEMORY; + + result = Curl_http_input_auth(conn, proxy, auth); + + Curl_safefree(auth); + if(result) return result; } @@ -3447,7 +3700,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, checkprefix("Location:", k->p) && !data->req.location) { /* this is the URL that the server advises us to use instead */ - char *location = copy_header_value(k->p); + char *location = Curl_copy_header_value(k->p); if(!location) return CURLE_OUT_OF_MEMORY; if(!*location) diff --git a/lib/http.h b/lib/http.h index 7236dd8..907755a 100644 --- a/lib/http.h +++ b/lib/http.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -21,20 +21,31 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "curl_setup.h" + #ifndef CURL_DISABLE_HTTP +#ifdef USE_NGHTTP2 +#include +#endif + extern const struct Curl_handler Curl_handler_http; #ifdef USE_SSL extern const struct Curl_handler Curl_handler_https; #endif +/* Header specific functions */ bool Curl_compareheader(const char *headerline, /* line to check */ const char *header, /* header keyword _with_ colon */ const char *content); /* content string to find */ -char *Curl_checkheaders(struct SessionHandle *data, const char *thisheader); +char *Curl_checkheaders(const struct connectdata *conn, + const char *thisheader); +char *Curl_copy_header_value(const char *header); +char *Curl_checkProxyheaders(const struct connectdata *conn, + const char *thisheader); /* ------------------------------------------------------------------------- */ /* * The add_buffer series of functions are used to build one large memory chunk @@ -60,12 +71,14 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in, CURLcode Curl_add_timecondition(struct SessionHandle *data, Curl_send_buffer *buf); CURLcode Curl_add_custom_headers(struct connectdata *conn, - Curl_send_buffer *req_buffer); + bool is_connect, + Curl_send_buffer *req_buffer); /* protocol-specific functions set up to be called by the main engine */ CURLcode Curl_http(struct connectdata *conn, bool *done); CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature); CURLcode Curl_http_connect(struct connectdata *conn, bool *done); +CURLcode Curl_http_setup_conn(struct connectdata *conn); /* The following functions are defined in http_chunks.c */ void Curl_httpchunk_init(struct connectdata *conn); @@ -74,8 +87,8 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap, /* These functions are in http.c */ void Curl_http_auth_stage(struct SessionHandle *data, int stage); -CURLcode Curl_http_input_auth(struct connectdata *conn, - int httpcode, const char *header); +CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, + const char *auth); CURLcode Curl_http_auth_act(struct connectdata *conn); CURLcode Curl_http_perhapsrewind(struct connectdata *conn); @@ -141,6 +154,45 @@ struct HTTP { points to an allocated send_buffer struct */ }; +typedef int (*sending)(void); /* Curl_send */ +typedef int (*recving)(void); /* Curl_recv */ + +struct http_conn { +#ifdef USE_NGHTTP2 +#define H2_BINSETTINGS_LEN 80 + nghttp2_session *h2; + uint8_t binsettings[H2_BINSETTINGS_LEN]; + size_t binlen; /* length of the binsettings data */ + char *mem; /* points to a buffer in memory to store */ + size_t len; /* size of the buffer 'mem' points to */ + bool bodystarted; + sending send_underlying; /* underlying send Curl_send callback */ + recving recv_underlying; /* underlying recv Curl_recv callback */ + bool closed; /* TRUE on HTTP2 stream close */ + Curl_send_buffer *header_recvbuf; /* store response headers. We + store non-final and final + response headers into it. */ + size_t nread_header_recvbuf; /* number of bytes in header_recvbuf + fed into upper layer */ + int32_t stream_id; /* stream we are interested in */ + const uint8_t *data; /* pointer to data chunk, received in + on_data_chunk */ + size_t datalen; /* the number of bytes left in data */ + char *inbuf; /* buffer to receive data from underlying socket */ + /* We need separate buffer for transmission and reception because we + may call nghttp2_session_send() after the + nghttp2_session_mem_recv() but mem buffer is still not full. In + this case, we wrongly sends the content of mem buffer if we share + them for both cases. */ + const uint8_t *upload_mem; /* points to a buffer to read from */ + size_t upload_len; /* size of the buffer 'upload_mem' points to */ + size_t upload_left; /* number of bytes left to upload */ + int status_code; /* HTTP status code */ +#else + int unused; /* prevent a compiler warning */ +#endif +}; + CURLcode Curl_http_readwrite_headers(struct SessionHandle *data, struct connectdata *conn, ssize_t *nread, diff --git a/lib/http2.c b/lib/http2.c new file mode 100644 index 0000000..dac9ab4 --- /dev/null +++ b/lib/http2.c @@ -0,0 +1,1051 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#ifdef USE_NGHTTP2 +#define _MPRINTF_REPLACE +#include + +#include +#include "urldata.h" +#include "http2.h" +#include "http.h" +#include "sendf.h" +#include "curl_base64.h" +#include "curl_memory.h" +#include "rawstr.h" +#include "multiif.h" + +/* include memdebug.h last */ +#include "memdebug.h" + +#if (NGHTTP2_VERSION_NUM < 0x000600) +#error too old nghttp2 version, upgrade! +#endif + +static int http2_perform_getsock(const struct connectdata *conn, + curl_socket_t *sock, /* points to + numsocks + number of + sockets */ + int numsocks) +{ + const struct http_conn *httpc = &conn->proto.httpc; + int bitmap = GETSOCK_BLANK; + (void)numsocks; + + /* TODO We should check underlying socket state if it is SSL socket + because of renegotiation. */ + sock[0] = conn->sock[FIRSTSOCKET]; + + if(nghttp2_session_want_read(httpc->h2)) + bitmap |= GETSOCK_READSOCK(FIRSTSOCKET); + + if(nghttp2_session_want_write(httpc->h2)) + bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET); + + return bitmap; +} + +static int http2_getsock(struct connectdata *conn, + curl_socket_t *sock, /* points to numsocks + number of sockets */ + int numsocks) +{ + return http2_perform_getsock(conn, sock, numsocks); +} + +static CURLcode http2_disconnect(struct connectdata *conn, + bool dead_connection) +{ + struct http_conn *httpc = &conn->proto.httpc; + (void)dead_connection; + + infof(conn->data, "HTTP/2 DISCONNECT starts now\n"); + + nghttp2_session_del(httpc->h2); + + Curl_safefree(httpc->header_recvbuf->buffer); + Curl_safefree(httpc->header_recvbuf); + + Curl_safefree(httpc->inbuf); + + infof(conn->data, "HTTP/2 DISCONNECT done\n"); + + return CURLE_OK; +} + +/* + * HTTP2 handler interface. This isn't added to the general list of protocols + * but will be used at run-time when the protocol is dynamically switched from + * HTTP to HTTP2. + */ +const struct Curl_handler Curl_handler_http2 = { + "HTTP2", /* scheme */ + ZERO_NULL, /* setup_connection */ + Curl_http, /* do_it */ + ZERO_NULL, /* done */ + ZERO_NULL, /* do_more */ + ZERO_NULL, /* connect_it */ + ZERO_NULL, /* connecting */ + ZERO_NULL, /* doing */ + http2_getsock, /* proto_getsock */ + http2_getsock, /* doing_getsock */ + ZERO_NULL, /* domore_getsock */ + http2_perform_getsock, /* perform_getsock */ + http2_disconnect, /* disconnect */ + ZERO_NULL, /* readwrite */ + PORT_HTTP, /* defport */ + CURLPROTO_HTTP, /* protocol */ + PROTOPT_NONE /* flags */ +}; + +const struct Curl_handler Curl_handler_http2_ssl = { + "HTTP2", /* scheme */ + ZERO_NULL, /* setup_connection */ + Curl_http, /* do_it */ + ZERO_NULL, /* done */ + ZERO_NULL, /* do_more */ + ZERO_NULL, /* connect_it */ + ZERO_NULL, /* connecting */ + ZERO_NULL, /* doing */ + http2_getsock, /* proto_getsock */ + http2_getsock, /* doing_getsock */ + ZERO_NULL, /* domore_getsock */ + http2_perform_getsock, /* perform_getsock */ + http2_disconnect, /* disconnect */ + ZERO_NULL, /* readwrite */ + PORT_HTTP, /* defport */ + CURLPROTO_HTTPS, /* protocol */ + PROTOPT_SSL /* flags */ +}; + +/* + * Store nghttp2 version info in this buffer, Prefix with a space. Return + * total length written. + */ +int Curl_http2_ver(char *p, size_t len) +{ + nghttp2_info *h2 = nghttp2_version(0); + return snprintf(p, len, " nghttp2/%s", h2->version_str); +} + +/* + * The implementation of nghttp2_send_callback type. Here we write |data| with + * size |length| to the network and return the number of bytes actually + * written. See the documentation of nghttp2_send_callback for the details. + */ +static ssize_t send_callback(nghttp2_session *h2, + const uint8_t *data, size_t length, int flags, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *httpc = &conn->proto.httpc; + ssize_t written; + CURLcode result = CURLE_OK; + + (void)h2; + (void)flags; + + written = ((Curl_send*)httpc->send_underlying)(conn, FIRSTSOCKET, + data, length, &result); + + if(result == CURLE_AGAIN) { + return NGHTTP2_ERR_WOULDBLOCK; + } + + if(written == -1) { + failf(conn->data, "Failed sending HTTP2 data"); + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + + if(!written) + return NGHTTP2_ERR_WOULDBLOCK; + + return written; +} + +static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *c = &conn->proto.httpc; + int rv; + size_t left, ncopy; + + (void)session; + (void)frame; + infof(conn->data, "on_frame_recv() was called with header %x\n", + frame->hd.type); + switch(frame->hd.type) { + case NGHTTP2_DATA: + /* If body started, then receiving DATA is illegal. */ + if(!c->bodystarted) { + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } + break; + case NGHTTP2_HEADERS: + if(frame->headers.cat == NGHTTP2_HCAT_REQUEST) + break; + + if(c->bodystarted) { + /* Only valid HEADERS after body started is trailer header, + which is not fully supported in this code. If HEADERS is not + trailer, then it is a PROTOCOL_ERROR. */ + if((frame->hd.flags & NGHTTP2_FLAG_END_STREAM) == 0) { + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } + break; + } + + if(c->status_code == -1) { + /* No :status header field means PROTOCOL_ERROR. */ + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + + break; + } + + /* Only final status code signals the end of header */ + if(c->status_code / 100 != 1) { + c->bodystarted = TRUE; + } + + c->status_code = -1; + + Curl_add_buffer(c->header_recvbuf, "\r\n", 2); + + left = c->header_recvbuf->size_used - c->nread_header_recvbuf; + ncopy = c->len < left ? c->len : left; + + memcpy(c->mem, c->header_recvbuf->buffer + c->nread_header_recvbuf, ncopy); + c->nread_header_recvbuf += ncopy; + + c->mem += ncopy; + c->len -= ncopy; + break; + case NGHTTP2_PUSH_PROMISE: + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->push_promise.promised_stream_id, + NGHTTP2_CANCEL); + if(nghttp2_is_fatal(rv)) { + return rv; + } + break; + } + return 0; +} + +static int on_invalid_frame_recv(nghttp2_session *session, + const nghttp2_frame *frame, + uint32_t error_code, void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + (void)session; + (void)frame; + infof(conn->data, "on_invalid_frame_recv() was called, error_code = %d\n", + error_code); + return 0; +} + +static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags, + int32_t stream_id, + const uint8_t *data, size_t len, void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *c = &conn->proto.httpc; + size_t nread; + (void)session; + (void)flags; + (void)data; + infof(conn->data, "on_data_chunk_recv() " + "len = %u, stream = %x\n", len, stream_id); + + if(stream_id != c->stream_id) { + return 0; + } + + nread = c->len < len ? c->len : len; + memcpy(c->mem, data, nread); + + c->mem += nread; + c->len -= nread; + + infof(conn->data, "%zu data written\n", nread); + + if(nread < len) { + c->data = data + nread; + c->datalen = len - nread; + return NGHTTP2_ERR_PAUSE; + } + return 0; +} + +static int before_frame_send(nghttp2_session *session, + const nghttp2_frame *frame, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + (void)session; + (void)frame; + infof(conn->data, "before_frame_send() was called\n"); + return 0; +} +static int on_frame_send(nghttp2_session *session, + const nghttp2_frame *frame, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + (void)session; + (void)frame; + infof(conn->data, "on_frame_send() was called\n"); + return 0; +} +static int on_frame_not_send(nghttp2_session *session, + const nghttp2_frame *frame, + int lib_error_code, void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + (void)session; + (void)frame; + infof(conn->data, "on_frame_not_send() was called, lib_error_code = %d\n", + lib_error_code); + return 0; +} +static int on_stream_close(nghttp2_session *session, int32_t stream_id, + uint32_t error_code, void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *c = &conn->proto.httpc; + (void)session; + (void)stream_id; + infof(conn->data, "on_stream_close() was called, error_code = %d\n", + error_code); + + if(stream_id != c->stream_id) { + return 0; + } + + c->closed = TRUE; + + return 0; +} + +static int on_begin_headers(nghttp2_session *session, + const nghttp2_frame *frame, void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + (void)session; + (void)frame; + infof(conn->data, "on_begin_headers() was called\n"); + return 0; +} + +/* Decode HTTP status code. Returns -1 if no valid status code was + decoded. */ +static int decode_status_code(const uint8_t *value, size_t len) +{ + int i; + int res; + + if(len != 3) { + return -1; + } + + res = 0; + + for(i = 0; i < 3; ++i) { + char c = value[i]; + + if(c < '0' || c > '9') { + return -1; + } + + res *= 10; + res += c - '0'; + } + + return res; +} + +static const char STATUS[] = ":status"; + +/* frame->hd.type is either NGHTTP2_HEADERS or NGHTTP2_PUSH_PROMISE */ +static int on_header(nghttp2_session *session, const nghttp2_frame *frame, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen, + uint8_t flags, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *c = &conn->proto.httpc; + int rv; + int goodname; + int goodheader; + + (void)session; + (void)frame; + (void)flags; + + if(frame->hd.stream_id != c->stream_id) { + return 0; + } + + if(c->bodystarted) { + /* Ignore trailer or HEADERS not mapped to HTTP semantics. The + consequence is handled in on_frame_recv(). */ + return 0; + } + + goodname = nghttp2_check_header_name(name, namelen); + goodheader = nghttp2_check_header_value(value, valuelen); + + if(!goodname || !goodheader) { + + infof(conn->data, "Detected bad incoming header %s%s, reset stream!\n", + goodname?"":"name", + goodheader?"":"value"); + + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + + return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; + } + + if(namelen == sizeof(":status") - 1 && + memcmp(STATUS, name, namelen) == 0) { + + /* :status must appear exactly once. */ + if(c->status_code != -1 || + (c->status_code = decode_status_code(value, valuelen)) == -1) { + + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + + return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; + } + + Curl_add_buffer(c->header_recvbuf, "HTTP/2.0 ", 9); + Curl_add_buffer(c->header_recvbuf, value, valuelen); + Curl_add_buffer(c->header_recvbuf, "\r\n", 2); + + return 0; + } + else { + /* Here we are sure that namelen > 0 because of + nghttp2_check_header_name(). Pseudo header other than :status + is illegal. */ + if(c->status_code == -1 || name[0] == ':') { + rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, + frame->hd.stream_id, + NGHTTP2_PROTOCOL_ERROR); + if(nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + + return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; + } + + /* convert to a HTTP1-style header */ + Curl_add_buffer(c->header_recvbuf, name, namelen); + Curl_add_buffer(c->header_recvbuf, ":", 1); + Curl_add_buffer(c->header_recvbuf, value, valuelen); + Curl_add_buffer(c->header_recvbuf, "\r\n", 2); + + infof(conn->data, "got http2 header: %.*s: %.*s\n", + namelen, name, valuelen, value); + } + + return 0; /* 0 is successful */ +} + +static ssize_t data_source_read_callback(nghttp2_session *session, + int32_t stream_id, + uint8_t *buf, size_t length, + uint32_t *data_flags, + nghttp2_data_source *source, + void *userp) +{ + struct connectdata *conn = (struct connectdata *)userp; + struct http_conn *c = &conn->proto.httpc; + size_t nread; + (void)session; + (void)stream_id; + (void)source; + + nread = c->upload_len < length ? c->upload_len : length; + if(nread > 0) { + memcpy(buf, c->upload_mem, nread); + c->upload_mem += nread; + c->upload_len -= nread; + c->upload_left -= nread; + } + + if(c->upload_left == 0) + *data_flags = 1; + else if(nread == 0) + return NGHTTP2_ERR_DEFERRED; + + return nread; +} + +/* + * The HTTP2 settings we send in the Upgrade request + */ +static nghttp2_settings_entry settings[] = { + { NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 }, + { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE }, +}; + +#define H2_BUFSIZE 4096 + +/* + * Initialize nghttp2 for a Curl connection + */ +CURLcode Curl_http2_init(struct connectdata *conn) +{ + if(!conn->proto.httpc.h2) { + int rc; + nghttp2_session_callbacks *callbacks; + + conn->proto.httpc.inbuf = malloc(H2_BUFSIZE); + if(conn->proto.httpc.inbuf == NULL) + return CURLE_OUT_OF_MEMORY; + + rc = nghttp2_session_callbacks_new(&callbacks); + + if(rc) { + failf(conn->data, "Couldn't initialize nghttp2 callbacks!"); + return CURLE_OUT_OF_MEMORY; /* most likely at least */ + } + + /* nghttp2_send_callback */ + nghttp2_session_callbacks_set_send_callback(callbacks, send_callback); + /* nghttp2_on_frame_recv_callback */ + nghttp2_session_callbacks_set_on_frame_recv_callback + (callbacks, on_frame_recv); + /* nghttp2_on_invalid_frame_recv_callback */ + nghttp2_session_callbacks_set_on_invalid_frame_recv_callback + (callbacks, on_invalid_frame_recv); + /* nghttp2_on_data_chunk_recv_callback */ + nghttp2_session_callbacks_set_on_data_chunk_recv_callback + (callbacks, on_data_chunk_recv); + /* nghttp2_before_frame_send_callback */ + nghttp2_session_callbacks_set_before_frame_send_callback + (callbacks, before_frame_send); + /* nghttp2_on_frame_send_callback */ + nghttp2_session_callbacks_set_on_frame_send_callback + (callbacks, on_frame_send); + /* nghttp2_on_frame_not_send_callback */ + nghttp2_session_callbacks_set_on_frame_not_send_callback + (callbacks, on_frame_not_send); + /* nghttp2_on_stream_close_callback */ + nghttp2_session_callbacks_set_on_stream_close_callback + (callbacks, on_stream_close); + /* nghttp2_on_begin_headers_callback */ + nghttp2_session_callbacks_set_on_begin_headers_callback + (callbacks, on_begin_headers); + /* nghttp2_on_header_callback */ + nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header); + + /* The nghttp2 session is not yet setup, do it */ + rc = nghttp2_session_client_new(&conn->proto.httpc.h2, + callbacks, conn); + + nghttp2_session_callbacks_del(callbacks); + + if(rc) { + failf(conn->data, "Couldn't initialize nghttp2!"); + return CURLE_OUT_OF_MEMORY; /* most likely at least */ + } + } + return CURLE_OK; +} + +/* + * Send a request using http2 + */ +CURLcode Curl_http2_send_request(struct connectdata *conn) +{ + (void)conn; + return CURLE_OK; +} + +/* + * Append headers to ask for a HTTP1.1 to HTTP2 upgrade. + */ +CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req, + struct connectdata *conn) +{ + CURLcode result; + ssize_t binlen; + char *base64; + size_t blen; + struct SingleRequest *k = &conn->data->req; + uint8_t *binsettings = conn->proto.httpc.binsettings; + + result = Curl_http2_init(conn); + if(result) + return result; + + result = Curl_http2_setup(conn); + if(result) + return result; + + /* As long as we have a fixed set of settings, we don't have to dynamically + * figure out the base64 strings since it'll always be the same. However, + * the settings will likely not be fixed every time in the future. + */ + + /* this returns number of bytes it wrote */ + binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN, + settings, + sizeof(settings)/sizeof(settings[0])); + if(!binlen) { + failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload"); + return CURLE_FAILED_INIT; + } + conn->proto.httpc.binlen = binlen; + + result = Curl_base64url_encode(conn->data, (const char *)binsettings, binlen, + &base64, &blen); + if(result) + return result; + + result = Curl_add_bufferf(req, + "Connection: Upgrade, HTTP2-Settings\r\n" + "Upgrade: %s\r\n" + "HTTP2-Settings: %s\r\n", + NGHTTP2_CLEARTEXT_PROTO_VERSION_ID, base64); + Curl_safefree(base64); + + k->upgr101 = UPGR101_REQUESTED; + + return result; +} + +/* + * If the read would block (EWOULDBLOCK) we return -1. Otherwise we return + * a regular CURLcode value. + */ +static ssize_t http2_recv(struct connectdata *conn, int sockindex, + char *mem, size_t len, CURLcode *err) +{ + CURLcode result = CURLE_OK; + ssize_t rv; + ssize_t nread; + struct http_conn *httpc = &conn->proto.httpc; + + (void)sockindex; /* we always do HTTP2 on sockindex 0 */ + + if(httpc->closed) { + /* Reset to FALSE to prevent infinite loop in readwrite_data + function. */ + httpc->closed = FALSE; + return 0; + } + + /* Nullify here because we call nghttp2_session_send() and they + might refer to the old buffer. */ + httpc->upload_mem = NULL; + httpc->upload_len = 0; + + if(httpc->bodystarted && + httpc->nread_header_recvbuf < httpc->header_recvbuf->size_used) { + size_t left = + httpc->header_recvbuf->size_used - httpc->nread_header_recvbuf; + size_t ncopy = len < left ? len : left; + memcpy(mem, httpc->header_recvbuf->buffer + httpc->nread_header_recvbuf, + ncopy); + httpc->nread_header_recvbuf += ncopy; + return ncopy; + } + + if(httpc->data) { + nread = len < httpc->datalen ? len : httpc->datalen; + memcpy(mem, httpc->data, nread); + + httpc->data += nread; + httpc->datalen -= nread; + + infof(conn->data, "%zu data written\n", nread); + if(httpc->datalen == 0) { + httpc->data = NULL; + httpc->datalen = 0; + } + return nread; + } + + conn->proto.httpc.mem = mem; + conn->proto.httpc.len = len; + + infof(conn->data, "http2_recv: %d bytes buffer\n", + conn->proto.httpc.len); + + nread = ((Curl_recv*)httpc->recv_underlying)(conn, FIRSTSOCKET, + httpc->inbuf, H2_BUFSIZE, + &result); + if(result == CURLE_AGAIN) { + *err = result; + return -1; + } + + if(nread == -1) { + failf(conn->data, "Failed receiving HTTP2 data"); + *err = result; + return 0; + } + + infof(conn->data, "nread=%zd\n", nread); + + if(nread == 0) { + failf(conn->data, "EOF"); + return 0; + } + + rv = nghttp2_session_mem_recv(httpc->h2, + (const uint8_t *)httpc->inbuf, nread); + + if(nghttp2_is_fatal((int)rv)) { + failf(conn->data, "nghttp2_session_mem_recv() returned %d:%s\n", + rv, nghttp2_strerror((int)rv)); + *err = CURLE_RECV_ERROR; + return 0; + } + infof(conn->data, "nghttp2_session_mem_recv() returns %zd\n", rv); + /* Always send pending frames in nghttp2 session, because + nghttp2_session_mem_recv() may queue new frame */ + rv = nghttp2_session_send(httpc->h2); + if(rv != 0) { + *err = CURLE_SEND_ERROR; + return 0; + } + if(len != httpc->len) { + return len - conn->proto.httpc.len; + } + /* If stream is closed, return 0 to signal the http routine to close + the connection */ + if(httpc->closed) { + /* Reset to FALSE to prevent infinite loop in readwrite_data + function. */ + httpc->closed = FALSE; + return 0; + } + *err = CURLE_AGAIN; + return -1; +} + +/* Index where :authority header field will appear in request header + field list. */ +#define AUTHORITY_DST_IDX 3 + +/* return number of received (decrypted) bytes */ +static ssize_t http2_send(struct connectdata *conn, int sockindex, + const void *mem, size_t len, CURLcode *err) +{ + /* + * BIG TODO: Currently, we send request in this function, but this + * function is also used to send request body. It would be nice to + * add dedicated function for request. + */ + int rv; + struct http_conn *httpc = &conn->proto.httpc; + nghttp2_nv *nva; + size_t nheader; + size_t i; + size_t authority_idx; + char *hdbuf = (char*)mem; + char *end; + nghttp2_data_provider data_prd; + int32_t stream_id; + + (void)sockindex; + + infof(conn->data, "http2_send len=%zu\n", len); + + if(httpc->stream_id != -1) { + /* If stream_id != -1, we have dispatched request HEADERS, and now + are going to send or sending request body in DATA frame */ + httpc->upload_mem = mem; + httpc->upload_len = len; + nghttp2_session_resume_data(httpc->h2, httpc->stream_id); + rv = nghttp2_session_send(httpc->h2); + if(nghttp2_is_fatal(rv)) { + *err = CURLE_SEND_ERROR; + return -1; + } + return len - httpc->upload_len; + } + + /* Calculate number of headers contained in [mem, mem + len) */ + /* Here, we assume the curl http code generate *correct* HTTP header + field block */ + nheader = 0; + for(i = 0; i < len; ++i) { + if(hdbuf[i] == 0x0a) { + ++nheader; + } + } + /* We counted additional 2 \n in the first and last line. We need 3 + new headers: :method, :path and :scheme. Therefore we need one + more space. */ + nheader += 1; + nva = malloc(sizeof(nghttp2_nv) * nheader); + if(nva == NULL) { + *err = CURLE_OUT_OF_MEMORY; + return -1; + } + /* Extract :method, :path from request line */ + end = strchr(hdbuf, ' '); + nva[0].name = (unsigned char *)":method"; + nva[0].namelen = (uint16_t)strlen((char *)nva[0].name); + nva[0].value = (unsigned char *)hdbuf; + nva[0].valuelen = (uint16_t)(end - hdbuf); + nva[0].flags = NGHTTP2_NV_FLAG_NONE; + + hdbuf = end + 1; + + end = strchr(hdbuf, ' '); + nva[1].name = (unsigned char *)":path"; + nva[1].namelen = (uint16_t)strlen((char *)nva[1].name); + nva[1].value = (unsigned char *)hdbuf; + nva[1].valuelen = (uint16_t)(end - hdbuf); + nva[1].flags = NGHTTP2_NV_FLAG_NONE; + + nva[2].name = (unsigned char *)":scheme"; + nva[2].namelen = (uint16_t)strlen((char *)nva[2].name); + if(conn->handler->flags & PROTOPT_SSL) + nva[2].value = (unsigned char *)"https"; + else + nva[2].value = (unsigned char *)"http"; + nva[2].valuelen = (uint16_t)strlen((char *)nva[2].value); + nva[2].flags = NGHTTP2_NV_FLAG_NONE; + + hdbuf = strchr(hdbuf, 0x0a); + ++hdbuf; + + authority_idx = 0; + + for(i = 3; i < nheader; ++i) { + end = strchr(hdbuf, ':'); + assert(end); + if(end - hdbuf == 4 && Curl_raw_nequal("host", hdbuf, 4)) { + authority_idx = i; + nva[i].name = (unsigned char *)":authority"; + nva[i].namelen = (uint16_t)strlen((char *)nva[i].name); + } + else { + nva[i].name = (unsigned char *)hdbuf; + nva[i].namelen = (uint16_t)(end - hdbuf); + } + hdbuf = end + 1; + for(; *hdbuf == ' '; ++hdbuf); + end = strchr(hdbuf, 0x0d); + assert(end); + nva[i].value = (unsigned char *)hdbuf; + nva[i].valuelen = (uint16_t)(end - hdbuf); + nva[i].flags = NGHTTP2_NV_FLAG_NONE; + + hdbuf = end + 2; + /* Inspect Content-Length header field and retrieve the request + entity length so that we can set END_STREAM to the last DATA + frame. */ + if(nva[i].namelen == 14 && + Curl_raw_nequal("content-length", (char*)nva[i].name, 14)) { + size_t j; + for(j = 0; j < nva[i].valuelen; ++j) { + httpc->upload_left *= 10; + httpc->upload_left += nva[i].value[j] - '0'; + } + infof(conn->data, "request content-length=%zu\n", httpc->upload_left); + } + } + + /* :authority must come before non-pseudo header fields */ + if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) { + nghttp2_nv authority = nva[authority_idx]; + for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) { + nva[i] = nva[i - 1]; + } + nva[i] = authority; + } + + switch(conn->data->set.httpreq) { + case HTTPREQ_POST: + case HTTPREQ_POST_FORM: + case HTTPREQ_PUT: + data_prd.read_callback = data_source_read_callback; + data_prd.source.ptr = NULL; + stream_id = nghttp2_submit_request(httpc->h2, NULL, nva, nheader, + &data_prd, NULL); + break; + default: + stream_id = nghttp2_submit_request(httpc->h2, NULL, nva, nheader, + NULL, NULL); + } + + Curl_safefree(nva); + + if(stream_id < 0) { + *err = CURLE_SEND_ERROR; + return -1; + } + + httpc->stream_id = stream_id; + + rv = nghttp2_session_send(httpc->h2); + + if(rv != 0) { + *err = CURLE_SEND_ERROR; + return -1; + } + + if(httpc->stream_id != -1) { + /* If whole HEADERS frame was sent off to the underlying socket, + the nghttp2 library calls data_source_read_callback. But only + it found that no data available, so it deferred the DATA + transmission. Which means that nghttp2_session_want_write() + returns 0 on http2_perform_getsock(), which results that no + writable socket check is performed. To workaround this, we + issue nghttp2_session_resume_data() here to bring back DATA + transmission from deferred state. */ + nghttp2_session_resume_data(httpc->h2, httpc->stream_id); + } + + return len; +} + +CURLcode Curl_http2_setup(struct connectdata *conn) +{ + struct http_conn *httpc = &conn->proto.httpc; + if(conn->handler->flags & PROTOPT_SSL) + conn->handler = &Curl_handler_http2_ssl; + else + conn->handler = &Curl_handler_http2; + + infof(conn->data, "Using HTTP2\n"); + httpc->bodystarted = FALSE; + httpc->closed = FALSE; + httpc->header_recvbuf = Curl_add_buffer_init(); + httpc->nread_header_recvbuf = 0; + httpc->data = NULL; + httpc->datalen = 0; + httpc->upload_left = 0; + httpc->upload_mem = NULL; + httpc->upload_len = 0; + httpc->stream_id = -1; + httpc->status_code = -1; + + conn->httpversion = 20; + + return 0; +} + +CURLcode Curl_http2_switched(struct connectdata *conn, + const char *mem, size_t nread) +{ + CURLcode result; + struct http_conn *httpc = &conn->proto.httpc; + int rv; + struct SessionHandle *data = conn->data; + + httpc->recv_underlying = (recving)conn->recv[FIRSTSOCKET]; + httpc->send_underlying = (sending)conn->send[FIRSTSOCKET]; + conn->recv[FIRSTSOCKET] = http2_recv; + conn->send[FIRSTSOCKET] = http2_send; + + rv = (int) ((Curl_send*)httpc->send_underlying) + (conn, FIRSTSOCKET, + NGHTTP2_CLIENT_CONNECTION_PREFACE, + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN, + &result); + if(result) + /* TODO: This may get CURLE_AGAIN */ + return result; + + if(rv != 24) { + failf(data, "Only sent partial HTTP2 packet"); + return CURLE_SEND_ERROR; + } + + if(conn->data->req.upgr101 == UPGR101_RECEIVED) { + /* stream 1 is opened implicitly on upgrade */ + httpc->stream_id = 1; + /* queue SETTINGS frame (again) */ + rv = nghttp2_session_upgrade(httpc->h2, httpc->binsettings, + httpc->binlen, NULL); + if(rv != 0) { + failf(data, "nghttp2_session_upgrade() failed: %s(%d)", + nghttp2_strerror(rv), rv); + return CURLE_HTTP2; + } + } + else { + /* stream ID is unknown at this point */ + httpc->stream_id = -1; + rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, NULL, 0); + if(rv != 0) { + failf(data, "nghttp2_submit_settings() failed: %s(%d)", + nghttp2_strerror(rv), rv); + return CURLE_HTTP2; + } + } + + rv = (int)nghttp2_session_mem_recv(httpc->h2, (const uint8_t*)mem, nread); + + if(rv != (int)nread) { + failf(data, "nghttp2_session_mem_recv() failed: %s(%d)", + nghttp2_strerror(rv), rv); + return CURLE_HTTP2; + } + + return CURLE_OK; +} + +#endif diff --git a/lib/http2.h b/lib/http2.h new file mode 100644 index 0000000..a2e4eb7 --- /dev/null +++ b/lib/http2.h @@ -0,0 +1,51 @@ +#ifndef HEADER_CURL_HTTP2_H +#define HEADER_CURL_HTTP2_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#ifdef USE_NGHTTP2 +#include "http.h" +/* + * Store nghttp2 version info in this buffer, Prefix with a space. Return + * total length written. + */ +int Curl_http2_ver(char *p, size_t len); + +CURLcode Curl_http2_init(struct connectdata *conn); +CURLcode Curl_http2_send_request(struct connectdata *conn); +CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req, + struct connectdata *conn); +CURLcode Curl_http2_setup(struct connectdata *conn); +CURLcode Curl_http2_switched(struct connectdata *conn, + const char *data, size_t nread); +#else /* USE_NGHTTP2 */ +#define Curl_http2_init(x) CURLE_UNSUPPORTED_PROTOCOL +#define Curl_http2_send_request(x) CURLE_UNSUPPORTED_PROTOCOL +#define Curl_http2_request_upgrade(x,y) CURLE_UNSUPPORTED_PROTOCOL +#define Curl_http2_setup(x) CURLE_UNSUPPORTED_PROTOCOL +#define Curl_http2_switched(x,y,z) CURLE_UNSUPPORTED_PROTOCOL +#endif + +#endif /* HEADER_CURL_HTTP2_H */ + diff --git a/lib/http_chunks.c b/lib/http_chunks.c index e9fddf5..61a6098 100644 --- a/lib/http_chunks.c +++ b/lib/http_chunks.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,6 +31,8 @@ #include "http.h" #include "curl_memory.h" #include "non-ascii.h" /* for Curl_convert_to_network prototype */ +#include "strtoofft.h" +#include "warnless.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -87,8 +89,8 @@ static bool Curl_isxdigit(char digit) void Curl_httpchunk_init(struct connectdata *conn) { struct Curl_chunker *chunk = &conn->chunk; - chunk->hexindex=0; /* start at 0 */ - chunk->dataleft=0; /* no data left yet! */ + chunk->hexindex=0; /* start at 0 */ + chunk->dataleft=0; /* no data left yet! */ chunk->state = CHUNK_HEX; /* we get hex first! */ } @@ -113,7 +115,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, struct Curl_chunker *ch = &conn->chunk; struct SingleRequest *k = &data->req; size_t piece; - size_t length = (size_t)datalen; + curl_off_t length = (curl_off_t)datalen; size_t *wrote = (size_t *)wrotep; *wrote = 0; /* nothing's written yet */ @@ -141,11 +143,12 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, } } else { - if(0 == ch->hexindex) { + char *endptr; + if(0 == ch->hexindex) /* This is illegal data, we received junk where we expected a hexadecimal digit. */ return CHUNKE_ILLEGAL_HEX; - } + /* length and datap are unmodified */ ch->hexbuffer[ch->hexindex]=0; @@ -155,50 +158,38 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, if(result) { /* Curl_convert_from_network calls failf if unsuccessful */ /* Treat it as a bad hex character */ - return(CHUNKE_ILLEGAL_HEX); + return CHUNKE_ILLEGAL_HEX ; } - ch->datasize=strtoul(ch->hexbuffer, NULL, 16); - ch->state = CHUNK_POSTHEX; + ch->datasize=curlx_strtoofft(ch->hexbuffer, &endptr, 16); + if((ch->datasize == CURL_OFF_T_MAX) && (errno == ERANGE)) + /* overflow is an error */ + return CHUNKE_ILLEGAL_HEX; + ch->state = CHUNK_LF; /* now wait for the CRLF */ } break; - case CHUNK_POSTHEX: - /* In this state, we're waiting for CRLF to arrive. We support - this to allow so called chunk-extensions to show up here - before the CRLF comes. */ - if(*datap == 0x0d) - ch->state = CHUNK_CR; - length--; - datap++; - break; - - case CHUNK_CR: - /* waiting for the LF */ + case CHUNK_LF: + /* waiting for the LF after a chunk size */ if(*datap == 0x0a) { /* we're now expecting data to come, unless size was zero! */ if(0 == ch->datasize) { ch->state = CHUNK_TRAILER; /* now check for trailers */ conn->trlPos=0; } - else { + else ch->state = CHUNK_DATA; - } } - else - /* previously we got a fake CR, go back to CR waiting! */ - ch->state = CHUNK_CR; + datap++; length--; break; case CHUNK_DATA: - /* we get pure and fine data - - We expect another 'datasize' of data. We have 'length' right now, - it can be more or less than 'datasize'. Get the smallest piece. + /* We expect 'datasize' of data. We have 'length' right now, it can be + more or less than 'datasize'. Get the smallest piece. */ - piece = (ch->datasize >= length)?length:ch->datasize; + piece = curlx_sotouz((ch->datasize >= length)?length:ch->datasize); /* Write the data portion available */ #ifdef HAVE_LIBZ @@ -251,37 +242,22 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, if(0 == ch->datasize) /* end of data this round, we now expect a trailing CRLF */ - ch->state = CHUNK_POSTCR; - break; - - case CHUNK_POSTCR: - if(*datap == 0x0d) { ch->state = CHUNK_POSTLF; - datap++; - length--; - } - else - return CHUNKE_BAD_CHUNK; - break; case CHUNK_POSTLF: if(*datap == 0x0a) { - /* - * The last one before we go back to hex state and start all - * over. - */ - Curl_httpchunk_init(conn); - datap++; - length--; + /* The last one before we go back to hex state and start all over. */ + Curl_httpchunk_init(conn); /* sets state back to CHUNK_HEX */ } - else + else if(*datap != 0x0d) return CHUNKE_BAD_CHUNK; - + datap++; + length--; break; case CHUNK_TRAILER: - if(*datap == 0x0d) { + if((*datap == 0x0d) || (*datap == 0x0a)) { /* this is the end of a trailer, but if the trailer was zero bytes there was no trailer and we move on */ @@ -307,6 +283,9 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, } conn->trlPos=0; ch->state = CHUNK_TRAILER_CR; + if(*datap == 0x0a) + /* already on the LF */ + break; } else { /* no trailer, we're on the final CRLF pair */ @@ -352,27 +331,18 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, case CHUNK_TRAILER_POSTCR: /* We enter this state when a CR should arrive so we expect to have to first pass a CR before we wait for LF */ - if(*datap != 0x0d) { + if((*datap != 0x0d) && (*datap != 0x0a)) { /* not a CR then it must be another header in the trailer */ ch->state = CHUNK_TRAILER; break; } - datap++; - length--; - /* now wait for the final LF */ - ch->state = CHUNK_STOP; - break; - - case CHUNK_STOPCR: - /* Read the final CRLF that ends all chunk bodies */ - if(*datap == 0x0d) { - ch->state = CHUNK_STOP; + /* skip if CR */ datap++; length--; } - else - return CHUNKE_BAD_CHUNK; + /* now wait for the final LF */ + ch->state = CHUNK_STOP; break; case CHUNK_STOP: @@ -381,17 +351,35 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, /* Record the length of any data left in the end of the buffer even if there's no more chunks to read */ + ch->dataleft = curlx_sotouz(length); - ch->dataleft = length; return CHUNKE_STOP; /* return stop */ } else return CHUNKE_BAD_CHUNK; - - default: - return CHUNKE_STATE_ERROR; } } return CHUNKE_OK; } + +const char *Curl_chunked_strerror(CHUNKcode code) +{ + switch (code) { + default: + return "OK"; + case CHUNKE_TOO_LONG_HEX: + return "Too long hexadecimal number"; + case CHUNKE_ILLEGAL_HEX: + return "Illegal or missing hexadecimal sequence"; + case CHUNKE_BAD_CHUNK: + return "Malformed encoding found"; + case CHUNKE_WRITE_ERROR: + return "Write error"; + case CHUNKE_BAD_ENCODING: + return "Bad content-encoding found"; + case CHUNKE_OUT_OF_MEMORY: + return "Out of memory"; + } +} + #endif /* CURL_DISABLE_HTTP */ diff --git a/lib/http_chunks.h b/lib/http_chunks.h index b999ab5..0489eb8 100644 --- a/lib/http_chunks.h +++ b/lib/http_chunks.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -29,40 +29,25 @@ #define MAXNUM_SIZE 16 typedef enum { - CHUNK_FIRST, /* never use */ - - /* In this we await and buffer all hexadecimal digits until we get one - that isn't a hexadecimal digit. When done, we go POSTHEX */ + /* await and buffer all hexadecimal digits until we get one that isn't a + hexadecimal digit. When done, we go CHUNK_LF */ CHUNK_HEX, - /* We have received the hexadecimal digit and we eat all characters until - we get a CRLF pair. When we see a CR we go to the CR state. */ - CHUNK_POSTHEX, - - /* A single CR has been found and we should get a LF right away in this - state or we go back to POSTHEX. When LF is received, we go to DATA. - If the size given was zero, we set state to STOP and return. */ - CHUNK_CR, + /* wait for LF, ignore all else */ + CHUNK_LF, /* We eat the amount of data specified. When done, we move on to the POST_CR state. */ CHUNK_DATA, - /* POSTCR should get a CR and nothing else, then move to POSTLF */ - CHUNK_POSTCR, - - /* POSTLF should get a LF and nothing else, then move back to HEX as the - CRLF combination marks the end of a chunk */ + /* POSTLF should get a CR and then a LF and nothing else, then move back to + HEX as the CRLF combination marks the end of a chunk. A missing CR is no + big deal. */ CHUNK_POSTLF, - /* Each Chunk body should end with a CRLF. Read a CR and nothing else, - then move to CHUNK_STOP */ - CHUNK_STOPCR, - - /* This is mainly used to really mark that we're out of the game. - NOTE: that there's a 'dataleft' field in the struct that will tell how - many bytes that were not passed to the client in the end of the last - buffer! */ + /* Used to mark that we're out of the game. NOTE: that there's a 'dataleft' + field in the struct that will tell how many bytes that were not passed to + the client in the end of the last buffer! */ CHUNK_STOP, /* At this point optional trailer headers can be found, unless the next line @@ -77,10 +62,7 @@ typedef enum { signalled If this is an empty trailer CHUNKE_STOP will be signalled. Otherwise the trailer will be broadcasted via Curl_client_write() and the next state will be CHUNK_TRAILER */ - CHUNK_TRAILER_POSTCR, - - CHUNK_LAST /* never use */ - + CHUNK_TRAILER_POSTCR } ChunkyState; typedef enum { @@ -90,17 +72,18 @@ typedef enum { CHUNKE_ILLEGAL_HEX, CHUNKE_BAD_CHUNK, CHUNKE_WRITE_ERROR, - CHUNKE_STATE_ERROR, CHUNKE_BAD_ENCODING, CHUNKE_OUT_OF_MEMORY, CHUNKE_LAST } CHUNKcode; +const char *Curl_chunked_strerror(CHUNKcode code); + struct Curl_chunker { char hexbuffer[ MAXNUM_SIZE + 1]; int hexindex; ChunkyState state; - size_t datasize; + curl_off_t datasize; size_t dataleft; /* untouched data amount at the end of the last buffer */ }; diff --git a/lib/http_digest.c b/lib/http_digest.c index f50f803..ba59e5d 100644 --- a/lib/http_digest.c +++ b/lib/http_digest.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,14 +26,9 @@ #include "urldata.h" #include "rawstr.h" -#include "curl_base64.h" -#include "curl_md5.h" +#include "curl_sasl.h" #include "http_digest.h" -#include "strtok.h" #include "curl_memory.h" -#include "sslgen.h" /* for Curl_rand() */ -#include "non-ascii.h" /* included for Curl_convert_... prototypes */ -#include "warnless.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -41,79 +36,6 @@ /* The last #include file should be: */ #include "memdebug.h" -#define MAX_VALUE_LENGTH 256 -#define MAX_CONTENT_LENGTH 1024 - -static void digest_cleanup_one(struct digestdata *dig); - -/* - * Return 0 on success and then the buffers are filled in fine. - * - * Non-zero means failure to parse. - */ -static int get_pair(const char *str, char *value, char *content, - const char **endptr) -{ - int c; - bool starts_with_quote = FALSE; - bool escape = FALSE; - - for(c=MAX_VALUE_LENGTH-1; (*str && (*str != '=') && c--); ) - *value++ = *str++; - *value=0; - - if('=' != *str++) - /* eek, no match */ - return 1; - - if('\"' == *str) { - /* this starts with a quote so it must end with one as well! */ - str++; - starts_with_quote = TRUE; - } - - for(c=MAX_CONTENT_LENGTH-1; *str && c--; str++) { - switch(*str) { - case '\\': - if(!escape) { - /* possibly the start of an escaped quote */ - escape = TRUE; - *content++ = '\\'; /* even though this is an escape character, we still - store it as-is in the target buffer */ - continue; - } - break; - case ',': - if(!starts_with_quote) { - /* this signals the end of the content if we didn't get a starting - quote and then we do "sloppy" parsing */ - c=0; /* the end */ - continue; - } - break; - case '\r': - case '\n': - /* end of string */ - c=0; - continue; - case '\"': - if(!escape && starts_with_quote) { - /* end of string */ - c=0; - continue; - } - break; - } - escape = FALSE; - *content++ = *str; - } - *content=0; - - *endptr = str; - - return 0; /* all is fine! */ -} - /* Test example headers: WWW-Authenticate: Digest realm="testrealm", nonce="1053604598" @@ -121,181 +43,31 @@ Proxy-Authenticate: Digest realm="testrealm", nonce="1053604598" */ -CURLdigest Curl_input_digest(struct connectdata *conn, - bool proxy, - const char *header) /* rest of the *-authenticate: - header */ +CURLcode Curl_input_digest(struct connectdata *conn, + bool proxy, + const char *header) /* rest of the *-authenticate: + header */ { - char *token = NULL; - char *tmp = NULL; - bool foundAuth = FALSE; - bool foundAuthInt = FALSE; - struct SessionHandle *data=conn->data; - bool before = FALSE; /* got a nonce before */ - struct digestdata *d; + struct SessionHandle *data = conn->data; + + /* Point to the correct struct with this */ + struct digestdata *digest; if(proxy) { - d = &data->state.proxydigest; + digest = &data->state.proxydigest; } else { - d = &data->state.digest; + digest = &data->state.digest; } - /* skip initial whitespaces */ + if(!checkprefix("Digest", header)) + return CURLE_BAD_CONTENT_ENCODING; + + header += strlen("Digest"); while(*header && ISSPACE(*header)) header++; - if(checkprefix("Digest", header)) { - header += strlen("Digest"); - - /* If we already have received a nonce, keep that in mind */ - if(d->nonce) - before = TRUE; - - /* clear off any former leftovers and init to defaults */ - digest_cleanup_one(d); - - for(;;) { - char value[MAX_VALUE_LENGTH]; - char content[MAX_CONTENT_LENGTH]; - - while(*header && ISSPACE(*header)) - header++; - - /* extract a value=content pair */ - if(!get_pair(header, value, content, &header)) { - if(Curl_raw_equal(value, "nonce")) { - d->nonce = strdup(content); - if(!d->nonce) - return CURLDIGEST_NOMEM; - } - else if(Curl_raw_equal(value, "stale")) { - if(Curl_raw_equal(content, "true")) { - d->stale = TRUE; - d->nc = 1; /* we make a new nonce now */ - } - } - else if(Curl_raw_equal(value, "realm")) { - d->realm = strdup(content); - if(!d->realm) - return CURLDIGEST_NOMEM; - } - else if(Curl_raw_equal(value, "opaque")) { - d->opaque = strdup(content); - if(!d->opaque) - return CURLDIGEST_NOMEM; - } - else if(Curl_raw_equal(value, "qop")) { - char *tok_buf; - /* tokenize the list and choose auth if possible, use a temporary - clone of the buffer since strtok_r() ruins it */ - tmp = strdup(content); - if(!tmp) - return CURLDIGEST_NOMEM; - token = strtok_r(tmp, ",", &tok_buf); - while(token != NULL) { - if(Curl_raw_equal(token, "auth")) { - foundAuth = TRUE; - } - else if(Curl_raw_equal(token, "auth-int")) { - foundAuthInt = TRUE; - } - token = strtok_r(NULL, ",", &tok_buf); - } - free(tmp); - /*select only auth o auth-int. Otherwise, ignore*/ - if(foundAuth) { - d->qop = strdup("auth"); - if(!d->qop) - return CURLDIGEST_NOMEM; - } - else if(foundAuthInt) { - d->qop = strdup("auth-int"); - if(!d->qop) - return CURLDIGEST_NOMEM; - } - } - else if(Curl_raw_equal(value, "algorithm")) { - d->algorithm = strdup(content); - if(!d->algorithm) - return CURLDIGEST_NOMEM; - if(Curl_raw_equal(content, "MD5-sess")) - d->algo = CURLDIGESTALGO_MD5SESS; - else if(Curl_raw_equal(content, "MD5")) - d->algo = CURLDIGESTALGO_MD5; - else - return CURLDIGEST_BADALGO; - } - else { - /* unknown specifier, ignore it! */ - } - } - else - break; /* we're done here */ - - /* pass all additional spaces here */ - while(*header && ISSPACE(*header)) - header++; - if(',' == *header) - /* allow the list to be comma-separated */ - header++; - } - /* We had a nonce since before, and we got another one now without - 'stale=true'. This means we provided bad credentials in the previous - request */ - if(before && !d->stale) - return CURLDIGEST_BAD; - - /* We got this header without a nonce, that's a bad Digest line! */ - if(!d->nonce) - return CURLDIGEST_BAD; - } - else - /* else not a digest, get out */ - return CURLDIGEST_NONE; - - return CURLDIGEST_FINE; -} - -/* convert md5 chunk to RFC2617 (section 3.1.3) -suitable ascii string*/ -static void md5_to_ascii(unsigned char *source, /* 16 bytes */ - unsigned char *dest) /* 33 bytes */ -{ - int i; - for(i=0; i<16; i++) - snprintf((char *)&dest[i*2], 3, "%02x", source[i]); -} - -/* Perform quoted-string escaping as described in RFC2616 and its errata */ -static char *string_quoted(const char *source) -{ - char *dest, *d; - const char *s = source; - size_t n = 1; /* null terminator */ - - /* Calculate size needed */ - while(*s) { - ++n; - if(*s == '"' || *s == '\\') { - ++n; - } - ++s; - } - - dest = malloc(n); - if(dest) { - s = source; - d = dest; - while(*s) { - if(*s == '"' || *s == '\\') { - *d++ = '\\'; - } - *d++ = *s++; - } - *d = 0; - } - - return dest; + return Curl_sasl_decode_digest_http_message(header, digest); } CURLcode Curl_output_digest(struct connectdata *conn, @@ -303,48 +75,35 @@ CURLcode Curl_output_digest(struct connectdata *conn, const unsigned char *request, const unsigned char *uripath) { - /* We have a Digest setup for this, use it! Now, to get all the details for - this sorted out, I must urge you dear friend to read up on the RFC2617 - section 3.2.2, */ - unsigned char md5buf[16]; /* 16 bytes/128 bits */ - unsigned char request_digest[33]; - unsigned char *md5this; - unsigned char ha1[33];/* 32 digits and 1 zero byte */ - unsigned char ha2[33];/* 32 digits and 1 zero byte */ - char cnoncebuf[33]; - char *cnonce = NULL; - size_t cnonce_sz = 0; - char *tmp = NULL; + CURLcode result; + struct SessionHandle *data = conn->data; + unsigned char *path; + char *tmp; + char *response; + size_t len; + bool have_chlg; + + /* Point to the address of the pointer that holds the string to send to the + server, which is for a plain host or for a HTTP proxy */ char **allocuserpwd; - size_t userlen; + + /* Point to the name and password for this */ const char *userp; - char *userp_quoted; const char *passwdp; - struct auth *authp; - struct SessionHandle *data = conn->data; - struct digestdata *d; - CURLcode rc; -/* The CURL_OUTPUT_DIGEST_CONV macro below is for non-ASCII machines. - It converts digest text to ASCII so the MD5 will be correct for - what ultimately goes over the network. -*/ -#define CURL_OUTPUT_DIGEST_CONV(a, b) \ - rc = Curl_convert_to_network(a, (char *)b, strlen((const char*)b)); \ - if(rc != CURLE_OK) { \ - free(b); \ - return rc; \ - } + /* Point to the correct struct with this */ + struct digestdata *digest; + struct auth *authp; if(proxy) { - d = &data->state.proxydigest; + digest = &data->state.proxydigest; allocuserpwd = &conn->allocptr.proxyuserpwd; userp = conn->proxyuser; passwdp = conn->proxypasswd; authp = &data->state.authproxy; } else { - d = &data->state.digest; + digest = &data->state.digest; allocuserpwd = &conn->allocptr.userpwd; userp = conn->user; passwdp = conn->passwd; @@ -355,78 +114,21 @@ CURLcode Curl_output_digest(struct connectdata *conn, /* not set means empty */ if(!userp) - userp=""; + userp = ""; if(!passwdp) - passwdp=""; + passwdp = ""; + +#if defined(USE_WINDOWS_SSPI) + have_chlg = digest->input_token ? TRUE : FALSE; +#else + have_chlg = digest->nonce ? TRUE : FALSE; +#endif - if(!d->nonce) { + if(!have_chlg) { authp->done = FALSE; return CURLE_OK; } - authp->done = TRUE; - - if(!d->nc) - d->nc = 1; - - if(!d->cnonce) { - struct timeval now = Curl_tvnow(); - snprintf(cnoncebuf, sizeof(cnoncebuf), "%08x%08x%08x%08x", - Curl_rand(data), Curl_rand(data), - (unsigned int)now.tv_sec, - (unsigned int)now.tv_usec); - - rc = Curl_base64_encode(data, cnoncebuf, strlen(cnoncebuf), - &cnonce, &cnonce_sz); - if(rc) - return rc; - d->cnonce = cnonce; - } - - /* - if the algorithm is "MD5" or unspecified (which then defaults to MD5): - - A1 = unq(username-value) ":" unq(realm-value) ":" passwd - - if the algorithm is "MD5-sess" then: - - A1 = H( unq(username-value) ":" unq(realm-value) ":" passwd ) - ":" unq(nonce-value) ":" unq(cnonce-value) - */ - - md5this = (unsigned char *) - aprintf("%s:%s:%s", userp, d->realm, passwdp); - if(!md5this) - return CURLE_OUT_OF_MEMORY; - - CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ - Curl_md5it(md5buf, md5this); - Curl_safefree(md5this); - md5_to_ascii(md5buf, ha1); - - if(d->algo == CURLDIGESTALGO_MD5SESS) { - /* nonce and cnonce are OUTSIDE the hash */ - tmp = aprintf("%s:%s:%s", ha1, d->nonce, d->cnonce); - if(!tmp) - return CURLE_OUT_OF_MEMORY; - CURL_OUTPUT_DIGEST_CONV(data, tmp); /* convert on non-ASCII machines */ - Curl_md5it(md5buf, (unsigned char *)tmp); - Curl_safefree(tmp); - md5_to_ascii(md5buf, ha1); - } - - /* - If the "qop" directive's value is "auth" or is unspecified, then A2 is: - - A2 = Method ":" digest-uri-value - - If the "qop" value is "auth-int", then A2 is: - - A2 = Method ":" digest-uri-value ":" H(entity-body) - - (The "Method" value is the HTTP request method as specified in section - 5.1.1 of RFC 2616) - */ /* So IE browsers < v7 cut off the URI part at the query part when they evaluate the MD5 and some (IIS?) servers work with them so we may need to @@ -440,165 +142,40 @@ CURLcode Curl_output_digest(struct connectdata *conn, Further details on Digest implementation differences: http://www.fngtps.com/2006/09/http-authentication */ + if(authp->iestyle && ((tmp = strchr((char *)uripath, '?')) != NULL)) { - md5this = (unsigned char *)aprintf("%s:%.*s", request, - curlx_sztosi(tmp - (char *)uripath), - uripath); + size_t urilen = tmp - (char *)uripath; + + path = (unsigned char *) aprintf("%.*s", urilen, uripath); } else - md5this = (unsigned char *)aprintf("%s:%s", request, uripath); - - if(d->qop && Curl_raw_equal(d->qop, "auth-int")) { - /* We don't support auth-int for PUT or POST at the moment. - TODO: replace md5 of empty string with entity-body for PUT/POST */ - unsigned char *md5this2 = (unsigned char *) - aprintf("%s:%s", md5this, "d41d8cd98f00b204e9800998ecf8427e"); - Curl_safefree(md5this); - md5this = md5this2; - } + path = (unsigned char *) strdup((char *) uripath); - if(!md5this) - return CURLE_OUT_OF_MEMORY; - - CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ - Curl_md5it(md5buf, md5this); - Curl_safefree(md5this); - md5_to_ascii(md5buf, ha2); - - if(d->qop) { - md5this = (unsigned char *)aprintf("%s:%s:%08x:%s:%s:%s", - ha1, - d->nonce, - d->nc, - d->cnonce, - d->qop, - ha2); - } - else { - md5this = (unsigned char *)aprintf("%s:%s:%s", - ha1, - d->nonce, - ha2); - } - if(!md5this) + if(!path) return CURLE_OUT_OF_MEMORY; - CURL_OUTPUT_DIGEST_CONV(data, md5this); /* convert on non-ASCII machines */ - Curl_md5it(md5buf, md5this); - Curl_safefree(md5this); - md5_to_ascii(md5buf, request_digest); - - /* for test case 64 (snooped from a Mozilla 1.3a request) - - Authorization: Digest username="testuser", realm="testrealm", \ - nonce="1053604145", uri="/64", response="c55f7f30d83d774a3d2dcacf725abaca" - - Digest parameters are all quoted strings. Username which is provided by - the user will need double quotes and backslashes within it escaped. For - the other fields, this shouldn't be an issue. realm, nonce, and opaque - are copied as is from the server, escapes and all. cnonce is generated - with web-safe characters. uri is already percent encoded. nc is 8 hex - characters. algorithm and qop with standard values only contain web-safe - chracters. - */ - userp_quoted = string_quoted(userp); - if(!userp_quoted) - return CURLE_OUT_OF_MEMORY; + result = Curl_sasl_create_digest_http_message(data, userp, passwdp, request, + path, digest, &response, &len); + free(path); + if(result) + return result; - if(d->qop) { - *allocuserpwd = - aprintf( "%sAuthorization: Digest " - "username=\"%s\", " - "realm=\"%s\", " - "nonce=\"%s\", " - "uri=\"%s\", " - "cnonce=\"%s\", " - "nc=%08x, " - "qop=%s, " - "response=\"%s\"", - proxy?"Proxy-":"", - userp_quoted, - d->realm, - d->nonce, - uripath, /* this is the PATH part of the URL */ - d->cnonce, - d->nc, - d->qop, - request_digest); - - if(Curl_raw_equal(d->qop, "auth")) - d->nc++; /* The nc (from RFC) has to be a 8 hex digit number 0 padded - which tells to the server how many times you are using the - same nonce in the qop=auth mode. */ - } - else { - *allocuserpwd = - aprintf( "%sAuthorization: Digest " - "username=\"%s\", " - "realm=\"%s\", " - "nonce=\"%s\", " - "uri=\"%s\", " - "response=\"%s\"", - proxy?"Proxy-":"", - userp_quoted, - d->realm, - d->nonce, - uripath, /* this is the PATH part of the URL */ - request_digest); - } - Curl_safefree(userp_quoted); + *allocuserpwd = aprintf("%sAuthorization: Digest %s\r\n", + proxy ? "Proxy-" : "", + response); + free(response); if(!*allocuserpwd) return CURLE_OUT_OF_MEMORY; - /* Add optional fields */ - if(d->opaque) { - /* append opaque */ - tmp = aprintf("%s, opaque=\"%s\"", *allocuserpwd, d->opaque); - if(!tmp) - return CURLE_OUT_OF_MEMORY; - free(*allocuserpwd); - *allocuserpwd = tmp; - } - - if(d->algorithm) { - /* append algorithm */ - tmp = aprintf("%s, algorithm=\"%s\"", *allocuserpwd, d->algorithm); - if(!tmp) - return CURLE_OUT_OF_MEMORY; - free(*allocuserpwd); - *allocuserpwd = tmp; - } - - /* append CRLF + zero (3 bytes) to the userpwd header */ - userlen = strlen(*allocuserpwd); - tmp = realloc(*allocuserpwd, userlen + 3); - if(!tmp) - return CURLE_OUT_OF_MEMORY; - strcpy(&tmp[userlen], "\r\n"); /* append the data */ - *allocuserpwd = tmp; + authp->done = TRUE; return CURLE_OK; } -static void digest_cleanup_one(struct digestdata *d) -{ - Curl_safefree(d->nonce); - Curl_safefree(d->cnonce); - Curl_safefree(d->realm); - Curl_safefree(d->opaque); - Curl_safefree(d->qop); - Curl_safefree(d->algorithm); - - d->nc = 0; - d->algo = CURLDIGESTALGO_MD5; /* default algorithm */ - d->stale = FALSE; /* default means normal, not stale */ -} - - void Curl_digest_cleanup(struct SessionHandle *data) { - digest_cleanup_one(&data->state.digest); - digest_cleanup_one(&data->state.proxydigest); + Curl_sasl_digest_cleanup(&data->state.digest); + Curl_sasl_digest_cleanup(&data->state.proxydigest); } #endif diff --git a/lib/http_digest.h b/lib/http_digest.h index c6a4e91..d13d563 100644 --- a/lib/http_digest.h +++ b/lib/http_digest.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,24 +23,9 @@ ***************************************************************************/ #include "curl_setup.h" -typedef enum { - CURLDIGEST_NONE, /* not a digest */ - CURLDIGEST_BAD, /* a digest, but one we don't like */ - CURLDIGEST_BADALGO, /* unsupported algorithm requested */ - CURLDIGEST_NOMEM, - CURLDIGEST_FINE, /* a digest we act on */ - - CURLDIGEST_LAST /* last entry in this enum, don't use */ -} CURLdigest; - -enum { - CURLDIGESTALGO_MD5, - CURLDIGESTALGO_MD5SESS -}; - /* this is for digest header input */ -CURLdigest Curl_input_digest(struct connectdata *conn, - bool proxy, const char *header); +CURLcode Curl_input_digest(struct connectdata *conn, + bool proxy, const char *header); /* this is for creating digest header output */ CURLcode Curl_output_digest(struct connectdata *conn, diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c index 9b981b3..97d0cb7 100644 --- a/lib/http_negotiate.c +++ b/lib/http_negotiate.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,13 +23,14 @@ #include "curl_setup.h" #ifdef HAVE_GSSAPI + +#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO) + #ifdef HAVE_OLD_GSSMIT #define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name #define NCOMPAT 1 #endif -#ifndef CURL_DISABLE_HTTP - #include "urldata.h" #include "sendf.h" #include "curl_gssapi.h" @@ -39,19 +40,6 @@ #include "curl_memory.h" #include "url.h" -#ifdef HAVE_SPNEGO -# include -# ifdef USE_SSLEAY -# ifdef USE_OPENSSL -# include -# else -# include -# endif -# else -# error "Can't compile SPNEGO support without OpenSSL." -# endif -#endif - #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -61,24 +49,10 @@ static int get_gss_name(struct connectdata *conn, bool proxy, gss_name_t *server) { - struct negotiatedata *neg_ctx = proxy?&conn->data->state.proxyneg: - &conn->data->state.negotiate; OM_uint32 major_status, minor_status; gss_buffer_desc token = GSS_C_EMPTY_BUFFER; char name[2048]; - const char* service; - - /* GSSAPI implementation by Globus (known as GSI) requires the name to be - of form "/" instead of @ (ie. slash instead - of at-sign). Also GSI servers are often identified as 'host' not 'khttp'. - Change following lines if you want to use GSI */ - - /* IIS uses the @ form but uses 'http' as the service name */ - - if(neg_ctx->gss) - service = "KHTTP"; - else - service = "HTTP"; + const char* service = "HTTP"; token.length = strlen(service) + 1 + strlen(proxy ? conn->proxy.name : conn->host.name) + 1; @@ -97,36 +71,6 @@ get_gss_name(struct connectdata *conn, bool proxy, gss_name_t *server) return GSS_ERROR(major_status) ? -1 : 0; } -static void -log_gss_error(struct connectdata *conn, OM_uint32 error_status, - const char *prefix) -{ - OM_uint32 maj_stat, min_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - char buf[1024]; - size_t len; - - snprintf(buf, sizeof(buf), "%s", prefix); - len = strlen(buf); - do { - maj_stat = gss_display_status(&min_stat, - error_status, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - if(sizeof(buf) > len + status_string.length + 1) { - snprintf(buf + len, sizeof(buf) - len, - ": %s", (char*) status_string.value); - len += status_string.length; - } - gss_release_buffer(&min_stat, &status_string); - } while(!GSS_ERROR(maj_stat) && msg_ctx != 0); - - infof(conn->data, "%s\n", buf); -} - /* returning zero (0) means success, everything else is treated as "failure" with no care exactly what the failure was */ int Curl_input_negotiate(struct connectdata *conn, bool proxy, @@ -141,32 +85,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, int ret; size_t len; size_t rawlen = 0; - bool gss; - const char* protocol; - CURLcode error; - - while(*header && ISSPACE(*header)) - header++; - if(checkprefix("GSS-Negotiate", header)) { - protocol = "GSS-Negotiate"; - gss = TRUE; - } - else if(checkprefix("Negotiate", header)) { - protocol = "Negotiate"; - gss = FALSE; - } - else - return -1; - - if(neg_ctx->context) { - if(neg_ctx->gss != gss) { - return -1; - } - } - else { - neg_ctx->protocol = protocol; - neg_ctx->gss = gss; - } + CURLcode result; if(neg_ctx->context && neg_ctx->status == GSS_S_COMPLETE) { /* We finished successfully our part of authentication, but server @@ -180,75 +99,30 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, (ret = get_gss_name(conn, proxy, &neg_ctx->server_name))) return ret; - header += strlen(neg_ctx->protocol); + header += strlen("Negotiate"); while(*header && ISSPACE(*header)) header++; len = strlen(header); if(len > 0) { - error = Curl_base64_decode(header, - (unsigned char **)&input_token.value, &rawlen); - if(error || rawlen == 0) + result = Curl_base64_decode(header, (unsigned char **)&input_token.value, + &rawlen); + if(result || rawlen == 0) return -1; input_token.length = rawlen; DEBUGASSERT(input_token.value != NULL); - -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ - if(checkprefix("Negotiate", header)) { - unsigned char *spnegoToken = NULL; - size_t spnegoTokenLength = 0; - gss_buffer_desc mechToken = GSS_C_EMPTY_BUFFER; - - spnegoToken = malloc(input_token.length); - if(spnegoToken == NULL) { - Curl_safefree(input_token.value); - return CURLE_OUT_OF_MEMORY; - } - memcpy(spnegoToken, input_token.value, input_token.length); - spnegoTokenLength = input_token.length; - - if(!parseSpnegoTargetToken(spnegoToken, - spnegoTokenLength, - NULL, - NULL, - (unsigned char**)&mechToken.value, - &mechToken.length, - NULL, - NULL)) { - Curl_safefree(spnegoToken); - infof(data, "Parse SPNEGO Target Token failed\n"); - } - else if(!mechToken.value || !mechToken.length) { - Curl_safefree(spnegoToken); - if(mechToken.value) - gss_release_buffer(&discard_st, &mechToken); - infof(data, "Parse SPNEGO Target Token succeeded (NULL token)\n"); - } - else { - Curl_safefree(spnegoToken); - Curl_safefree(input_token.value); - input_token.value = malloc(mechToken.length); - if(input_token.value == NULL) { - gss_release_buffer(&discard_st, &mechToken); - return CURLE_OUT_OF_MEMORY; - } - memcpy(input_token.value, mechToken.value, mechToken.length); - input_token.length = mechToken.length; - gss_release_buffer(&discard_st, &mechToken); - infof(data, "Parse SPNEGO Target Token succeeded\n"); - } - } -#endif } major_status = Curl_gss_init_sec_context(data, &minor_status, &neg_ctx->context, neg_ctx->server_name, + &Curl_spnego_mech_oid, GSS_C_NO_CHANNEL_BINDINGS, &input_token, &output_token, + TRUE, NULL); Curl_safefree(input_token.value); @@ -256,7 +130,8 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, if(GSS_ERROR(major_status)) { if(output_token.value) gss_release_buffer(&discard_st, &output_token); - log_gss_error(conn, minor_status, "gss_init_sec_context() failed: "); + Curl_gss_log_error(conn->data, minor_status, + "gss_init_sec_context() failed: "); return -1; } @@ -278,64 +153,18 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) char *encoded = NULL; size_t len = 0; char *userp; - CURLcode error; + CURLcode result; OM_uint32 discard_st; -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ - if(checkprefix("Negotiate", neg_ctx->protocol)) { - ASN1_OBJECT *object = NULL; - unsigned char *responseToken = NULL; - size_t responseTokenLength = 0; - gss_buffer_desc spnegoToken = GSS_C_EMPTY_BUFFER; - - responseToken = malloc(neg_ctx->output_token.length); - if(responseToken == NULL) - return CURLE_OUT_OF_MEMORY; - memcpy(responseToken, neg_ctx->output_token.value, - neg_ctx->output_token.length); - responseTokenLength = neg_ctx->output_token.length; - - object = OBJ_txt2obj("1.2.840.113554.1.2.2", 1); - if(!object) { - Curl_safefree(responseToken); - return CURLE_OUT_OF_MEMORY; - } - - if(!makeSpnegoInitialToken(object, - responseToken, - responseTokenLength, - (unsigned char**)&spnegoToken.value, - &spnegoToken.length)) { - Curl_safefree(responseToken); - ASN1_OBJECT_free(object); - infof(conn->data, "Make SPNEGO Initial Token failed\n"); - } - else if(!spnegoToken.value || !spnegoToken.length) { - Curl_safefree(responseToken); - ASN1_OBJECT_free(object); - if(spnegoToken.value) - gss_release_buffer(&discard_st, &spnegoToken); - infof(conn->data, "Make SPNEGO Initial Token succeeded (NULL token)\n"); - } - else { - Curl_safefree(responseToken); - ASN1_OBJECT_free(object); - gss_release_buffer(&discard_st, &neg_ctx->output_token); - neg_ctx->output_token.value = spnegoToken.value; - neg_ctx->output_token.length = spnegoToken.length; - infof(conn->data, "Make SPNEGO Initial Token succeeded\n"); - } - } -#endif - error = Curl_base64_encode(conn->data, - neg_ctx->output_token.value, - neg_ctx->output_token.length, - &encoded, &len); - if(error) { + result = Curl_base64_encode(conn->data, + neg_ctx->output_token.value, + neg_ctx->output_token.length, + &encoded, &len); + if(result) { gss_release_buffer(&discard_st, &neg_ctx->output_token); neg_ctx->output_token.value = NULL; neg_ctx->output_token.length = 0; - return error; + return result; } if(!encoded || !len) { @@ -345,8 +174,8 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) return CURLE_REMOTE_ACCESS_DENIED; } - userp = aprintf("%sAuthorization: %s %s\r\n", proxy ? "Proxy-" : "", - neg_ctx->protocol, encoded); + userp = aprintf("%sAuthorization: Negotiate %s\r\n", proxy ? "Proxy-" : "", + encoded); if(proxy) { Curl_safefree(conn->allocptr.proxyuserpwd); conn->allocptr.proxyuserpwd = userp; @@ -357,7 +186,6 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) } Curl_safefree(encoded); - Curl_cleanup_negotiate(conn->data); return (userp == NULL) ? CURLE_OUT_OF_MEMORY : CURLE_OK; } @@ -383,6 +211,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data) cleanup(&data->state.proxyneg); } +#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */ -#endif -#endif +#endif /* HAVE_GSSAPI */ diff --git a/lib/http_negotiate.h b/lib/http_negotiate.h index e584d76..f7efe8c 100644 --- a/lib/http_negotiate.h +++ b/lib/http_negotiate.h @@ -22,7 +22,7 @@ * ***************************************************************************/ -#ifdef USE_HTTP_NEGOTIATE +#ifdef USE_SPNEGO /* this is for Negotiate header input */ int Curl_input_negotiate(struct connectdata *conn, bool proxy, @@ -37,6 +37,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data); #define GSS_ERROR(status) (status & 0x80000000) #endif -#endif /* USE_HTTP_NEGOTIATE */ +#endif /* USE_SPNEGO */ #endif /* HEADER_CURL_HTTP_NEGOTIATE_H */ diff --git a/lib/http_negotiate_sspi.c b/lib/http_negotiate_sspi.c index 1381d52..d651ac9 100644 --- a/lib/http_negotiate_sspi.c +++ b/lib/http_negotiate_sspi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,13 +24,14 @@ #ifdef USE_WINDOWS_SSPI -#ifndef CURL_DISABLE_HTTP +#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO) #include "urldata.h" #include "sendf.h" #include "rawstr.h" #include "warnless.h" #include "curl_base64.h" +#include "curl_sasl.h" #include "http_negotiate.h" #include "curl_memory.h" #include "curl_multibyte.h" @@ -41,87 +42,47 @@ /* The last #include file should be: */ #include "memdebug.h" -static int -get_gss_name(struct connectdata *conn, bool proxy, - struct negotiatedata *neg_ctx) -{ - const char* service; - size_t length; - - if(proxy && !conn->proxy.name) - /* proxy auth requested but no given proxy name, error out! */ - return -1; - - /* GSSAPI implementation by Globus (known as GSI) requires the name to be - of form "/" instead of @ (ie. slash instead - of at-sign). Also GSI servers are often identified as 'host' not 'khttp'. - Change following lines if you want to use GSI */ - - /* IIS uses the @ form but uses 'http' as the service name, - and SSPI then generates an NTLM token. When using / a - Kerberos token is generated. */ - - if(neg_ctx->gss) - service = "KHTTP"; - else - service = "HTTP"; - - length = strlen(service) + 1 + strlen(proxy ? conn->proxy.name : - conn->host.name) + 1; - if(length + 1 > sizeof(neg_ctx->server_name)) - return EMSGSIZE; - - snprintf(neg_ctx->server_name, sizeof(neg_ctx->server_name), "%s/%s", - service, proxy ? conn->proxy.name : conn->host.name); - - return 0; -} - /* returning zero (0) means success, everything else is treated as "failure" with no care exactly what the failure was */ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *header) { - struct negotiatedata *neg_ctx = proxy?&conn->data->state.proxyneg: - &conn->data->state.negotiate; - BYTE *input_token = 0; + BYTE *input_token = NULL; SecBufferDesc out_buff_desc; SecBuffer out_sec_buff; SecBufferDesc in_buff_desc; SecBuffer in_sec_buff; unsigned long context_attributes; - TimeStamp lifetime; - TCHAR *sname; + TimeStamp expiry; int ret; size_t len = 0, input_token_len = 0; - bool gss = FALSE; - const char* protocol; CURLcode error; - while(*header && ISSPACE(*header)) - header++; + /* Point to the username and password */ + const char *userp; + const char *passwdp; - if(checkprefix("GSS-Negotiate", header)) { - protocol = "GSS-Negotiate"; - gss = TRUE; - } - else if(checkprefix("Negotiate", header)) { - protocol = "Negotiate"; - gss = FALSE; - } - else - return -1; + /* Point to the correct struct with this */ + struct negotiatedata *neg_ctx; - if(neg_ctx->context) { - if(neg_ctx->gss != gss) { - return -1; - } + if(proxy) { + userp = conn->proxyuser; + passwdp = conn->proxypasswd; + neg_ctx = &conn->data->state.proxyneg; } else { - neg_ctx->protocol = protocol; - neg_ctx->gss = gss; + userp = conn->user; + passwdp = conn->passwd; + neg_ctx = &conn->data->state.negotiate; } + /* Not set means empty */ + if(!userp) + userp = ""; + + if(!passwdp) + passwdp = ""; + if(neg_ctx->context && neg_ctx->status == SEC_E_OK) { /* We finished successfully our part of authentication, but server * rejected it (since we're again here). Exit with an error since we @@ -130,102 +91,119 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, return -1; } - if(0 == strlen(neg_ctx->server_name)) { - ret = get_gss_name(conn, proxy, neg_ctx); - if(ret) - return ret; + if(!neg_ctx->server_name) { + /* Check proxy auth requested but no given proxy name */ + if(proxy && !conn->proxy.name) + return -1; + + /* Generate our SPN */ + neg_ctx->server_name = Curl_sasl_build_spn("HTTP", + proxy ? conn->proxy.name : + conn->host.name); + if(!neg_ctx->server_name) + return -1; } if(!neg_ctx->output_token) { PSecPkgInfo SecurityPackage; - ret = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT("Negotiate"), + ret = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NEGOTIATE), &SecurityPackage); if(ret != SEC_E_OK) return -1; /* Allocate input and output buffers according to the max token size as indicated by the security package */ - neg_ctx->max_token_length = SecurityPackage->cbMaxToken; - neg_ctx->output_token = malloc(neg_ctx->max_token_length); + neg_ctx->token_max = SecurityPackage->cbMaxToken; + neg_ctx->output_token = malloc(neg_ctx->token_max); s_pSecFn->FreeContextBuffer(SecurityPackage); } /* Obtain the input token, if any */ - header += strlen(neg_ctx->protocol); + header += strlen("Negotiate"); while(*header && ISSPACE(*header)) header++; len = strlen(header); if(!len) { - /* first call in a new negotation, we have to acquire credentials, - and allocate memory for the context */ + /* Is this the first call in a new negotiation? */ + if(neg_ctx->context) { + /* The server rejected our authentication and hasn't suppled any more + negotiation mechanisms */ + return -1; + } + /* We have to acquire credentials and allocate memory for the context */ neg_ctx->credentials = malloc(sizeof(CredHandle)); neg_ctx->context = malloc(sizeof(CtxtHandle)); if(!neg_ctx->credentials || !neg_ctx->context) return -1; + if(userp && *userp) { + /* Populate our identity structure */ + error = Curl_create_sspi_identity(userp, passwdp, &neg_ctx->identity); + if(error) + return -1; + + /* Allow proper cleanup of the identity structure */ + neg_ctx->p_identity = &neg_ctx->identity; + } + else + /* Use the current Windows user */ + neg_ctx->p_identity = NULL; + + /* Acquire our credientials handle */ neg_ctx->status = s_pSecFn->AcquireCredentialsHandle(NULL, - (TCHAR *) TEXT("Negotiate"), - SECPKG_CRED_OUTBOUND, NULL, NULL, - NULL, NULL, neg_ctx->credentials, - &lifetime); + (TCHAR *) TEXT(SP_NAME_NEGOTIATE), + SECPKG_CRED_OUTBOUND, NULL, + neg_ctx->p_identity, NULL, NULL, + neg_ctx->credentials, &expiry); if(neg_ctx->status != SEC_E_OK) return -1; } else { - input_token = malloc(neg_ctx->max_token_length); - if(!input_token) - return -1; - error = Curl_base64_decode(header, (unsigned char **)&input_token, &input_token_len); - if(error || input_token_len == 0) + if(error || !input_token_len) return -1; } - /* prepare the output buffers, and input buffers if present */ - out_buff_desc.ulVersion = 0; + /* Setup the "output" security buffer */ + out_buff_desc.ulVersion = SECBUFFER_VERSION; out_buff_desc.cBuffers = 1; out_buff_desc.pBuffers = &out_sec_buff; - - out_sec_buff.cbBuffer = curlx_uztoul(neg_ctx->max_token_length); out_sec_buff.BufferType = SECBUFFER_TOKEN; out_sec_buff.pvBuffer = neg_ctx->output_token; + out_sec_buff.cbBuffer = curlx_uztoul(neg_ctx->token_max); - + /* Setup the "input" security buffer if present */ if(input_token) { - in_buff_desc.ulVersion = 0; + in_buff_desc.ulVersion = SECBUFFER_VERSION; in_buff_desc.cBuffers = 1; in_buff_desc.pBuffers = &in_sec_buff; - - in_sec_buff.cbBuffer = curlx_uztoul(input_token_len); in_sec_buff.BufferType = SECBUFFER_TOKEN; in_sec_buff.pvBuffer = input_token; + in_sec_buff.cbBuffer = curlx_uztoul(input_token_len); } - sname = Curl_convert_UTF8_to_tchar(neg_ctx->server_name); - if(!sname) - return CURLE_OUT_OF_MEMORY; - + /* Generate our message */ neg_ctx->status = s_pSecFn->InitializeSecurityContext( neg_ctx->credentials, - input_token ? neg_ctx->context : 0, - sname, + input_token ? neg_ctx->context : NULL, + neg_ctx->server_name, ISC_REQ_CONFIDENTIALITY, 0, SECURITY_NATIVE_DREP, - input_token ? &in_buff_desc : 0, + input_token ? &in_buff_desc : NULL, 0, neg_ctx->context, &out_buff_desc, &context_attributes, - &lifetime); + &expiry); - Curl_unicodefree(sname); + Curl_safefree(input_token); if(GSS_ERROR(neg_ctx->status)) return -1; @@ -260,41 +238,50 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) if(error) return error; - if(len == 0) + if(!len) return CURLE_REMOTE_ACCESS_DENIED; - userp = aprintf("%sAuthorization: %s %s\r\n", proxy ? "Proxy-" : "", - neg_ctx->protocol, encoded); + userp = aprintf("%sAuthorization: Negotiate %s\r\n", proxy ? "Proxy-" : "", + encoded); - if(proxy) + if(proxy) { + Curl_safefree(conn->allocptr.proxyuserpwd); conn->allocptr.proxyuserpwd = userp; - else + } + else { + Curl_safefree(conn->allocptr.userpwd); conn->allocptr.userpwd = userp; + } free(encoded); - Curl_cleanup_negotiate (conn->data); return (userp == NULL) ? CURLE_OUT_OF_MEMORY : CURLE_OK; } static void cleanup(struct negotiatedata *neg_ctx) { + /* Free our security context */ if(neg_ctx->context) { s_pSecFn->DeleteSecurityContext(neg_ctx->context); free(neg_ctx->context); - neg_ctx->context = 0; + neg_ctx->context = NULL; } + /* Free our credentials handle */ if(neg_ctx->credentials) { s_pSecFn->FreeCredentialsHandle(neg_ctx->credentials); free(neg_ctx->credentials); - neg_ctx->credentials = 0; + neg_ctx->credentials = NULL; } - if(neg_ctx->output_token) { - free(neg_ctx->output_token); - neg_ctx->output_token = 0; - } + /* Free our identity */ + Curl_sspi_free_identity(neg_ctx->p_identity); + neg_ctx->p_identity = NULL; + + /* Free the SPN and output token */ + Curl_safefree(neg_ctx->server_name); + Curl_safefree(neg_ctx->output_token); - neg_ctx->max_token_length = 0; + /* Reset any variables */ + neg_ctx->token_max = 0; } void Curl_cleanup_negotiate(struct SessionHandle *data) @@ -303,6 +290,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data) cleanup(&data->state.proxyneg); } +#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */ -#endif -#endif +#endif /* USE_WINDOWS_SSPI */ diff --git a/lib/http_proxy.c b/lib/http_proxy.c index 7c60e95..72123ed 100644 --- a/lib/http_proxy.c +++ b/lib/http_proxy.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -66,13 +66,13 @@ CURLcode Curl_proxy_connect(struct connectdata *conn) * This function might be called several times in the multi interface case * if the proxy's CONNTECT response is not instant. */ - prot_save = conn->data->state.proto.generic; + prot_save = conn->data->req.protop; memset(&http_proxy, 0, sizeof(http_proxy)); - conn->data->state.proto.http = &http_proxy; - conn->bits.close = FALSE; + conn->data->req.protop = &http_proxy; + connkeep(conn, "HTTP proxy CONNECT"); result = Curl_proxyCONNECT(conn, FIRSTSOCKET, conn->host.name, conn->remote_port); - conn->data->state.proto.generic = prot_save; + conn->data->req.protop = prot_save; if(CURLE_OK != result) return result; #else @@ -92,14 +92,12 @@ CURLcode Curl_proxy_connect(struct connectdata *conn) CURLcode Curl_proxyCONNECT(struct connectdata *conn, int sockindex, const char *hostname, - unsigned short remote_port) + int remote_port) { int subversion=0; struct SessionHandle *data=conn->data; struct SingleRequest *k = &data->req; CURLcode result; - long timeout = - data->set.timeout?data->set.timeout:PROXY_TIMEOUT; /* in milliseconds */ curl_socket_t tunnelsocket = conn->sock[sockindex]; curl_off_t cl=0; bool closeConnection = FALSE; @@ -150,7 +148,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, free(host_port); - if(CURLE_OK == result) { + if(!result) { char *host=(char *)""; const char *proxyconn=""; const char *useragent=""; @@ -165,7 +163,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, return CURLE_OUT_OF_MEMORY; } - if(!Curl_checkheaders(data, "Host:")) { + if(!Curl_checkProxyheaders(conn, "Host:")) { host = aprintf("Host: %s\r\n", hostheader); if(!host) { free(hostheader); @@ -173,10 +171,10 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, return CURLE_OUT_OF_MEMORY; } } - if(!Curl_checkheaders(data, "Proxy-Connection:")) + if(!Curl_checkProxyheaders(conn, "Proxy-Connection:")) proxyconn = "Proxy-Connection: Keep-Alive\r\n"; - if(!Curl_checkheaders(data, "User-Agent:") && + if(!Curl_checkProxyheaders(conn, "User-Agent:") && data->set.str[STRING_USERAGENT]) useragent = conn->allocptr.uagent; @@ -199,14 +197,14 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, free(host); free(hostheader); - if(CURLE_OK == result) - result = Curl_add_custom_headers(conn, req_buffer); + if(!result) + result = Curl_add_custom_headers(conn, TRUE, req_buffer); - if(CURLE_OK == result) + if(!result) /* CRLF terminate the request */ result = Curl_add_bufferf(req_buffer, "\r\n"); - if(CURLE_OK == result) { + if(!result) { /* Send the connect request to the proxy */ /* BLOCKING */ result = @@ -223,14 +221,25 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, return result; conn->tunnel_state[sockindex] = TUNNEL_CONNECT; + } /* END CONNECT PHASE */ + + check = Curl_timeleft(data, NULL, TRUE); + if(check <= 0) { + failf(data, "Proxy CONNECT aborted due to timeout"); + return CURLE_RECV_ERROR; + } - /* now we've issued the CONNECT and we're waiting to hear back, return - and get called again polling-style */ + if(0 == Curl_socket_ready(tunnelsocket, CURL_SOCKET_BAD, 0)) + /* return so we'll be called again polling-style */ return CURLE_OK; + else { + DEBUGF(infof(data, + "Read response immediately from proxy CONNECT\n")); + } - } /* END CONNECT PHASE */ + /* at this point, the tunnel_connecting phase is over. */ - { /* BEGIN NEGOTIATION PHASE */ + { /* READING RESPONSE PHASE */ size_t nread; /* total size read */ int perline; /* count bytes per line */ int keepon=TRUE; @@ -243,13 +252,10 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, nread=0; perline=0; - keepon=TRUE; while((nreadnow); /* spent time */ + check = Curl_timeleft(data, NULL, TRUE); if(check <= 0) { failf(data, "Proxy CONNECT aborted due to timeout"); error = SELECT_TIMEOUT; /* already too little time */ @@ -279,6 +285,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, /* proxy auth was requested and there was proxy auth available, then deem this as "mere" proxy disconnect */ conn->bits.proxy_connect_closed = TRUE; + infof(data, "Proxy CONNECT connection closed"); } else { error = SELECT_ERROR; @@ -380,9 +387,9 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, keepon = 2; if(cl) { - - infof(data, "Ignore %" FORMAT_OFF_T + infof(data, "Ignore %" CURL_FORMAT_CURL_OFF_T " bytes of response-body\n", cl); + /* remove the remaining chunk of what we already read */ cl -= (gotbytes - i); @@ -452,8 +459,16 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, (401 == k->httpcode)) || (checkprefix("Proxy-authenticate:", line_start) && (407 == k->httpcode))) { - result = Curl_http_input_auth(conn, k->httpcode, - line_start); + + bool proxy = (k->httpcode == 407) ? TRUE : FALSE; + char *auth = Curl_copy_header_value(line_start); + if(!auth) + return CURLE_OUT_OF_MEMORY; + + result = Curl_http_input_auth(conn, proxy, auth); + + Curl_safefree(auth); + if(result) return result; } @@ -519,7 +534,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, conn->sock[sockindex] = CURL_SOCKET_BAD; break; } - } /* END NEGOTIATION PHASE */ + } /* END READING RESPONSE PHASE */ /* If we are supposed to continue and request a new URL, which basically * means the HTTP authentication is still going on so if the tunnel @@ -534,22 +549,33 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, } while(data->req.newurl); if(200 != data->req.httpcode) { - failf(data, "Received HTTP code %d from proxy after CONNECT", - data->req.httpcode); - - if(closeConnection && data->req.newurl) + if(closeConnection && data->req.newurl) { conn->bits.proxy_connect_closed = TRUE; - - if(data->req.newurl) { - /* this won't be used anymore for the CONNECT so free it now */ - free(data->req.newurl); - data->req.newurl = NULL; + infof(data, "Connect me again please\n"); + } + else { + if(data->req.newurl) { + /* this won't be used anymore for the CONNECT so free it now */ + free(data->req.newurl); + data->req.newurl = NULL; + } + /* failure, close this connection to avoid re-use */ + connclose(conn, "proxy CONNECT failure"); + Curl_closesocket(conn, conn->sock[sockindex]); + conn->sock[sockindex] = CURL_SOCKET_BAD; } /* to back to init state */ conn->tunnel_state[sockindex] = TUNNEL_INIT; - return CURLE_RECV_ERROR; + if(conn->bits.proxy_connect_closed) + /* this is not an error, just part of the connection negotiation */ + return CURLE_OK; + else { + failf(data, "Received HTTP code %d from proxy after CONNECT", + data->req.httpcode); + return CURLE_RECV_ERROR; + } } conn->tunnel_state[sockindex] = TUNNEL_COMPLETE; diff --git a/lib/http_proxy.h b/lib/http_proxy.h index 518c093..2b5e9c9 100644 --- a/lib/http_proxy.h +++ b/lib/http_proxy.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,7 +26,7 @@ /* ftp can use this as well */ CURLcode Curl_proxyCONNECT(struct connectdata *conn, int tunnelsocket, - const char *hostname, unsigned short remote_port); + const char *hostname, int remote_port); /* Default proxy timeout in milliseconds */ #define PROXY_TIMEOUT (3600*1000) diff --git a/lib/idn_win32.c b/lib/idn_win32.c index 464964b..b369723 100644 --- a/lib/idn_win32.c +++ b/lib/idn_win32.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -35,8 +35,31 @@ #include "memdebug.h" #ifdef WANT_IDN_PROTOTYPES -WINBASEAPI int WINAPI IdnToAscii(DWORD, const WCHAR *, int, WCHAR *, int); -WINBASEAPI int WINAPI IdnToUnicode(DWORD, const WCHAR *, int, WCHAR *, int); +# if defined(_SAL_VERSION) +WINNORMALIZEAPI int WINAPI +IdnToAscii(_In_ DWORD dwFlags, + _In_reads_(cchUnicodeChar) LPCWSTR lpUnicodeCharStr, + _In_ int cchUnicodeChar, + _Out_writes_opt_(cchASCIIChar) LPWSTR lpASCIICharStr, + _In_ int cchASCIIChar); +WINNORMALIZEAPI int WINAPI +IdnToUnicode(_In_ DWORD dwFlags, + _In_reads_(cchASCIIChar) LPCWSTR lpASCIICharStr, + _In_ int cchASCIIChar, + _Out_writes_opt_(cchUnicodeChar) LPWSTR lpUnicodeCharStr, + _In_ int cchUnicodeChar); +# else +WINBASEAPI int WINAPI IdnToAscii(DWORD dwFlags, + const WCHAR *lpUnicodeCharStr, + int cchUnicodeChar, + WCHAR *lpASCIICharStr, + int cchASCIIChar); +WINBASEAPI int WINAPI IdnToUnicode(DWORD dwFlags, + const WCHAR *lpASCIICharStr, + int cchASCIIChar, + WCHAR *lpUnicodeCharStr, + int cchUnicodeChar); +# endif #endif #define IDN_MAX_LENGTH 255 diff --git a/lib/if2ip.c b/lib/if2ip.c index 05ae7d6..389feed 100644 --- a/lib/if2ip.c +++ b/lib/if2ip.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -63,6 +63,38 @@ /* ------------------------------------------------------------------ */ +/* Return the scope of the given address. */ +unsigned int Curl_ipv6_scope(const struct sockaddr *sa) +{ +#ifndef ENABLE_IPV6 + (void) sa; +#else + if(sa->sa_family == AF_INET6) { + const struct sockaddr_in6 * sa6 = (const struct sockaddr_in6 *) sa; + const unsigned char * b = sa6->sin6_addr.s6_addr; + unsigned short w = (unsigned short) ((b[0] << 8) | b[1]); + + switch(w & 0xFFC0) { + case 0xFE80: + return IPV6_SCOPE_LINKLOCAL; + case 0xFEC0: + return IPV6_SCOPE_SITELOCAL; + case 0x0000: + w = b[1] | b[2] | b[3] | b[4] | b[5] | b[6] | b[7] | b[8] | b[9] | + b[10] | b[11] | b[12] | b[13] | b[14]; + if(w || b[15] != 0x01) + break; + return IPV6_SCOPE_NODELOCAL; + default: + break; + } + } +#endif + + return IPV6_SCOPE_GLOBAL; +} + + #if defined(HAVE_GETIFADDRS) bool Curl_if_is_interface_name(const char *interf) @@ -84,41 +116,58 @@ bool Curl_if_is_interface_name(const char *interf) } if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, - const char *interf, char *buf, int buf_size) + unsigned int remote_scope_id, const char *interf, + char *buf, int buf_size) { struct ifaddrs *iface, *head; if2ip_result_t res = IF2IP_NOT_FOUND; #ifndef ENABLE_IPV6 (void) remote_scope; + +#ifndef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + (void) remote_scope_id; +#endif + #endif if(getifaddrs(&head) >= 0) { - for(iface=head; iface != NULL; iface=iface->ifa_next) { + for(iface = head; iface != NULL; iface=iface->ifa_next) { if(iface->ifa_addr != NULL) { if(iface->ifa_addr->sa_family == af) { if(curl_strequal(iface->ifa_name, interf)) { void *addr; char *ip; - char scope[12]=""; + char scope[12] = ""; char ipstr[64]; #ifdef ENABLE_IPV6 if(af == AF_INET6) { unsigned int scopeid = 0; + unsigned int ifscope = Curl_ipv6_scope(iface->ifa_addr); + + if(ifscope != remote_scope) { + /* We are interested only in interface addresses whose + scope matches the remote address we want to + connect to: global for global, link-local for + link-local, etc... */ + if(res == IF2IP_NOT_FOUND) res = IF2IP_AF_NOT_SUPPORTED; + continue; + } + addr = &((struct sockaddr_in6 *)iface->ifa_addr)->sin6_addr; #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID /* Include the scope of this interface as part of the address */ scopeid = ((struct sockaddr_in6 *)iface->ifa_addr)->sin6_scope_id; -#endif - if(scopeid != remote_scope) { - /* We are interested only in interface addresses whose - scope ID matches the remote address we want to - connect to: global (0) for global, link-local for - link-local, etc... */ - if(res == IF2IP_NOT_FOUND) res = IF2IP_AF_NOT_SUPPORTED; + + /* If given, scope id should match. */ + if(remote_scope_id && scopeid != remote_scope_id) { + if(res == IF2IP_NOT_FOUND) + res = IF2IP_AF_NOT_SUPPORTED; + continue; } +#endif if(scopeid) snprintf(scope, sizeof(scope), "%%%u", scopeid); } @@ -137,8 +186,10 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, } } } + freeifaddrs(head); } + return res; } @@ -149,12 +200,13 @@ bool Curl_if_is_interface_name(const char *interf) /* This is here just to support the old interfaces */ char buf[256]; - return (Curl_if2ip(AF_INET, 0, interf, buf, sizeof(buf)) == + return (Curl_if2ip(AF_INET, 0 /* unused */, 0, interf, buf, sizeof(buf)) == IF2IP_NOT_FOUND) ? FALSE : TRUE; } if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, - const char *interf, char *buf, int buf_size) + unsigned int remote_scope_id, const char *interf, + char *buf, int buf_size) { struct ifreq req; struct in_addr in; @@ -163,6 +215,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, size_t len; (void)remote_scope; + (void)remote_scope_id; if(!interf || (af != AF_INET)) return IF2IP_NOT_FOUND; @@ -205,10 +258,12 @@ bool Curl_if_is_interface_name(const char *interf) } if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, - const char *interf, char *buf, int buf_size) + unsigned int remote_scope_id, const char *interf, + char *buf, int buf_size) { (void) af; (void) remote_scope; + (void) remote_scope_id; (void) interf; (void) buf; (void) buf_size; diff --git a/lib/if2ip.h b/lib/if2ip.h index ac58752..78bb0bd 100644 --- a/lib/if2ip.h +++ b/lib/if2ip.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,6 +23,14 @@ ***************************************************************************/ #include "curl_setup.h" +/* IPv6 address scopes. */ +#define IPV6_SCOPE_GLOBAL 0 /* Global scope. */ +#define IPV6_SCOPE_LINKLOCAL 1 /* Link-local scope. */ +#define IPV6_SCOPE_SITELOCAL 2 /* Site-local scope (deprecated). */ +#define IPV6_SCOPE_NODELOCAL 3 /* Loopback. */ + +unsigned int Curl_ipv6_scope(const struct sockaddr *sa); + bool Curl_if_is_interface_name(const char *interf); typedef enum { @@ -32,7 +40,8 @@ typedef enum { } if2ip_result_t; if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, - const char *interf, char *buf, int buf_size); + unsigned int remote_scope_id, const char *interf, + char *buf, int buf_size); #ifdef __INTERIX diff --git a/lib/imap.c b/lib/imap.c index 13e9784..767ac80 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -24,8 +24,11 @@ * RFC3501 IMAPv4 protocol * RFC4422 Simple Authentication and Security Layer (SASL) * RFC4616 PLAIN authentication + * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism * RFC4959 IMAP Extension for SASL Initial Client Response * RFC5092 IMAP URL Scheme + * RFC6749 OAuth 2.0 Authorization Framework + * Draft LOGIN SASL Mechanism * ***************************************************************************/ @@ -58,7 +61,6 @@ #include #include "urldata.h" #include "sendf.h" -#include "if2ip.h" #include "hostip.h" #include "progress.h" #include "transfer.h" @@ -69,7 +71,7 @@ #include "strtoofft.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" #include "strerror.h" #include "select.h" @@ -103,6 +105,10 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...); static CURLcode imap_parse_url_options(struct connectdata *conn); static CURLcode imap_parse_url_path(struct connectdata *conn); static CURLcode imap_parse_custom_request(struct connectdata *conn); +static CURLcode imap_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + imapstate *state1, imapstate *state2); /* * IMAP protocol handler. @@ -125,8 +131,7 @@ const struct Curl_handler Curl_handler_imap = { ZERO_NULL, /* readwrite */ PORT_IMAP, /* defport */ CURLPROTO_IMAP, /* protocol */ - PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD - | PROTOPT_NOURLQUERY /* flags */ + PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD /* flags */ }; #ifdef USE_SSL @@ -150,9 +155,9 @@ const struct Curl_handler Curl_handler_imaps = { imap_disconnect, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_IMAPS, /* defport */ - CURLPROTO_IMAP | CURLPROTO_IMAPS, /* protocol */ - PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NEEDSPWD - | PROTOPT_NOURLQUERY /* flags */ + CURLPROTO_IMAPS, /* protocol */ + PROTOPT_CLOSEACTION | PROTOPT_SSL | + PROTOPT_NEEDSPWD /* flags */ }; #endif @@ -163,7 +168,7 @@ const struct Curl_handler Curl_handler_imaps = { static const struct Curl_handler Curl_handler_imap_proxy = { "IMAP", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -188,7 +193,7 @@ static const struct Curl_handler Curl_handler_imap_proxy = { static const struct Curl_handler Curl_handler_imaps_proxy = { "IMAPS", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -252,7 +257,7 @@ static bool imap_matchresp(const char *line, size_t len, const char *cmd) /* Does the command name match and is it followed by a space character or at the end of line? */ if(line + cmd_len <= end && Curl_raw_nequal(line, cmd, cmd_len) && - (line[cmd_len] == ' ' || line + cmd_len == end)) + (line[cmd_len] == ' ' || line + cmd_len + 2 == end)) return TRUE; return FALSE; @@ -268,7 +273,7 @@ static bool imap_matchresp(const char *line, size_t len, const char *cmd) static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, int *resp) { - struct IMAP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->req.protop; struct imap_conn *imapc = &conn->proto.imapc; const char *id = imapc->resptag; size_t id_len = strlen(id); @@ -307,7 +312,12 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, (strcmp(imap->custom, "STORE") || !imap_matchresp(line, len, "FETCH")) && strcmp(imap->custom, "SELECT") && - strcmp(imap->custom, "EXAMINE"))) + strcmp(imap->custom, "EXAMINE") && + strcmp(imap->custom, "SEARCH") && + strcmp(imap->custom, "EXPUNGE") && + strcmp(imap->custom, "LSUB") && + strcmp(imap->custom, "UID") && + strcmp(imap->custom, "NOOP"))) return FALSE; break; @@ -321,6 +331,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, return FALSE; break; + case IMAP_SEARCH: + if(!imap_matchresp(line, len, "SEARCH")) + return FALSE; + break; + /* Ignore other untagged responses */ default: return FALSE; @@ -330,7 +345,10 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, return TRUE; } - /* Do we have a continuation response? */ + /* Do we have a continuation response? This should be a + symbol followed by + a space and optionally some text as per RFC-3501 for the AUTHENTICATE and + APPEND commands and as outlined in Section 4. Examples of RFC-4959 but + some e-mail servers ignore this and only send a single + instead. */ if((len == 3 && !memcmp("+", line, 1)) || (len >= 2 && !memcmp("+ ", line, 2))) { switch(imapc->state) { @@ -343,6 +361,7 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, case IMAP_AUTHENTICATE_DIGESTMD5_RESP: case IMAP_AUTHENTICATE_NTLM: case IMAP_AUTHENTICATE_NTLM_TYPE2MSG: + case IMAP_AUTHENTICATE_XOAUTH2: case IMAP_AUTHENTICATE_FINAL: case IMAP_APPEND: *resp = '+'; @@ -362,6 +381,35 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len, /*********************************************************************** * + * imap_get_message() + * + * Gets the authentication message from the response buffer. + */ +static void imap_get_message(char *buffer, char** outptr) +{ + size_t len = 0; + char* message = NULL; + + /* Find the start of the message */ + for(message = buffer + 2; *message == ' ' || *message == '\t'; message++) + ; + + /* Find the end of the message */ + for(len = strlen(message); len--;) + if(message[len] != '\r' && message[len] != '\n' && message[len] != ' ' && + message[len] != '\t') + break; + + /* Terminate the message */ + if(++len) { + message[len] = '\0'; + } + + *outptr = message; +} + +/*********************************************************************** + * * state() * * This is the ONLY way to change IMAP state! @@ -385,6 +433,11 @@ static void state(struct connectdata *conn, imapstate newstate) "AUTHENTICATE_DIGESTMD5_RESP", "AUTHENTICATE_NTLM", "AUTHENTICATE_NTLM_TYPE2MSG", + "AUTHENTICATE_GSSAPI", + "AUTHENTICATE_GSSAPI_TOKEN", + "AUTHENTICATE_GSSAPI_NO_DATA", + "AUTHENTICATE_XOAUTH2", + "AUTHENTICATE_CANCEL", "AUTHENTICATE_FINAL", "LOGIN", "LIST", @@ -393,6 +446,7 @@ static void state(struct connectdata *conn, imapstate newstate) "FETCH_FINAL", "APPEND", "APPEND_FINAL", + "SEARCH", "LOGOUT", /* LAST */ }; @@ -517,16 +571,45 @@ static CURLcode imap_perform_login(struct connectdata *conn) * * imap_perform_authenticate() * - * Sends an AUTHENTICATE command allowing the client to login with the - * appropriate SASL authentication mechanism. + * Sends an AUTHENTICATE command allowing the client to login with the given + * SASL authentication mechanism. + */ +static CURLcode imap_perform_authenticate(struct connectdata *conn, + const char *mech, + const char *initresp, + imapstate state1, imapstate state2) +{ + CURLcode result = CURLE_OK; + + if(initresp) { + /* Send the AUTHENTICATE command with the initial response */ + result = imap_sendf(conn, "AUTHENTICATE %s %s", mech, initresp); + + if(!result) + state(conn, state2); + } + else { + /* Send the AUTHENTICATE command */ + result = imap_sendf(conn, "AUTHENTICATE %s", mech); + + if(!result) + state(conn, state1); + } + + return result; +} + +/*********************************************************************** + * + * imap_perform_authentication() * - * Additionally, the function will perform fallback to the LOGIN command - * should a common mechanism not be available between the client and server. + * Initiates the authentication sequence, with the appropriate SASL + * authentication mechanism, falling back to clear text should a common + * mechanism not be available between the client and server. */ -static CURLcode imap_perform_authenticate(struct connectdata *conn) +static CURLcode imap_perform_authentication(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct SessionHandle *data = conn->data; struct imap_conn *imapc = &conn->proto.imapc; const char *mech = NULL; char *initresp = NULL; @@ -542,80 +625,17 @@ static CURLcode imap_perform_authenticate(struct connectdata *conn) return result; } - /* Calculate the supported authentication mechanism by decreasing order of - security */ -#ifndef CURL_DISABLE_CRYPTO_AUTH - if((imapc->authmechs & SASL_MECH_DIGEST_MD5) && - (imapc->prefmech & SASL_MECH_DIGEST_MD5)) { - mech = "DIGEST-MD5"; - state1 = IMAP_AUTHENTICATE_DIGESTMD5; - imapc->authused = SASL_MECH_DIGEST_MD5; - } - else if((imapc->authmechs & SASL_MECH_CRAM_MD5) && - (imapc->prefmech & SASL_MECH_CRAM_MD5)) { - mech = "CRAM-MD5"; - state1 = IMAP_AUTHENTICATE_CRAMMD5; - imapc->authused = SASL_MECH_CRAM_MD5; - } - else -#endif -#ifdef USE_NTLM - if((imapc->authmechs & SASL_MECH_NTLM) && - (imapc->prefmech & SASL_MECH_NTLM)) { - mech = "NTLM"; - state1 = IMAP_AUTHENTICATE_NTLM; - state2 = IMAP_AUTHENTICATE_NTLM_TYPE2MSG; - imapc->authused = SASL_MECH_NTLM; - - if(imapc->ir_supported || data->set.sasl_ir) - result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, - &conn->ntlm, - &initresp, &len); - } - else -#endif - if((imapc->authmechs & SASL_MECH_LOGIN) && - (imapc->prefmech & SASL_MECH_LOGIN)) { - mech = "LOGIN"; - state1 = IMAP_AUTHENTICATE_LOGIN; - state2 = IMAP_AUTHENTICATE_LOGIN_PASSWD; - imapc->authused = SASL_MECH_LOGIN; - - if(imapc->ir_supported || data->set.sasl_ir) - result = Curl_sasl_create_login_message(conn->data, conn->user, - &initresp, &len); - } - else if((imapc->authmechs & SASL_MECH_PLAIN) && - (imapc->prefmech & SASL_MECH_PLAIN)) { - mech = "PLAIN"; - state1 = IMAP_AUTHENTICATE_PLAIN; - state2 = IMAP_AUTHENTICATE_FINAL; - imapc->authused = SASL_MECH_PLAIN; - - if(imapc->ir_supported || data->set.sasl_ir) - result = Curl_sasl_create_plain_message(conn->data, conn->user, - conn->passwd, &initresp, &len); - } + /* Calculate the SASL login details */ + result = imap_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); if(!result) { - if(mech) { + if(mech && (imapc->preftype & IMAP_TYPE_SASL)) { /* Perform SASL based authentication */ - if(initresp) { - result = imap_sendf(conn, "AUTHENTICATE %s %s", mech, initresp); - - if(!result) - state(conn, state2); - } - else { - result = imap_sendf(conn, "AUTHENTICATE %s", mech); - - if(!result) - state(conn, state1); - } - - Curl_safefree(initresp); + result = imap_perform_authenticate(conn, mech, initresp, state1, state2); } - else if(!imapc->login_disabled) + else if((!imapc->login_disabled) && + (imapc->preftype & IMAP_TYPE_CLEARTEXT)) /* Perform clear text authentication */ result = imap_perform_login(conn); else { @@ -625,6 +645,8 @@ static CURLcode imap_perform_authenticate(struct connectdata *conn) } } + Curl_safefree(initresp); + return result; } @@ -638,7 +660,7 @@ static CURLcode imap_perform_list(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; char *mailbox; if(imap->custom) @@ -673,7 +695,7 @@ static CURLcode imap_perform_select(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; struct imap_conn *imapc = &conn->proto.imapc; char *mailbox; @@ -712,7 +734,7 @@ static CURLcode imap_perform_select(struct connectdata *conn) static CURLcode imap_perform_fetch(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct IMAP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->req.protop; /* Check we have a UID */ if(!imap->uid) { @@ -721,9 +743,15 @@ static CURLcode imap_perform_fetch(struct connectdata *conn) } /* Send the FETCH command */ - result = imap_sendf(conn, "FETCH %s BODY[%s]", - imap->uid, - imap->section ? imap->section : ""); + if(imap->partial) + result = imap_sendf(conn, "FETCH %s BODY[%s]<%s>", + imap->uid, + imap->section ? imap->section : "", + imap->partial); + else + result = imap_sendf(conn, "FETCH %s BODY[%s]", + imap->uid, + imap->section ? imap->section : ""); if(!result) state(conn, IMAP_FETCH); @@ -740,7 +768,7 @@ static CURLcode imap_perform_fetch(struct connectdata *conn) static CURLcode imap_perform_append(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct IMAP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->req.protop; char *mailbox; /* Check we have a mailbox */ @@ -750,7 +778,7 @@ static CURLcode imap_perform_append(struct connectdata *conn) } /* Check we know the size of the upload */ - if(conn->data->set.infilesize < 0) { + if(conn->data->state.infilesize < 0) { failf(conn->data, "Cannot APPEND with unknown input file size\n"); return CURLE_UPLOAD_FAILED; } @@ -761,8 +789,8 @@ static CURLcode imap_perform_append(struct connectdata *conn) return CURLE_OUT_OF_MEMORY; /* Send the APPEND command */ - result = imap_sendf(conn, "APPEND %s (\\Seen) {%" FORMAT_OFF_T "}", - mailbox, conn->data->set.infilesize); + result = imap_sendf(conn, "APPEND %s (\\Seen) {%" CURL_FORMAT_CURL_OFF_T "}", + mailbox, conn->data->state.infilesize); Curl_safefree(mailbox); @@ -774,6 +802,32 @@ static CURLcode imap_perform_append(struct connectdata *conn) /*********************************************************************** * + * imap_perform_search() + * + * Sends a SEARCH command. + */ +static CURLcode imap_perform_search(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + struct IMAP *imap = conn->data->req.protop; + + /* Check we have a query string */ + if(!imap->query) { + failf(conn->data, "Cannot SEARCH without a query string."); + return CURLE_URL_MALFORMAT; + } + + /* Send the SEARCH command */ + result = imap_sendf(conn, "SEARCH %s", imap->query); + + if(!result) + state(conn, IMAP_SEARCH); + + return result; +} + +/*********************************************************************** + * * imap_perform_logout() * * Performs the logout action prior to sclose() being called. @@ -864,20 +918,22 @@ static CURLcode imap_state_capability_resp(struct connectdata *conn, wordlen -= 5; /* Test the word for a matching authentication mechanism */ - if(wordlen == 5 && !memcmp(line, "LOGIN", 5)) + if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_LOGIN)) imapc->authmechs |= SASL_MECH_LOGIN; - if(wordlen == 5 && !memcmp(line, "PLAIN", 5)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_PLAIN)) imapc->authmechs |= SASL_MECH_PLAIN; - else if(wordlen == 8 && !memcmp(line, "CRAM-MD5", 8)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_CRAM_MD5)) imapc->authmechs |= SASL_MECH_CRAM_MD5; - else if(wordlen == 10 && !memcmp(line, "DIGEST-MD5", 10)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_DIGEST_MD5)) imapc->authmechs |= SASL_MECH_DIGEST_MD5; - else if(wordlen == 6 && !memcmp(line, "GSSAPI", 6)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_GSSAPI)) imapc->authmechs |= SASL_MECH_GSSAPI; - else if(wordlen == 8 && !memcmp(line, "EXTERNAL", 8)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_EXTERNAL)) imapc->authmechs |= SASL_MECH_EXTERNAL; - else if(wordlen == 4 && !memcmp(line, "NTLM", 4)) + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_NTLM)) imapc->authmechs |= SASL_MECH_NTLM; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_XOAUTH2)) + imapc->authmechs |= SASL_MECH_XOAUTH2; } line += wordlen; @@ -891,17 +947,17 @@ static CURLcode imap_state_capability_resp(struct connectdata *conn, result = imap_perform_starttls(conn); else if(data->set.use_ssl == CURLUSESSL_TRY) /* Fallback and carry on with authentication */ - result = imap_perform_authenticate(conn); + result = imap_perform_authentication(conn); else { failf(data, "STARTTLS not supported."); result = CURLE_USE_SSL_FAILED; } } else - result = imap_perform_authenticate(conn); + result = imap_perform_authentication(conn); } else - result = imap_perform_login(conn); + result = imap_perform_authentication(conn); return result; } @@ -922,7 +978,7 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn, result = CURLE_USE_SSL_FAILED; } else - result = imap_perform_authenticate(conn); + result = imap_perform_authentication(conn); } else result = imap_perform_upgrade_tls(conn); @@ -950,20 +1006,17 @@ static CURLcode imap_state_auth_plain_resp(struct connectdata *conn, /* Create the authorisation message */ result = Curl_sasl_create_plain_message(data, conn->user, conn->passwd, &plainauth, &len); + if(!result && plainauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", plainauth); - /* Send the message */ - if(!result) { - if(plainauth) { - result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", plainauth); - - if(!result) - state(conn, IMAP_AUTHENTICATE_FINAL); - } - - Curl_safefree(plainauth); + if(!result) + state(conn, IMAP_AUTHENTICATE_FINAL); } } + Curl_safefree(plainauth); + return result; } @@ -987,20 +1040,17 @@ static CURLcode imap_state_auth_login_resp(struct connectdata *conn, /* Create the user message */ result = Curl_sasl_create_login_message(data, conn->user, &authuser, &len); + if(!result && authuser) { + /* Send the user */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", authuser); - /* Send the user */ - if(!result) { - if(authuser) { - result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", authuser); - - if(!result) - state(conn, IMAP_AUTHENTICATE_LOGIN_PASSWD); - } - - Curl_safefree(authuser); + if(!result) + state(conn, IMAP_AUTHENTICATE_LOGIN_PASSWD); } } + Curl_safefree(authuser); + return result; } @@ -1024,20 +1074,17 @@ static CURLcode imap_state_auth_login_password_resp(struct connectdata *conn, /* Create the password message */ result = Curl_sasl_create_login_message(data, conn->passwd, &authpasswd, &len); + if(!result && authpasswd) { + /* Send the password */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", authpasswd); - /* Send the password */ - if(!result) { - if(authpasswd) { - result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", authpasswd); - - if(!result) - state(conn, IMAP_AUTHENTICATE_FINAL); - } - - Curl_safefree(authpasswd); + if(!result) + state(conn, IMAP_AUTHENTICATE_FINAL); } } + Curl_safefree(authpasswd); + return result; } @@ -1049,9 +1096,10 @@ static CURLcode imap_state_auth_cram_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg = NULL; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -1060,38 +1108,34 @@ static CURLcode imap_state_auth_cram_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 2; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + imap_get_message(data->state.buffer, &chlg64); - /* Terminate the challenge */ - if(*chlg64 != '=') { - for(len = strlen(chlg64); len--;) - if(chlg64[len] != '\r' && chlg64[len] != '\n' && chlg64[len] != ' ' && - chlg64[len] != '\t') - break; + /* Decode the challenge message */ + result = Curl_sasl_decode_cram_md5_message(chlg64, &chlg, &len); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*"); - if(++len) { - chlg64[len] = '\0'; - } + if(!result) + state(conn, IMAP_AUTHENTICATE_CANCEL); } - - /* Create the response message */ - result = Curl_sasl_create_cram_md5_message(data, chlg64, conn->user, - conn->passwd, &rplyb64, &len); - - /* Send the response */ - if(!result) { - if(rplyb64) { + else { + /* Create the response message */ + result = Curl_sasl_create_cram_md5_message(data, chlg, conn->user, + conn->passwd, &rplyb64, &len); + if(!result && rplyb64) { + /* Send the response */ result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", rplyb64); if(!result) state(conn, IMAP_AUTHENTICATE_FINAL); } - - Curl_safefree(rplyb64); } + Curl_safefree(chlg); + Curl_safefree(rplyb64); + return result; } @@ -1102,9 +1146,9 @@ static CURLcode imap_state_auth_digest_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -1113,27 +1157,32 @@ static CURLcode imap_state_auth_digest_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 2; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + imap_get_message(data->state.buffer, &chlg64); /* Create the response message */ - result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user, - conn->passwd, "imap", - &rplyb64, &len); - - /* Send the response */ - if(!result) { - if(rplyb64) { - result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", rplyb64); + result = Curl_sasl_create_digest_md5_message(data, chlg64, + conn->user, conn->passwd, + "imap", &rplyb64, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*"); if(!result) - state(conn, IMAP_AUTHENTICATE_DIGESTMD5_RESP); + state(conn, IMAP_AUTHENTICATE_CANCEL); } + } + else { + /* Send the response */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", rplyb64); - Curl_safefree(rplyb64); + if(!result) + state(conn, IMAP_AUTHENTICATE_DIGESTMD5_RESP); } + Curl_safefree(rplyb64); + return result; } @@ -1185,20 +1234,17 @@ static CURLcode imap_state_auth_ntlm_resp(struct connectdata *conn, result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, &conn->ntlm, &type1msg, &len); + if(!result && type1msg) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", type1msg); - /* Send the message */ - if(!result) { - if(type1msg) { - result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", type1msg); - - if(!result) - state(conn, IMAP_AUTHENTICATE_NTLM_TYPE2MSG); - } - - Curl_safefree(type1msg); + if(!result) + state(conn, IMAP_AUTHENTICATE_NTLM_TYPE2MSG); } } + Curl_safefree(type1msg); + return result; } @@ -1209,8 +1255,9 @@ static CURLcode imap_state_auth_ntlm_type2msg_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - size_t len = 0; + char *type2msg = NULL; char *type3msg = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -1219,31 +1266,273 @@ static CURLcode imap_state_auth_ntlm_type2msg_resp(struct connectdata *conn, result = CURLE_LOGIN_DENIED; } else { - /* Create the type-3 message */ - result = Curl_sasl_create_ntlm_type3_message(data, - data->state.buffer + 2, - conn->user, conn->passwd, - &conn->ntlm, - &type3msg, &len); + /* Get the challenge message */ + imap_get_message(data->state.buffer, &type2msg); - /* Send the message */ - if(!result) { - if(type3msg) { + /* Decode the type-2 message */ + result = Curl_sasl_decode_ntlm_type2_message(data, type2msg, &conn->ntlm); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*"); + + if(!result) + state(conn, IMAP_AUTHENTICATE_CANCEL); + } + else { + /* Create the type-3 message */ + result = Curl_sasl_create_ntlm_type3_message(data, conn->user, + conn->passwd, &conn->ntlm, + &type3msg, &len); + if(!result && type3msg) { + /* Send the message */ result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", type3msg); if(!result) state(conn, IMAP_AUTHENTICATE_FINAL); } + } + } + + Curl_safefree(type3msg); + + return result; +} +#endif + +#if defined(USE_KERBEROS5) +/* For AUTHENTICATE GSSAPI (without initial response) responses */ +static CURLcode imap_state_auth_gssapi_resp(struct connectdata *conn, + int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct imap_conn *imapc = &conn->proto.imapc; + size_t len = 0; + char *respmsg = NULL; + + (void)instate; /* no use for this yet */ + + if(imapcode != '+') { + failf(data, "Access denied: %d", imapcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the initial response message */ + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "imap", + imapc->mutual_auth, + NULL, &conn->krb5, + &respmsg, &len); + if(!result && respmsg) { + /* Send the message */ + result = Curl_pp_sendf(&imapc->pp, "%s", respmsg); + + if(!result) + state(conn, IMAP_AUTHENTICATE_GSSAPI_TOKEN); + } + } + + Curl_safefree(respmsg); + + return result; +} + +/* For AUTHENTICATE GSSAPI user token responses */ +static CURLcode imap_state_auth_gssapi_token_resp(struct connectdata *conn, + int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct imap_conn *imapc = &conn->proto.imapc; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(imapcode != '+') { + failf(data, "Access denied: %d", imapcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the challenge message */ + imap_get_message(data->state.buffer, &chlgmsg); + + if(imapc->mutual_auth) + /* Decode the user token challenge and create the optional response + message */ + result = Curl_sasl_create_gssapi_user_message(data, NULL, NULL, NULL, + imapc->mutual_auth, + chlgmsg, &conn->krb5, + &respmsg, &len); + else + /* Decode the security challenge and create the response message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&imapc->pp, "%s", "*"); + + if(!result) + state(conn, IMAP_AUTHENTICATE_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) + result = Curl_pp_sendf(&imapc->pp, "%s", respmsg); + else + result = Curl_pp_sendf(&imapc->pp, "%s", ""); + + if(!result) + state(conn, (imapc->mutual_auth ? IMAP_AUTHENTICATE_GSSAPI_NO_DATA : + IMAP_AUTHENTICATE_FINAL)); + } + } + + Curl_safefree(respmsg); + + return result; +} + +/* For AUTHENTICATE GSSAPI no data responses */ +static CURLcode imap_state_auth_gssapi_no_data_resp(struct connectdata *conn, + int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(imapcode != '+') { + failf(data, "Access denied: %d", imapcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the challenge message */ + imap_get_message(data->state.buffer, &chlgmsg); + + /* Decode the security challenge and create the response message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", "*"); + + if(!result) + state(conn, IMAP_AUTHENTICATE_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) { + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", respmsg); - Curl_safefree(type3msg); + if(!result) + state(conn, IMAP_AUTHENTICATE_FINAL); + } } } + Curl_safefree(respmsg); + return result; } #endif -/* For final responses to the AUTHENTICATE sequence */ +/* For AUTHENTICATE XOAUTH2 (without initial response) responses */ +static CURLcode imap_state_auth_xoauth2_resp(struct connectdata *conn, + int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + size_t len = 0; + char *xoauth = NULL; + + (void)instate; /* no use for this yet */ + + if(imapcode != '+') { + failf(data, "Access denied: %d", imapcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the authorisation message */ + result = Curl_sasl_create_xoauth2_message(conn->data, conn->user, + conn->xoauth2_bearer, + &xoauth, &len); + if(!result && xoauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.imapc.pp, "%s", xoauth); + + if(!result) + state(conn, IMAP_AUTHENTICATE_FINAL); + } + } + + Curl_safefree(xoauth); + + return result; +} + +/* For AUTHENTICATE cancellation responses */ +static CURLcode imap_state_auth_cancel_resp(struct connectdata *conn, + int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct imap_conn *imapc = &conn->proto.imapc; + const char *mech = NULL; + char *initresp = NULL; + size_t len = 0; + imapstate state1 = IMAP_STOP; + imapstate state2 = IMAP_STOP; + + (void)imapcode; + (void)instate; /* no use for this yet */ + + /* Remove the offending mechanism from the supported list */ + imapc->authmechs ^= imapc->authused; + + /* Calculate alternative SASL login details */ + result = imap_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); + + if(!result) { + /* Do we have any mechanisms left or can we fallback to clear text? */ + if(mech) { + /* Retry SASL based authentication */ + result = imap_perform_authenticate(conn, mech, initresp, state1, state2); + + Curl_safefree(initresp); + } + else if((!imapc->login_disabled) && + (imapc->preftype & IMAP_TYPE_CLEARTEXT)) + /* Perform clear text authentication */ + result = imap_perform_login(conn); + else { + failf(data, "Authentication cancelled"); + + result = CURLE_LOGIN_DENIED; + } + } + + return result; +} + +/* For final responses in the AUTHENTICATE sequence */ static CURLcode imap_state_auth_final_resp(struct connectdata *conn, int imapcode, imapstate instate) @@ -1316,7 +1605,7 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->req.protop; struct imap_conn *imapc = &conn->proto.imapc; const char *line = data->state.buffer; char tmp[20]; @@ -1343,6 +1632,8 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode, if(imap->custom) result = imap_perform_list(conn); + else if(imap->query) + result = imap_perform_search(conn); else result = imap_perform_fetch(conn); } @@ -1370,7 +1661,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, (void)instate; /* no use for this yet */ if(imapcode != '*') { - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetDownloadSize(data, -1); state(conn, IMAP_STOP); return CURLE_REMOTE_FILE_NOT_FOUND; /* TODO: Fix error code */ } @@ -1389,7 +1680,8 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, } if(parsed) { - infof(data, "Found %" FORMAT_OFF_TU " bytes to download\n", size); + infof(data, "Found %" CURL_FORMAT_CURL_OFF_TU " bytes to download\n", + size); Curl_pgrsSetDownloadSize(data, size); if(pp->cache) { @@ -1407,10 +1699,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, return result; data->req.bytecount += chunk; - size -= chunk; - infof(data, "Written %" FORMAT_OFF_TU " bytes, %" FORMAT_OFF_TU - " bytes are left for transfer\n", (curl_off_t)chunk, size); + infof(data, "Written %" CURL_FORMAT_CURL_OFF_TU + " bytes, %" CURL_FORMAT_CURL_OFF_TU + " bytes are left for transfer\n", (curl_off_t)chunk, + size - chunk); /* Have we used the entire cache or just part of it?*/ if(pp->cache_size > chunk) { @@ -1427,7 +1720,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, } } - if(!size) + if(data->req.bytecount == size) /* The entire data is already transferred! */ Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); else { @@ -1480,7 +1773,7 @@ static CURLcode imap_state_append_resp(struct connectdata *conn, int imapcode, } else { /* Set the progress upload size */ - Curl_pgrsSetUploadSize(data, data->set.infilesize); + Curl_pgrsSetUploadSize(data, data->state.infilesize); /* IMAP upload */ Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); @@ -1510,6 +1803,31 @@ static CURLcode imap_state_append_final_resp(struct connectdata *conn, return result; } +/* For SEARCH responses */ +static CURLcode imap_state_search_resp(struct connectdata *conn, int imapcode, + imapstate instate) +{ + CURLcode result = CURLE_OK; + char *line = conn->data->state.buffer; + size_t len = strlen(line); + + (void)instate; /* No use for this yet */ + + if(imapcode == '*') { + /* Temporarily add the LF character back and send as body to the client */ + line[len] = '\n'; + result = Curl_client_write(conn, CLIENTWRITE_BODY, line, len + 1); + line[len] = '\0'; + } + else if(imapcode != 'O') + result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */ + else + /* End of DO phase */ + state(conn, IMAP_STOP); + + return result; +} + static CURLcode imap_statemach_act(struct connectdata *conn) { CURLcode result = CURLE_OK; @@ -1592,6 +1910,29 @@ static CURLcode imap_statemach_act(struct connectdata *conn) break; #endif +#if defined(USE_KERBEROS5) + case IMAP_AUTHENTICATE_GSSAPI: + result = imap_state_auth_gssapi_resp(conn, imapcode, imapc->state); + break; + + case IMAP_AUTHENTICATE_GSSAPI_TOKEN: + result = imap_state_auth_gssapi_token_resp(conn, imapcode, imapc->state); + break; + + case IMAP_AUTHENTICATE_GSSAPI_NO_DATA: + result = imap_state_auth_gssapi_no_data_resp(conn, imapcode, + imapc->state); + break; +#endif + + case IMAP_AUTHENTICATE_XOAUTH2: + result = imap_state_auth_xoauth2_resp(conn, imapcode, imapc->state); + break; + + case IMAP_AUTHENTICATE_CANCEL: + result = imap_state_auth_cancel_resp(conn, imapcode, imapc->state); + break; + case IMAP_AUTHENTICATE_FINAL: result = imap_state_auth_final_resp(conn, imapcode, imapc->state); break; @@ -1624,6 +1965,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn) result = imap_state_append_final_resp(conn, imapcode, imapc->state); break; + case IMAP_SEARCH: + result = imap_state_search_resp(conn, imapcode, imapc->state); + break; + case IMAP_LOGOUT: /* fallthrough, just stop! */ default: @@ -1642,11 +1987,13 @@ static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done) CURLcode result = CURLE_OK; struct imap_conn *imapc = &conn->proto.imapc; - if((conn->handler->flags & PROTOPT_SSL) && !imapc->ssldone) + if((conn->handler->flags & PROTOPT_SSL) && !imapc->ssldone) { result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone); - else - result = Curl_pp_statemach(&imapc->pp, FALSE); + if(result || !imapc->ssldone) + return result; + } + result = Curl_pp_statemach(&imapc->pp, FALSE); *done = (imapc->state == IMAP_STOP) ? TRUE : FALSE; return result; @@ -1669,13 +2016,11 @@ static CURLcode imap_init(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap; - if(!imap) { - imap = data->state.proto.imap = calloc(sizeof(struct IMAP), 1); - if(!imap) - result = CURLE_OUT_OF_MEMORY; - } + imap = data->req.protop = calloc(sizeof(struct IMAP), 1); + if(!imap) + result = CURLE_OUT_OF_MEMORY; return result; } @@ -1705,17 +2050,8 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done) *done = FALSE; /* default to not done yet */ - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - /* Initialise the IMAP layer */ - result = imap_init(conn); - if(result) - return result; - /* We always support persistent connections in IMAP */ - conn->bits.close = FALSE; + connkeep(conn, "IMAP default"); /* Set the default response time-out */ pp->response_time = RESP_TIMEOUT; @@ -1723,7 +2059,8 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done) pp->endofresp = imap_endofresp; pp->conn = conn; - /* Set the default preferred authentication mechanism */ + /* Set the default preferred authentication type and mechanism */ + imapc->preftype = IMAP_TYPE_ANY; imapc->prefmech = SASL_AUTH_ANY; /* Initialise the pingpong layer */ @@ -1759,7 +2096,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; (void)premature; @@ -1771,7 +2108,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, return CURLE_OK; if(status) { - conn->bits.close = TRUE; /* marked for closure */ + connclose(conn, "IMAP done with bad status"); /* marked for closure */ result = status; /* use the already set error code */ } else if(!data->set.connect_only && !imap->custom && @@ -1802,6 +2139,8 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, Curl_safefree(imap->uidvalidity); Curl_safefree(imap->uid); Curl_safefree(imap->section); + Curl_safefree(imap->partial); + Curl_safefree(imap->query); Curl_safefree(imap->custom); Curl_safefree(imap->custom_params); @@ -1824,7 +2163,7 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, /* This is IMAP and no proxy */ CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; struct imap_conn *imapc = &conn->proto.imapc; bool selected = FALSE; @@ -1855,7 +2194,11 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, else if(!imap->custom && selected && imap->uid) /* FETCH from the same mailbox */ result = imap_perform_fetch(conn); - else if(imap->mailbox && !selected && (imap->custom || imap->uid)) + else if(!imap->custom && selected && imap->query) + /* SEARCH the current mailbox */ + result = imap_perform_search(conn); + else if(imap->mailbox && !selected && + (imap->custom || imap->uid || imap->query)) /* SELECT the mailbox */ result = imap_perform_select(conn); else @@ -1891,15 +2234,6 @@ static CURLcode imap_do(struct connectdata *conn, bool *done) *done = FALSE; /* default to false */ - /* Since connections can be re-used between SessionHandles, there might be a - connection already existing but on a fresh SessionHandle struct. As such - we make sure we have a good IMAP struct to play with. For new connections - the IMAP struct is allocated and setup in the imap_connect() function. */ - Curl_reset_reqproto(conn); - result = imap_init(conn); - if(result) - return result; - /* Parse the URL path */ result = imap_parse_url_path(conn); if(result) @@ -1932,7 +2266,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection) /* The IMAP session may or may not have been allocated/setup at this point! */ - if(!dead_connection && imapc->pp.conn) + if(!dead_connection && imapc->pp.conn && imapc->pp.conn->bits.protoconnstart) if(!imap_perform_logout(conn)) (void)imap_block_statemach(conn); /* ignore errors on LOGOUT */ @@ -1952,7 +2286,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection) /* Call this when the DO phase has completed */ static CURLcode imap_dophase_done(struct connectdata *conn, bool connected) { - struct IMAP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->req.protop; (void)connected; @@ -2001,8 +2335,8 @@ static CURLcode imap_regular_transfer(struct connectdata *conn, /* Set the progress data */ Curl_pgrsSetUploadCounter(data, 0); Curl_pgrsSetDownloadCounter(data, 0); - Curl_pgrsSetUploadSize(data, 0); - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetUploadSize(data, -1); + Curl_pgrsSetDownloadSize(data, -1); /* Carry out the perform */ result = imap_perform(conn, &connected, dophase_done); @@ -2018,6 +2352,11 @@ static CURLcode imap_setup_connection(struct connectdata *conn) { struct SessionHandle *data = conn->data; + /* Initialise the IMAP layer */ + CURLcode result = imap_init(conn); + if(result) + return result; + if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) { /* Unless we have asked to tunnel IMAP operations through the proxy, we switch and use HTTP operations only */ @@ -2033,10 +2372,8 @@ static CURLcode imap_setup_connection(struct connectdata *conn) #endif } - /* We explicitly mark this connection as persistent here as we're doing - IMAP over HTTP and thus we accidentally avoid setting this value - otherwise */ - conn->bits.close = FALSE; + /* set it up as an HTTP connection instead */ + return conn->handler->setup_connection(conn); #else failf(data, "IMAP over http proxy requires HTTP support built-in!"); return CURLE_UNSUPPORTED_PROTOCOL; @@ -2110,7 +2447,7 @@ static char *imap_atom(const char *str) if(!str) return NULL; - /* Count any unescapped characters */ + /* Count any unescaped characters */ p1 = str; while(*p1) { if(*p1 == '\\') @@ -2123,7 +2460,7 @@ static char *imap_atom(const char *str) p1++; } - /* Does the input contain any unescapped characters? */ + /* Does the input contain any unescaped characters? */ if(!backsp_count && !quote_count && !space_exists) return strdup(str); @@ -2213,32 +2550,64 @@ static CURLcode imap_parse_url_options(struct connectdata *conn) struct imap_conn *imapc = &conn->proto.imapc; const char *options = conn->options; const char *ptr = options; + bool reset = TRUE; - if(options) { + while(ptr && *ptr) { const char *key = ptr; while(*ptr && *ptr != '=') ptr++; if(strnequal(key, "AUTH", 4)) { - const char *value = ptr + 1; + size_t len = 0; + const char *value = ++ptr; - if(strequal(value, "*")) - imapc->prefmech = SASL_AUTH_ANY; - else if(strequal(value, "LOGIN")) - imapc->prefmech = SASL_MECH_LOGIN; - else if(strequal(value, "PLAIN")) - imapc->prefmech = SASL_MECH_PLAIN; - else if(strequal(value, "CRAM-MD5")) - imapc->prefmech = SASL_MECH_CRAM_MD5; - else if(strequal(value, "DIGEST-MD5")) - imapc->prefmech = SASL_MECH_DIGEST_MD5; - else if(strequal(value, "GSSAPI")) - imapc->prefmech = SASL_MECH_GSSAPI; - else if(strequal(value, "NTLM")) - imapc->prefmech = SASL_MECH_NTLM; - else + if(reset) { + reset = FALSE; + imapc->preftype = IMAP_TYPE_NONE; imapc->prefmech = SASL_AUTH_NONE; + } + + while(*ptr && *ptr != ';') { + ptr++; + len++; + } + + if(strnequal(value, "*", len)) { + imapc->preftype = IMAP_TYPE_ANY; + imapc->prefmech = SASL_AUTH_ANY; + } + else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_LOGIN; + } + else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_PLAIN; + } + else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_CRAM_MD5; + } + else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_DIGEST_MD5; + } + else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_GSSAPI; + } + else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_NTLM; + } + else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) { + imapc->preftype = IMAP_TYPE_SASL; + imapc->prefmech |= SASL_MECH_XOAUTH2; + } + + if(*ptr == ';') + ptr++; } else result = CURLE_URL_MALFORMAT; @@ -2259,7 +2628,7 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) /* The imap struct is already initialised in imap_connect() */ CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; const char *begin = data->state.path; const char *ptr = begin; @@ -2314,8 +2683,8 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) DEBUGF(infof(conn->data, "IMAP URL parameter '%s' = '%s'\n", name, value)); - /* Process the known hierarchical parameters (UIDVALIDITY, UID and SECTION) - stripping of the trailing slash character if it is present. + /* Process the known hierarchical parameters (UIDVALIDITY, UID, SECTION and + PARTIAL) stripping of the trailing slash character if it is present. Note: Unknown parameters trigger a URL_MALFORMAT error. */ if(Curl_raw_equal(name, "UIDVALIDITY") && !imap->uidvalidity) { @@ -2339,6 +2708,13 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) imap->section = value; value = NULL; } + else if(Curl_raw_equal(name, "PARTIAL") && !imap->partial) { + if(valuelen > 0 && value[valuelen - 1] == '/') + value[valuelen - 1] = '\0'; + + imap->partial = value; + value = NULL; + } else { Curl_safefree(name); Curl_safefree(value); @@ -2350,6 +2726,21 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) Curl_safefree(value); } + /* Does the URL contain a query parameter? Only valid when we have a mailbox + and no UID as per RFC-5092 */ + if(imap->mailbox && !imap->uid && *ptr == '?') { + /* Find the length of the query parameter */ + begin = ++ptr; + while(imap_is_bchar(*ptr)) + ptr++; + + /* Decode the query parameter */ + result = Curl_urldecode(data, begin, ptr - begin, &imap->query, NULL, + TRUE); + if(result) + return result; + } + /* Any extra stuff at the end of the URL is an error */ if(*ptr) return CURLE_URL_MALFORMAT; @@ -2367,7 +2758,7 @@ static CURLcode imap_parse_custom_request(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct IMAP *imap = data->state.proto.imap; + struct IMAP *imap = data->req.protop; const char *custom = data->set.str[STRING_CUSTOMREQUEST]; if(custom) { @@ -2394,4 +2785,108 @@ static CURLcode imap_parse_custom_request(struct connectdata *conn) return result; } +/*********************************************************************** + * + * imap_calc_sasl_details() + * + * Calculate the required login details for SASL authentication. + */ +static CURLcode imap_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + imapstate *state1, imapstate *state2) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct imap_conn *imapc = &conn->proto.imapc; + + /* Calculate the supported authentication mechanism, by decreasing order of + security, as well as the initial response where appropriate */ +#if defined(USE_KERBEROS5) + if((imapc->authmechs & SASL_MECH_GSSAPI) && + (imapc->prefmech & SASL_MECH_GSSAPI)) { + imapc->mutual_auth = FALSE; /* TODO: Calculate mutual authentication */ + + *mech = SASL_MECH_STRING_GSSAPI; + *state1 = IMAP_AUTHENTICATE_GSSAPI; + *state2 = IMAP_AUTHENTICATE_GSSAPI_TOKEN; + imapc->authused = SASL_MECH_GSSAPI; + + if(imapc->ir_supported || data->set.sasl_ir) + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "imap", + imapc->mutual_auth, + NULL, &conn->krb5, + initresp, len); + } + else +#endif +#ifndef CURL_DISABLE_CRYPTO_AUTH + if((imapc->authmechs & SASL_MECH_DIGEST_MD5) && + (imapc->prefmech & SASL_MECH_DIGEST_MD5)) { + *mech = SASL_MECH_STRING_DIGEST_MD5; + *state1 = IMAP_AUTHENTICATE_DIGESTMD5; + imapc->authused = SASL_MECH_DIGEST_MD5; + } + else if((imapc->authmechs & SASL_MECH_CRAM_MD5) && + (imapc->prefmech & SASL_MECH_CRAM_MD5)) { + *mech = SASL_MECH_STRING_CRAM_MD5; + *state1 = IMAP_AUTHENTICATE_CRAMMD5; + imapc->authused = SASL_MECH_CRAM_MD5; + } + else +#endif +#ifdef USE_NTLM + if((imapc->authmechs & SASL_MECH_NTLM) && + (imapc->prefmech & SASL_MECH_NTLM)) { + *mech = SASL_MECH_STRING_NTLM; + *state1 = IMAP_AUTHENTICATE_NTLM; + *state2 = IMAP_AUTHENTICATE_NTLM_TYPE2MSG; + imapc->authused = SASL_MECH_NTLM; + + if(imapc->ir_supported || data->set.sasl_ir) + result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, + &conn->ntlm, + initresp, len); + } + else +#endif + if(((imapc->authmechs & SASL_MECH_XOAUTH2) && + (imapc->prefmech & SASL_MECH_XOAUTH2) && + (imapc->prefmech != SASL_AUTH_ANY)) || conn->xoauth2_bearer) { + *mech = SASL_MECH_STRING_XOAUTH2; + *state1 = IMAP_AUTHENTICATE_XOAUTH2; + *state2 = IMAP_AUTHENTICATE_FINAL; + imapc->authused = SASL_MECH_XOAUTH2; + + if(imapc->ir_supported || data->set.sasl_ir) + result = Curl_sasl_create_xoauth2_message(data, conn->user, + conn->xoauth2_bearer, + initresp, len); + } + else if((imapc->authmechs & SASL_MECH_LOGIN) && + (imapc->prefmech & SASL_MECH_LOGIN)) { + *mech = SASL_MECH_STRING_LOGIN; + *state1 = IMAP_AUTHENTICATE_LOGIN; + *state2 = IMAP_AUTHENTICATE_LOGIN_PASSWD; + imapc->authused = SASL_MECH_LOGIN; + + if(imapc->ir_supported || data->set.sasl_ir) + result = Curl_sasl_create_login_message(data, conn->user, initresp, len); + } + else if((imapc->authmechs & SASL_MECH_PLAIN) && + (imapc->prefmech & SASL_MECH_PLAIN)) { + *mech = SASL_MECH_STRING_PLAIN; + *state1 = IMAP_AUTHENTICATE_PLAIN; + *state2 = IMAP_AUTHENTICATE_FINAL; + imapc->authused = SASL_MECH_PLAIN; + + if(imapc->ir_supported || data->set.sasl_ir) + result = Curl_sasl_create_plain_message(data, conn->user, conn->passwd, + initresp, len); + } + + return result; +} + #endif /* CURL_DISABLE_IMAP */ diff --git a/lib/imap.h b/lib/imap.h index bc0a83d..768fc4b 100644 --- a/lib/imap.h +++ b/lib/imap.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2009 - 2014, 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 @@ -43,6 +43,11 @@ typedef enum { IMAP_AUTHENTICATE_DIGESTMD5_RESP, IMAP_AUTHENTICATE_NTLM, IMAP_AUTHENTICATE_NTLM_TYPE2MSG, + IMAP_AUTHENTICATE_GSSAPI, + IMAP_AUTHENTICATE_GSSAPI_TOKEN, + IMAP_AUTHENTICATE_GSSAPI_NO_DATA, + IMAP_AUTHENTICATE_XOAUTH2, + IMAP_AUTHENTICATE_CANCEL, IMAP_AUTHENTICATE_FINAL, IMAP_LOGIN, IMAP_LIST, @@ -51,6 +56,7 @@ typedef enum { IMAP_FETCH_FINAL, IMAP_APPEND, IMAP_APPEND_FINAL, + IMAP_SEARCH, IMAP_LOGOUT, IMAP_LAST /* never used */ } imapstate; @@ -65,6 +71,8 @@ struct IMAP { char *uidvalidity; /* UIDVALIDITY to check in select */ char *uid; /* Message UID to fetch */ char *section; /* Message SECTION to fetch */ + char *partial; /* Message PARTIAL to fetch */ + char *query; /* Query to search for */ char *custom; /* Custom request */ char *custom_params; /* Parameters for the custom request */ }; @@ -76,6 +84,7 @@ struct imap_conn { imapstate state; /* Always use imap.c:state() to change state! */ bool ssldone; /* Is connect() over SSL done? */ unsigned int authmechs; /* Accepted authentication mechanisms */ + unsigned int preftype; /* Preferred authentication type */ unsigned int prefmech; /* Preferred authentication mechanism */ unsigned int authused; /* Auth mechanism used for the connection */ int cmdid; /* Last used command ID */ @@ -83,6 +92,7 @@ struct imap_conn { bool tls_supported; /* StartTLS capability supported by server */ bool login_disabled; /* LOGIN command disabled by server */ bool ir_supported; /* Initial response supported by server */ + bool mutual_auth; /* Mutual authentication enabled (GSSAPI only) */ char *mailbox; /* The last selected mailbox */ char *mailbox_uidvalidity; /* UIDVALIDITY parsed from select response */ }; @@ -90,4 +100,12 @@ struct imap_conn { extern const struct Curl_handler Curl_handler_imap; extern const struct Curl_handler Curl_handler_imaps; +/* Authentication type flags */ +#define IMAP_TYPE_CLEARTEXT (1 << 0) +#define IMAP_TYPE_SASL (1 << 1) + +/* Authentication type values */ +#define IMAP_TYPE_NONE 0 +#define IMAP_TYPE_ANY ~0U + #endif /* HEADER_CURL_IMAP_H */ diff --git a/lib/krb4.c b/lib/krb4.c deleted file mode 100644 index 3d78962..0000000 --- a/lib/krb4.c +++ /dev/null @@ -1,440 +0,0 @@ -/* This source code was modified by Martin Hedenfalk for - * use in Curl. Martin's latest changes were done 2000-09-18. - * - * It has since been patched away like a madman by Daniel Stenberg to make it - * better applied to curl conditions, and to make it not use globals, pollute - * name space and more. - * - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * Copyright (c) 2004 - 2011 Daniel Stenberg - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include "curl_setup.h" - -#ifndef CURL_DISABLE_FTP -#ifdef HAVE_KRB4 - -#ifdef HAVE_NETDB_H -#include -#endif -#include -#include - -#include "urldata.h" -#include "curl_base64.h" -#include "ftp.h" -#include "sendf.h" -#include "krb4.h" -#include "inet_ntop.h" -#include "curl_memory.h" - -/* The last #include file should be: */ -#include "memdebug.h" - -#define LOCAL_ADDR (&conn->local_addr) -#define REMOTE_ADDR conn->ip_addr->ai_addr -#define myctladdr LOCAL_ADDR -#define hisctladdr REMOTE_ADDR - -struct krb4_data { - des_cblock key; - des_key_schedule schedule; - char name[ANAME_SZ]; - char instance[INST_SZ]; - char realm[REALM_SZ]; -}; - -#ifndef HAVE_STRLCPY -/* if it ever goes non-static, make it Curl_ prefixed! */ -static size_t -strlcpy (char *dst, const char *src, size_t dst_sz) -{ - size_t n; - char *p; - - for(p = dst, n = 0; - n + 1 < dst_sz && *src != '\0'; - ++p, ++src, ++n) - *p = *src; - *p = '\0'; - if(*src == '\0') - return n; - else - return n + strlen (src); -} -#else -size_t strlcpy (char *dst, const char *src, size_t dst_sz); -#endif - -static int -krb4_check_prot(void *app_data, int level) -{ - app_data = NULL; /* prevent compiler warning */ - if(level == PROT_CONFIDENTIAL) - return -1; - return 0; -} - -static int -krb4_decode(void *app_data, void *buf, int len, int level, - struct connectdata *conn) -{ - MSG_DAT m; - int e; - struct krb4_data *d = app_data; - - if(level == PROT_SAFE) - e = krb_rd_safe(buf, len, &d->key, - (struct sockaddr_in *)REMOTE_ADDR, - (struct sockaddr_in *)LOCAL_ADDR, &m); - else - e = krb_rd_priv(buf, len, d->schedule, &d->key, - (struct sockaddr_in *)REMOTE_ADDR, - (struct sockaddr_in *)LOCAL_ADDR, &m); - if(e) { - struct SessionHandle *data = conn->data; - infof(data, "krb4_decode: %s\n", krb_get_err_text(e)); - return -1; - } - memmove(buf, m.app_data, m.app_length); - return m.app_length; -} - -static int -krb4_overhead(void *app_data, int level, int len) -{ - /* no arguments are used, just init them to prevent compiler warnings */ - app_data = NULL; - level = 0; - len = 0; - return 31; -} - -static int -krb4_encode(void *app_data, const void *from, int length, int level, void **to, - struct connectdata *conn) -{ - struct krb4_data *d = app_data; - *to = malloc(length + 31); - if(!*to) - return -1; - if(level == PROT_SAFE) - /* NOTE that the void* cast is safe, krb_mk_safe/priv don't modify the - * input buffer - */ - return krb_mk_safe((void*)from, *to, length, &d->key, - (struct sockaddr_in *)LOCAL_ADDR, - (struct sockaddr_in *)REMOTE_ADDR); - else if(level == PROT_PRIVATE) - return krb_mk_priv((void*)from, *to, length, d->schedule, &d->key, - (struct sockaddr_in *)LOCAL_ADDR, - (struct sockaddr_in *)REMOTE_ADDR); - else - return -1; -} - -static int -mk_auth(struct krb4_data *d, KTEXT adat, - const char *service, char *host, int checksum) -{ - int ret; - CREDENTIALS cred; - char sname[SNAME_SZ], inst[INST_SZ], realm[REALM_SZ]; - - strlcpy(sname, service, sizeof(sname)); - strlcpy(inst, krb_get_phost(host), sizeof(inst)); - strlcpy(realm, krb_realmofhost(host), sizeof(realm)); - ret = krb_mk_req(adat, sname, inst, realm, checksum); - if(ret) - return ret; - strlcpy(sname, service, sizeof(sname)); - strlcpy(inst, krb_get_phost(host), sizeof(inst)); - strlcpy(realm, krb_realmofhost(host), sizeof(realm)); - ret = krb_get_cred(sname, inst, realm, &cred); - memmove(&d->key, &cred.session, sizeof(des_cblock)); - des_key_sched(&d->key, d->schedule); - memset(&cred, 0, sizeof(cred)); - return ret; -} - -#ifdef HAVE_KRB_GET_OUR_IP_FOR_REALM -int krb_get_our_ip_for_realm(char *, struct in_addr *); -#endif - -static int -krb4_auth(void *app_data, struct connectdata *conn) -{ - int ret; - char *p; - unsigned char *ptr; - size_t len = 0; - KTEXT_ST adat; - MSG_DAT msg_data; - int checksum; - u_int32_t cs; - struct krb4_data *d = app_data; - char *host = conn->host.name; - ssize_t nread; - int l = sizeof(conn->local_addr); - struct SessionHandle *data = conn->data; - CURLcode result; - size_t base64_sz = 0; - - if(getsockname(conn->sock[FIRSTSOCKET], - (struct sockaddr *)LOCAL_ADDR, &l) < 0) - perror("getsockname()"); - - checksum = getpid(); - ret = mk_auth(d, &adat, "ftp", host, checksum); - if(ret == KDC_PR_UNKNOWN) - ret = mk_auth(d, &adat, "rcmd", host, checksum); - if(ret) { - infof(data, "%s\n", krb_get_err_text(ret)); - return AUTH_CONTINUE; - } - -#ifdef HAVE_KRB_GET_OUR_IP_FOR_REALM - if(krb_get_config_bool("nat_in_use")) { - struct sockaddr_in *localaddr = (struct sockaddr_in *)LOCAL_ADDR; - struct in_addr natAddr; - - if(krb_get_our_ip_for_realm(krb_realmofhost(host), - &natAddr) != KSUCCESS - && krb_get_our_ip_for_realm(NULL, &natAddr) != KSUCCESS) - infof(data, "Can't get address for realm %s\n", - krb_realmofhost(host)); - else { - if(natAddr.s_addr != localaddr->sin_addr.s_addr) { - char addr_buf[128]; - if(Curl_inet_ntop(AF_INET, natAddr, addr_buf, sizeof(addr_buf))) - infof(data, "Using NAT IP address (%s) for kerberos 4\n", addr_buf); - localaddr->sin_addr = natAddr; - } - } - } -#endif - - result = Curl_base64_encode(conn->data, (char *)adat.dat, adat.length, - &p, &base64_sz); - if(result) { - Curl_failf(data, "base64-encoding: %s", curl_easy_strerror(result)); - return AUTH_CONTINUE; - } - - result = Curl_ftpsendf(conn, "ADAT %s", p); - - free(p); - - if(result) - return -2; - - if(Curl_GetFTPResponse(&nread, conn, NULL)) - return -1; - - if(data->state.buffer[0] != '2') { - Curl_failf(data, "Server didn't accept auth data"); - return AUTH_ERROR; - } - - p = strstr(data->state.buffer, "ADAT="); - if(!p) { - Curl_failf(data, "Remote host didn't send adat reply"); - return AUTH_ERROR; - } - p += 5; - result = Curl_base64_decode(p, &ptr, &len); - if(result) { - Curl_failf(data, "base64-decoding: %s", curl_easy_strerror(result)); - return AUTH_ERROR; - } - if(len > sizeof(adat.dat)-1) { - free(ptr); - ptr = NULL; - len = 0; - } - if(!len || !ptr) { - Curl_failf(data, "Failed to decode base64 from server"); - return AUTH_ERROR; - } - memcpy((char *)adat.dat, ptr, len); - free(ptr); - adat.length = len; - ret = krb_rd_safe(adat.dat, adat.length, &d->key, - (struct sockaddr_in *)hisctladdr, - (struct sockaddr_in *)myctladdr, &msg_data); - if(ret) { - Curl_failf(data, "Error reading reply from server: %s", - krb_get_err_text(ret)); - return AUTH_ERROR; - } - krb_get_int(msg_data.app_data, &cs, 4, 0); - if(cs - checksum != 1) { - Curl_failf(data, "Bad checksum returned from server"); - return AUTH_ERROR; - } - return AUTH_OK; -} - -struct Curl_sec_client_mech Curl_krb4_client_mech = { - "KERBEROS_V4", - sizeof(struct krb4_data), - NULL, /* init */ - krb4_auth, - NULL, /* end */ - krb4_check_prot, - krb4_overhead, - krb4_encode, - krb4_decode -}; - -static enum protection_level -krb4_set_command_prot(struct connectdata *conn, enum protection_level level) -{ - enum protection_level old = conn->command_prot; - DEBUGASSERT(level > PROT_NONE && level < PROT_LAST); - conn->command_prot = level; - return old; -} - -CURLcode Curl_krb_kauth(struct connectdata *conn) -{ - des_cblock key; - des_key_schedule schedule; - KTEXT_ST tkt, tktcopy; - char *name; - char *p; - char passwd[100]; - size_t tmp = 0; - ssize_t nread; - enum protection_level save; - CURLcode result; - unsigned char *ptr; - size_t base64_sz = 0; - - save = krb4_set_command_prot(conn, PROT_PRIVATE); - - result = Curl_ftpsendf(conn, "SITE KAUTH %s", conn->user); - - if(result) - return result; - - result = Curl_GetFTPResponse(&nread, conn, NULL); - if(result) - return result; - - if(conn->data->state.buffer[0] != '3') { - krb4_set_command_prot(conn, save); - return CURLE_FTP_WEIRD_SERVER_REPLY; - } - - p = strstr(conn->data->state.buffer, "T="); - if(!p) { - Curl_failf(conn->data, "Bad reply from server"); - krb4_set_command_prot(conn, save); - return CURLE_FTP_WEIRD_SERVER_REPLY; - } - - p += 2; - result = Curl_base64_decode(p, &ptr, &tmp); - if(result) { - Curl_failf(conn->data, "base64-decoding: %s", curl_easy_strerror(result)); - return result; - } - if(tmp >= sizeof(tkt.dat)) { - free(ptr); - ptr = NULL; - tmp = 0; - } - if(!tmp || !ptr) { - Curl_failf(conn->data, "Failed to decode base64 in reply"); - krb4_set_command_prot(conn, save); - return CURLE_FTP_WEIRD_SERVER_REPLY; - } - memcpy((char *)tkt.dat, ptr, tmp); - free(ptr); - tkt.length = tmp; - tktcopy.length = tkt.length; - - p = strstr(conn->data->state.buffer, "P="); - if(!p) { - Curl_failf(conn->data, "Bad reply from server"); - krb4_set_command_prot(conn, save); - return CURLE_FTP_WEIRD_SERVER_REPLY; - } - name = p + 2; - for(; *p && *p != ' ' && *p != '\r' && *p != '\n'; p++); - *p = 0; - - des_string_to_key (conn->passwd, &key); - des_key_sched(&key, schedule); - - des_pcbc_encrypt((void *)tkt.dat, (void *)tktcopy.dat, - tkt.length, - schedule, &key, DES_DECRYPT); - if(strcmp ((char*)tktcopy.dat + 8, - KRB_TICKET_GRANTING_TICKET) != 0) { - afs_string_to_key(passwd, - krb_realmofhost(conn->host.name), - &key); - des_key_sched(&key, schedule); - des_pcbc_encrypt((void *)tkt.dat, (void *)tktcopy.dat, - tkt.length, - schedule, &key, DES_DECRYPT); - } - memset(key, 0, sizeof(key)); - memset(schedule, 0, sizeof(schedule)); - memset(passwd, 0, sizeof(passwd)); - result = Curl_base64_encode(conn->data, (char *)tktcopy.dat, tktcopy.length, - &p, &base64_sz); - if(result) { - Curl_failf(conn->data, "base64-encoding: %s", curl_easy_strerror(result)); - krb4_set_command_prot(conn, save); - return result; - } - memset (tktcopy.dat, 0, tktcopy.length); - - result = Curl_ftpsendf(conn, "SITE KAUTH %s %s", name, p); - free(p); - if(result) - return result; - - result = Curl_GetFTPResponse(&nread, conn, NULL); - if(result) - return result; - krb4_set_command_prot(conn, save); - - return CURLE_OK; -} - -#endif /* HAVE_KRB4 */ -#endif /* CURL_DISABLE_FTP */ diff --git a/lib/krb5.c b/lib/krb5.c index 1e99c70..a0d7bb4 100644 --- a/lib/krb5.c +++ b/lib/krb5.c @@ -1,8 +1,8 @@ /* GSSAPI/krb5 support for FTP - loosely based on old krb4.c * - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2013 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). - * Copyright (c) 2004 - 2012 Daniel Stenberg + * Copyright (c) 2004 - 2014 Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,7 +51,7 @@ #include "ftp.h" #include "curl_gssapi.h" #include "sendf.h" -#include "krb4.h" +#include "curl_sec.h" #include "curl_memory.h" #include "warnless.h" @@ -121,8 +121,7 @@ krb5_overhead(void *app_data, int level, int len) } static int -krb5_encode(void *app_data, const void *from, int length, int level, void **to, - struct connectdata *conn UNUSED_PARAM) +krb5_encode(void *app_data, const void *from, int length, int level, void **to) { gss_ctx_id_t *context = app_data; gss_buffer_desc dec, enc; @@ -130,9 +129,6 @@ krb5_encode(void *app_data, const void *from, int length, int level, void **to, int state; int len; - /* shut gcc up */ - conn = NULL; - /* NOTE that the cast is safe, neither of the krb5, gnu gss and heimdal * libraries modify the input buffer in gss_seal() */ @@ -236,9 +232,11 @@ krb5_auth(void *app_data, struct connectdata *conn) &min, context, gssname, + &Curl_krb5_mech_oid, &chan, gssresp, &output_buffer, + TRUE, NULL); if(gssresp) { diff --git a/lib/ldap.c b/lib/ldap.c index 2352715..f27fa90 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -64,8 +64,10 @@ #include "strtok.h" #include "curl_ldap.h" #include "curl_memory.h" +#include "curl_multibyte.h" #include "curl_base64.h" #include "rawstr.h" +#include "connect.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -77,13 +79,25 @@ /* Use our own implementation. */ typedef struct { - char *lud_host; - int lud_port; - char *lud_dn; - char **lud_attrs; - int lud_scope; - char *lud_filter; - char **lud_exts; + char *lud_host; + int lud_port; +#if defined(CURL_LDAP_WIN) + TCHAR *lud_dn; + TCHAR **lud_attrs; +#else + char *lud_dn; + char **lud_attrs; +#endif + int lud_scope; +#if defined(CURL_LDAP_WIN) + TCHAR *lud_filter; +#else + char *lud_filter; +#endif + char **lud_exts; + size_t lud_attrs_dups; /* how many were dup'ed, this field is not in the + "real" struct so can only be used in code + without HAVE_LDAP_URL_PARSE defined */ } CURL_LDAPURLDesc; #undef LDAPURLDesc @@ -156,7 +170,7 @@ const struct Curl_handler Curl_handler_ldaps = { ZERO_NULL, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_LDAPS, /* defport */ - CURLPROTO_LDAP | CURLPROTO_LDAPS, /* protocol */ + CURLPROTO_LDAPS, /* protocol */ PROTOPT_SSL /* flags */ }; #endif @@ -164,11 +178,11 @@ const struct Curl_handler Curl_handler_ldaps = { static CURLcode Curl_ldap(struct connectdata *conn, bool *done) { - CURLcode status = CURLE_OK; + CURLcode result = CURLE_OK; int rc = 0; LDAP *server = NULL; LDAPURLDesc *ludp = NULL; - LDAPMessage *result = NULL; + LDAPMessage *ldapmsg = NULL; LDAPMessage *entryIterator; int num = 0; struct SessionHandle *data=conn->data; @@ -180,6 +194,15 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) #ifdef LDAP_OPT_NETWORK_TIMEOUT struct timeval ldap_timeout = {10,0}; /* 10 sec connection/search timeout */ #endif +#if defined(CURL_LDAP_WIN) + TCHAR *host = NULL; + TCHAR *user = NULL; + TCHAR *passwd = NULL; +#else + char *host = NULL; + char *user = NULL; + char *passwd = NULL; +#endif *done = TRUE; /* unconditionally */ infof(data, "LDAP local: LDAP Vendor = %s ; LDAP Version = %d\n", @@ -193,7 +216,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) #endif if(rc != 0) { failf(data, "LDAP local: %s", ldap_err2string(rc)); - status = CURLE_LDAP_INVALID_URL; + result = CURLE_LDAP_INVALID_URL; goto quit; } @@ -203,6 +226,32 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) infof(data, "LDAP local: trying to establish %s connection\n", ldap_ssl ? "encrypted" : "cleartext"); +#if defined(CURL_LDAP_WIN) + host = Curl_convert_UTF8_to_tchar(conn->host.name); + if(!host) { + result = CURLE_OUT_OF_MEMORY; + + goto quit; + } + + if(conn->bits.user_passwd) { + user = Curl_convert_UTF8_to_tchar(conn->user); + passwd = Curl_convert_UTF8_to_tchar(conn->passwd); + if(!user || !passwd) { + result = CURLE_OUT_OF_MEMORY; + + goto quit; + } + } +#else + host = conn->host.name; + + if(conn->bits.user_passwd) { + user = conn->user; + passwd = conn->passwd; + } +#endif + #ifdef LDAP_OPT_NETWORK_TIMEOUT ldap_set_option(NULL, LDAP_OPT_NETWORK_TIMEOUT, &ldap_timeout); #endif @@ -212,7 +261,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) #ifdef HAVE_LDAP_SSL #ifdef CURL_LDAP_WIN /* Win32 LDAP SDK doesn't support insecure mode without CA! */ - server = ldap_sslinit(conn->host.name, (int)conn->port, 1); + server = ldap_sslinit(host, (int)conn->port, 1); ldap_set_option(server, LDAP_OPT_SSL, LDAP_OPT_ON); #else int ldap_option; @@ -221,7 +270,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) rc = ldapssl_client_init(NULL, NULL); if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ldapssl_client_init %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } if(data->set.ssl.verifypeer) { @@ -233,7 +282,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(!ldap_ca) { failf(data, "LDAP local: ERROR %s CA cert not set!", (cert_type == LDAPSSL_CERT_FILETYPE_DER ? "DER" : "PEM")); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } infof(data, "LDAP local: using %s CA cert '%s'\n", @@ -244,7 +293,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) failf(data, "LDAP local: ERROR setting %s CA cert: %s", (cert_type == LDAPSSL_CERT_FILETYPE_DER ? "DER" : "PEM"), ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } ldap_option = LDAPSSL_VERIFY_SERVER; @@ -255,14 +304,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ERROR setting cert verify mode: %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } - server = ldapssl_init(conn->host.name, (int)conn->port, 1); + server = ldapssl_init(host, (int)conn->port, 1); if(server == NULL) { failf(data, "LDAP local: Cannot connect to %s:%ld", - conn->host.name, conn->port); - status = CURLE_COULDNT_CONNECT; + conn->host.dispname, conn->port); + result = CURLE_COULDNT_CONNECT; goto quit; } #elif defined(LDAP_OPT_X_TLS) @@ -271,12 +320,12 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if((data->set.str[STRING_CERT_TYPE]) && (!Curl_raw_equal(data->set.str[STRING_CERT_TYPE], "PEM"))) { failf(data, "LDAP local: ERROR OpenLDAP only supports PEM cert-type!"); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } if(!ldap_ca) { failf(data, "LDAP local: ERROR PEM CA cert not set!"); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } infof(data, "LDAP local: using PEM CA cert: %s\n", ldap_ca); @@ -284,7 +333,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ERROR setting PEM CA cert: %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } ldap_option = LDAP_OPT_X_TLS_DEMAND; @@ -296,14 +345,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ERROR setting cert verify mode: %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } - server = ldap_init(conn->host.name, (int)conn->port); + server = ldap_init(host, (int)conn->port); if(server == NULL) { failf(data, "LDAP local: Cannot connect to %s:%ld", - conn->host.name, conn->port); - status = CURLE_COULDNT_CONNECT; + conn->host.dispname, conn->port); + result = CURLE_COULDNT_CONNECT; goto quit; } ldap_option = LDAP_OPT_X_TLS_HARD; @@ -311,7 +360,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ERROR setting SSL/TLS mode: %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } /* @@ -319,7 +368,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) if(rc != LDAP_SUCCESS) { failf(data, "LDAP local: ERROR starting SSL/TLS mode: %s", ldap_err2string(rc)); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; } */ @@ -328,18 +377,18 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) should check in first place if we can support LDAP SSL/TLS */ failf(data, "LDAP local: SSL/TLS not supported with this version " "of the OpenLDAP toolkit\n"); - status = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto quit; #endif #endif #endif /* CURL_LDAP_USE_SSL */ } else { - server = ldap_init(conn->host.name, (int)conn->port); + server = ldap_init(host, (int)conn->port); if(server == NULL) { failf(data, "LDAP local: Cannot connect to %s:%ld", - conn->host.name, conn->port); - status = CURLE_COULDNT_CONNECT; + conn->host.dispname, conn->port); + result = CURLE_COULDNT_CONNECT; goto quit; } } @@ -347,107 +396,259 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto); #endif - rc = ldap_simple_bind_s(server, - conn->bits.user_passwd ? conn->user : NULL, - conn->bits.user_passwd ? conn->passwd : NULL); + rc = ldap_simple_bind_s(server, user, passwd); if(!ldap_ssl && rc != 0) { ldap_proto = LDAP_VERSION2; ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto); - rc = ldap_simple_bind_s(server, - conn->bits.user_passwd ? conn->user : NULL, - conn->bits.user_passwd ? conn->passwd : NULL); + rc = ldap_simple_bind_s(server, user, passwd); } if(rc != 0) { failf(data, "LDAP local: ldap_simple_bind_s %s", ldap_err2string(rc)); - status = CURLE_LDAP_CANNOT_BIND; + result = CURLE_LDAP_CANNOT_BIND; goto quit; } rc = ldap_search_s(server, ludp->lud_dn, ludp->lud_scope, - ludp->lud_filter, ludp->lud_attrs, 0, &result); + ludp->lud_filter, ludp->lud_attrs, 0, &ldapmsg); if(rc != 0 && rc != LDAP_SIZELIMIT_EXCEEDED) { failf(data, "LDAP remote: %s", ldap_err2string(rc)); - status = CURLE_LDAP_SEARCH_FAILED; + result = CURLE_LDAP_SEARCH_FAILED; goto quit; } - for(num = 0, entryIterator = ldap_first_entry(server, result); + for(num = 0, entryIterator = ldap_first_entry(server, ldapmsg); entryIterator; entryIterator = ldap_next_entry(server, entryIterator), num++) { BerElement *ber = NULL; +#if defined(CURL_LDAP_WIN) + TCHAR *attribute; +#else char *attribute; /*! suspicious that this isn't 'const' */ - char *dn = ldap_get_dn(server, entryIterator); +#endif int i; - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)dn, 0); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + /* Get the DN and write it to the client */ + { + char *name; + size_t name_len; +#if defined(CURL_LDAP_WIN) + TCHAR *dn = ldap_get_dn(server, entryIterator); + name = Curl_convert_tchar_to_UTF8(dn); + if(!name) { + ldap_memfree(dn); + + result = CURLE_OUT_OF_MEMORY; + + goto quit; + } +#else + char *dn = name = ldap_get_dn(server, entryIterator); +#endif + name_len = strlen(name); + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4); + if(result) { +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(name); +#endif + ldap_memfree(dn); - dlsize += strlen(dn)+5; + goto quit; + } + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *) name, + name_len); + if(result) { +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(name); +#endif + ldap_memfree(dn); + goto quit; + } + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + if(result) { +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(name); +#endif + ldap_memfree(dn); + + goto quit; + } + + dlsize += name_len + 5; + +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(name); +#endif + ldap_memfree(dn); + } + + /* Get the attributes and write them to the client */ for(attribute = ldap_first_attribute(server, entryIterator, &ber); attribute; attribute = ldap_next_attribute(server, entryIterator, ber)) { - BerValue **vals = ldap_get_values_len(server, entryIterator, attribute); + BerValue **vals; + size_t attr_len; +#if defined(CURL_LDAP_WIN) + char *attr = Curl_convert_tchar_to_UTF8(attribute); + if(!attr) { + if(ber) + ber_free(ber, 0); + + result = CURLE_OUT_OF_MEMORY; + goto quit; + } +#else + char *attr = attribute; +#endif + attr_len = strlen(attr); + + vals = ldap_get_values_len(server, entryIterator, attribute); if(vals != NULL) { for(i = 0; (vals[i] != NULL); i++) { - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *) attribute, 0); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2); - dlsize += strlen(attribute)+3; - - if((strlen(attribute) > 7) && - (strcmp(";binary", - (char *)attribute + - (strlen((char *)attribute) - 7)) == 0)) { + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + + result = Curl_client_write(conn, CLIENTWRITE_BODY, + (char *) attr, attr_len); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + + dlsize += attr_len + 3; + + if((attr_len > 7) && + (strcmp(";binary", (char *) attr + (attr_len - 7)) == 0)) { /* Binary attribute, encode to base64. */ - CURLcode error = Curl_base64_encode(data, - vals[i]->bv_val, - vals[i]->bv_len, - &val_b64, - &val_b64_sz); - if(error) { + result = Curl_base64_encode(data, + vals[i]->bv_val, + vals[i]->bv_len, + &val_b64, + &val_b64_sz); + if(result) { ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif ldap_memfree(attribute); - ldap_memfree(dn); if(ber) ber_free(ber, 0); - status = error; + goto quit; } + if(val_b64_sz > 0) { - Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, val_b64_sz); + result = Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, + val_b64_sz); free(val_b64); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + dlsize += val_b64_sz; } } else { - Curl_client_write(conn, CLIENTWRITE_BODY, vals[i]->bv_val, - vals[i]->bv_len); + result = Curl_client_write(conn, CLIENTWRITE_BODY, vals[i]->bv_val, + vals[i]->bv_len); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + dlsize += vals[i]->bv_len; } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + if(result) { + ldap_value_free_len(vals); +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + if(ber) + ber_free(ber, 0); + + goto quit; + } + dlsize++; } /* Free memory used to store values */ ldap_value_free_len(vals); } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + + /* Free the attribute as we are done with it */ +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(attr); +#endif + ldap_memfree(attribute); + + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + if(result) + goto quit; dlsize++; Curl_pgrsSetDownloadCounter(data, dlsize); - ldap_memfree(attribute); } - ldap_memfree(dn); + if(ber) ber_free(ber, 0); } quit: - if(result) { - ldap_msgfree(result); + if(ldapmsg) { + ldap_msgfree(ldapmsg); LDAP_TRACE (("Received %d entries\n", num)); } if(rc == LDAP_SIZELIMIT_EXCEEDED) @@ -461,11 +662,17 @@ quit: ldapssl_client_deinit(); #endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */ +#if defined(CURL_LDAP_WIN) + Curl_unicodefree(passwd); + Curl_unicodefree(user); + Curl_unicodefree(host); +#endif + /* no data to transfer */ Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); - conn->bits.close = TRUE; + connclose(conn, "LDAP connection always disable re-use"); - return status; + return result; } #ifdef DEBUG_LDAP @@ -509,61 +716,34 @@ static int str2scope (const char *p) /* * Split 'str' into strings separated by commas. - * Note: res[] points into 'str'. + * Note: out[] points into 'str'. */ -static char **split_str (char *str) +static bool split_str(char *str, char ***out, size_t *count) { - char **res, *lasts, *s; - int i; - - for(i = 2, s = strchr(str,','); s; i++) - s = strchr(++s,','); + char **res; + char *lasts; + char *s; + size_t i; + size_t items = 1; + + s = strchr(str, ','); + while(s) { + items++; + s = strchr(++s, ','); + } - res = calloc(i, sizeof(char*)); + res = calloc(items, sizeof(char *)); if(!res) - return NULL; + return FALSE; - for(i = 0, s = strtok_r(str, ",", &lasts); s; + for(i = 0, s = strtok_r(str, ",", &lasts); s && i < items; s = strtok_r(NULL, ",", &lasts), i++) res[i] = s; - return res; -} - -/* - * Unescape the LDAP-URL components - */ -static bool unescape_elements (void *data, LDAPURLDesc *ludp) -{ - int i; - - if(ludp->lud_filter) { - ludp->lud_filter = curl_easy_unescape(data, ludp->lud_filter, 0, NULL); - if(!ludp->lud_filter) - return (FALSE); - } - for(i = 0; ludp->lud_attrs && ludp->lud_attrs[i]; i++) { - ludp->lud_attrs[i] = curl_easy_unescape(data, ludp->lud_attrs[i], 0, NULL); - if(!ludp->lud_attrs[i]) - return (FALSE); - } + *out = res; + *count = items; - for(i = 0; ludp->lud_exts && ludp->lud_exts[i]; i++) { - ludp->lud_exts[i] = curl_easy_unescape(data, ludp->lud_exts[i], 0, NULL); - if(!ludp->lud_exts[i]) - return (FALSE); - } - - if(ludp->lud_dn) { - char *dn = ludp->lud_dn; - char *new_dn = curl_easy_unescape(data, dn, 0, NULL); - - free(dn); - ludp->lud_dn = new_dn; - if(!new_dn) - return (FALSE); - } - return (TRUE); + return TRUE; } /* @@ -582,8 +762,11 @@ static bool unescape_elements (void *data, LDAPURLDesc *ludp) */ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp) { - char *p, *q; - int i; + int rc = LDAP_SUCCESS; + char *path; + char *p; + char *q; + size_t i; if(!conn->data || !conn->data->state.path || @@ -595,85 +778,190 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp) ludp->lud_port = conn->remote_port; ludp->lud_host = conn->host.name; - /* parse DN (Distinguished Name). - */ - ludp->lud_dn = strdup(conn->data->state.path+1); - if(!ludp->lud_dn) + /* Duplicate the path */ + p = path = strdup(conn->data->state.path + 1); + if(!path) return LDAP_NO_MEMORY; - p = strchr(ludp->lud_dn, '?'); - LDAP_TRACE (("DN '%.*s'\n", p ? (size_t)(p-ludp->lud_dn) : - strlen(ludp->lud_dn), ludp->lud_dn)); + /* Parse the DN (Distinguished Name) */ + q = strchr(p, '?'); + if(q) + *q++ = '\0'; - if(!p) - goto success; + if(*p) { + char *dn = p; + char *unescaped; + + LDAP_TRACE (("DN '%s'\n", dn)); + + /* Unescape the DN */ + unescaped = curl_easy_unescape(conn->data, dn, 0, NULL); + if(!unescaped) { + rc = LDAP_NO_MEMORY; + + goto quit; + } + +#if defined(CURL_LDAP_WIN) + /* Convert the unescaped string to a tchar */ + ludp->lud_dn = Curl_convert_UTF8_to_tchar(unescaped); + + /* Free the unescaped string as we are done with it */ + Curl_unicodefree(unescaped); - *p++ = '\0'; + if(!ludp->lud_dn) { + rc = LDAP_NO_MEMORY; + + goto quit; + } +#else + ludp->lud_dn = unescaped; +#endif + } - /* parse attributes. skip "??". - */ + p = q; + if(!p) + goto quit; + + /* Parse the attributes. skip "??" */ q = strchr(p, '?'); if(q) *q++ = '\0'; - if(*p && *p != '?') { - ludp->lud_attrs = split_str(p); - if(!ludp->lud_attrs) - return LDAP_NO_MEMORY; + if(*p) { + char **attributes; + size_t count = 0; + + /* Split the string into an array of attributes */ + if(!split_str(p, &attributes, &count)) { + rc = LDAP_NO_MEMORY; + + goto quit; + } + + /* Allocate our array (+1 for the NULL entry) */ +#if defined(CURL_LDAP_WIN) + ludp->lud_attrs = calloc(count + 1, sizeof(TCHAR *)); +#else + ludp->lud_attrs = calloc(count + 1, sizeof(char *)); +#endif + if(!ludp->lud_attrs) { + Curl_safefree(attributes); + + rc = LDAP_NO_MEMORY; + + goto quit; + } + + for(i = 0; i < count; i++) { + char *unescaped; + + LDAP_TRACE (("attr[%d] '%s'\n", i, attributes[i])); + + /* Unescape the attribute */ + unescaped = curl_easy_unescape(conn->data, attributes[i], 0, NULL); + if(!unescaped) { + Curl_safefree(attributes); + + rc = LDAP_NO_MEMORY; + + goto quit; + } + +#if defined(CURL_LDAP_WIN) + /* Convert the unescaped string to a tchar */ + ludp->lud_attrs[i] = Curl_convert_UTF8_to_tchar(unescaped); + + /* Free the unescaped string as we are done with it */ + Curl_unicodefree(unescaped); + + if(!ludp->lud_attrs[i]) { + Curl_safefree(attributes); + + rc = LDAP_NO_MEMORY; - for(i = 0; ludp->lud_attrs[i]; i++) - LDAP_TRACE (("attr[%d] '%s'\n", i, ludp->lud_attrs[i])); + goto quit; + } +#else + ludp->lud_attrs[i] = unescaped; +#endif + + ludp->lud_attrs_dups++; + } + + Curl_safefree(attributes); } p = q; if(!p) - goto success; + goto quit; - /* parse scope. skip "??" - */ + /* Parse the scope. skip "??" */ q = strchr(p, '?'); if(q) *q++ = '\0'; - if(*p && *p != '?') { + if(*p) { ludp->lud_scope = str2scope(p); - if(ludp->lud_scope == -1) - return LDAP_INVALID_SYNTAX; + if(ludp->lud_scope == -1) { + rc = LDAP_INVALID_SYNTAX; + + goto quit; + } LDAP_TRACE (("scope %d\n", ludp->lud_scope)); } p = q; if(!p) - goto success; + goto quit; - /* parse filter - */ + /* Parse the filter */ q = strchr(p, '?'); if(q) *q++ = '\0'; - if(!*p) - return LDAP_INVALID_SYNTAX; - ludp->lud_filter = p; - LDAP_TRACE (("filter '%s'\n", ludp->lud_filter)); + if(*p) { + char *filter = p; + char *unescaped; + + LDAP_TRACE (("filter '%s'\n", filter)); + + /* Unescape the filter */ + unescaped = curl_easy_unescape(conn->data, filter, 0, NULL); + if(!unescaped) { + rc = LDAP_NO_MEMORY; + + goto quit; + } + +#if defined(CURL_LDAP_WIN) + /* Convert the unescaped string to a tchar */ + ludp->lud_filter = Curl_convert_UTF8_to_tchar(unescaped); + + /* Free the unescaped string as we are done with it */ + Curl_unicodefree(unescaped); + + if(!ludp->lud_filter) { + rc = LDAP_NO_MEMORY; + + goto quit; + } +#else + ludp->lud_filter = unescaped; +#endif + } p = q; - if(!p) - goto success; + if(p && !*p) { + rc = LDAP_INVALID_SYNTAX; - /* parse extensions - */ - ludp->lud_exts = split_str(p); - if(!ludp->lud_exts) - return LDAP_NO_MEMORY; + goto quit; + } - for(i = 0; ludp->lud_exts[i]; i++) - LDAP_TRACE (("exts[%d] '%s'\n", i, ludp->lud_exts[i])); +quit: + Curl_safefree(path); - success: - if(!unescape_elements(conn->data, ludp)) - return LDAP_NO_MEMORY; - return LDAP_SUCCESS; + return rc; } static int _ldap_url_parse (const struct connectdata *conn, @@ -697,7 +985,7 @@ static int _ldap_url_parse (const struct connectdata *conn, static void _ldap_free_urldesc (LDAPURLDesc *ludp) { - int i; + size_t i; if(!ludp) return; @@ -709,16 +997,11 @@ static void _ldap_free_urldesc (LDAPURLDesc *ludp) free(ludp->lud_filter); if(ludp->lud_attrs) { - for(i = 0; ludp->lud_attrs[i]; i++) + for(i = 0; i < ludp->lud_attrs_dups; i++) free(ludp->lud_attrs[i]); free(ludp->lud_attrs); } - if(ludp->lud_exts) { - for(i = 0; ludp->lud_exts[i]; i++) - free(ludp->lud_exts[i]); - free(ludp->lud_exts); - } free (ludp); } #endif /* !HAVE_LDAP_URL_PARSE */ diff --git a/lib/libcurl.plist b/lib/libcurl.plist index da77c22..cb60271 100644 --- a/lib/libcurl.plist +++ b/lib/libcurl.plist @@ -15,7 +15,7 @@ se.haxx.curl.libcurl CFBundleVersion - 7.32.0 + 7.40.0 CFBundleName libcurl @@ -27,9 +27,9 @@ ???? CFBundleShortVersionString - libcurl 7.32.0 + libcurl 7.40.0 CFBundleGetInfoString - libcurl.plist 7.32.0 + libcurl.plist 7.40.0 diff --git a/lib/md4.c b/lib/md4.c index 6930e02..fd0c6d4 100644 --- a/lib/md4.c +++ b/lib/md4.c @@ -22,9 +22,9 @@ #include "curl_setup.h" -/* NSS crypto library does not provide the MD4 hash algorithm, so that we have - * a local implementation of it */ -#ifdef USE_NSS +/* NSS and OS/400 crypto library do not provide the MD4 hash algorithm, so + * that we have a local implementation of it */ +#if defined(USE_NSS) || defined(USE_OS400CRYPTO) #include "curl_md4.h" #include "warnless.h" @@ -279,4 +279,4 @@ void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len) MD4Update(&ctx, input, curlx_uztoui(len)); MD4Final(output, &ctx); } -#endif /* USE_NSS */ +#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) */ diff --git a/lib/md5.c b/lib/md5.c index d8344db..af39fd4 100644 --- a/lib/md5.c +++ b/lib/md5.c @@ -147,7 +147,7 @@ static void MD5_Update(MD5_CTX *ctx, static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx) { - unsigned long length; + unsigned long length = 0; CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); if(length == 16) CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); diff --git a/lib/memdebug.c b/lib/memdebug.c index 7d68af8..4afa620 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -314,7 +314,7 @@ void curl_dofree(void *ptr, int line, const char *source) { struct memdebug *mem; - assert(ptr != NULL); + if(ptr) { #ifdef __INTEL_COMPILER # pragma warning(push) @@ -322,17 +322,18 @@ void curl_dofree(void *ptr, int line, const char *source) /* 1684: conversion from pointer to same-sized integral type */ #endif - mem = (void *)((char *)ptr - offsetof(struct memdebug, mem)); + mem = (void *)((char *)ptr - offsetof(struct memdebug, mem)); #ifdef __INTEL_COMPILER # pragma warning(pop) #endif - /* destroy */ - mt_free_fill(mem->mem, mem->size); + /* destroy */ + mt_free_fill(mem->mem, mem->size); - /* free for real */ - (Curl_cfree)(mem); + /* free for real */ + (Curl_cfree)(mem); + } if(source) curl_memlog("MEM %s:%d free(%p)\n", source, line, (void *)ptr); diff --git a/lib/mk-ca-bundle.pl b/lib/mk-ca-bundle.pl index 1a9c859..0b13318 100755 --- a/lib/mk-ca-bundle.pl +++ b/lib/mk-ca-bundle.pl @@ -6,7 +6,7 @@ # * | (__| |_| | _ <| |___ # * \___|\___/|_| \_\_____| # * -# * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# * Copyright (C) 1998 - 2014, 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 @@ -34,40 +34,143 @@ use Getopt::Std; use MIME::Base64; use LWP::UserAgent; use strict; -use vars qw($opt_b $opt_f $opt_h $opt_i $opt_l $opt_n $opt_q $opt_t $opt_u $opt_v $opt_w); +use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_l $opt_n $opt_p $opt_q $opt_s $opt_t $opt_u $opt_v $opt_w); +use List::Util; +use Text::Wrap; +my $MOD_SHA = "Digest::SHA"; +eval "require $MOD_SHA"; +if ($@) { + $MOD_SHA = "Digest::SHA::PurePerl"; + eval "require $MOD_SHA"; +} + +my %urls = ( + 'nss' => + 'http://hg.mozilla.org/projects/nss/raw-file/tip/lib/ckfw/builtins/certdata.txt', + 'central' => + 'http://hg.mozilla.org/mozilla-central/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', + 'aurora' => + 'http://hg.mozilla.org/releases/mozilla-aurora/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', + 'beta' => + 'http://hg.mozilla.org/releases/mozilla-beta/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', + 'release' => + 'http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', +); + +$opt_d = 'release'; -my $url = 'http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1'; # If the OpenSSL commandline is not in search path you can configure it here! my $openssl = 'openssl'; -my $version = '1.19'; +my $version = '1.25'; $opt_w = 76; # default base64 encoded lines length +# default cert types to include in the output (default is to include CAs which may issue SSL server certs) +my $default_mozilla_trust_purposes = "SERVER_AUTH"; +my $default_mozilla_trust_levels = "TRUSTED_DELEGATOR"; +$opt_p = $default_mozilla_trust_purposes . ":" . $default_mozilla_trust_levels; + +my @valid_mozilla_trust_purposes = ( + "DIGITAL_SIGNATURE", + "NON_REPUDIATION", + "KEY_ENCIPHERMENT", + "DATA_ENCIPHERMENT", + "KEY_AGREEMENT", + "KEY_CERT_SIGN", + "CRL_SIGN", + "SERVER_AUTH", + "CLIENT_AUTH", + "CODE_SIGNING", + "EMAIL_PROTECTION", + "IPSEC_END_SYSTEM", + "IPSEC_TUNNEL", + "IPSEC_USER", + "TIME_STAMPING", + "STEP_UP_APPROVED" +); + +my @valid_mozilla_trust_levels = ( + "TRUSTED_DELEGATOR", # CAs + "NOT_TRUSTED", # Don't trust these certs. + "MUST_VERIFY_TRUST", # This explicitly tells us that it ISN'T a CA but is otherwise ok. In other words, this should tell the app to ignore any other sources that claim this is a CA. + "TRUSTED" # This cert is trusted, but only for itself and not for delegates (i.e. it is not a CA). +); + +my $default_signature_algorithms = $opt_s = "MD5"; + +my @valid_signature_algorithms = ( + "MD5", + "SHA1", + "SHA256", + "SHA384", + "SHA512" +); + $0 =~ s@.*(/|\\)@@; $Getopt::Std::STANDARD_HELP_VERSION = 1; -getopts('bfhilnqtuvw:'); +getopts('bd:fhilnp:qs:tuvw:'); + +if(!defined($opt_d)) { + # to make plain "-d" use not cause warnings, and actually still work + $opt_d = 'release'; +} + +# Use predefined URL or else custom URL specified on command line. +my $url = ( defined( $urls{$opt_d} ) ) ? $urls{$opt_d} : $opt_d; + +my $curl = `curl -V`; if ($opt_i) { print ("=" x 78 . "\n"); - print "Script Version : $version\n"; - print "Perl Version : $]\n"; - print "Operating System Name : $^O\n"; - print "Getopt::Std.pm Version : ${Getopt::Std::VERSION}\n"; - print "MIME::Base64.pm Version : ${MIME::Base64::VERSION}\n"; - print "LWP::UserAgent.pm Version : ${LWP::UserAgent::VERSION}\n"; - print "LWP.pm Version : ${LWP::VERSION}\n"; + print "Script Version : $version\n"; + print "Perl Version : $]\n"; + print "Operating System Name : $^O\n"; + print "Getopt::Std.pm Version : ${Getopt::Std::VERSION}\n"; + print "MIME::Base64.pm Version : ${MIME::Base64::VERSION}\n"; + print "LWP::UserAgent.pm Version : ${LWP::UserAgent::VERSION}\n"; + print "LWP.pm Version : ${LWP::VERSION}\n"; + print "Digest::SHA.pm Version : ${Digest::SHA::VERSION}\n" if ($Digest::SHA::VERSION); + print "Digest::SHA::PurePerl.pm Version : ${Digest::SHA::PurePerl::VERSION}\n" if ($Digest::SHA::PurePerl::VERSION); print ("=" x 78 . "\n"); } +sub warning_message() { + if ( $opt_d =~ m/^risk$/i ) { # Long Form Warning and Exit + print "Warning: Use of this script may pose some risk:\n"; + print "\n"; + print " 1) Using http is subject to man in the middle attack of certdata content\n"; + print " 2) Default to 'release', but more recent updates may be found in other trees\n"; + print " 3) certdata.txt file format may change, lag time to update this script\n"; + print " 4) Generally unwise to blindly trust CAs without manual review & verification\n"; + print " 5) Mozilla apps use additional security checks aren't represented in certdata\n"; + print " 6) Use of this script will make a security engineer grind his teeth and\n"; + print " swear at you. ;)\n"; + exit; + } else { # Short Form Warning + print "Warning: Use of this script may pose some risk, -d risk for more details.\n"; + } +} + sub HELP_MESSAGE() { - print "Usage:\t${0} [-b] [-f] [-i] [-l] [-n] [-q] [-t] [-u] [-v] [-w] []\n"; + print "Usage:\t${0} [-b] [-d] [-f] [-i] [-l] [-n] [-p] [-q] [-s] [-t] [-u] [-v] [-w] []\n"; print "\t-b\tbackup an existing version of ca-bundle.crt\n"; + print "\t-d\tspecify Mozilla tree to pull certdata.txt or custom URL\n"; + print "\t\t Valid names are:\n"; + print "\t\t ", join( ", ", map { ( $_ =~ m/$opt_d/ ) ? "$_ (default)" : "$_" } sort keys %urls ), "\n"; print "\t-f\tforce rebuild even if certdata.txt is current\n"; print "\t-i\tprint version info about used modules\n"; print "\t-l\tprint license info about certdata.txt\n"; print "\t-n\tno download of certdata.txt (to use existing)\n"; + print wrap("\t","\t\t", "-p\tlist of Mozilla trust purposes and levels for certificates to include in output. Takes the form of a comma separated list of purposes, a colon, and a comma separated list of levels. (default: $default_mozilla_trust_purposes:$default_mozilla_trust_levels)"), "\n"; + print "\t\t Valid purposes are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_purposes ) ), "\n"; + print "\t\t Valid levels are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_levels ) ), "\n"; print "\t-q\tbe really quiet (no progress output at all)\n"; + print wrap("\t","\t\t", "-s\tcomma separated list of certificate signatures/hashes to output in plain text mode. (default: $default_signature_algorithms)\n"); + print "\t\t Valid signature algorithms are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_signature_algorithms ) ), "\n"; print "\t-t\tinclude plain text listing of certificates\n"; print "\t-u\tunlink (remove) certdata.txt after processing\n"; print "\t-v\tbe verbose and print out processed CAs\n"; @@ -79,8 +182,93 @@ sub VERSION_MESSAGE() { print "${0} version ${version} running Perl ${]} on ${^O}\n"; } +warning_message() unless ($opt_q || $url =~ m/^(ht|f)tps:/i ); HELP_MESSAGE() if ($opt_h); +sub is_in_list($@) { + my $target = shift; + + return defined(List::Util::first { $target eq $_ } @_); +} + +# Parses $param_string as a case insensitive comma separated list with optional whitespace +# validates that only allowed parameters are supplied +sub parse_csv_param($$@) { + my $description = shift; + my $param_string = shift; + my @valid_values = @_; + + my @values = map { + s/^\s+//; # strip leading spaces + s/\s+$//; # strip trailing spaces + uc $_ # return the modified string as upper case + } split( ',', $param_string ); + + # Find all values which are not in the list of valid values or "ALL" + my @invalid = grep { !is_in_list($_,"ALL",@valid_values) } @values; + + if ( scalar(@invalid) > 0 ) { + # Tell the user which parameters were invalid and print the standard help message which will exit + print "Error: Invalid ", $description, scalar(@invalid) == 1 ? ": " : "s: ", join( ", ", map { "\"$_\"" } @invalid ), "\n"; + HELP_MESSAGE(); + } + + @values = @valid_values if ( is_in_list("ALL",@values) ); + + return @values; +} + +sub sha1 { + my $result; + if ($Digest::SHA::VERSION || $Digest::SHA::PurePerl::VERSION) { + open(FILE, $_[0]) or die "Can't open '$_[0]': $!"; + binmode(FILE); + $result = $MOD_SHA->new(1)->addfile(*FILE)->hexdigest; + close(FILE); + } else { + # Use OpenSSL command if Perl Digest::SHA modules not available + $result = (split(/ |\r|\n/,`$openssl dgst -sha1 $_[0]`))[1]; + } + return $result; +} + + +sub oldsha1 { + my $sha1 = ""; + open(C, "<$_[0]") || return 0; + while() { + chomp; + if($_ =~ /^\#\# SHA1: (.*)/) { + $sha1 = $1; + last; + } + } + close(C); + return $sha1; +} + +if ( $opt_p !~ m/:/ ) { + print "Error: Mozilla trust identifier list must include both purposes and levels\n"; + HELP_MESSAGE(); +} + +(my $included_mozilla_trust_purposes_string, my $included_mozilla_trust_levels_string) = split( ':', $opt_p ); +my @included_mozilla_trust_purposes = parse_csv_param( "trust purpose", $included_mozilla_trust_purposes_string, @valid_mozilla_trust_purposes ); +my @included_mozilla_trust_levels = parse_csv_param( "trust level", $included_mozilla_trust_levels_string, @valid_mozilla_trust_levels ); + +my @included_signature_algorithms = parse_csv_param( "signature algorithm", $opt_s, @valid_signature_algorithms ); + +sub should_output_cert(%) { + my %trust_purposes_by_level = @_; + + foreach my $level (@included_mozilla_trust_levels) { + # for each level we want to output, see if any of our desired purposes are included + return 1 if ( defined( List::Util::first { is_in_list( $_, @included_mozilla_trust_purposes ) } @{$trust_purposes_by_level{$level}} ) ); + } + + return 0; +} + my $crt = $ARGV[0] || 'ca-bundle.crt'; (my $txt = $url) =~ s@(.*/|\?.*)@@g; @@ -88,8 +276,26 @@ my $stdout = $crt eq '-'; my $resp; my $fetched; -unless ($opt_n and -e $txt) { - print STDERR "Downloading '$txt' ...\n" if (!$opt_q); +my $oldsha1 = oldsha1($crt); + +print STDERR "SHA1 of old file: $oldsha1\n" if (!$opt_q); + +print STDERR "Downloading '$txt' ...\n" if (!$opt_q); + +if($curl && !$opt_n) { + my $https = $url; + $https =~ s/^http:/https:/; + print STDERR "Get certdata over HTTPS with curl!\n" if (!$opt_q); + my $quiet = $opt_q ? "-s" : ""; + my @out = `curl -w %{response_code} $quiet -O $https`; + if(@out && $out[0] == 200) { + $fetched = 1; + } else { + print STDERR "Failed downloading HTTPS with curl, trying HTTP with LWP\n" if (!$opt_q); + } +} + +unless ($fetched || ($opt_n and -e $txt)) { my $ua = new LWP::UserAgent(agent => "$0/$version"); $ua->env_proxy(); $resp = $ua->mirror($url, $txt); @@ -107,7 +313,25 @@ unless ($opt_n and -e $txt) { } } -my $currentdate = scalar gmtime($fetched ? $resp->last_modified : (stat($txt))[9]); +my $filedate = $resp ? $resp->last_modified : (stat($txt))[9]; +my $datesrc = "as of"; +if(!$filedate) { + # mxr.mozilla.org gave us a time, hg.mozilla.org does not! + $filedate = time(); + $datesrc="downloaded on"; +} + +# get the hash from the download file +my $newsha1= sha1($txt); + +if(!$opt_f && $oldsha1 eq $newsha1) { + print STDERR "Downloaded file identical to previous run\'s source file. Exiting\n"; + exit; +} + +print STDERR "SHA1 of new file: $newsha1\n"; + +my $currentdate = scalar gmtime($filedate); my $format = $opt_t ? "plain text and " : ""; if( $stdout ) { @@ -117,9 +341,9 @@ if( $stdout ) { } print CRT <) { if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) { $caname = $1; } - my $untrusted = 1; + my %trust_purposes_by_level; if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) { my $data; while () { @@ -181,14 +408,21 @@ while () { last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/); chomp; } - # now scan the trust part for untrusted certs + # now scan the trust part to determine how we should trust this cert while () { last if (/^#/); - if (/^CKA_TRUST_SERVER_AUTH\s+CK_TRUST\s+CKT_NSS_TRUSTED_DELEGATOR$/) { - $untrusted = 0; + if (/^CKA_TRUST_([A-Z_]+)\s+CK_TRUST\s+CKT_NSS_([A-Z_]+)\s*$/) { + if ( !is_in_list($1,@valid_mozilla_trust_purposes) ) { + print STDERR "Warning: Unrecognized trust purpose for cert: $caname. Trust purpose: $1. Trust Level: $2\n" if (!$opt_q); + } elsif ( !is_in_list($2,@valid_mozilla_trust_levels) ) { + print STDERR "Warning: Unrecognized trust level for cert: $caname. Trust purpose: $1. Trust Level: $2\n" if (!$opt_q); + } else { + push @{$trust_purposes_by_level{$2}}, $1; + } } } - if ($untrusted) { + + if ( !should_output_cert(%trust_purposes_by_level) ) { $skipnum ++; } else { my $encoded = MIME::Base64::encode_base64($data, ''); @@ -197,11 +431,34 @@ while () { . $encoded . "-----END CERTIFICATE-----\n"; print CRT "\n$caname\n"; - print CRT ("=" x length($caname) . "\n"); + + my $maxStringLength = length($caname); + if ($opt_t) { + foreach my $key (keys %trust_purposes_by_level) { + my $string = $key . ": " . join(", ", @{$trust_purposes_by_level{$key}}); + $maxStringLength = List::Util::max( length($string), $maxStringLength ); + print CRT $string . "\n"; + } + } + print CRT ("=" x $maxStringLength . "\n"); if (!$opt_t) { print CRT $pem; } else { - my $pipe = "|$openssl x509 -md5 -fingerprint -text -inform PEM"; + my $pipe = ""; + foreach my $hash (@included_signature_algorithms) { + $pipe = "|$openssl x509 -" . $hash . " -fingerprint -noout -inform PEM"; + if (!$stdout) { + $pipe .= " >> $crt.~"; + close(CRT) or die "Couldn't close $crt.~: $!"; + } + open(TMP, $pipe) or die "Couldn't open openssl pipe: $!"; + print TMP $pem; + close(TMP) or die "Couldn't close openssl pipe: $!"; + if (!$stdout) { + open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!"; + } + } + $pipe = "|$openssl x509 -text -inform PEM"; if (!$stdout) { $pipe .= " >> $crt.~"; close(CRT) or die "Couldn't close $crt.~: $!"; @@ -234,8 +491,4 @@ unless( $stdout ) { rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n"; } unlink $txt if ($opt_u); -print STDERR "Done ($certnum CA certs processed, $skipnum untrusted skipped).\n" if (!$opt_q); - -exit; - - +print STDERR "Done ($certnum CA certs processed, $skipnum skipped).\n" if (!$opt_q); diff --git a/lib/mk-ca-bundle.vbs b/lib/mk-ca-bundle.vbs index d868079..2d82e7d 100755 --- a/lib/mk-ca-bundle.vbs +++ b/lib/mk-ca-bundle.vbs @@ -5,7 +5,7 @@ '* | (__| |_| | _ <| |___ '* \___|\___/|_| \_\_____| '* -'* Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +'* Copyright (C) 1998 - 2014, 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 @@ -26,10 +26,9 @@ '* Hacked by Guenter Knauf '*************************************************************************** Option Explicit -Const myVersion = "0.3.8" - -Const myUrl = "http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1" +Const myVersion = "0.3.9" +Const myUrl = "http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt" Const myOpenssl = "openssl.exe" Const myCdSavF = FALSE ' Flag: save downloaded data to file certdata.txt @@ -48,7 +47,7 @@ Set objHttp = WScript.CreateObject("WinHttp.WinHttpRequest.5.1") If objHttp Is Nothing Then Set objHttp = WScript.CreateObject("WinHttp.WinHttpRequest") myBase = Left(WScript.ScriptFullName, InstrRev(WScript.ScriptFullName, "\")) mySelf = Left(WScript.ScriptName, InstrRev(WScript.ScriptName, ".") - 1) & " " & myVersion -myCdFile = Mid(myUrl, InstrRev(myUrl, "/") + 1, InstrRev(myUrl, "?") - InstrRev(myUrl, "/") - 1) +myCdFile = Mid(myUrl, InstrRev(myUrl, "/") + 1) myCaFile = "ca-bundle.crt" myTmpName = InputBox("Enter output filename:", mySelf, myCaFile) If Not (myTmpName = "") Then @@ -60,8 +59,8 @@ objHttp.SetTimeouts 0, 5000, 10000, 10000 objHttp.Open "GET", myUrl, FALSE objHttp.setRequestHeader "User-Agent", WScript.ScriptName & "/" & myVersion objHttp.Send "" -If Not (objHttp.statusText = "OK") Then - MsgBox("Failed to download '" & myCdFile & "': " & objHttp.statusText), vbCritical, mySelf +If Not (objHttp.Status = 200) Then + MsgBox("Failed to download '" & myCdFile & "': " & objHttp.Status & " - " & objHttp.StatusText), vbCritical, mySelf WScript.Quit 1 End If ' Convert data from ResponseBody instead of using ResponseText because of UTF-8 diff --git a/lib/mprintf.c b/lib/mprintf.c index 8f392c7..23070a7 100644 --- a/lib/mprintf.c +++ b/lib/mprintf.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1999 - 2014, 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 @@ -73,6 +73,19 @@ #endif /* + * Non-ANSI integer extensions + */ + +#if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)) || \ + (defined(__WATCOMC__) && defined(__386__)) || \ + (defined(__POCC__) && defined(_MSC_VER)) || \ + (defined(_WIN32_WCE)) || \ + (defined(__MINGW32__)) || \ + (defined(_MSC_VER) && (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)) +# define MP_HAVE_INT_EXTENSIONS +#endif + +/* * Max integer data types that mprintf.c is capable */ @@ -189,17 +202,27 @@ static long dprintf_DollarString(char *input, char **end) return 0; } -static int dprintf_IsQualifierNoDollar(char c) +static bool dprintf_IsQualifierNoDollar(const char *fmt) { - switch (c) { +#if defined(MP_HAVE_INT_EXTENSIONS) + if(!strncmp(fmt, "I32", 3) || !strncmp(fmt, "I64", 3)) { + return TRUE; + } +#endif + + switch(*fmt) { case '-': case '+': case ' ': case '#': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'h': case 'l': case 'L': case 'z': case 'q': case '*': case 'O': - return 1; /* true */ +#if defined(MP_HAVE_INT_EXTENSIONS) + case 'I': +#endif + return TRUE; + default: - return 0; /* false */ + return FALSE; } } @@ -255,8 +278,20 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos, /* Handle the flags */ - while(dprintf_IsQualifierNoDollar(*fmt)) { - switch (*fmt++) { + while(dprintf_IsQualifierNoDollar(fmt)) { +#if defined(MP_HAVE_INT_EXTENSIONS) + if(!strncmp(fmt, "I32", 3)) { + flags |= FLAGS_LONG; + fmt += 3; + } + else if(!strncmp(fmt, "I64", 3)) { + flags |= FLAGS_LONGLONG; + fmt += 3; + } + else +#endif + + switch(*fmt++) { case ' ': flags |= FLAGS_SPACE; break; @@ -296,6 +331,15 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos, case 'h': flags |= FLAGS_SHORT; break; +#if defined(MP_HAVE_INT_EXTENSIONS) + case 'I': +#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG) + flags |= FLAGS_LONGLONG; +#else + flags |= FLAGS_LONG; +#endif + break; +#endif case 'l': if(flags & FLAGS_LONG) flags |= FLAGS_LONGLONG; @@ -760,11 +804,11 @@ static int dprintf_formatf( len = 0; } } + else if(prec != -1) + len = (size_t)prec; else len = strlen(str); - if(prec != -1 && (size_t) prec < len) - len = (size_t)prec; width -= (long)len; if(p->flags & FLAGS_ALT) @@ -774,7 +818,7 @@ static int dprintf_formatf( while(width-- > 0) OUTCHAR(' '); - while(len-- > 0) + while((len-- > 0) && *str) OUTCHAR(*str++); if(p->flags&FLAGS_LEFT) while(width-- > 0) diff --git a/lib/multi.c b/lib/multi.c index 476f058..97c9e65 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2015, 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 @@ -30,6 +30,7 @@ #include "connect.h" #include "progress.h" #include "easyif.h" +#include "share.h" #include "multiif.h" #include "sendf.h" #include "timeval.h" @@ -41,6 +42,7 @@ #include "bundles.h" #include "multihandle.h" #include "pipeline.h" +#include "sigpipe.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -68,7 +70,7 @@ ((x) && (((struct SessionHandle *)(x))->magic == CURLEASY_MAGIC_NUMBER)) static void singlesocket(struct Curl_multi *multi, - struct SessionHandle *easy); + struct SessionHandle *data); static int update_timer(struct Curl_multi *multi); static bool isHandleAtHead(struct SessionHandle *handle, @@ -105,38 +107,42 @@ static const char * const statename[]={ static void multi_freetimeout(void *a, void *b); /* always use this function to change state, to make debugging easier */ -static void mstate(struct SessionHandle *easy, CURLMstate state +static void mstate(struct SessionHandle *data, CURLMstate state #ifdef DEBUGBUILD , int lineno #endif ) { -#ifdef DEBUGBUILD - long connection_id = -5000; + CURLMstate oldstate = data->mstate; + +#if defined(DEBUGBUILD) && defined(CURL_DISABLE_VERBOSE_STRINGS) + (void) lineno; #endif - CURLMstate oldstate = easy->mstate; if(oldstate == state) /* don't bother when the new state is the same as the old state */ return; - easy->mstate = state; + data->mstate = state; -#ifdef DEBUGBUILD - if(easy->mstate >= CURLM_STATE_CONNECT_PEND && - easy->mstate < CURLM_STATE_COMPLETED) { - if(easy->easy_conn) - connection_id = easy->easy_conn->connection_id; +#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) + if(data->mstate >= CURLM_STATE_CONNECT_PEND && + data->mstate < CURLM_STATE_COMPLETED) { + long connection_id = -5000; - infof(easy, + if(data->easy_conn) + connection_id = data->easy_conn->connection_id; + + infof(data, "STATE: %s => %s handle %p; line %d (connection #%ld) \n", - statename[oldstate], statename[easy->mstate], - (void *)easy, lineno, connection_id); + statename[oldstate], statename[data->mstate], + (void *)data, lineno, connection_id); } #endif + if(state == CURLM_STATE_COMPLETED) /* changing to COMPLETED means there's one less easy handle 'alive' */ - easy->multi->num_alive--; + data->multi->num_alive--; } #ifndef DEBUGBUILD @@ -178,11 +184,12 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh, check = calloc(1, sizeof(struct Curl_sh_entry)); if(!check) return NULL; /* major failure */ + check->easy = data; check->socket = s; /* make/add new hash entry */ - if(NULL == Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) { + if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) { free(check); return NULL; /* major failure */ } @@ -307,7 +314,22 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ if(!multi->msglist) goto error; + multi->pending = Curl_llist_alloc(multi_freeamsg); + if(!multi->pending) + goto error; + + /* allocate a new easy handle to use when closing cached connections */ + multi->closure_handle = curl_easy_init(); + if(!multi->closure_handle) + goto error; + + multi->closure_handle->multi = multi; + multi->closure_handle->state.conn_cache = multi->conn_cache; + multi->max_pipeline_length = 5; + + /* -1 means it not set by user, use the default value */ + multi->maxconnects = -1; return (CURLM *) multi; error: @@ -318,6 +340,10 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ multi->hostcache = NULL; Curl_conncache_destroy(multi->conn_cache); multi->conn_cache = NULL; + Curl_close(multi->closure_handle); + multi->closure_handle = NULL; + Curl_llist_destroy(multi->msglist, NULL); + Curl_llist_destroy(multi->pending, NULL); free(multi); return NULL; @@ -329,15 +355,12 @@ CURLM *curl_multi_init(void) CURL_CONNECTION_HASH_SIZE); } - CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle) { struct curl_llist *timeoutlist; struct Curl_multi *multi = (struct Curl_multi *)multi_handle; struct SessionHandle *data = (struct SessionHandle *)easy_handle; - struct SessionHandle *new_closure = NULL; - struct curl_hash *hostcache = NULL; /* First, make some basic checks that the CURLM handle is a good handle */ if(!GOOD_MULTI_HANDLE(multi)) @@ -350,55 +373,19 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, /* Prevent users from adding same easy handle more than once and prevent adding to more than one multi stack */ if(data->multi) - /* possibly we should create a new unique error code for this condition */ - return CURLM_BAD_EASY_HANDLE; + return CURLM_ADDED_ALREADY; /* Allocate and initialize timeout list for easy handle */ timeoutlist = Curl_llist_alloc(multi_freetimeout); if(!timeoutlist) return CURLM_OUT_OF_MEMORY; - /* In case multi handle has no hostcache yet, allocate one */ - if(!multi->hostcache) { - hostcache = Curl_mk_dnscache(); - if(!hostcache) { - free(data); - Curl_llist_destroy(timeoutlist, NULL); - return CURLM_OUT_OF_MEMORY; - } - } - - /* In case multi handle has no closure_handle yet, allocate - a new easy handle to use when closing cached connections */ - if(!multi->closure_handle) { - new_closure = (struct SessionHandle *)curl_easy_init(); - if(!new_closure) { - Curl_hash_destroy(hostcache); - free(data); - Curl_llist_destroy(timeoutlist, NULL); - return CURLM_OUT_OF_MEMORY; - } - } - /* - ** No failure allowed in this function beyond this point. And - ** no modification of easy nor multi handle allowed before this - ** except for potential multi's connection cache growing which - ** won't be undone in this function no matter what. - */ - - /* In case a new closure handle has been initialized above, it - is associated now with the multi handle which lacked one. */ - if(new_closure) { - multi->closure_handle = new_closure; - Curl_easy_addmulti(multi->closure_handle, multi_handle); - multi->closure_handle->state.conn_cache = multi->conn_cache; - } - - /* In case hostcache has been allocated above, - it is associated now with the multi handle. */ - if(hostcache) - multi->hostcache = hostcache; + * No failure allowed in this function beyond this point. And no + * modification of easy nor multi handle allowed before this except for + * potential multi's connection cache growing which won't be undone in this + * function no matter what. + */ /* Make easy handle use timeout list initialized above */ data->state.timeoutlist = timeoutlist; @@ -428,6 +415,8 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, /* Point to the multi's connection cache */ data->state.conn_cache = multi->conn_cache; + data->state.infilesize = data->set.filesize; + /* This adds the new entry at the 'end' of the doubly-linked circular list of SessionHandle structs to try and maintain a FIFO queue so the pipelined requests are in order. */ @@ -449,7 +438,7 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, } /* make the SessionHandle refer back to this multi handle */ - Curl_easy_addmulti(data, multi_handle); + data->multi = multi_handle; /* Set the timeout for this handle to expire really soon so that it will be taken care of even when this handle is added in the midst of operation @@ -493,7 +482,7 @@ static void debug_print_sock_hash(void *p) struct Curl_sh_entry *sh = (struct Curl_sh_entry *)p; fprintf(stderr, " [easy %p/magic %x/socket %d]", - (void *)sh->easy, sh->easy->magic, (int)sh->socket); + (void *)sh->data, sh->data->magic, (int)sh->socket); } #endif @@ -503,6 +492,9 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, struct Curl_multi *multi=(struct Curl_multi *)multi_handle; struct SessionHandle *easy = curl_handle; struct SessionHandle *data = easy; + bool premature; + bool easy_owns_conn; + struct curl_llist_element *e; /* First, make some basic checks that the CURLM handle is a good handle */ if(!GOOD_MULTI_HANDLE(multi)) @@ -512,125 +504,121 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, if(!GOOD_EASY_HANDLE(curl_handle)) return CURLM_BAD_EASY_HANDLE; - if(easy) { - bool premature = (easy->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE; - bool easy_owns_conn = (easy->easy_conn && - (easy->easy_conn->data == easy)) ? - TRUE : FALSE; - - /* If the 'state' is not INIT or COMPLETED, we might need to do something - nice to put the easy_handle in a good known state when this returns. */ - if(premature) - /* this handle is "alive" so we need to count down the total number of - alive connections when this is removed */ - multi->num_alive--; - - if(easy->easy_conn && - (easy->easy_conn->send_pipe->size + - easy->easy_conn->recv_pipe->size > 1) && - easy->mstate > CURLM_STATE_WAITDO && - easy->mstate < CURLM_STATE_COMPLETED) { - /* If the handle is in a pipeline and has started sending off its - request but not received its response yet, we need to close - connection. */ - easy->easy_conn->bits.close = TRUE; - /* Set connection owner so that Curl_done() closes it. - We can sefely do this here since connection is killed. */ - easy->easy_conn->data = easy; - } + /* Prevent users from trying to remove same easy handle more than once */ + if(!data->multi) + return CURLM_OK; /* it is already removed so let's say it is fine! */ + + + premature = (data->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE; + easy_owns_conn = (data->easy_conn && (data->easy_conn->data == easy)) ? + TRUE : FALSE; + + /* If the 'state' is not INIT or COMPLETED, we might need to do something + nice to put the easy_handle in a good known state when this returns. */ + if(premature) + /* this handle is "alive" so we need to count down the total number of + alive connections when this is removed */ + multi->num_alive--; + + if(data->easy_conn && + data->mstate > CURLM_STATE_DO && + data->mstate < CURLM_STATE_COMPLETED) { + /* If the handle is in a pipeline and has started sending off its + request but not received its response yet, we need to close + connection. */ + connclose(data->easy_conn, "Removed with partial response"); + /* Set connection owner so that Curl_done() closes it. + We can safely do this here since connection is killed. */ + data->easy_conn->data = easy; + easy_owns_conn = TRUE; + } - /* The timer must be shut down before easy->multi is set to NULL, - else the timenode will remain in the splay tree after - curl_easy_cleanup is called. */ - Curl_expire(easy, 0); + /* The timer must be shut down before data->multi is set to NULL, + else the timenode will remain in the splay tree after + curl_easy_cleanup is called. */ + Curl_expire(data, 0); - /* destroy the timeout list that is held in the easy handle */ - if(data->state.timeoutlist) { - Curl_llist_destroy(data->state.timeoutlist, NULL); - data->state.timeoutlist = NULL; - } + /* destroy the timeout list that is held in the easy handle */ + if(data->state.timeoutlist) { + Curl_llist_destroy(data->state.timeoutlist, NULL); + data->state.timeoutlist = NULL; + } - if(easy->dns.hostcachetype == HCACHE_MULTI) { - /* stop using the multi handle's DNS cache */ - easy->dns.hostcache = NULL; - easy->dns.hostcachetype = HCACHE_NONE; - } + if(data->dns.hostcachetype == HCACHE_MULTI) { + /* stop using the multi handle's DNS cache */ + data->dns.hostcache = NULL; + data->dns.hostcachetype = HCACHE_NONE; + } - if(easy->easy_conn) { + if(data->easy_conn) { - /* we must call Curl_done() here (if we still "own it") so that we don't - leave a half-baked one around */ - if(easy_owns_conn) { + /* we must call Curl_done() here (if we still "own it") so that we don't + leave a half-baked one around */ + if(easy_owns_conn) { - /* Curl_done() clears the conn->data field to lose the association - between the easy handle and the connection + /* Curl_done() clears the conn->data field to lose the association + between the easy handle and the connection - Note that this ignores the return code simply because there's - nothing really useful to do with it anyway! */ - (void)Curl_done(&easy->easy_conn, easy->result, premature); - } - else - /* Clear connection pipelines, if Curl_done above was not called */ - Curl_getoff_all_pipelines(easy, easy->easy_conn); + Note that this ignores the return code simply because there's + nothing really useful to do with it anyway! */ + (void)Curl_done(&data->easy_conn, data->result, premature); } + else + /* Clear connection pipelines, if Curl_done above was not called */ + Curl_getoff_all_pipelines(data, data->easy_conn); + } - /* as this was using a shared connection cache we clear the pointer - to that since we're not part of that multi handle anymore */ - easy->state.conn_cache = NULL; + Curl_wildcard_dtor(&data->wildcard); - /* change state without using multistate(), only to make singlesocket() do - what we want */ - easy->mstate = CURLM_STATE_COMPLETED; - singlesocket(multi, easy); /* to let the application know what sockets - that vanish with this handle */ + /* as this was using a shared connection cache we clear the pointer to that + since we're not part of that multi handle anymore */ + data->state.conn_cache = NULL; - /* Remove the association between the connection and the handle */ - if(easy->easy_conn) { - easy->easy_conn->data = NULL; - easy->easy_conn = NULL; - } + /* change state without using multistate(), only to make singlesocket() do + what we want */ + data->mstate = CURLM_STATE_COMPLETED; + singlesocket(multi, easy); /* to let the application know what sockets that + vanish with this handle */ - Curl_easy_addmulti(easy, NULL); /* clear the association - to this multi handle */ + /* Remove the association between the connection and the handle */ + if(data->easy_conn) { + data->easy_conn->data = NULL; + data->easy_conn = NULL; + } - { - /* make sure there's no pending message in the queue sent from this easy - handle */ - struct curl_llist_element *e; + data->multi = NULL; /* clear the association to this multi handle */ - for(e = multi->msglist->head; e; e = e->next) { - struct Curl_message *msg = e->ptr; + /* make sure there's no pending message in the queue sent from this easy + handle */ - if(msg->extmsg.easy_handle == easy) { - Curl_llist_remove(multi->msglist, e, NULL); - /* there can only be one from this specific handle */ - break; - } - } - } + for(e = multi->msglist->head; e; e = e->next) { + struct Curl_message *msg = e->ptr; - /* make the previous node point to our next */ - if(easy->prev) - easy->prev->next = easy->next; - else - multi->easyp = easy->next; /* point to first node */ + if(msg->extmsg.easy_handle == easy) { + Curl_llist_remove(multi->msglist, e, NULL); + /* there can only be one from this specific handle */ + break; + } + } - /* make our next point to our previous node */ - if(easy->next) - easy->next->prev = easy->prev; - else - multi->easylp = easy->prev; /* point to last node */ + /* make the previous node point to our next */ + if(data->prev) + data->prev->next = data->next; + else + multi->easyp = data->next; /* point to first node */ - /* NOTE NOTE NOTE - We do not touch the easy handle here! */ + /* make our next point to our previous node */ + if(data->next) + data->next->prev = data->prev; + else + multi->easylp = data->prev; /* point to last node */ - multi->num_easy--; /* one less to care about now */ + /* NOTE NOTE NOTE + We do not touch the easy handle here! */ + multi->num_easy--; /* one less to care about now */ - update_timer(multi); - return CURLM_OK; - } - else - return CURLM_BAD_EASY_HANDLE; /* twasn't found */ + update_timer(multi); + return CURLM_OK; } bool Curl_multi_pipeline_enabled(const struct Curl_multi *multi) @@ -647,17 +635,28 @@ static int waitconnect_getsock(struct connectdata *conn, curl_socket_t *sock, int numsocks) { + int i; + int s=0; + int rc=0; + if(!numsocks) return GETSOCK_BLANK; - sock[0] = conn->sock[FIRSTSOCKET]; + for(i=0; i<2; i++) { + if(conn->tempsock[i] != CURL_SOCKET_BAD) { + sock[s] = conn->tempsock[i]; + rc |= GETSOCK_WRITESOCK(s++); + } + } /* when we've sent a CONNECT to a proxy, we should rather wait for the socket to become readable to be able to get the response headers */ - if(conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) - return GETSOCK_READSOCK(0); + if(conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) { + sock[0] = conn->sock[FIRSTSOCKET]; + rc = GETSOCK_READSOCK(0); + } - return GETSOCK_WRITESOCK(0); + return rc; } static int domore_getsock(struct connectdata *conn, @@ -670,7 +669,7 @@ static int domore_getsock(struct connectdata *conn, } /* returns bitmapped flags for this handle and its sockets */ -static int multi_getsock(struct SessionHandle *easy, +static int multi_getsock(struct SessionHandle *data, curl_socket_t *socks, /* points to numsocks number of sockets */ int numsocks) @@ -680,16 +679,16 @@ static int multi_getsock(struct SessionHandle *easy, happen when this is called from curl_multi_remove_handle() => singlesocket() => multi_getsock(). */ - if(easy->state.pipe_broke || !easy->easy_conn) + if(data->state.pipe_broke || !data->easy_conn) return 0; - if(easy->mstate > CURLM_STATE_CONNECT && - easy->mstate < CURLM_STATE_COMPLETED) { + if(data->mstate > CURLM_STATE_CONNECT && + data->mstate < CURLM_STATE_COMPLETED) { /* Set up ownership correctly */ - easy->easy_conn->data = easy; + data->easy_conn->data = data; } - switch(easy->mstate) { + switch(data->mstate) { default: #if 0 /* switch back on these cases to get the compiler to check for all enums to be present */ @@ -707,28 +706,28 @@ static int multi_getsock(struct SessionHandle *easy, return 0; case CURLM_STATE_WAITRESOLVE: - return Curl_resolver_getsock(easy->easy_conn, socks, numsocks); + return Curl_resolver_getsock(data->easy_conn, socks, numsocks); case CURLM_STATE_PROTOCONNECT: - return Curl_protocol_getsock(easy->easy_conn, socks, numsocks); + return Curl_protocol_getsock(data->easy_conn, socks, numsocks); case CURLM_STATE_DO: case CURLM_STATE_DOING: - return Curl_doing_getsock(easy->easy_conn, socks, numsocks); + return Curl_doing_getsock(data->easy_conn, socks, numsocks); case CURLM_STATE_WAITPROXYCONNECT: case CURLM_STATE_WAITCONNECT: - return waitconnect_getsock(easy->easy_conn, socks, numsocks); + return waitconnect_getsock(data->easy_conn, socks, numsocks); case CURLM_STATE_DO_MORE: - return domore_getsock(easy->easy_conn, socks, numsocks); + return domore_getsock(data->easy_conn, socks, numsocks); case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch to waiting for the same as the *PERFORM states */ case CURLM_STATE_PERFORM: case CURLM_STATE_WAITPERFORM: - return Curl_single_getsock(easy->easy_conn, socks, numsocks); + return Curl_single_getsock(data->easy_conn, socks, numsocks); } } @@ -741,7 +740,7 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle, Some easy handles may not have connected to the remote host yet, and then we must make sure that is done. */ struct Curl_multi *multi=(struct Curl_multi *)multi_handle; - struct SessionHandle *easy; + struct SessionHandle *data; int this_max_fd=-1; curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE]; int bitmap; @@ -751,9 +750,9 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle, if(!GOOD_MULTI_HANDLE(multi)) return CURLM_BAD_HANDLE; - easy=multi->easyp; - while(easy) { - bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); + data=multi->easyp; + while(data) { + bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE); for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { curl_socket_t s = CURL_SOCKET_BAD; @@ -775,7 +774,7 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle, } } - easy = easy->next; /* check next handle */ + data = data->next; /* check next handle */ } *max_fd = this_max_fd; @@ -790,7 +789,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, int *ret) { struct Curl_multi *multi=(struct Curl_multi *)multi_handle; - struct SessionHandle *easy; + struct SessionHandle *data; curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE]; int bitmap; unsigned int i; @@ -804,15 +803,15 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, /* If the internally desired timeout is actually shorter than requested from the outside, then use the shorter time! But only if the internal timer - is actually larger than 0! */ + is actually larger than -1! */ (void)multi_timeout(multi, &timeout_internal); - if((timeout_internal > 0) && (timeout_internal < (long)timeout_ms)) + if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms)) timeout_ms = (int)timeout_internal; /* Count up how many fds we have from the multi handle */ - easy=multi->easyp; - while(easy) { - bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); + data=multi->easyp; + while(data) { + bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE); for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { curl_socket_t s = CURL_SOCKET_BAD; @@ -830,13 +829,13 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, } } - easy = easy->next; /* check next handle */ + data = data->next; /* check next handle */ } curlfds = nfds; /* number of internal file descriptors */ nfds += extra_nfds; /* add the externally provided ones */ - if(nfds) { + if(nfds || extra_nfds) { ufds = malloc(nfds * sizeof(struct pollfd)); if(!ufds) return CURLM_OUT_OF_MEMORY; @@ -848,9 +847,9 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, if(curlfds) { /* Add the curl handles to our pollfds first */ - easy=multi->easyp; - while(easy) { - bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); + data=multi->easyp; + while(data) { + bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE); for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { curl_socket_t s = CURL_SOCKET_BAD; @@ -872,7 +871,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, } } - easy = easy->next; /* check next handle */ + data = data->next; /* check next handle */ } } @@ -891,6 +890,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, if(nfds) { /* wait... */ + infof(data, "Curl_poll(%d ds, %d ms)\n", nfds, timeout_ms); i = Curl_poll(ufds, nfds, timeout_ms); if(i) { @@ -924,7 +924,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle, static CURLMcode multi_runsingle(struct Curl_multi *multi, struct timeval now, - struct SessionHandle *easy) + struct SessionHandle *data) { struct Curl_message *msg = NULL; bool connected; @@ -932,100 +932,108 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, bool protocol_connect = FALSE; bool dophase_done = FALSE; bool done = FALSE; - CURLMcode result = CURLM_OK; + CURLMcode rc; + CURLcode result = CURLE_OK; struct SingleRequest *k; - struct SessionHandle *data; long timeout_ms; int control; - if(!GOOD_EASY_HANDLE(easy)) + if(!GOOD_EASY_HANDLE(data)) return CURLM_BAD_EASY_HANDLE; - data = easy; - do { - /* this is a single-iteration do-while loop just to allow a - break to skip to the end of it */ bool disconnect_conn = FALSE; + rc = CURLM_OK; /* Handle the case when the pipe breaks, i.e., the connection we're using gets cleaned up and we're left with nothing. */ if(data->state.pipe_broke) { - infof(data, "Pipe broke: handle 0x%p, url = %s\n", - (void *)easy, data->state.path); + infof(data, "Pipe broke: handle %p, url = %s\n", + (void *)data, data->state.path); - if(easy->mstate < CURLM_STATE_COMPLETED) { + if(data->mstate < CURLM_STATE_COMPLETED) { /* Head back to the CONNECT state */ - multistate(easy, CURLM_STATE_CONNECT); - result = CURLM_CALL_MULTI_PERFORM; - easy->result = CURLE_OK; + multistate(data, CURLM_STATE_CONNECT); + rc = CURLM_CALL_MULTI_PERFORM; + result = CURLE_OK; } data->state.pipe_broke = FALSE; - easy->easy_conn = NULL; - break; + data->easy_conn = NULL; + continue; } - if(!easy->easy_conn && - easy->mstate > CURLM_STATE_CONNECT && - easy->mstate < CURLM_STATE_DONE) { - /* In all these states, the code will blindly access 'easy->easy_conn' + if(!data->easy_conn && + data->mstate > CURLM_STATE_CONNECT && + data->mstate < CURLM_STATE_DONE) { + /* In all these states, the code will blindly access 'data->easy_conn' so this is precaution that it isn't NULL. And it silences static analyzers. */ - failf(data, "In state %d with no easy_conn, bail out!\n", easy->mstate); + failf(data, "In state %d with no easy_conn, bail out!\n", data->mstate); return CURLM_INTERNAL_ERROR; } - if(easy->easy_conn && easy->mstate > CURLM_STATE_CONNECT && - easy->mstate < CURLM_STATE_COMPLETED) + if(data->easy_conn && data->mstate > CURLM_STATE_CONNECT && + data->mstate < CURLM_STATE_COMPLETED) /* Make sure we set the connection's current owner */ - easy->easy_conn->data = data; + data->easy_conn->data = data; - if(easy->easy_conn && - (easy->mstate >= CURLM_STATE_CONNECT) && - (easy->mstate < CURLM_STATE_COMPLETED)) { + if(data->easy_conn && + (data->mstate >= CURLM_STATE_CONNECT) && + (data->mstate < CURLM_STATE_COMPLETED)) { /* we need to wait for the connect state as only then is the start time stored, but we must not check already completed handles */ timeout_ms = Curl_timeleft(data, &now, - (easy->mstate <= CURLM_STATE_WAITDO)? + (data->mstate <= CURLM_STATE_WAITDO)? TRUE:FALSE); if(timeout_ms < 0) { /* Handle timed out */ - if(easy->mstate == CURLM_STATE_WAITRESOLVE) + if(data->mstate == CURLM_STATE_WAITRESOLVE) failf(data, "Resolving timed out after %ld milliseconds", Curl_tvdiff(now, data->progress.t_startsingle)); - else if(easy->mstate == CURLM_STATE_WAITCONNECT) + else if(data->mstate == CURLM_STATE_WAITCONNECT) failf(data, "Connection timed out after %ld milliseconds", Curl_tvdiff(now, data->progress.t_startsingle)); else { k = &data->req; - failf(data, "Operation timed out after %ld milliseconds with %" - FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received", - Curl_tvdiff(now, data->progress.t_startsingle), k->bytecount, - k->size); + if(k->size != -1) { + failf(data, "Operation timed out after %ld milliseconds with %" + CURL_FORMAT_CURL_OFF_T " out of %" + CURL_FORMAT_CURL_OFF_T " bytes received", + Curl_tvdiff(k->now, data->progress.t_startsingle), + k->bytecount, k->size); + } + else { + failf(data, "Operation timed out after %ld milliseconds with %" + CURL_FORMAT_CURL_OFF_T " bytes received", + Curl_tvdiff(now, data->progress.t_startsingle), + k->bytecount); + } } - /* Force the connection closed because the server could continue to - send us stuff at any time. (The disconnect_conn logic used below - doesn't work at this point). */ - easy->easy_conn->bits.close = TRUE; - easy->result = CURLE_OPERATION_TIMEDOUT; - multistate(easy, CURLM_STATE_COMPLETED); - break; + /* Force connection closed if the connection has indeed been used */ + if(data->mstate > CURLM_STATE_DO) { + connclose(data->easy_conn, "Disconnected with pending data"); + disconnect_conn = TRUE; + } + result = CURLE_OPERATION_TIMEDOUT; + /* Skip the statemachine and go directly to error handling section. */ + goto statemachine_end; } } - switch(easy->mstate) { + switch(data->mstate) { case CURLM_STATE_INIT: /* init this transfer. */ - easy->result=Curl_pretransfer(data); + result=Curl_pretransfer(data); - if(CURLE_OK == easy->result) { + if(!result) { /* after init, go CONNECT */ - multistate(easy, CURLM_STATE_CONNECT); - result = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_CONNECT); + Curl_pgrsTime(data, TIMER_STARTOP); + rc = CURLM_CALL_MULTI_PERFORM; } break; @@ -1037,41 +1045,46 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, case CURLM_STATE_CONNECT: /* Connect. We want to get a connection identifier filled in. */ Curl_pgrsTime(data, TIMER_STARTSINGLE); - easy->result = Curl_connect(data, &easy->easy_conn, - &async, &protocol_connect); - if(CURLE_NO_CONNECTION_AVAILABLE == easy->result) { + result = Curl_connect(data, &data->easy_conn, + &async, &protocol_connect); + if(CURLE_NO_CONNECTION_AVAILABLE == result) { /* There was no connection available. We will go to the pending state and wait for an available connection. */ - multistate(easy, CURLM_STATE_CONNECT_PEND); - easy->result = CURLE_OK; + multistate(data, CURLM_STATE_CONNECT_PEND); + + /* add this handle to the list of connect-pending handles */ + if(!Curl_llist_insert_next(multi->pending, multi->pending->tail, data)) + result = CURLE_OUT_OF_MEMORY; + else + result = CURLE_OK; break; } - if(CURLE_OK == easy->result) { + if(!result) { /* Add this handle to the send or pend pipeline */ - easy->result = Curl_add_handle_to_pipeline(data, easy->easy_conn); - if(CURLE_OK != easy->result) + result = Curl_add_handle_to_pipeline(data, data->easy_conn); + if(result) disconnect_conn = TRUE; else { if(async) /* We're now waiting for an asynchronous name lookup */ - multistate(easy, CURLM_STATE_WAITRESOLVE); + multistate(data, CURLM_STATE_WAITRESOLVE); else { /* after the connect has been sent off, go WAITCONNECT unless the protocol connect is already done and we can go directly to WAITDO or DO! */ - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; if(protocol_connect) - multistate(easy, multi->pipelining_enabled? + multistate(data, multi->pipelining_enabled? CURLM_STATE_WAITDO:CURLM_STATE_DO); else { #ifndef CURL_DISABLE_HTTP - if(easy->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) - multistate(easy, CURLM_STATE_WAITPROXYCONNECT); + if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) + multistate(data, CURLM_STATE_WAITPROXYCONNECT); else #endif - multistate(easy, CURLM_STATE_WAITCONNECT); + multistate(data, CURLM_STATE_WAITCONNECT); } } } @@ -1082,9 +1095,29 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* awaiting an asynch name resolve to complete */ { struct Curl_dns_entry *dns = NULL; + struct connectdata *conn = data->easy_conn; /* check if we have the name resolved by now */ - easy->result = Curl_resolver_is_resolved(easy->easy_conn, &dns); + if(data->share) + Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE); + + dns = Curl_fetch_addr(conn, conn->host.name, (int)conn->port); + + if(dns) { + dns->inuse++; /* we use it! */ +#ifdef CURLRES_ASYNCH + conn->async.dns = dns; + conn->async.done = TRUE; +#endif + result = CURLE_OK; + infof(data, "Hostname was found in DNS cache\n"); + } + + if(data->share) + Curl_share_unlock(data, CURL_LOCK_DATA_DNS); + + if(!dns) + result = Curl_resolver_is_resolved(data->easy_conn, &dns); /* Update sockets here, because the socket(s) may have been closed and the application thus needs to be told, even if it @@ -1092,36 +1125,35 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, down. If the name has not yet been resolved, it is likely that new sockets have been opened in an attempt to contact another resolver. */ - singlesocket(multi, easy); + singlesocket(multi, data); if(dns) { /* Perform the next step in the connection phase, and then move on to the WAITCONNECT state */ - easy->result = Curl_async_resolved(easy->easy_conn, - &protocol_connect); + result = Curl_async_resolved(data->easy_conn, &protocol_connect); - if(CURLE_OK != easy->result) + if(result) /* if Curl_async_resolved() returns failure, the connection struct is already freed and gone */ - easy->easy_conn = NULL; /* no more connection */ + data->easy_conn = NULL; /* no more connection */ else { /* call again please so that we get the next socket setup */ - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; if(protocol_connect) - multistate(easy, multi->pipelining_enabled? + multistate(data, multi->pipelining_enabled? CURLM_STATE_WAITDO:CURLM_STATE_DO); else { #ifndef CURL_DISABLE_HTTP - if(easy->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) - multistate(easy, CURLM_STATE_WAITPROXYCONNECT); + if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) + multistate(data, CURLM_STATE_WAITPROXYCONNECT); else #endif - multistate(easy, CURLM_STATE_WAITCONNECT); + multistate(data, CURLM_STATE_WAITCONNECT); } } } - if(CURLE_OK != easy->result) { + if(result) { /* failure detected */ disconnect_conn = TRUE; break; @@ -1132,40 +1164,44 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, #ifndef CURL_DISABLE_HTTP case CURLM_STATE_WAITPROXYCONNECT: /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */ - easy->result = Curl_http_connect(easy->easy_conn, &protocol_connect); + result = Curl_http_connect(data->easy_conn, &protocol_connect); - if(easy->easy_conn->bits.proxy_connect_closed) { - /* reset the error buffer */ - if(data->set.errorbuffer) - data->set.errorbuffer[0] = '\0'; - data->state.errorbuf = FALSE; - - easy->result = CURLE_OK; - result = CURLM_CALL_MULTI_PERFORM; - multistate(easy, CURLM_STATE_CONNECT); + if(data->easy_conn->bits.proxy_connect_closed) { + /* connect back to proxy again */ + result = CURLE_OK; + rc = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_CONNECT); } - else if(CURLE_OK == easy->result) { - if(easy->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_COMPLETE) - multistate(easy, CURLM_STATE_WAITCONNECT); + else if(!result) { + if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_COMPLETE) + multistate(data, CURLM_STATE_WAITCONNECT); } break; #endif case CURLM_STATE_WAITCONNECT: /* awaiting a completion of an asynch connect */ - easy->result = Curl_is_connected(easy->easy_conn, - FIRSTSOCKET, - &connected); + result = Curl_is_connected(data->easy_conn, + FIRSTSOCKET, + &connected); if(connected) { - if(!easy->result) + if(!result) /* if everything is still fine we do the protocol-specific connect setup */ - easy->result = Curl_protocol_connect(easy->easy_conn, - &protocol_connect); + result = Curl_protocol_connect(data->easy_conn, + &protocol_connect); } - if(CURLE_OK != easy->result) { + if(data->easy_conn->bits.proxy_connect_closed) { + /* connect back to proxy again since it was closed in a proxy CONNECT + setup */ + result = CURLE_OK; + rc = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_CONNECT); + break; + } + else if(result) { /* failure detected */ /* Just break, the cleaning up is handled all in one place */ disconnect_conn = TRUE; @@ -1180,36 +1216,35 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, BUT if we are using a proxy we must change to WAITPROXYCONNECT */ #ifndef CURL_DISABLE_HTTP - if(easy->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) - multistate(easy, CURLM_STATE_WAITPROXYCONNECT); + if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT) + multistate(data, CURLM_STATE_WAITPROXYCONNECT); else #endif - multistate(easy, CURLM_STATE_PROTOCONNECT); + multistate(data, CURLM_STATE_PROTOCONNECT); } else /* after the connect has completed, go WAITDO or DO */ - multistate(easy, multi->pipelining_enabled? + multistate(data, multi->pipelining_enabled? CURLM_STATE_WAITDO:CURLM_STATE_DO); - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; } break; case CURLM_STATE_PROTOCONNECT: /* protocol-specific connect phase */ - easy->result = Curl_protocol_connecting(easy->easy_conn, - &protocol_connect); - if((easy->result == CURLE_OK) && protocol_connect) { + result = Curl_protocol_connecting(data->easy_conn, &protocol_connect); + if(!result && protocol_connect) { /* after the connect has completed, go WAITDO or DO */ - multistate(easy, multi->pipelining_enabled? + multistate(data, multi->pipelining_enabled? CURLM_STATE_WAITDO:CURLM_STATE_DO); - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; } - else if(easy->result) { + else if(result) { /* failure detected */ Curl_posttransfer(data); - Curl_done(&easy->easy_conn, easy->result, TRUE); + Curl_done(&data->easy_conn, result, TRUE); disconnect_conn = TRUE; } break; @@ -1218,70 +1253,70 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* Wait for our turn to DO when we're pipelining requests */ #ifdef DEBUGBUILD infof(data, "WAITDO: Conn %ld send pipe %zu inuse %s athead %s\n", - easy->easy_conn->connection_id, - easy->easy_conn->send_pipe->size, - easy->easy_conn->writechannel_inuse?"TRUE":"FALSE", + data->easy_conn->connection_id, + data->easy_conn->send_pipe->size, + data->easy_conn->writechannel_inuse?"TRUE":"FALSE", isHandleAtHead(data, - easy->easy_conn->send_pipe)?"TRUE":"FALSE"); + data->easy_conn->send_pipe)?"TRUE":"FALSE"); #endif - if(!easy->easy_conn->writechannel_inuse && + if(!data->easy_conn->writechannel_inuse && isHandleAtHead(data, - easy->easy_conn->send_pipe)) { + data->easy_conn->send_pipe)) { /* Grab the channel */ - easy->easy_conn->writechannel_inuse = TRUE; - multistate(easy, CURLM_STATE_DO); - result = CURLM_CALL_MULTI_PERFORM; + data->easy_conn->writechannel_inuse = TRUE; + multistate(data, CURLM_STATE_DO); + rc = CURLM_CALL_MULTI_PERFORM; } break; case CURLM_STATE_DO: if(data->set.connect_only) { /* keep connection open for application to use the socket */ - easy->easy_conn->bits.close = FALSE; - multistate(easy, CURLM_STATE_DONE); - easy->result = CURLE_OK; - result = CURLM_CALL_MULTI_PERFORM; + connkeep(data->easy_conn, "CONNECT_ONLY"); + multistate(data, CURLM_STATE_DONE); + result = CURLE_OK; + rc = CURLM_CALL_MULTI_PERFORM; } else { /* Perform the protocol's DO action */ - easy->result = Curl_do(&easy->easy_conn, &dophase_done); + result = Curl_do(&data->easy_conn, &dophase_done); - /* When Curl_do() returns failure, easy->easy_conn might be NULL! */ + /* When Curl_do() returns failure, data->easy_conn might be NULL! */ - if(CURLE_OK == easy->result) { + if(!result) { if(!dophase_done) { /* some steps needed for wildcard matching */ if(data->set.wildcardmatch) { struct WildcardData *wc = &data->wildcard; if(wc->state == CURLWC_DONE || wc->state == CURLWC_SKIP) { /* skip some states if it is important */ - Curl_done(&easy->easy_conn, CURLE_OK, FALSE); - multistate(easy, CURLM_STATE_DONE); - result = CURLM_CALL_MULTI_PERFORM; + Curl_done(&data->easy_conn, CURLE_OK, FALSE); + multistate(data, CURLM_STATE_DONE); + rc = CURLM_CALL_MULTI_PERFORM; break; } } /* DO was not completed in one function call, we must continue DOING... */ - multistate(easy, CURLM_STATE_DOING); - result = CURLM_OK; + multistate(data, CURLM_STATE_DOING); + rc = CURLM_OK; } /* after DO, go DO_DONE... or DO_MORE */ - else if(easy->easy_conn->bits.do_more) { + else if(data->easy_conn->bits.do_more) { /* we're supposed to do more, but we need to sit down, relax and wait a little while first */ - multistate(easy, CURLM_STATE_DO_MORE); - result = CURLM_OK; + multistate(data, CURLM_STATE_DO_MORE); + rc = CURLM_OK; } else { /* we're done with the DO, now DO_DONE */ - multistate(easy, CURLM_STATE_DO_DONE); - result = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_DO_DONE); + rc = CURLM_CALL_MULTI_PERFORM; } } - else if((CURLE_SEND_ERROR == easy->result) && - easy->easy_conn->bits.reuse) { + else if((CURLE_SEND_ERROR == result) && + data->easy_conn->bits.reuse) { /* * In this situation, a connection that we were trying to use * may have unexpectedly died. If possible, send the connection @@ -1292,51 +1327,52 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, CURLcode drc; bool retry = FALSE; - drc = Curl_retry_request(easy->easy_conn, &newurl); + drc = Curl_retry_request(data->easy_conn, &newurl); if(drc) { /* a failure here pretty much implies an out of memory */ - easy->result = drc; + result = drc; disconnect_conn = TRUE; } else retry = (newurl)?TRUE:FALSE; Curl_posttransfer(data); - drc = Curl_done(&easy->easy_conn, easy->result, FALSE); + drc = Curl_done(&data->easy_conn, result, FALSE); /* When set to retry the connection, we must to go back to * the CONNECT state */ if(retry) { - if((drc == CURLE_OK) || (drc == CURLE_SEND_ERROR)) { + if(!drc || (drc == CURLE_SEND_ERROR)) { follow = FOLLOW_RETRY; drc = Curl_follow(data, newurl, follow); - if(drc == CURLE_OK) { - multistate(easy, CURLM_STATE_CONNECT); - result = CURLM_CALL_MULTI_PERFORM; - easy->result = CURLE_OK; + if(!drc) { + multistate(data, CURLM_STATE_CONNECT); + rc = CURLM_CALL_MULTI_PERFORM; + result = CURLE_OK; } else { /* Follow failed */ - easy->result = drc; + result = drc; free(newurl); } } else { /* done didn't return OK or SEND_ERROR */ - easy->result = drc; + result = drc; free(newurl); } } else { /* Have error handler disconnect conn if we can't retry */ disconnect_conn = TRUE; + free(newurl); } } else { /* failure detected */ Curl_posttransfer(data); - if(easy->easy_conn) - Curl_done(&easy->easy_conn, easy->result, FALSE); + if(data->easy_conn) + Curl_done(&data->easy_conn, result, FALSE); disconnect_conn = TRUE; } } @@ -1344,21 +1380,21 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, case CURLM_STATE_DOING: /* we continue DOING until the DO phase is complete */ - easy->result = Curl_protocol_doing(easy->easy_conn, - &dophase_done); - if(CURLE_OK == easy->result) { + result = Curl_protocol_doing(data->easy_conn, + &dophase_done); + if(!result) { if(dophase_done) { /* after DO, go DO_DONE or DO_MORE */ - multistate(easy, easy->easy_conn->bits.do_more? + multistate(data, data->easy_conn->bits.do_more? CURLM_STATE_DO_MORE: CURLM_STATE_DO_DONE); - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; } /* dophase_done */ } else { /* failure detected */ Curl_posttransfer(data); - Curl_done(&easy->easy_conn, easy->result, FALSE); + Curl_done(&data->easy_conn, result, FALSE); disconnect_conn = TRUE; } break; @@ -1367,78 +1403,85 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* * When we are connected, DO MORE and then go DO_DONE */ - easy->result = Curl_do_more(easy->easy_conn, &control); + result = Curl_do_more(data->easy_conn, &control); /* No need to remove this handle from the send pipeline here since that is done in Curl_done() */ - if(CURLE_OK == easy->result) { + if(!result) { if(control) { /* if positive, advance to DO_DONE if negative, go back to DOING */ - multistate(easy, control==1? + multistate(data, control==1? CURLM_STATE_DO_DONE: CURLM_STATE_DOING); - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; } else /* stay in DO_MORE */ - result = CURLM_OK; + rc = CURLM_OK; } else { /* failure detected */ Curl_posttransfer(data); - Curl_done(&easy->easy_conn, easy->result, FALSE); + Curl_done(&data->easy_conn, result, FALSE); disconnect_conn = TRUE; } break; case CURLM_STATE_DO_DONE: /* Move ourselves from the send to recv pipeline */ - Curl_move_handle_from_send_to_recv_pipe(data, easy->easy_conn); + Curl_move_handle_from_send_to_recv_pipe(data, data->easy_conn); /* Check if we can move pending requests to send pipe */ Curl_multi_process_pending_handles(multi); - multistate(easy, CURLM_STATE_WAITPERFORM); - result = CURLM_CALL_MULTI_PERFORM; + + /* Only perform the transfer if there's a good socket to work with. + Having both BAD is a signal to skip immediately to DONE */ + if((data->easy_conn->sockfd != CURL_SOCKET_BAD) || + (data->easy_conn->writesockfd != CURL_SOCKET_BAD)) + multistate(data, CURLM_STATE_WAITPERFORM); + else + multistate(data, CURLM_STATE_DONE); + rc = CURLM_CALL_MULTI_PERFORM; break; case CURLM_STATE_WAITPERFORM: /* Wait for our turn to PERFORM */ - if(!easy->easy_conn->readchannel_inuse && + if(!data->easy_conn->readchannel_inuse && isHandleAtHead(data, - easy->easy_conn->recv_pipe)) { + data->easy_conn->recv_pipe)) { /* Grab the channel */ - easy->easy_conn->readchannel_inuse = TRUE; - multistate(easy, CURLM_STATE_PERFORM); - result = CURLM_CALL_MULTI_PERFORM; + data->easy_conn->readchannel_inuse = TRUE; + multistate(data, CURLM_STATE_PERFORM); + rc = CURLM_CALL_MULTI_PERFORM; } #ifdef DEBUGBUILD else { infof(data, "WAITPERFORM: Conn %ld recv pipe %zu inuse %s athead %s\n", - easy->easy_conn->connection_id, - easy->easy_conn->recv_pipe->size, - easy->easy_conn->readchannel_inuse?"TRUE":"FALSE", + data->easy_conn->connection_id, + data->easy_conn->recv_pipe->size, + data->easy_conn->readchannel_inuse?"TRUE":"FALSE", isHandleAtHead(data, - easy->easy_conn->recv_pipe)?"TRUE":"FALSE"); + data->easy_conn->recv_pipe)?"TRUE":"FALSE"); } #endif break; case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */ /* if both rates are within spec, resume transfer */ - if(Curl_pgrsUpdate(easy->easy_conn)) - easy->result = CURLE_ABORTED_BY_CALLBACK; + if(Curl_pgrsUpdate(data->easy_conn)) + result = CURLE_ABORTED_BY_CALLBACK; else - easy->result = Curl_speedcheck(data, now); + result = Curl_speedcheck(data, now); if(( (data->set.max_send_speed == 0) || (data->progress.ulspeed < data->set.max_send_speed )) && ( (data->set.max_recv_speed == 0) || (data->progress.dlspeed < data->set.max_recv_speed))) - multistate(easy, CURLM_STATE_PERFORM); + multistate(data, CURLM_STATE_PERFORM); break; case CURLM_STATE_PERFORM: - { + { char *newurl = NULL; bool retry = FALSE; @@ -1447,14 +1490,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, (data->progress.ulspeed > data->set.max_send_speed)) { int buffersize; - multistate(easy, CURLM_STATE_TOOFAST); + multistate(data, CURLM_STATE_TOOFAST); /* calculate upload rate-limitation timeout. */ buffersize = (int)(data->set.buffer_size ? data->set.buffer_size : BUFSIZE); timeout_ms = Curl_sleep_time(data->set.max_send_speed, data->progress.ulspeed, buffersize); - Curl_expire(data, timeout_ms); + Curl_expire_latest(data, timeout_ms); break; } @@ -1463,50 +1506,50 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, (data->progress.dlspeed > data->set.max_recv_speed)) { int buffersize; - multistate(easy, CURLM_STATE_TOOFAST); + multistate(data, CURLM_STATE_TOOFAST); - /* Calculate download rate-limitation timeout. */ + /* Calculate download rate-limitation timeout. */ buffersize = (int)(data->set.buffer_size ? data->set.buffer_size : BUFSIZE); timeout_ms = Curl_sleep_time(data->set.max_recv_speed, data->progress.dlspeed, buffersize); - Curl_expire(data, timeout_ms); + Curl_expire_latest(data, timeout_ms); break; } /* read/write data if it is ready to do so */ - easy->result = Curl_readwrite(easy->easy_conn, &done); + result = Curl_readwrite(data->easy_conn, &done); k = &data->req; if(!(k->keepon & KEEP_RECV)) { /* We're done receiving */ - easy->easy_conn->readchannel_inuse = FALSE; + data->easy_conn->readchannel_inuse = FALSE; } if(!(k->keepon & KEEP_SEND)) { /* We're done sending */ - easy->easy_conn->writechannel_inuse = FALSE; + data->easy_conn->writechannel_inuse = FALSE; } - if(done || (easy->result == CURLE_RECV_ERROR)) { + if(done || (result == CURLE_RECV_ERROR)) { /* If CURLE_RECV_ERROR happens early enough, we assume it was a race * condition and the server closed the re-used connection exactly when * we wanted to use it, so figure out if that is indeed the case. */ - CURLcode ret = Curl_retry_request(easy->easy_conn, &newurl); + CURLcode ret = Curl_retry_request(data->easy_conn, &newurl); if(!ret) retry = (newurl)?TRUE:FALSE; if(retry) { /* if we are to retry, set the result to OK and consider the request as done */ - easy->result = CURLE_OK; + result = CURLE_OK; done = TRUE; } } - if(easy->result) { + if(result) { /* * The transfer phase returned error, we mark the connection to get * closed to prevent being re-used. This is because we can't possibly @@ -1515,11 +1558,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, * happened in the data connection. */ - if(!(easy->easy_conn->handler->flags & PROTOPT_DUAL)) - easy->easy_conn->bits.close = TRUE; + if(!(data->easy_conn->handler->flags & PROTOPT_DUAL)) + connclose(data->easy_conn, "Transfer returned error"); Curl_posttransfer(data); - Curl_done(&easy->easy_conn, easy->result, FALSE); + Curl_done(&data->easy_conn, result, FALSE); } else if(done) { followtype follow=FOLLOW_NONE; @@ -1528,11 +1571,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, Curl_posttransfer(data); /* we're no longer receiving */ - Curl_removeHandleFromPipeline(data, easy->easy_conn->recv_pipe); + Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe); /* expire the new receiving pipeline head */ - if(easy->easy_conn->recv_pipe->head) - Curl_expire(easy->easy_conn->recv_pipe->head->ptr, 1); + if(data->easy_conn->recv_pipe->head) + Curl_expire_latest(data->easy_conn->recv_pipe->head->ptr, 1); /* Check if we can move pending requests to send pipe */ Curl_multi_process_pending_handles(multi); @@ -1543,18 +1586,20 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(!retry) { /* if the URL is a follow-location and not just a retried request then figure out the URL here */ + if(newurl) + free(newurl); newurl = data->req.newurl; data->req.newurl = NULL; follow = FOLLOW_REDIR; } else follow = FOLLOW_RETRY; - easy->result = Curl_done(&easy->easy_conn, CURLE_OK, FALSE); - if(CURLE_OK == easy->result) { - easy->result = Curl_follow(data, newurl, follow); - if(CURLE_OK == easy->result) { - multistate(easy, CURLM_STATE_CONNECT); - result = CURLM_CALL_MULTI_PERFORM; + result = Curl_done(&data->easy_conn, CURLE_OK, FALSE); + if(!result) { + result = Curl_follow(data, newurl, follow); + if(!result) { + multistate(data, CURLM_STATE_CONNECT); + rc = CURLM_CALL_MULTI_PERFORM; newurl = NULL; /* handed over the memory ownership to Curl_follow(), make sure we don't free() it here */ @@ -1571,65 +1616,64 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, free(newurl); newurl = data->req.location; data->req.location = NULL; - easy->result = Curl_follow(data, newurl, FOLLOW_FAKE); - if(CURLE_OK == easy->result) + result = Curl_follow(data, newurl, FOLLOW_FAKE); + if(!result) newurl = NULL; /* allocation was handed over Curl_follow() */ else disconnect_conn = TRUE; } - multistate(easy, CURLM_STATE_DONE); - result = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_DONE); + rc = CURLM_CALL_MULTI_PERFORM; } } if(newurl) free(newurl); break; - } + } case CURLM_STATE_DONE: + /* this state is highly transient, so run another loop after this */ + rc = CURLM_CALL_MULTI_PERFORM; + + if(data->easy_conn) { + CURLcode res; - if(easy->easy_conn) { /* Remove ourselves from the receive pipeline, if we are there. */ - Curl_removeHandleFromPipeline(data, - easy->easy_conn->recv_pipe); + Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe); /* Check if we can move pending requests to send pipe */ Curl_multi_process_pending_handles(multi); - if(easy->easy_conn->bits.stream_was_rewound) { - /* This request read past its response boundary so we quickly let - the other requests consume those bytes since there is no - guarantee that the socket will become active again */ - result = CURLM_CALL_MULTI_PERFORM; - } - /* post-transfer command */ - easy->result = Curl_done(&easy->easy_conn, CURLE_OK, FALSE); + res = Curl_done(&data->easy_conn, result, FALSE); + + /* allow a previously set error code take precedence */ + if(!result) + result = res; + /* * If there are other handles on the pipeline, Curl_done won't set * easy_conn to NULL. In such a case, curl_multi_remove_handle() can * access free'd data, if the connection is free'd and the handle * removed before we perform the processing in CURLM_STATE_COMPLETED */ - if(easy->easy_conn) - easy->easy_conn = NULL; + if(data->easy_conn) + data->easy_conn = NULL; } if(data->set.wildcardmatch) { if(data->wildcard.state != CURLWC_DONE) { /* if a wildcard is set and we are not ending -> lets start again with CURLM_STATE_INIT */ - result = CURLM_CALL_MULTI_PERFORM; - multistate(easy, CURLM_STATE_INIT); + multistate(data, CURLM_STATE_INIT); break; } } /* after we have DONE what we're supposed to do, go COMPLETED, and it doesn't matter what the Curl_done() returned! */ - multistate(easy, CURLM_STATE_COMPLETED); - + multistate(data, CURLM_STATE_COMPLETED); break; case CURLM_STATE_COMPLETED: @@ -1640,20 +1684,22 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* Important: reset the conn pointer so that we don't point to memory that could be freed anytime */ - easy->easy_conn = NULL; + data->easy_conn = NULL; Curl_expire(data, 0); /* stop all timers */ break; case CURLM_STATE_MSGSENT: + data->result = result; return CURLM_OK; /* do nothing */ default: return CURLM_INTERNAL_ERROR; } + statemachine_end: - if(easy->mstate < CURLM_STATE_COMPLETED) { - if(CURLE_OK != easy->result) { + if(data->mstate < CURLM_STATE_COMPLETED) { + if(result) { /* * If an error was returned, and we aren't in completed state now, * then we go to completed and consider this transfer aborted. @@ -1664,69 +1710,73 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->state.pipe_broke = FALSE; - if(easy->easy_conn) { + if(data->easy_conn) { /* if this has a connection, unsubscribe from the pipelines */ - easy->easy_conn->writechannel_inuse = FALSE; - easy->easy_conn->readchannel_inuse = FALSE; - Curl_removeHandleFromPipeline(data, - easy->easy_conn->send_pipe); - Curl_removeHandleFromPipeline(data, - easy->easy_conn->recv_pipe); + data->easy_conn->writechannel_inuse = FALSE; + data->easy_conn->readchannel_inuse = FALSE; + Curl_removeHandleFromPipeline(data, data->easy_conn->send_pipe); + Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe); /* Check if we can move pending requests to send pipe */ Curl_multi_process_pending_handles(multi); if(disconnect_conn) { + /* Don't attempt to send data over a connection that timed out */ + bool dead_connection = result == CURLE_OPERATION_TIMEDOUT; /* disconnect properly */ - Curl_disconnect(easy->easy_conn, /* dead_connection */ FALSE); + Curl_disconnect(data->easy_conn, dead_connection); /* This is where we make sure that the easy_conn pointer is reset. We don't have to do this in every case block above where a failure is detected */ - easy->easy_conn = NULL; + data->easy_conn = NULL; } } - else if(easy->mstate == CURLM_STATE_CONNECT) { + else if(data->mstate == CURLM_STATE_CONNECT) { /* Curl_connect() failed */ (void)Curl_posttransfer(data); } - multistate(easy, CURLM_STATE_COMPLETED); + multistate(data, CURLM_STATE_COMPLETED); } /* if there's still a connection to use, call the progress function */ - else if(easy->easy_conn && Curl_pgrsUpdate(easy->easy_conn)) { + else if(data->easy_conn && Curl_pgrsUpdate(data->easy_conn)) { /* aborted due to progress callback return code must close the connection */ - easy->easy_conn->bits.close = TRUE; + result = CURLE_ABORTED_BY_CALLBACK; + connclose(data->easy_conn, "Aborted by callback"); /* if not yet in DONE state, go there, otherwise COMPLETED */ - multistate(easy, (easy->mstate < CURLM_STATE_DONE)? + multistate(data, (data->mstate < CURLM_STATE_DONE)? CURLM_STATE_DONE: CURLM_STATE_COMPLETED); - result = CURLM_CALL_MULTI_PERFORM; + rc = CURLM_CALL_MULTI_PERFORM; } } - } WHILE_FALSE; /* just to break out from! */ - if(CURLM_STATE_COMPLETED == easy->mstate) { - /* now fill in the Curl_message with this info */ - msg = &easy->msg; + if(CURLM_STATE_COMPLETED == data->mstate) { + /* now fill in the Curl_message with this info */ + msg = &data->msg; - msg->extmsg.msg = CURLMSG_DONE; - msg->extmsg.easy_handle = data; - msg->extmsg.data.result = easy->result; + msg->extmsg.msg = CURLMSG_DONE; + msg->extmsg.easy_handle = data; + msg->extmsg.data.result = result; - result = multi_addmsg(multi, msg); + rc = multi_addmsg(multi, msg); - multistate(easy, CURLM_STATE_MSGSENT); - } + multistate(data, CURLM_STATE_MSGSENT); + } + } while(rc == CURLM_CALL_MULTI_PERFORM); - return result; + data->result = result; + + + return rc; } CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) { struct Curl_multi *multi=(struct Curl_multi *)multi_handle; - struct SessionHandle *easy; + struct SessionHandle *data; CURLMcode returncode=CURLM_OK; struct Curl_tree *t; struct timeval now = Curl_tvnow(); @@ -1734,12 +1784,13 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) if(!GOOD_MULTI_HANDLE(multi)) return CURLM_BAD_HANDLE; - easy=multi->easyp; - while(easy) { + data=multi->easyp; + while(data) { CURLMcode result; - struct WildcardData *wc = &easy->wildcard; + struct WildcardData *wc = &data->wildcard; + SIGPIPE_VARIABLE(pipe_st); - if(easy->set.wildcardmatch) { + if(data->set.wildcardmatch) { if(!wc->filelist) { CURLcode ret = Curl_wildcard_init(wc); /* init wildcard structures */ if(ret) @@ -1747,11 +1798,11 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) } } - do - result = multi_runsingle(multi, now, easy); - while(CURLM_CALL_MULTI_PERFORM == result); + sigpipe_ignore(data, &pipe_st); + result = multi_runsingle(multi, now, data); + sigpipe_restore(&pipe_st); - if(easy->set.wildcardmatch) { + if(data->set.wildcardmatch) { /* destruct wildcard structures if it is needed */ if(wc->state == CURLWC_DONE || result) Curl_wildcard_dtor(wc); @@ -1760,7 +1811,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) if(result) returncode = result; - easy = easy->next; /* operate on next handle */ + data = data->next; /* operate on next handle */ } /* @@ -1795,10 +1846,13 @@ static void close_all_connections(struct Curl_multi *multi) conn = Curl_conncache_find_first_connection(multi->conn_cache); while(conn) { + SIGPIPE_VARIABLE(pipe_st); conn->data = multi->closure_handle; + sigpipe_ignore(conn->data, &pipe_st); /* This will remove the connection from the cache */ (void)Curl_disconnect(conn, FALSE); + sigpipe_restore(&pipe_st); conn = Curl_conncache_find_first_connection(multi->conn_cache); } @@ -1807,61 +1861,61 @@ static void close_all_connections(struct Curl_multi *multi) CURLMcode curl_multi_cleanup(CURLM *multi_handle) { struct Curl_multi *multi=(struct Curl_multi *)multi_handle; - struct SessionHandle *easy; - struct SessionHandle *nexteasy; + struct SessionHandle *data; + struct SessionHandle *nextdata; if(GOOD_MULTI_HANDLE(multi)) { + bool restore_pipe = FALSE; + SIGPIPE_VARIABLE(pipe_st); + multi->type = 0; /* not good anymore */ /* Close all the connections in the connection cache */ close_all_connections(multi); if(multi->closure_handle) { + sigpipe_ignore(multi->closure_handle, &pipe_st); + restore_pipe = TRUE; + multi->closure_handle->dns.hostcache = multi->hostcache; Curl_hostcache_clean(multi->closure_handle, multi->closure_handle->dns.hostcache); Curl_close(multi->closure_handle); - multi->closure_handle = NULL; } Curl_hash_destroy(multi->sockhash); - multi->sockhash = NULL; - Curl_conncache_destroy(multi->conn_cache); - multi->conn_cache = NULL; - - /* remove the pending list of messages */ Curl_llist_destroy(multi->msglist, NULL); - multi->msglist = NULL; + Curl_llist_destroy(multi->pending, NULL); /* remove all easy handles */ - easy = multi->easyp; - while(easy) { - nexteasy=easy->next; - if(easy->dns.hostcachetype == HCACHE_MULTI) { + data = multi->easyp; + while(data) { + nextdata=data->next; + if(data->dns.hostcachetype == HCACHE_MULTI) { /* clear out the usage of the shared DNS cache */ - Curl_hostcache_clean(easy, easy->dns.hostcache); - easy->dns.hostcache = NULL; - easy->dns.hostcachetype = HCACHE_NONE; + Curl_hostcache_clean(data, data->dns.hostcache); + data->dns.hostcache = NULL; + data->dns.hostcachetype = HCACHE_NONE; } /* Clear the pointer to the connection cache */ - easy->state.conn_cache = NULL; + data->state.conn_cache = NULL; + data->multi = NULL; /* clear the association */ - Curl_easy_addmulti(easy, NULL); /* clear the association */ - - easy = nexteasy; + data = nextdata; } Curl_hash_destroy(multi->hostcache); - multi->hostcache = NULL; /* Free the blacklists by setting them to NULL */ Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl); Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl); free(multi); + if(restore_pipe) + sigpipe_restore(&pipe_st); return CURLM_OK; } @@ -1912,7 +1966,7 @@ CURLMsg *curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue) * call the callback accordingly. */ static void singlesocket(struct Curl_multi *multi, - struct SessionHandle *easy) + struct SessionHandle *data) { curl_socket_t socks[MAX_SOCKSPEREASYHANDLE]; int i; @@ -1927,7 +1981,7 @@ static void singlesocket(struct Curl_multi *multi, /* Fill in the 'current' struct with the state as it is now: what sockets to supervise and for what actions */ - curraction = multi_getsock(easy, socks, MAX_SOCKSPEREASYHANDLE); + curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE); /* We have 0 .. N sockets already and we get to know about the 0 .. M sockets we should have from now on. Detect the differences, remove no @@ -1957,7 +2011,7 @@ static void singlesocket(struct Curl_multi *multi, } else { /* this is a socket we didn't have before, add it! */ - entry = sh_addentry(multi->sockhash, s, easy); + entry = sh_addentry(multi->sockhash, s, data); if(!entry) /* fatal */ return; @@ -1965,7 +2019,7 @@ static void singlesocket(struct Curl_multi *multi, /* we know (entry != NULL) at this point, see the logic above */ if(multi->socket_cb) - multi->socket_cb(easy, + multi->socket_cb(data, s, action, multi->socket_userp, @@ -1978,9 +2032,9 @@ static void singlesocket(struct Curl_multi *multi, /* when we've walked over all the sockets we should have right now, we must make sure to detect sockets that are removed */ - for(i=0; i< easy->numsocks; i++) { + for(i=0; i< data->numsocks; i++) { int j; - s = easy->sockets[i]; + s = data->sockets[i]; for(j=0; jeasy_conn; + struct connectdata *easy_conn = data->easy_conn; if(easy_conn) { if(easy_conn->recv_pipe && easy_conn->recv_pipe->size > 1) { /* the handle should not be removed from the pipe yet */ @@ -2007,8 +2061,8 @@ static void singlesocket(struct Curl_multi *multi, /* Update the sockhash entry to instead point to the next in line for the recv_pipe, or the first (in case this particular easy isn't already) */ - if(entry->easy == easy) { - if(isHandleAtHead(easy, easy_conn->recv_pipe)) + if(entry->easy == data) { + if(isHandleAtHead(data, easy_conn->recv_pipe)) entry->easy = easy_conn->recv_pipe->head->next->ptr; else entry->easy = easy_conn->recv_pipe->head->ptr; @@ -2021,8 +2075,8 @@ static void singlesocket(struct Curl_multi *multi, /* Update the sockhash entry to instead point to the next in line for the send_pipe, or the first (in case this particular easy isn't already) */ - if(entry->easy == easy) { - if(isHandleAtHead(easy, easy_conn->send_pipe)) + if(entry->easy == data) { + if(isHandleAtHead(data, easy_conn->send_pipe)) entry->easy = easy_conn->send_pipe->head->next->ptr; else entry->easy = easy_conn->send_pipe->head->ptr; @@ -2043,7 +2097,7 @@ static void singlesocket(struct Curl_multi *multi, if(remove_sock_from_hash) { /* in this case 'entry' is always non-NULL */ if(multi->socket_cb) - multi->socket_cb(easy, + multi->socket_cb(data, s, CURL_POLL_REMOVE, multi->socket_userp, @@ -2054,15 +2108,15 @@ static void singlesocket(struct Curl_multi *multi, } } - memcpy(easy->sockets, socks, num*sizeof(curl_socket_t)); - easy->numsocks = num; + memcpy(data->sockets, socks, num*sizeof(curl_socket_t)); + data->numsocks = num; } /* * Curl_multi_closed() * * Used by the connect code to tell the multi_socket code that one of the - * sockets we were using have just been closed. This function will then + * sockets we were using is about to be closed. This function will then * remove it from the sockethash for this handle to make the multi_socket API * behave properly, especially for the case when libcurl will create another * socket again and it gets the same file descriptor number. @@ -2146,12 +2200,6 @@ static CURLMcode add_next_timeout(struct timeval now, return CURLM_OK; } -#ifdef WIN32 -#define TIMEOUT_INACCURACY 40000 -#else -#define TIMEOUT_INACCURACY 3000 -#endif - static CURLMcode multi_socket(struct Curl_multi *multi, bool checkall, curl_socket_t s, @@ -2164,16 +2212,17 @@ static CURLMcode multi_socket(struct Curl_multi *multi, struct timeval now = Curl_tvnow(); if(checkall) { - struct SessionHandle *easy; /* *perform() deals with running_handles on its own */ result = curl_multi_perform(multi, running_handles); /* walk through each easy handle and do the socket state change magic and callbacks */ - easy=multi->easyp; - while(easy) { - singlesocket(multi, easy); - easy = easy->next; + if(result != CURLM_BAD_HANDLE) { + data=multi->easyp; + while(data) { + singlesocket(multi, data); + data = data->next; + } } /* or should we fall-through and do the timer-based stuff? */ @@ -2192,6 +2241,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi, and just move on. */ ; else { + SIGPIPE_VARIABLE(pipe_st); + data = entry->easy; if(data->magic != CURLEASY_MAGIC_NUMBER) @@ -2217,9 +2268,9 @@ static CURLMcode multi_socket(struct Curl_multi *multi, /* set socket event bitmask if they're not locked */ data->easy_conn->cselect_bits = ev_bitmask; - do - result = multi_runsingle(multi, now, data); - while(CURLM_CALL_MULTI_PERFORM == result); + sigpipe_ignore(data, &pipe_st); + result = multi_runsingle(multi, now, data); + sigpipe_restore(&pipe_st); if(data->easy_conn && !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK)) @@ -2237,31 +2288,16 @@ static CURLMcode multi_socket(struct Curl_multi *multi, data = NULL; /* set data to NULL again to avoid calling multi_runsingle() in case there's no need to */ + now = Curl_tvnow(); /* get a newer time since the multi_runsingle() loop + may have taken some time */ } } - - /* Compensate for bad precision timers that might've triggered too early. - - This precaution was added in commit 2c72732ebf3da5e as a result of bad - resolution in the windows function use(d). - - The problematic case here is when using the multi_socket API and libcurl - has told the application about a timeout, and that timeout is what fires - off a bit early. As we don't have any IDs associated with the timeout we - can't tell which timeout that fired off but we only have the times to use - to check what to do. If it fires off too early, we don't run the correct - actions and we don't tell the application again about the same timeout as - was already first in the queue... - - Originally we made the timeouts run 40 milliseconds early on all systems, - but now we have an #ifdef setup to provide a decent precaution inaccuracy - margin. - */ - - now.tv_usec += TIMEOUT_INACCURACY; - if(now.tv_usec >= 1000000) { - now.tv_sec++; - now.tv_usec -= 1000000; + else { + /* Asked to run due to time-out. Clear the 'lastcall' variable to force + update_timer() to trigger a callback to the app again even if the same + timeout is still the one to run after this call. That handles the case + when the application asks libcurl to run the timeout prematurely. */ + memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall)); } /* @@ -2272,9 +2308,11 @@ static CURLMcode multi_socket(struct Curl_multi *multi, do { /* the first loop lap 'data' can be NULL */ if(data) { - do - result = multi_runsingle(multi, now, data); - while(CURLM_CALL_MULTI_PERFORM == result); + SIGPIPE_VARIABLE(pipe_st); + + sigpipe_ignore(data, &pipe_st); + result = multi_runsingle(multi, now, data); + sigpipe_restore(&pipe_st); if(CURLM_OK >= result) /* get the socket(s) and check if the state has been changed since @@ -2476,12 +2514,6 @@ static int update_timer(struct Curl_multi *multi) return multi->timer_cb((CURLM*)multi, timeout_ms, multi->timer_userp); } -void Curl_multi_set_easy_connection(struct SessionHandle *handle, - struct connectdata *conn) -{ - handle->easy_conn = conn; -} - static bool isHandleAtHead(struct SessionHandle *handle, struct curl_llist *pipeline) { @@ -2644,6 +2676,46 @@ void Curl_expire(struct SessionHandle *data, long milli) #endif } +/* + * Curl_expire_latest() + * + * This is like Curl_expire() but will only add a timeout node to the list of + * timers if there is no timeout that will expire before the given time. + * + * Use this function if the code logic risks calling this function many times + * or if there's no particular conditional wait in the code for this specific + * time-out period to expire. + * + */ +void Curl_expire_latest(struct SessionHandle *data, long milli) +{ + struct timeval *expire = &data->state.expiretime; + + struct timeval set; + + set = Curl_tvnow(); + set.tv_sec += milli / 1000; + set.tv_usec += (milli % 1000) * 1000; + + if(set.tv_usec >= 1000000) { + set.tv_sec++; + set.tv_usec -= 1000000; + } + + if(expire->tv_sec || expire->tv_usec) { + /* This means that the struct is added as a node in the splay tree. + Compare if the new time is earlier, and only remove-old/add-new if it + is. */ + long diff = curlx_tvdiff(set, *expire); + if(diff > 0) + /* the new expire time was later than the top time, so just skip this */ + return; + } + + /* Just add the timeout like normal */ + Curl_expire(data, milli); +} + CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t s, void *hashp) { @@ -2698,16 +2770,23 @@ struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi) void Curl_multi_process_pending_handles(struct Curl_multi *multi) { - struct SessionHandle *easy; + struct curl_llist_element *e = multi->pending->head; + + while(e) { + struct SessionHandle *data = e->ptr; + struct curl_llist_element *next = e->next; + + if(data->mstate == CURLM_STATE_CONNECT_PEND) { + multistate(data, CURLM_STATE_CONNECT); + + /* Remove this node from the list */ + Curl_llist_remove(multi->pending, e, NULL); - easy=multi->easyp; - while(easy) { - if(easy->mstate == CURLM_STATE_CONNECT_PEND) { - multistate(easy, CURLM_STATE_CONNECT); /* Make sure that the handle will be processed soonish. */ - Curl_expire(easy, 1); + Curl_expire_latest(data, 1); } - easy = easy->next; /* operate on next handle */ + + e = next; /* operate on next handle */ } } @@ -2715,18 +2794,18 @@ void Curl_multi_process_pending_handles(struct Curl_multi *multi) void Curl_multi_dump(const struct Curl_multi *multi_handle) { struct Curl_multi *multi=(struct Curl_multi *)multi_handle; - struct SessionHandle *easy; + struct SessionHandle *data; int i; fprintf(stderr, "* Multi status: %d handles, %d alive\n", multi->num_easy, multi->num_alive); - for(easy=multi->easyp; easy; easy = easy->next) { - if(easy->mstate < CURLM_STATE_COMPLETED) { + for(data=multi->easyp; data; data = data->next) { + if(data->mstate < CURLM_STATE_COMPLETED) { /* only display handles that are not completed */ fprintf(stderr, "handle %p, state %s, %d sockets\n", - (void *)easy, - statename[easy->mstate], easy->numsocks); - for(i=0; i < easy->numsocks; i++) { - curl_socket_t s = easy->sockets[i]; + (void *)data, + statename[data->mstate], data->numsocks); + for(i=0; i < data->numsocks; i++) { + curl_socket_t s = data->sockets[i]; struct Curl_sh_entry *entry = Curl_hash_pick(multi->sockhash, (char *)&s, sizeof(s)); @@ -2739,7 +2818,7 @@ void Curl_multi_dump(const struct Curl_multi *multi_handle) entry->action&CURL_POLL_IN?"RECVING":"", entry->action&CURL_POLL_OUT?"SENDING":""); } - if(easy->numsocks) + if(data->numsocks) fprintf(stderr, "\n"); } } diff --git a/lib/multihandle.h b/lib/multihandle.h index 552aa93..1a4b1d9 100644 --- a/lib/multihandle.h +++ b/lib/multihandle.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -75,6 +75,9 @@ struct Curl_multi { struct curl_llist *msglist; /* a list of messages from completed transfers */ + struct curl_llist *pending; /* SessionHandles that are in the + CURLM_STATE_CONNECT_PEND state */ + /* callback function and user data pointer for the *socket() API */ curl_socket_callback socket_cb; void *socket_userp; diff --git a/lib/multiif.h b/lib/multiif.h index d1b0e2f..d8acfca 100644 --- a/lib/multiif.h +++ b/lib/multiif.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,12 +22,11 @@ * ***************************************************************************/ - - /* * Prototypes for library-wide functions provided by multi.c */ void Curl_expire(struct SessionHandle *data, long milli); +void Curl_expire_latest(struct SessionHandle *data, long milli); bool Curl_multi_pipeline_enabled(const struct Curl_multi* multi); void Curl_multi_handlePipeBreak(struct SessionHandle *data); @@ -56,10 +55,6 @@ struct Curl_multi *Curl_multi_handle(int hashsize, int chashsize); void Curl_multi_dump(const struct Curl_multi *multi_handle); #endif -/* Update the current connection of a One_Easy handle */ -void Curl_multi_set_easy_connection(struct SessionHandle *handle, - struct connectdata *conn); - void Curl_multi_process_pending_handles(struct Curl_multi *multi); /* Return the value of the CURLMOPT_MAX_HOST_CONNECTIONS option */ @@ -87,7 +82,7 @@ size_t Curl_multi_max_total_connections(struct Curl_multi *multi); * Curl_multi_closed() * * Used by the connect code to tell the multi_socket code that one of the - * sockets we were using have just been closed. This function will then + * sockets we were using is about to be closed. This function will then * remove it from the sockethash for this handle to make the multi_socket API * behave properly, especially for the case when libcurl will create another * socket again and it gets the same file descriptor number. diff --git a/lib/netrc.c b/lib/netrc.c index 2c5942a..7435d94 100644 --- a/lib/netrc.c +++ b/lib/netrc.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -50,17 +50,18 @@ enum host_lookup_state { /* * @unittest: 1304 + * + * *loginp and *passwordp MUST be allocated if they aren't NULL when passed + * in. */ int Curl_parsenetrc(const char *host, - char *login, - char *password, + char **loginp, + char **passwordp, char *netrcfile) { FILE *file; int retcode=1; - int specific_login = (login[0] != 0); - char *home = NULL; - bool home_alloc = FALSE; + int specific_login = (*loginp && **loginp != 0); bool netrc_alloc = FALSE; enum host_lookup_state state=NOTHING; @@ -71,10 +72,23 @@ int Curl_parsenetrc(const char *host, #define NETRC DOT_CHAR "netrc" if(!netrcfile) { - home = curl_getenv("HOME"); /* portable environment reader */ + bool home_alloc = FALSE; + char *home = curl_getenv("HOME"); /* portable environment reader */ if(home) { home_alloc = TRUE; -#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) +#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID) + } + else { + struct passwd pw, *pw_res; + char pwbuf[1024]; + if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res) + && pw_res) { + home = strdup(pw.pw_dir); + if(!home) + return CURLE_OUT_OF_MEMORY; + home_alloc = TRUE; + } +#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) } else { struct passwd *pw; @@ -86,18 +100,20 @@ int Curl_parsenetrc(const char *host, } if(!home) - return -1; + return retcode; /* no home directory found (or possibly out of memory) */ netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC); + if(home_alloc) + Curl_safefree(home); if(!netrcfile) { - if(home_alloc) - free(home); return -1; } netrc_alloc = TRUE; } file = fopen(netrcfile, "r"); + if(netrc_alloc) + Curl_safefree(netrcfile); if(file) { char *tok; char *tok_buf; @@ -109,7 +125,7 @@ int Curl_parsenetrc(const char *host, tok=strtok_r(netrcbuffer, " \t\n", &tok_buf); while(!done && tok) { - if(login[0] && password[0]) { + if((*loginp && **loginp) && (*passwordp && **passwordp)) { done=TRUE; break; } @@ -138,16 +154,26 @@ int Curl_parsenetrc(const char *host, /* we are now parsing sub-keywords concerning "our" host */ if(state_login) { if(specific_login) { - state_our_login = Curl_raw_equal(login, tok); + state_our_login = Curl_raw_equal(*loginp, tok); } else { - strncpy(login, tok, LOGINSIZE-1); + free(*loginp); + *loginp = strdup(tok); + if(!*loginp) { + retcode = -1; /* allocation failed */ + goto out; + } } state_login=0; } else if(state_password) { if(state_our_login || !specific_login) { - strncpy(password, tok, PASSWORDSIZE-1); + free(*passwordp); + *passwordp = strdup(tok); + if(!*passwordp) { + retcode = -1; /* allocation failed */ + goto out; + } } state_password=0; } @@ -167,13 +193,9 @@ int Curl_parsenetrc(const char *host, } /* while(tok) */ } /* while fgets() */ + out: fclose(file); } - if(home_alloc) - free(home); - if(netrc_alloc) - free(netrcfile); - return retcode; } diff --git a/lib/netrc.h b/lib/netrc.h index 4db764d..a145601 100644 --- a/lib/netrc.h +++ b/lib/netrc.h @@ -22,19 +22,15 @@ * ***************************************************************************/ -/* Make sure we have room for at least this size: */ -#define LOGINSIZE 64 -#define PASSWORDSIZE 64 - /* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */ int Curl_parsenetrc(const char *host, - char *login, - char *password, + char **loginp, + char **passwordp, char *filename); - /* Assume: password[0]=0, host[0] != 0. - * If login[0] = 0, search for login and password within a machine section - * in the netrc. - * If login[0] != 0, search for password within machine and login. + /* Assume: (*passwordp)[0]=0, host[0] != 0. + * If (*loginp)[0] = 0, search for login and password within a machine + * section in the netrc. + * If (*loginp)[0] != 0, search for password within machine and login. */ #endif /* HEADER_CURL_NETRC_H */ diff --git a/lib/non-ascii.c b/lib/non-ascii.c index 91d6a54..6ccb449 100644 --- a/lib/non-ascii.c +++ b/lib/non-ascii.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -82,17 +82,16 @@ CURLcode Curl_convert_clone(struct SessionHandle *data, CURLcode Curl_convert_to_network(struct SessionHandle *data, char *buffer, size_t length) { - CURLcode rc; - if(data->set.convtonetwork) { /* use translation callback */ - rc = data->set.convtonetwork(buffer, length); - if(rc != CURLE_OK) { + CURLcode result = data->set.convtonetwork(buffer, length); + if(result) { failf(data, "CURLOPT_CONV_TO_NETWORK_FUNCTION callback returned %d: %s", - (int)rc, curl_easy_strerror(rc)); + (int)result, curl_easy_strerror(result)); } - return rc; + + return result; } else { #ifdef HAVE_ICONV @@ -143,17 +142,16 @@ CURLcode Curl_convert_to_network(struct SessionHandle *data, CURLcode Curl_convert_from_network(struct SessionHandle *data, char *buffer, size_t length) { - CURLcode rc; - if(data->set.convfromnetwork) { /* use translation callback */ - rc = data->set.convfromnetwork(buffer, length); - if(rc != CURLE_OK) { + CURLcode result = data->set.convfromnetwork(buffer, length); + if(result) { failf(data, "CURLOPT_CONV_FROM_NETWORK_FUNCTION callback returned %d: %s", - (int)rc, curl_easy_strerror(rc)); + (int)result, curl_easy_strerror(result)); } - return rc; + + return result; } else { #ifdef HAVE_ICONV @@ -204,17 +202,16 @@ CURLcode Curl_convert_from_network(struct SessionHandle *data, CURLcode Curl_convert_from_utf8(struct SessionHandle *data, char *buffer, size_t length) { - CURLcode rc; - if(data->set.convfromutf8) { /* use translation callback */ - rc = data->set.convfromutf8(buffer, length); - if(rc != CURLE_OK) { + CURLcode result = data->set.convfromutf8(buffer, length); + if(result) { failf(data, "CURLOPT_CONV_FROM_UTF8_FUNCTION callback returned %d: %s", - (int)rc, curl_easy_strerror(rc)); + (int)result, curl_easy_strerror(result)); } - return rc; + + return result; } else { #ifdef HAVE_ICONV @@ -319,24 +316,22 @@ void Curl_convert_close(struct SessionHandle *data) */ CURLcode Curl_convert_form(struct SessionHandle *data, struct FormData *form) { - struct FormData *next; - CURLcode rc; - - if(!form) - return CURLE_OK; + CURLcode result; if(!data) return CURLE_BAD_FUNCTION_ARGUMENT; - do { - next=form->next; /* the following form line */ + while(form) { if(form->type == FORM_DATA) { - rc = Curl_convert_to_network(data, form->line, form->length); + result = Curl_convert_to_network(data, form->line, form->length); /* Curl_convert_to_network calls failf if unsuccessful */ - if(rc != CURLE_OK) - return rc; + if(result) + return result; } - } while((form = next) != NULL); /* continue */ + + form = form->next; + } + return CURLE_OK; } diff --git a/lib/openldap.c b/lib/openldap.c index cb3b420..b94c034 100644 --- a/lib/openldap.c +++ b/lib/openldap.c @@ -5,8 +5,8 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2010, Howard Chu, - * Copyright (C) 2011 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2010, 2013, Howard Chu, + * Copyright (C) 2011 - 2014, 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 @@ -41,11 +41,12 @@ #include "urldata.h" #include #include "sendf.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "transfer.h" #include "curl_ldap.h" #include "curl_memory.h" #include "curl_base64.h" +#include "connect.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -58,7 +59,7 @@ extern int ldap_init_fd(ber_socket_t fd, int proto, const char *url, LDAP **ld); #endif -static CURLcode ldap_setup(struct connectdata *conn); +static CURLcode ldap_setup_connection(struct connectdata *conn); static CURLcode ldap_do(struct connectdata *conn, bool *done); static CURLcode ldap_done(struct connectdata *conn, CURLcode, bool); static CURLcode ldap_connect(struct connectdata *conn, bool *done); @@ -73,7 +74,7 @@ static Curl_recv ldap_recv; const struct Curl_handler Curl_handler_ldap = { "LDAP", /* scheme */ - ldap_setup, /* setup_connection */ + ldap_setup_connection, /* setup_connection */ ldap_do, /* do_it */ ldap_done, /* done */ ZERO_NULL, /* do_more */ @@ -98,7 +99,7 @@ const struct Curl_handler Curl_handler_ldap = { const struct Curl_handler Curl_handler_ldaps = { "LDAPS", /* scheme */ - ldap_setup, /* setup_connection */ + ldap_setup_connection, /* setup_connection */ ldap_do, /* do_it */ ldap_done, /* done */ ZERO_NULL, /* do_more */ @@ -147,7 +148,7 @@ typedef struct ldapreqinfo { int nument; } ldapreqinfo; -static CURLcode ldap_setup(struct connectdata *conn) +static CURLcode ldap_setup_connection(struct connectdata *conn) { ldapconninfo *li; LDAPURLDesc *lud; @@ -175,7 +176,7 @@ static CURLcode ldap_setup(struct connectdata *conn) return CURLE_OUT_OF_MEMORY; li->proto = proto; conn->proto.generic = li; - conn->bits.close = FALSE; + connkeep(conn, "OpenLDAP default"); /* TODO: * - provide option to choose SASL Binds instead of Simple */ @@ -189,9 +190,11 @@ static Sockbuf_IO ldapsb_tls; static CURLcode ldap_connect(struct connectdata *conn, bool *done) { ldapconninfo *li = conn->proto.generic; - struct SessionHandle *data=conn->data; + struct SessionHandle *data = conn->data; int rc, proto = LDAP_VERSION3; - char hosturl[1024], *ptr; + char hosturl[1024]; + char *ptr; + (void)done; strcpy(hosturl, "ldap"); @@ -212,10 +215,10 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done) #ifdef USE_SSL if(conn->handler->flags & PROTOPT_SSL) { - CURLcode res; - res = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &li->ssldone); - if(res) - return res; + CURLcode result; + result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &li->ssldone); + if(result) + return result; } #endif @@ -225,8 +228,8 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done) static CURLcode ldap_connecting(struct connectdata *conn, bool *done) { ldapconninfo *li = conn->proto.generic; - struct SessionHandle *data=conn->data; - LDAPMessage *result = NULL; + struct SessionHandle *data = conn->data; + LDAPMessage *msg = NULL; struct timeval tv = {0,1}, *tvp; int rc, err; char *info = NULL; @@ -235,11 +238,12 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done) if(conn->handler->flags & PROTOPT_SSL) { /* Is the SSL handshake complete yet? */ if(!li->ssldone) { - CURLcode res = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, - &li->ssldone); - if(res || !li->ssldone) - return res; + CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, + &li->ssldone); + if(result || !li->ssldone) + return result; } + /* Have we installed the libcurl SSL handlers into the sockbuf yet? */ if(!li->sslinst) { Sockbuf *sb; @@ -278,7 +282,7 @@ retry: return CURLE_OK; } - rc = ldap_result(li->ld, li->msgid, LDAP_MSG_ONE, tvp, &result); + rc = ldap_result(li->ld, li->msgid, LDAP_MSG_ONE, tvp, &msg); if(rc < 0) { failf(data, "LDAP local: bind ldap_result %s", ldap_err2string(rc)); return CURLE_LDAP_CANNOT_BIND; @@ -287,11 +291,13 @@ retry: /* timed out */ return CURLE_OK; } - rc = ldap_parse_result(li->ld, result, &err, NULL, &info, NULL, NULL, 1); + + rc = ldap_parse_result(li->ld, msg, &err, NULL, &info, NULL, NULL, 1); if(rc) { failf(data, "LDAP local: bind ldap_parse_result %s", ldap_err2string(rc)); return CURLE_LDAP_CANNOT_BIND; } + /* Try to fallback to LDAPv2? */ if(err == LDAP_PROTOCOL_ERROR) { int proto; @@ -320,6 +326,7 @@ retry: ldap_memfree(info); conn->recv[FIRSTSOCKET] = ldap_recv; *done = TRUE; + return CURLE_OK; } @@ -349,7 +356,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done) int msgid; struct SessionHandle *data=conn->data; - conn->bits.close = FALSE; + connkeep(conn, "OpenLDAP do"); infof(data, "LDAP local: %s\n", data->change.url); @@ -378,7 +385,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done) if(!lr) return CURLE_OUT_OF_MEMORY; lr->msgid = msgid; - data->state.proto.generic = lr; + data->req.protop = lr; Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL); *done = TRUE; return CURLE_OK; @@ -387,7 +394,8 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done) static CURLcode ldap_done(struct connectdata *conn, CURLcode res, bool premature) { - ldapreqinfo *lr = conn->data->state.proto.generic; + ldapreqinfo *lr = conn->data->req.protop; + (void)res; (void)premature; @@ -398,9 +406,10 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res, ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL); lr->msgid = 0; } - conn->data->state.proto.generic = NULL; + conn->data->req.protop = NULL; free(lr); } + return CURLE_OK; } @@ -408,18 +417,19 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf, size_t len, CURLcode *err) { ldapconninfo *li = conn->proto.generic; - struct SessionHandle *data=conn->data; - ldapreqinfo *lr = data->state.proto.generic; + struct SessionHandle *data = conn->data; + ldapreqinfo *lr = data->req.protop; int rc, ret; - LDAPMessage *result = NULL; + LDAPMessage *msg = NULL; LDAPMessage *ent; BerElement *ber = NULL; struct timeval tv = {0,1}; + (void)len; (void)buf; (void)sockindex; - rc = ldap_result(li->ld, lr->msgid, LDAP_MSG_RECEIVED, &tv, &result); + rc = ldap_result(li->ld, lr->msgid, LDAP_MSG_RECEIVED, &tv, &msg); if(rc < 0) { failf(data, "LDAP local: search ldap_result %s", ldap_err2string(rc)); *err = CURLE_RECV_ERROR; @@ -430,10 +440,10 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf, ret = -1; /* timed out */ - if(result == NULL) + if(!msg) return ret; - for(ent = ldap_first_message(li->ld, result); ent; + for(ent = ldap_first_message(li->ld, msg); ent; ent = ldap_next_message(li->ld, ent)) { struct berval bv, *bvals, **bvp = &bvals; int binary = 0, msgtype; @@ -476,9 +486,18 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf, *err = CURLE_RECV_ERROR; return -1; } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, bv.bv_len); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4); + if(*err) + return -1; + + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, + bv.bv_len); + if(*err) + return -1; + + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); + if(*err) + return -1; data->req.bytecount += bv.bv_len + 5; for(rc = ldap_get_attribute_ber(li->ld, ent, ber, &bv, bvp); @@ -495,10 +514,18 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf, for(i=0; bvals[i].bv_val != NULL; i++) { int binval = 0; - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, - bv.bv_len); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)":", 1); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); + if(*err) + return -1; + + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)bv.bv_val, + bv.bv_len); + if(*err) + return -1; + + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)":", 1); + if(*err) + return -1; data->req.bytecount += bv.bv_len + 2; if(!binary) { @@ -528,36 +555,55 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf, if(error) { ber_memfree(bvals); ber_free(ber, 0); - ldap_msgfree(result); + ldap_msgfree(msg); *err = error; return -1; } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2); + if(*err) + return -1; + data->req.bytecount += 2; if(val_b64_sz > 0) { - Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, val_b64_sz); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, + val_b64_sz); + if(*err) + return -1; free(val_b64); data->req.bytecount += val_b64_sz; } } else { - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)" ", 1); - Curl_client_write(conn, CLIENTWRITE_BODY, bvals[i].bv_val, - bvals[i].bv_len); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)" ", 1); + if(*err) + return -1; + + *err = Curl_client_write(conn, CLIENTWRITE_BODY, bvals[i].bv_val, + bvals[i].bv_len); + if(*err) + return -1; + data->req.bytecount += bvals[i].bv_len + 1; } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + if(*err) + return -1; + data->req.bytecount++; } ber_memfree(bvals); - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + if(*err) + return -1; data->req.bytecount++; } - Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + *err = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 0); + if(*err) + return -1; data->req.bytecount++; ber_free(ber, 0); } - ldap_msgfree(result); + ldap_msgfree(msg); return ret; } diff --git a/lib/parsedate.c b/lib/parsedate.c index 1ddd008..3e168f5 100644 --- a/lib/parsedate.c +++ b/lib/parsedate.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -353,9 +353,11 @@ static int parsedate(const char *date, time_t *output) /* a name coming up */ char buf[32]=""; size_t len; - sscanf(date, "%31[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]", - buf); - len = strlen(buf); + if(sscanf(date, "%31[ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz]", buf)) + len = strlen(buf); + else + len = 0; if(wdaynum == -1) { wdaynum = checkday(buf, len); @@ -410,8 +412,10 @@ static int parsedate(const char *date, time_t *output) if(error) return PARSEDATE_FAIL; +#if LONG_MAX != INT_MAX if((lval > (long)INT_MAX) || (lval < (long)INT_MIN)) return PARSEDATE_FAIL; +#endif val = curlx_sltosi(lval); @@ -526,8 +530,10 @@ static int parsedate(const char *date, time_t *output) /* Add the time zone diff between local time zone and GMT. */ long delta = (long)(tzoff!=-1?tzoff:0); - if((delta>0) && (t + delta < t)) - return -1; /* time_t overflow */ + if((delta>0) && (t > LONG_MAX - delta)) { + *output = 0x7fffffff; + return PARSEDATE_LATER; /* time_t overflow */ + } t += delta; } @@ -539,7 +545,7 @@ static int parsedate(const char *date, time_t *output) time_t curl_getdate(const char *p, const time_t *now) { - time_t parsed; + time_t parsed = -1; int rc = parsedate(p, &parsed); (void)now; /* legacy argument from the past that we ignore */ @@ -557,9 +563,6 @@ time_t curl_getdate(const char *p, const time_t *now) * Curl_gmtime() is a gmtime() replacement for portability. Do not use the * gmtime_r() or gmtime() functions anywhere else but here. * - * To make sure no such function calls slip in, we define them to cause build - * errors, which is why we use the name within parentheses in this function. - * */ CURLcode Curl_gmtime(time_t intime, struct tm *store) diff --git a/lib/pingpong.c b/lib/pingpong.c index 0040b3f..2c2741f 100644 --- a/lib/pingpong.c +++ b/lib/pingpong.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -33,6 +33,7 @@ #include "pingpong.h" #include "multiif.h" #include "non-ascii.h" +#include "vtls/vtls.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -105,6 +106,9 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block) if(Curl_pp_moredata(pp)) /* We are receiving and there is data in the cache so just read it */ rc = 1; + else if(!pp->sendleft && Curl_ssl_data_pending(conn, FIRSTSOCKET)) + /* We are receiving and there is data ready in the SSL library */ + rc = 1; else rc = Curl_socket_ready(pp->sendleft?CURL_SOCKET_BAD:sock, /* reading */ pp->sendleft?sock:CURL_SOCKET_BAD, /* writing */ @@ -161,11 +165,11 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, size_t write_len; char *fmt_crlf; char *s; - CURLcode error; + CURLcode result; struct connectdata *conn = pp->conn; struct SessionHandle *data = conn->data; -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI enum protection_level data_sec = conn->data_prot; #endif @@ -187,26 +191,26 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, Curl_pp_init(pp); - error = Curl_convert_to_network(data, s, write_len); + result = Curl_convert_to_network(data, s, write_len); /* Curl_convert_to_network calls failf if unsuccessful */ - if(error) { + if(result) { free(s); - return error; + return result; } -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI conn->data_prot = PROT_CMD; #endif - error = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len, + result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len, &bytes_written); -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST); conn->data_prot = data_sec; #endif - if(error) { + if(result) { free(s); - return error; + return result; } if(conn->data->set.verbose) @@ -243,15 +247,15 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, CURLcode Curl_pp_sendf(struct pingpong *pp, const char *fmt, ...) { - CURLcode res; + CURLcode result; va_list ap; va_start(ap, fmt); - res = Curl_pp_vsendf(pp, fmt, ap); + result = Curl_pp_vsendf(pp, fmt, ap); va_end(ap); - return res; + return result; } /* @@ -281,8 +285,6 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd, /* number of bytes in the current line, so far */ perline = (ssize_t)(ptr-pp->linestart_resp); - keepon=TRUE; - while((pp->nread_respcache) { @@ -301,30 +303,28 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd, pp->cache_size = 0; /* zero the size just in case */ } else { - int res; -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI enum protection_level prot = conn->data_prot; conn->data_prot = PROT_CLEAR; #endif DEBUGASSERT((ptr+BUFSIZE-pp->nread_resp) <= (buf+BUFSIZE+1)); - res = Curl_read(conn, sockfd, ptr, BUFSIZE-pp->nread_resp, - &gotbytes); -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) + result = Curl_read(conn, sockfd, ptr, BUFSIZE-pp->nread_resp, + &gotbytes); +#ifdef HAVE_GSSAPI DEBUGASSERT(prot > PROT_NONE && prot < PROT_LAST); conn->data_prot = prot; #endif - if(res == CURLE_AGAIN) + if(result == CURLE_AGAIN) return CURLE_OK; /* return */ - if((res == CURLE_OK) && (gotbytes > 0)) + if(!result && (gotbytes > 0)) /* convert from the network encoding */ - res = Curl_convert_from_network(data, ptr, gotbytes); + result = Curl_convert_from_network(data, ptr, gotbytes); /* Curl_convert_from_network calls failf if unsuccessful */ - if(CURLE_OK != res) { - result = (CURLcode)res; /* Set outer result variable to this error. */ + if(result) + /* Set outer result variable to this error. */ keepon = FALSE; - } } if(!keepon) @@ -352,7 +352,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd, the line isn't really terminated until the LF comes */ /* output debug output if that is requested */ -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI if(!conn->sec_complete) #endif if(data->set.verbose) @@ -371,13 +371,10 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd, if(pp->endofresp(conn, pp->linestart_resp, perline, code)) { /* This is the end of the last line, copy the last line to the - start of the buffer and zero terminate, for old times sake (and - krb4)! */ - char *meow; - int n; - for(meow=pp->linestart_resp, n=0; meowlinestart_resp; + memmove(buf, pp->linestart_resp, n); + buf[n]=0; /* zero terminate */ keepon=FALSE; pp->linestart_resp = ptr+1; /* advance pointer */ i++; /* skip this before getting out */ @@ -477,11 +474,9 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp) /* we have a piece of a command still left to send */ struct connectdata *conn = pp->conn; ssize_t written; - CURLcode result = CURLE_OK; curl_socket_t sock = conn->sock[FIRSTSOCKET]; - - result = Curl_write(conn, sock, pp->sendthis + pp->sendsize - - pp->sendleft, pp->sendleft, &written); + CURLcode result = Curl_write(conn, sock, pp->sendthis + pp->sendsize - + pp->sendleft, pp->sendleft, &written); if(result) return result; diff --git a/lib/pipeline.c b/lib/pipeline.c index 418058a..2645fdb 100644 --- a/lib/pipeline.c +++ b/lib/pipeline.c @@ -6,7 +6,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2013, Linus Nielsen Feltzing, - * Copyright (C) 2013, Daniel Stenberg, , et al. + * Copyright (C) 2013-2014, 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 @@ -85,8 +85,8 @@ bool Curl_pipeline_penalized(struct SessionHandle *data, (curl_off_t)conn->chunk.datasize > chunk_penalty_size) penalized = TRUE; - infof(data, "Conn: %ld (%p) Receive pipe weight: (%" FORMAT_OFF_T - "/%zu), penalized: %s\n", + infof(data, "Conn: %ld (%p) Receive pipe weight: (%" + CURL_FORMAT_CURL_OFF_T "/%zu), penalized: %s\n", conn->connection_id, (void *)conn, recv_size, conn->chunk.datasize, penalized?"TRUE":"FALSE"); return penalized; @@ -99,28 +99,23 @@ CURLcode Curl_add_handle_to_pipeline(struct SessionHandle *handle, { struct curl_llist_element *sendhead = conn->send_pipe->head; struct curl_llist *pipeline; - CURLcode rc; + CURLcode result; pipeline = conn->send_pipe; - infof(conn->data, "Adding handle: conn: %p\n", (void *)conn); - infof(conn->data, "Adding handle: send: %d\n", conn->send_pipe->size); - infof(conn->data, "Adding handle: recv: %d\n", conn->recv_pipe->size); - rc = Curl_addHandleToPipeline(handle, pipeline); + result = Curl_addHandleToPipeline(handle, pipeline); if(pipeline == conn->send_pipe && sendhead != conn->send_pipe->head) { /* this is a new one as head, expire it */ conn->writechannel_inuse = FALSE; /* not in use yet */ -#ifdef DEBUGBUILD - infof(conn->data, "%p is at send pipe head!\n", - (void *)conn->send_pipe->head->ptr); -#endif Curl_expire(conn->send_pipe->head->ptr, 1); } +#if 0 /* enable for pipeline debugging */ print_pipeline(conn); +#endif - return rc; + return result; } /* Move this transfer from the sending list to the receiving list. @@ -206,11 +201,18 @@ CURLMcode Curl_pipeline_set_site_blacklist(char **sites, char *port; struct site_blacklist_entry *entry; - entry = malloc(sizeof(struct site_blacklist_entry)); - hostname = strdup(*sites); - if(!hostname) + if(!hostname) { + Curl_llist_destroy(new_list, NULL); return CURLM_OUT_OF_MEMORY; + } + + entry = malloc(sizeof(struct site_blacklist_entry)); + if(!entry) { + free(hostname); + Curl_llist_destroy(new_list, NULL); + return CURLM_OUT_OF_MEMORY; + } port = strchr(hostname, ':'); if(port) { @@ -225,8 +227,11 @@ CURLMcode Curl_pipeline_set_site_blacklist(char **sites, entry->hostname = hostname; - if(!Curl_llist_insert_next(new_list, new_list->tail, entry)) + if(!Curl_llist_insert_next(new_list, new_list->tail, entry)) { + site_blacklist_llist_dtor(NULL, entry); + Curl_llist_destroy(new_list, NULL); return CURLM_OUT_OF_MEMORY; + } sites++; } @@ -246,7 +251,7 @@ CURLMcode Curl_pipeline_set_site_blacklist(char **sites, bool Curl_pipeline_server_blacklisted(struct SessionHandle *handle, char *server_name) { - if(handle->multi) { + if(handle->multi && server_name) { struct curl_llist *blacklist = Curl_multi_pipelining_server_bl(handle->multi); @@ -267,7 +272,7 @@ bool Curl_pipeline_server_blacklisted(struct SessionHandle *handle, } } - infof(handle, "Server %s is not blacklisted\n", server_name); + DEBUGF(infof(handle, "Server %s is not blacklisted\n", server_name)); } return FALSE; } @@ -309,7 +314,7 @@ CURLMcode Curl_pipeline_set_server_blacklist(char **servers, return CURLM_OK; } - +#if 0 void print_pipeline(struct connectdata *conn) { struct curl_llist_element *curr; @@ -331,3 +336,5 @@ void print_pipeline(struct connectdata *conn) } } } + +#endif diff --git a/lib/pipeline.h b/lib/pipeline.h index 1df9589..96c4c33 100644 --- a/lib/pipeline.h +++ b/lib/pipeline.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2013, Linus Nielsen Feltzing, + * Copyright (C) 2013 - 2014, Linus Nielsen Feltzing, * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -41,6 +41,4 @@ bool Curl_pipeline_server_blacklisted(struct SessionHandle *handle, CURLMcode Curl_pipeline_set_server_blacklist(char **servers, struct curl_llist **list_ptr); -void print_pipeline(struct connectdata *conn); - #endif /* HEADER_CURL_PIPELINE_H */ diff --git a/lib/pop3.c b/lib/pop3.c index 876987f..6600459 100644 --- a/lib/pop3.c +++ b/lib/pop3.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -27,7 +27,10 @@ * RFC2831 DIGEST-MD5 authentication * RFC4422 Simple Authentication and Security Layer (SASL) * RFC4616 PLAIN authentication + * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism * RFC5034 POP3 SASL Authentication Mechanism + * RFC6749 OAuth 2.0 Authorization Framework + * Draft LOGIN SASL Mechanism * ***************************************************************************/ @@ -60,7 +63,6 @@ #include #include "urldata.h" #include "sendf.h" -#include "if2ip.h" #include "hostip.h" #include "progress.h" #include "transfer.h" @@ -71,7 +73,7 @@ #include "strtoofft.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" #include "strerror.h" #include "select.h" @@ -104,6 +106,10 @@ static CURLcode pop3_setup_connection(struct connectdata *conn); static CURLcode pop3_parse_url_options(struct connectdata *conn); static CURLcode pop3_parse_url_path(struct connectdata *conn); static CURLcode pop3_parse_custom_request(struct connectdata *conn); +static CURLcode pop3_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + pop3state *state1, pop3state *state2); /* * POP3 protocol handler. @@ -150,7 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = { pop3_disconnect, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_POP3S, /* defport */ - CURLPROTO_POP3 | CURLPROTO_POP3S, /* protocol */ + CURLPROTO_POP3S, /* protocol */ PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NOURLQUERY /* flags */ }; @@ -163,7 +169,7 @@ const struct Curl_handler Curl_handler_pop3s = { static const struct Curl_handler Curl_handler_pop3_proxy = { "POP3", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -188,7 +194,7 @@ static const struct Curl_handler Curl_handler_pop3_proxy = { static const struct Curl_handler Curl_handler_pop3s_proxy = { "POP3S", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -230,8 +236,6 @@ static bool pop3_endofresp(struct connectdata *conn, char *line, size_t len, int *resp) { struct pop3_conn *pop3c = &conn->proto.pop3c; - size_t wordlen; - size_t i; /* Do we have an error response? */ if(len >= 4 && !memcmp("-ERR", line, 4)) { @@ -240,99 +244,15 @@ static bool pop3_endofresp(struct connectdata *conn, char *line, size_t len, return TRUE; } - /* Are we processing servergreet responses? */ - if(pop3c->state == POP3_SERVERGREET) { - /* Look for the APOP timestamp */ - if(len >= 3 && line[len - 3] == '>') { - for(i = 0; i < len - 3; ++i) { - if(line[i] == '<') { - /* Calculate the length of the timestamp */ - size_t timestamplen = len - 2 - i; - - /* Allocate some memory for the timestamp */ - pop3c->apoptimestamp = (char *)calloc(1, timestamplen + 1); - - if(!pop3c->apoptimestamp) - break; - - /* Copy the timestamp */ - memcpy(pop3c->apoptimestamp, line + i, timestamplen); - pop3c->apoptimestamp[timestamplen] = '\0'; - break; - } - } - } - } /* Are we processing CAPA command responses? */ - else if(pop3c->state == POP3_CAPA) { + if(pop3c->state == POP3_CAPA) { /* Do we have the terminating line? */ - if(len >= 1 && !memcmp(line, ".", 1)) { + if(len >= 1 && !memcmp(line, ".", 1)) *resp = '+'; + else + *resp = '*'; - return TRUE; - } - - /* Does the server support the STLS capability? */ - if(len >= 4 && !memcmp(line, "STLS", 4)) - pop3c->tls_supported = TRUE; - - /* Does the server support clear text authentication? */ - else if(len >= 4 && !memcmp(line, "USER", 4)) - pop3c->authtypes |= POP3_TYPE_CLEARTEXT; - - /* Does the server support APOP authentication? */ - else if(len >= 4 && !memcmp(line, "APOP", 4)) - pop3c->authtypes |= POP3_TYPE_APOP; - - /* Does the server support SASL based authentication? */ - else if(len >= 5 && !memcmp(line, "SASL ", 5)) { - pop3c->authtypes |= POP3_TYPE_SASL; - - /* Advance past the SASL keyword */ - line += 5; - len -= 5; - - /* Loop through the data line */ - for(;;) { - while(len && - (*line == ' ' || *line == '\t' || - *line == '\r' || *line == '\n')) { - - line++; - len--; - } - - if(!len) - break; - - /* Extract the word */ - for(wordlen = 0; wordlen < len && line[wordlen] != ' ' && - line[wordlen] != '\t' && line[wordlen] != '\r' && - line[wordlen] != '\n';) - wordlen++; - - /* Test the word for a matching authentication mechanism */ - if(wordlen == 5 && !memcmp(line, "LOGIN", 5)) - pop3c->authmechs |= SASL_MECH_LOGIN; - else if(wordlen == 5 && !memcmp(line, "PLAIN", 5)) - pop3c->authmechs |= SASL_MECH_PLAIN; - else if(wordlen == 8 && !memcmp(line, "CRAM-MD5", 8)) - pop3c->authmechs |= SASL_MECH_CRAM_MD5; - else if(wordlen == 10 && !memcmp(line, "DIGEST-MD5", 10)) - pop3c->authmechs |= SASL_MECH_DIGEST_MD5; - else if(wordlen == 6 && !memcmp(line, "GSSAPI", 6)) - pop3c->authmechs |= SASL_MECH_GSSAPI; - else if(wordlen == 8 && !memcmp(line, "EXTERNAL", 8)) - pop3c->authmechs |= SASL_MECH_EXTERNAL; - else if(wordlen == 4 && !memcmp(line, "NTLM", 4)) - pop3c->authmechs |= SASL_MECH_NTLM; - - line += wordlen; - len -= wordlen; - } - } - - return FALSE; + return TRUE; } /* Do we have a command or continuation response? */ @@ -348,6 +268,35 @@ static bool pop3_endofresp(struct connectdata *conn, char *line, size_t len, /*********************************************************************** * + * pop3_get_message() + * + * Gets the authentication message from the response buffer. + */ +static void pop3_get_message(char *buffer, char** outptr) +{ + size_t len = 0; + char* message = NULL; + + /* Find the start of the message */ + for(message = buffer + 2; *message == ' ' || *message == '\t'; message++) + ; + + /* Find the end of the message */ + for(len = strlen(message); len--;) + if(message[len] != '\r' && message[len] != '\n' && message[len] != ' ' && + message[len] != '\t') + break; + + /* Terminate the message */ + if(++len) { + message[len] = '\0'; + } + + *outptr = message; +} + +/*********************************************************************** + * * state() * * This is the ONLY way to change POP3 state! @@ -371,6 +320,11 @@ static void state(struct connectdata *conn, pop3state newstate) "AUTH_DIGESTMD5_RESP", "AUTH_NTLM", "AUTH_NTLM_TYPE2MSG", + "AUTH_GSSAPI", + "AUTH_GSSAPI_TOKEN", + "AUTH_GSSAPI_NO_DATA", + "AUTH_XOAUTH2", + "AUTH_CANCEL", "AUTH_FINAL", "APOP", "USER", @@ -539,18 +493,48 @@ static CURLcode pop3_perform_apop(struct connectdata *conn) /*********************************************************************** * - * pop3_perform_authenticate() + * pop3_perform_auth() * - * Sends an AUTH command allowing the client to login with the appropriate - * SASL authentication mechanism. + * Sends an AUTH command allowing the client to login with the given SASL + * authentication mechanism. + */ +static CURLcode pop3_perform_auth(struct connectdata *conn, + const char *mech, + const char *initresp, size_t len, + pop3state state1, pop3state state2) +{ + CURLcode result = CURLE_OK; + struct pop3_conn *pop3c = &conn->proto.pop3c; + + if(initresp && 8 + strlen(mech) + len <= 255) { /* AUTH ... */ + /* Send the AUTH command with the initial response */ + result = Curl_pp_sendf(&pop3c->pp, "AUTH %s %s", mech, initresp); + + if(!result) + state(conn, state2); + } + else { + /* Send the AUTH command */ + result = Curl_pp_sendf(&pop3c->pp, "AUTH %s", mech); + + if(!result) + state(conn, state1); + } + + return result; +} + +/*********************************************************************** + * + * pop3_perform_authentication() * - * Additionally, the function will perform fallback to APOP and USER commands - * should a common mechanism not be available between the client and server. + * Initiates the authentication sequence, with the appropriate SASL + * authentication mechanism, falling back to APOP and clear text should a + * common mechanism not be available between the client and server. */ -static CURLcode pop3_perform_authenticate(struct connectdata *conn) +static CURLcode pop3_perform_authentication(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct SessionHandle *data = conn->data; struct pop3_conn *pop3c = &conn->proto.pop3c; const char *mech = NULL; char *initresp = NULL; @@ -566,82 +550,15 @@ static CURLcode pop3_perform_authenticate(struct connectdata *conn) return result; } - /* Calculate the supported authentication mechanism by decreasing order of - security */ - if(pop3c->authtypes & POP3_TYPE_SASL) { -#ifndef CURL_DISABLE_CRYPTO_AUTH - if((pop3c->authmechs & SASL_MECH_DIGEST_MD5) && - (pop3c->prefmech & SASL_MECH_DIGEST_MD5)) { - mech = "DIGEST-MD5"; - state1 = POP3_AUTH_DIGESTMD5; - pop3c->authused = SASL_MECH_DIGEST_MD5; - } - else if((pop3c->authmechs & SASL_MECH_CRAM_MD5) && - (pop3c->prefmech & SASL_MECH_CRAM_MD5)) { - mech = "CRAM-MD5"; - state1 = POP3_AUTH_CRAMMD5; - pop3c->authused = SASL_MECH_CRAM_MD5; - } - else -#endif -#ifdef USE_NTLM - if((pop3c->authmechs & SASL_MECH_NTLM) && - (pop3c->prefmech & SASL_MECH_NTLM)) { - mech = "NTLM"; - state1 = POP3_AUTH_NTLM; - state2 = POP3_AUTH_NTLM_TYPE2MSG; - pop3c->authused = SASL_MECH_NTLM; - - if(data->set.sasl_ir) - result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, - &conn->ntlm, - &initresp, &len); - } - else -#endif - if((pop3c->authmechs & SASL_MECH_LOGIN) && - (pop3c->prefmech & SASL_MECH_LOGIN)) { - mech = "LOGIN"; - state1 = POP3_AUTH_LOGIN; - state2 = POP3_AUTH_LOGIN_PASSWD; - pop3c->authused = SASL_MECH_LOGIN; - - if(data->set.sasl_ir) - result = Curl_sasl_create_login_message(conn->data, conn->user, - &initresp, &len); - } - else if((pop3c->authmechs & SASL_MECH_PLAIN) && - (pop3c->prefmech & SASL_MECH_PLAIN)) { - mech = "PLAIN"; - state1 = POP3_AUTH_PLAIN; - state2 = POP3_AUTH_FINAL; - pop3c->authused = SASL_MECH_PLAIN; - - if(data->set.sasl_ir) - result = Curl_sasl_create_plain_message(conn->data, conn->user, - conn->passwd, &initresp, - &len); - } - } + /* Calculate the SASL login details */ + if(pop3c->authtypes & POP3_TYPE_SASL) + result = pop3_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); if(!result) { if(mech && (pop3c->preftype & POP3_TYPE_SASL)) { /* Perform SASL based authentication */ - if(initresp && - 8 + strlen(mech) + len <= 255) { /* AUTH ... */ - result = Curl_pp_sendf(&pop3c->pp, "AUTH %s %s", mech, initresp); - - if(!result) - state(conn, state2); - } - else { - result = Curl_pp_sendf(&pop3c->pp, "AUTH %s", mech); - - if(!result) - state(conn, state1); - } - - Curl_safefree(initresp); + result = pop3_perform_auth(conn, mech, initresp, len, state1, state2); } #ifndef CURL_DISABLE_CRYPTO_AUTH else if((pop3c->authtypes & POP3_TYPE_APOP) && @@ -660,6 +577,8 @@ static CURLcode pop3_perform_authenticate(struct connectdata *conn) } } + Curl_safefree(initresp); + return result; } @@ -673,7 +592,7 @@ static CURLcode pop3_perform_command(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3 = data->req.protop; const char *command = NULL; /* Calculate the default command */ @@ -729,6 +648,10 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; + struct pop3_conn *pop3c = &conn->proto.pop3c; + const char *line = data->state.buffer; + size_t len = strlen(line); + size_t i; (void)instate; /* no use for this yet */ @@ -736,8 +659,36 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn, failf(data, "Got unexpected pop3-server response"); result = CURLE_FTP_WEIRD_SERVER_REPLY; } - else + else { + /* Does the server support APOP authentication? */ + if(len >= 4 && line[len - 2] == '>') { + /* Look for the APOP timestamp */ + for(i = 3; i < len - 2; ++i) { + if(line[i] == '<') { + /* Calculate the length of the timestamp */ + size_t timestamplen = len - 1 - i; + if(!timestamplen) + break; + + /* Allocate some memory for the timestamp */ + pop3c->apoptimestamp = (char *)calloc(1, timestamplen + 1); + + if(!pop3c->apoptimestamp) + break; + + /* Copy the timestamp */ + memcpy(pop3c->apoptimestamp, line + i, timestamplen); + pop3c->apoptimestamp[timestamplen] = '\0'; + + /* Store the APOP capability */ + pop3c->authtypes |= POP3_TYPE_APOP; + break; + } + } + } + result = pop3_perform_capa(conn); + } return result; } @@ -749,26 +700,95 @@ static CURLcode pop3_state_capa_resp(struct connectdata *conn, int pop3code, CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; struct pop3_conn *pop3c = &conn->proto.pop3c; + const char *line = data->state.buffer; + size_t len = strlen(line); + size_t wordlen; (void)instate; /* no use for this yet */ - if(pop3code != '+') - result = pop3_perform_user(conn); - else if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) { - /* We don't have a SSL/TLS connection yet, but SSL is requested */ - if(pop3c->tls_supported) - /* Switch to TLS connection now */ - result = pop3_perform_starttls(conn); - else if(data->set.use_ssl == CURLUSESSL_TRY) - /* Fallback and carry on with authentication */ - result = pop3_perform_authenticate(conn); - else { - failf(data, "STLS not supported."); - result = CURLE_USE_SSL_FAILED; + /* Do we have a untagged response? */ + if(pop3code == '*') { + /* Does the server support the STLS capability? */ + if(len >= 4 && !memcmp(line, "STLS", 4)) + pop3c->tls_supported = TRUE; + + /* Does the server support clear text authentication? */ + else if(len >= 4 && !memcmp(line, "USER", 4)) + pop3c->authtypes |= POP3_TYPE_CLEARTEXT; + + /* Does the server support SASL based authentication? */ + else if(len >= 5 && !memcmp(line, "SASL ", 5)) { + pop3c->authtypes |= POP3_TYPE_SASL; + + /* Advance past the SASL keyword */ + line += 5; + len -= 5; + + /* Loop through the data line */ + for(;;) { + while(len && + (*line == ' ' || *line == '\t' || + *line == '\r' || *line == '\n')) { + + line++; + len--; + } + + if(!len) + break; + + /* Extract the word */ + for(wordlen = 0; wordlen < len && line[wordlen] != ' ' && + line[wordlen] != '\t' && line[wordlen] != '\r' && + line[wordlen] != '\n';) + wordlen++; + + /* Test the word for a matching authentication mechanism */ + if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_LOGIN)) + pop3c->authmechs |= SASL_MECH_LOGIN; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_PLAIN)) + pop3c->authmechs |= SASL_MECH_PLAIN; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_CRAM_MD5)) + pop3c->authmechs |= SASL_MECH_CRAM_MD5; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_DIGEST_MD5)) + pop3c->authmechs |= SASL_MECH_DIGEST_MD5; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_GSSAPI)) + pop3c->authmechs |= SASL_MECH_GSSAPI; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_EXTERNAL)) + pop3c->authmechs |= SASL_MECH_EXTERNAL; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_NTLM)) + pop3c->authmechs |= SASL_MECH_NTLM; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_XOAUTH2)) + pop3c->authmechs |= SASL_MECH_XOAUTH2; + + line += wordlen; + len -= wordlen; + } } } - else - result = pop3_perform_authenticate(conn); + else if(pop3code == '+') { + if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) { + /* We don't have a SSL/TLS connection yet, but SSL is requested */ + if(pop3c->tls_supported) + /* Switch to TLS connection now */ + result = pop3_perform_starttls(conn); + else if(data->set.use_ssl == CURLUSESSL_TRY) + /* Fallback and carry on with authentication */ + result = pop3_perform_authentication(conn); + else { + failf(data, "STLS not supported."); + result = CURLE_USE_SSL_FAILED; + } + } + else + result = pop3_perform_authentication(conn); + } + else { + /* Clear text is supported when CAPA isn't recognised */ + pop3c->authtypes |= POP3_TYPE_CLEARTEXT; + + result = pop3_perform_authentication(conn); + } return result; } @@ -789,7 +809,7 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn, result = CURLE_USE_SSL_FAILED; } else - result = pop3_perform_authenticate(conn); + result = pop3_perform_authentication(conn); } else result = pop3_perform_upgrade_tls(conn); @@ -817,20 +837,17 @@ static CURLcode pop3_state_auth_plain_resp(struct connectdata *conn, /* Create the authorisation message */ result = Curl_sasl_create_plain_message(data, conn->user, conn->passwd, &plainauth, &len); + if(!result && plainauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", plainauth); - /* Send the message */ - if(!result) { - if(plainauth) { - result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", plainauth); - - if(!result) - state(conn, POP3_AUTH_FINAL); - } - - Curl_safefree(plainauth); + if(!result) + state(conn, POP3_AUTH_FINAL); } } + Curl_safefree(plainauth); + return result; } @@ -854,20 +871,17 @@ static CURLcode pop3_state_auth_login_resp(struct connectdata *conn, /* Create the user message */ result = Curl_sasl_create_login_message(data, conn->user, &authuser, &len); + if(!result && authuser) { + /* Send the user */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", authuser); - /* Send the user */ - if(!result) { - if(authuser) { - result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", authuser); - - if(!result) - state(conn, POP3_AUTH_LOGIN_PASSWD); - } - - Curl_safefree(authuser); + if(!result) + state(conn, POP3_AUTH_LOGIN_PASSWD); } } + Curl_safefree(authuser); + return result; } @@ -891,20 +905,17 @@ static CURLcode pop3_state_auth_login_password_resp(struct connectdata *conn, /* Create the password message */ result = Curl_sasl_create_login_message(data, conn->passwd, &authpasswd, &len); + if(!result && authpasswd) { + /* Send the password */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", authpasswd); - /* Send the password */ - if(!result) { - if(authpasswd) { - result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", authpasswd); - - if(!result) - state(conn, POP3_AUTH_FINAL); - } - - Curl_safefree(authpasswd); + if(!result) + state(conn, POP3_AUTH_FINAL); } } + Curl_safefree(authpasswd); + return result; } @@ -916,9 +927,10 @@ static CURLcode pop3_state_auth_cram_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg = NULL; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -927,38 +939,34 @@ static CURLcode pop3_state_auth_cram_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 2; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + pop3_get_message(data->state.buffer, &chlg64); - /* Terminate the challenge */ - if(*chlg64 != '=') { - for(len = strlen(chlg64); len--;) - if(chlg64[len] != '\r' && chlg64[len] != '\n' && chlg64[len] != ' ' && - chlg64[len] != '\t') - break; + /* Decode the challenge message */ + result = Curl_sasl_decode_cram_md5_message(chlg64, &chlg, &len); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*"); - if(++len) { - chlg64[len] = '\0'; - } + if(!result) + state(conn, POP3_AUTH_CANCEL); } - - /* Create the response message */ - result = Curl_sasl_create_cram_md5_message(data, chlg64, conn->user, - conn->passwd, &rplyb64, &len); - - /* Send the response */ - if(!result) { - if(rplyb64) { + else { + /* Create the response message */ + result = Curl_sasl_create_cram_md5_message(data, chlg, conn->user, + conn->passwd, &rplyb64, &len); + if(!result && rplyb64) { + /* Send the response */ result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", rplyb64); if(!result) state(conn, POP3_AUTH_FINAL); } - - Curl_safefree(rplyb64); } + Curl_safefree(chlg); + Curl_safefree(rplyb64); + return result; } @@ -969,9 +977,9 @@ static CURLcode pop3_state_auth_digest_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -980,27 +988,32 @@ static CURLcode pop3_state_auth_digest_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 2; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + pop3_get_message(data->state.buffer, &chlg64); /* Create the response message */ - result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user, - conn->passwd, "pop", - &rplyb64, &len); - - /* Send the response */ - if(!result) { - if(rplyb64) { - result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", rplyb64); + result = Curl_sasl_create_digest_md5_message(data, chlg64, + conn->user, conn->passwd, + "pop", &rplyb64, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*"); if(!result) - state(conn, POP3_AUTH_DIGESTMD5_RESP); + state(conn, POP3_AUTH_CANCEL); } + } + else { + /* Send the response */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", rplyb64); - Curl_safefree(rplyb64); + if(!result) + state(conn, POP3_AUTH_DIGESTMD5_RESP); } + Curl_safefree(rplyb64); + return result; } @@ -1052,20 +1065,17 @@ static CURLcode pop3_state_auth_ntlm_resp(struct connectdata *conn, result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, &conn->ntlm, &type1msg, &len); + if(!result && type1msg) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", type1msg); - /* Send the message */ - if(!result) { - if(type1msg) { - result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", type1msg); - - if(!result) - state(conn, POP3_AUTH_NTLM_TYPE2MSG); - } - - Curl_safefree(type1msg); + if(!result) + state(conn, POP3_AUTH_NTLM_TYPE2MSG); } } + Curl_safefree(type1msg); + return result; } @@ -1076,8 +1086,9 @@ static CURLcode pop3_state_auth_ntlm_type2msg_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - size_t len = 0; + char *type2msg = NULL; char *type3msg = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -1086,31 +1097,279 @@ static CURLcode pop3_state_auth_ntlm_type2msg_resp(struct connectdata *conn, result = CURLE_LOGIN_DENIED; } else { - /* Create the type-3 message */ - result = Curl_sasl_create_ntlm_type3_message(data, - data->state.buffer + 2, - conn->user, conn->passwd, - &conn->ntlm, - &type3msg, &len); + /* Get the type-2 message */ + pop3_get_message(data->state.buffer, &type2msg); + + /* Decode the type-2 message */ + result = Curl_sasl_decode_ntlm_type2_message(data, type2msg, &conn->ntlm); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*"); - /* Send the message */ - if(!result) { - if(type3msg) { + if(!result) + state(conn, POP3_AUTH_CANCEL); + } + else { + /* Create the type-3 message */ + result = Curl_sasl_create_ntlm_type3_message(data, conn->user, + conn->passwd, &conn->ntlm, + &type3msg, &len); + if(!result && type3msg) { + /* Send the message */ result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", type3msg); if(!result) state(conn, POP3_AUTH_FINAL); } + } + } + + Curl_safefree(type3msg); + + return result; +} +#endif + +#if defined(USE_KERBEROS5) +/* For AUTH GSSAPI (without initial response) responses */ +static CURLcode pop3_state_auth_gssapi_resp(struct connectdata *conn, + int pop3code, + pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct pop3_conn *pop3c = &conn->proto.pop3c; + size_t len = 0; + char *respmsg = NULL; + + (void)instate; /* no use for this yet */ + + if(pop3code != '+') { + failf(data, "Access denied: %d", pop3code); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the initial response message */ + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "pop", + pop3c->mutual_auth, + NULL, &conn->krb5, + &respmsg, &len); + if(!result && respmsg) { + /* Send the message */ + result = Curl_pp_sendf(&pop3c->pp, "%s", respmsg); + + if(!result) + state(conn, POP3_AUTH_GSSAPI_TOKEN); + } + } + + Curl_safefree(respmsg); + + return result; +} + +/* For AUTH GSSAPI user token responses */ +static CURLcode pop3_state_auth_gssapi_token_resp(struct connectdata *conn, + int pop3code, + pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct pop3_conn *pop3c = &conn->proto.pop3c; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(pop3code != '+') { + failf(data, "Access denied: %d", pop3code); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the challenge message */ + pop3_get_message(data->state.buffer, &chlgmsg); + + if(pop3c->mutual_auth) + /* Decode the user token challenge and create the optional response + message */ + result = Curl_sasl_create_gssapi_user_message(data, NULL, NULL, NULL, + pop3c->mutual_auth, + chlgmsg, &conn->krb5, + &respmsg, &len); + else + /* Decode the security challenge and create the response message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&pop3c->pp, "%s", "*"); + + if(!result) + state(conn, POP3_AUTH_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) + result = Curl_pp_sendf(&pop3c->pp, "%s", respmsg); + else + result = Curl_pp_sendf(&pop3c->pp, "%s", ""); + + if(!result) + state(conn, (pop3c->mutual_auth ? POP3_AUTH_GSSAPI_NO_DATA : + POP3_AUTH_FINAL)); + } + } + + Curl_safefree(respmsg); + + return result; +} + +/* For AUTH GSSAPI no data responses */ +static CURLcode pop3_state_auth_gssapi_no_data_resp(struct connectdata *conn, + int pop3code, + pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(pop3code != '+') { + failf(data, "Access denied: %d", pop3code); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the challenge message */ + pop3_get_message(data->state.buffer, &chlgmsg); + + /* Decode the security challenge and create the security message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "*"); + + if(!result) + state(conn, POP3_AUTH_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) { + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", respmsg); + + if(!result) + state(conn, POP3_AUTH_FINAL); + } + } + } + + Curl_safefree(respmsg); + + return result; +} +#endif + +/* For AUTH XOAUTH2 (without initial response) responses */ +static CURLcode pop3_state_auth_xoauth2_resp(struct connectdata *conn, + int pop3code, pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + size_t len = 0; + char *xoauth = NULL; + + (void)instate; /* no use for this yet */ + + if(pop3code != '+') { + failf(data, "Access denied: %d", pop3code); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the authorisation message */ + result = Curl_sasl_create_xoauth2_message(conn->data, conn->user, + conn->xoauth2_bearer, + &xoauth, &len); + if(!result && xoauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", xoauth); - Curl_safefree(type3msg); + if(!result) + state(conn, POP3_AUTH_FINAL); } } + Curl_safefree(xoauth); + return result; } + +/* For AUTH cancellation responses */ +static CURLcode pop3_state_auth_cancel_resp(struct connectdata *conn, + int pop3code, + pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct pop3_conn *pop3c = &conn->proto.pop3c; + const char *mech = NULL; + char *initresp = NULL; + size_t len = 0; + pop3state state1 = POP3_STOP; + pop3state state2 = POP3_STOP; + + (void)pop3code; + (void)instate; /* no use for this yet */ + + /* Remove the offending mechanism from the supported list */ + pop3c->authmechs ^= pop3c->authused; + + /* Calculate alternative SASL login details */ + result = pop3_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); + + if(!result) { + /* Do we have any mechanisms left or can we fallback to another + authentication type? */ + if(mech) { + /* Retry SASL based authentication */ + result = pop3_perform_auth(conn, mech, initresp, len, state1, state2); + + Curl_safefree(initresp); + } +#ifndef CURL_DISABLE_CRYPTO_AUTH + else if((pop3c->authtypes & POP3_TYPE_APOP) && + (pop3c->preftype & POP3_TYPE_APOP)) + /* Perform APOP authentication */ + result = pop3_perform_apop(conn); #endif + else if((pop3c->authtypes & POP3_TYPE_CLEARTEXT) && + (pop3c->preftype & POP3_TYPE_CLEARTEXT)) + /* Perform clear text authentication */ + result = pop3_perform_user(conn); + else { + failf(data, "Authentication cancelled"); + + result = CURLE_LOGIN_DENIED; + } + } -/* For final responses to the AUTH sequence */ + return result; +} + +/* For final responses in the AUTH sequence */ static CURLcode pop3_state_auth_final_resp(struct connectdata *conn, int pop3code, pop3state instate) @@ -1203,7 +1462,7 @@ static CURLcode pop3_state_command_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3 = data->req.protop; struct pop3_conn *pop3c = &conn->proto.pop3c; struct pingpong *pp = &pop3c->pp; @@ -1270,12 +1529,15 @@ static CURLcode pop3_statemach_act(struct connectdata *conn) if(pp->sendleft) return Curl_pp_flushsend(pp); - /* Read the response from the server */ - result = Curl_pp_readresp(sock, pp, &pop3code, &nread); - if(result) - return result; + do { + /* Read the response from the server */ + result = Curl_pp_readresp(sock, pp, &pop3code, &nread); + if(result) + return result; + + if(!pop3code) + break; - if(pop3code) { /* We have now received a full POP3 server response */ switch(pop3c->state) { case POP3_SERVERGREET: @@ -1328,6 +1590,29 @@ static CURLcode pop3_statemach_act(struct connectdata *conn) break; #endif +#if defined(USE_KERBEROS5) + case POP3_AUTH_GSSAPI: + result = pop3_state_auth_gssapi_resp(conn, pop3code, pop3c->state); + break; + + case POP3_AUTH_GSSAPI_TOKEN: + result = pop3_state_auth_gssapi_token_resp(conn, pop3code, pop3c->state); + break; + + case POP3_AUTH_GSSAPI_NO_DATA: + result = pop3_state_auth_gssapi_no_data_resp(conn, pop3code, + pop3c->state); + break; +#endif + + case POP3_AUTH_XOAUTH2: + result = pop3_state_auth_xoauth2_resp(conn, pop3code, pop3c->state); + break; + + case POP3_AUTH_CANCEL: + result = pop3_state_auth_cancel_resp(conn, pop3code, pop3c->state); + break; + case POP3_AUTH_FINAL: result = pop3_state_auth_final_resp(conn, pop3code, pop3c->state); break; @@ -1357,7 +1642,7 @@ static CURLcode pop3_statemach_act(struct connectdata *conn) state(conn, POP3_STOP); break; } - } + } while(!result && pop3c->state != POP3_STOP && Curl_pp_moredata(pp)); return result; } @@ -1368,11 +1653,13 @@ static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done) CURLcode result = CURLE_OK; struct pop3_conn *pop3c = &conn->proto.pop3c; - if((conn->handler->flags & PROTOPT_SSL) && !pop3c->ssldone) + if((conn->handler->flags & PROTOPT_SSL) && !pop3c->ssldone) { result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &pop3c->ssldone); - else - result = Curl_pp_statemach(&pop3c->pp, FALSE); + if(result || !pop3c->ssldone) + return result; + } + result = Curl_pp_statemach(&pop3c->pp, FALSE); *done = (pop3c->state == POP3_STOP) ? TRUE : FALSE; return result; @@ -1395,13 +1682,11 @@ static CURLcode pop3_init(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3; - if(!pop3) { - pop3 = data->state.proto.pop3 = calloc(sizeof(struct POP3), 1); - if(!pop3) - result = CURLE_OUT_OF_MEMORY; - } + pop3 = data->req.protop = calloc(sizeof(struct POP3), 1); + if(!pop3) + result = CURLE_OUT_OF_MEMORY; return result; } @@ -1431,17 +1716,8 @@ static CURLcode pop3_connect(struct connectdata *conn, bool *done) *done = FALSE; /* default to not done yet */ - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - /* Initialise the POP3 layer */ - result = pop3_init(conn); - if(result) - return result; - /* We always support persistent connections in POP3 */ - conn->bits.close = FALSE; + connkeep(conn, "POP3 default"); /* Set the default response time-out */ pp->response_time = RESP_TIMEOUT; @@ -1483,7 +1759,7 @@ static CURLcode pop3_done(struct connectdata *conn, CURLcode status, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3 = data->req.protop; (void)premature; @@ -1495,7 +1771,7 @@ static CURLcode pop3_done(struct connectdata *conn, CURLcode status, return CURLE_OK; if(status) { - conn->bits.close = TRUE; /* marked for closure */ + connclose(conn, "POP3 done with bad status"); result = status; /* use the already set error code */ } @@ -1521,12 +1797,12 @@ static CURLcode pop3_perform(struct connectdata *conn, bool *connected, { /* This is POP3 and no proxy */ CURLcode result = CURLE_OK; + struct POP3 *pop3 = conn->data->req.protop; DEBUGF(infof(conn->data, "DO phase starts\n")); if(conn->data->set.opt_no_body) { /* Requested no body means no transfer */ - struct POP3 *pop3 = conn->data->state.proto.pop3; pop3->transfer = FTPTRANSFER_INFO; } @@ -1563,15 +1839,6 @@ static CURLcode pop3_do(struct connectdata *conn, bool *done) *done = FALSE; /* default to false */ - /* Since connections can be re-used between SessionHandles, there might be a - connection already existing but on a fresh SessionHandle struct. As such - we make sure we have a good POP3 struct to play with. For new connections - the POP3 struct is allocated and setup in the pop3_connect() function. */ - Curl_reset_reqproto(conn); - result = pop3_init(conn); - if(result) - return result; - /* Parse the URL path */ result = pop3_parse_url_path(conn); if(result) @@ -1594,8 +1861,7 @@ static CURLcode pop3_do(struct connectdata *conn, bool *done) * Disconnect from an POP3 server. Cleanup protocol-specific per-connection * resources. BLOCKING. */ -static CURLcode pop3_disconnect(struct connectdata *conn, - bool dead_connection) +static CURLcode pop3_disconnect(struct connectdata *conn, bool dead_connection) { struct pop3_conn *pop3c = &conn->proto.pop3c; @@ -1605,7 +1871,7 @@ static CURLcode pop3_disconnect(struct connectdata *conn, /* The POP3 session may or may not have been allocated/setup at this point! */ - if(!dead_connection && pop3c->pp.conn) + if(!dead_connection && pop3c->pp.conn && pop3c->pp.conn->bits.protoconnstart) if(!pop3_perform_quit(conn)) (void)pop3_block_statemach(conn); /* ignore errors on QUIT */ @@ -1668,8 +1934,8 @@ static CURLcode pop3_regular_transfer(struct connectdata *conn, /* Set the progress data */ Curl_pgrsSetUploadCounter(data, 0); Curl_pgrsSetDownloadCounter(data, 0); - Curl_pgrsSetUploadSize(data, 0); - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetUploadSize(data, -1); + Curl_pgrsSetDownloadSize(data, -1); /* Carry out the perform */ result = pop3_perform(conn, &connected, dophase_done); @@ -1685,6 +1951,11 @@ static CURLcode pop3_setup_connection(struct connectdata *conn) { struct SessionHandle *data = conn->data; + /* Initialise the POP3 layer */ + CURLcode result = pop3_init(conn); + if(result) + return result; + if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) { /* Unless we have asked to tunnel POP3 operations through the proxy, we switch and use HTTP operations only */ @@ -1700,10 +1971,8 @@ static CURLcode pop3_setup_connection(struct connectdata *conn) #endif } - /* We explicitly mark this connection as persistent here as we're doing - POP3 over HTTP and thus we accidentally avoid setting this value - otherwise */ - conn->bits.close = FALSE; + /* set it up as an HTTP connection instead */ + return conn->handler->setup_connection(conn); #else failf(data, "POP3 over http proxy requires HTTP support built-in!"); return CURLE_UNSUPPORTED_PROTOCOL; @@ -1727,52 +1996,68 @@ static CURLcode pop3_parse_url_options(struct connectdata *conn) struct pop3_conn *pop3c = &conn->proto.pop3c; const char *options = conn->options; const char *ptr = options; + bool reset = TRUE; - if(options) { + while(ptr && *ptr) { const char *key = ptr; while(*ptr && *ptr != '=') ptr++; if(strnequal(key, "AUTH", 4)) { - const char *value = ptr + 1; + size_t len = 0; + const char *value = ++ptr; + + if(reset) { + reset = FALSE; + pop3c->preftype = POP3_TYPE_NONE; + pop3c->prefmech = SASL_AUTH_NONE; + } - if(strequal(value, "*")) { + while(*ptr && *ptr != ';') { + ptr++; + len++; + } + + if(strnequal(value, "*", len)) { pop3c->preftype = POP3_TYPE_ANY; pop3c->prefmech = SASL_AUTH_ANY; } - else if(strequal(value, "+APOP")) { + else if(strnequal(value, "+APOP", len)) { pop3c->preftype = POP3_TYPE_APOP; pop3c->prefmech = SASL_AUTH_NONE; } - else if(strequal(value, "LOGIN")) { + else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_LOGIN; + pop3c->prefmech |= SASL_MECH_LOGIN; } - else if(strequal(value, "PLAIN")) { + else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_PLAIN; + pop3c->prefmech |= SASL_MECH_PLAIN; } - else if(strequal(value, "CRAM-MD5")) { + else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_CRAM_MD5; + pop3c->prefmech |= SASL_MECH_CRAM_MD5; } - else if(strequal(value, "DIGEST-MD5")) { + else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_DIGEST_MD5; + pop3c->prefmech |= SASL_MECH_DIGEST_MD5; } - else if(strequal(value, "GSSAPI")) { + else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_GSSAPI; + pop3c->prefmech |= SASL_MECH_GSSAPI; } - else if(strequal(value, "NTLM")) { + else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) { pop3c->preftype = POP3_TYPE_SASL; - pop3c->prefmech = SASL_MECH_NTLM; + pop3c->prefmech |= SASL_MECH_NTLM; } - else { - pop3c->preftype = POP3_TYPE_NONE; - pop3c->prefmech = SASL_AUTH_NONE; + else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) { + pop3c->preftype = POP3_TYPE_SASL; + pop3c->prefmech |= SASL_MECH_XOAUTH2; } + + if(*ptr == ';') + ptr++; } else result = CURLE_URL_MALFORMAT; @@ -1791,7 +2076,7 @@ static CURLcode pop3_parse_url_path(struct connectdata *conn) { /* The POP3 struct is already initialised in pop3_connect() */ struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3 = data->req.protop; const char *path = data->state.path; /* URL decode the path for the message ID */ @@ -1808,7 +2093,7 @@ static CURLcode pop3_parse_custom_request(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct POP3 *pop3 = data->state.proto.pop3; + struct POP3 *pop3 = data->req.protop; const char *custom = data->set.str[STRING_CUSTOMREQUEST]; /* URL decode the custom request */ @@ -1820,6 +2105,110 @@ static CURLcode pop3_parse_custom_request(struct connectdata *conn) /*********************************************************************** * + * pop3_calc_sasl_details() + * + * Calculate the required login details for SASL authentication. + */ +static CURLcode pop3_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + pop3state *state1, pop3state *state2) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct pop3_conn *pop3c = &conn->proto.pop3c; + + /* Calculate the supported authentication mechanism, by decreasing order of + security, as well as the initial response where appropriate */ +#if defined(USE_KERBEROS5) + if((pop3c->authmechs & SASL_MECH_GSSAPI) && + (pop3c->prefmech & SASL_MECH_GSSAPI)) { + pop3c->mutual_auth = FALSE; /* TODO: Calculate mutual authentication */ + + *mech = SASL_MECH_STRING_GSSAPI; + *state1 = POP3_AUTH_GSSAPI; + *state2 = POP3_AUTH_GSSAPI_TOKEN; + pop3c->authused = SASL_MECH_GSSAPI; + + if(data->set.sasl_ir) + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "pop", + pop3c->mutual_auth, + NULL, &conn->krb5, + initresp, len); + } + else +#endif +#ifndef CURL_DISABLE_CRYPTO_AUTH + if((pop3c->authmechs & SASL_MECH_DIGEST_MD5) && + (pop3c->prefmech & SASL_MECH_DIGEST_MD5)) { + *mech = SASL_MECH_STRING_DIGEST_MD5; + *state1 = POP3_AUTH_DIGESTMD5; + pop3c->authused = SASL_MECH_DIGEST_MD5; + } + else if((pop3c->authmechs & SASL_MECH_CRAM_MD5) && + (pop3c->prefmech & SASL_MECH_CRAM_MD5)) { + *mech = SASL_MECH_STRING_CRAM_MD5; + *state1 = POP3_AUTH_CRAMMD5; + pop3c->authused = SASL_MECH_CRAM_MD5; + } + else +#endif +#ifdef USE_NTLM + if((pop3c->authmechs & SASL_MECH_NTLM) && + (pop3c->prefmech & SASL_MECH_NTLM)) { + *mech = SASL_MECH_STRING_NTLM; + *state1 = POP3_AUTH_NTLM; + *state2 = POP3_AUTH_NTLM_TYPE2MSG; + pop3c->authused = SASL_MECH_NTLM; + + if(data->set.sasl_ir) + result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, + &conn->ntlm, + initresp, len); + } + else +#endif + if(((pop3c->authmechs & SASL_MECH_XOAUTH2) && + (pop3c->prefmech & SASL_MECH_XOAUTH2) && + (pop3c->prefmech != SASL_AUTH_ANY)) || conn->xoauth2_bearer) { + *mech = SASL_MECH_STRING_XOAUTH2; + *state1 = POP3_AUTH_XOAUTH2; + *state2 = POP3_AUTH_FINAL; + pop3c->authused = SASL_MECH_XOAUTH2; + + if(data->set.sasl_ir) + result = Curl_sasl_create_xoauth2_message(data, conn->user, + conn->xoauth2_bearer, + initresp, len); + } + else if((pop3c->authmechs & SASL_MECH_LOGIN) && + (pop3c->prefmech & SASL_MECH_LOGIN)) { + *mech = SASL_MECH_STRING_LOGIN; + *state1 = POP3_AUTH_LOGIN; + *state2 = POP3_AUTH_LOGIN_PASSWD; + pop3c->authused = SASL_MECH_LOGIN; + + if(data->set.sasl_ir) + result = Curl_sasl_create_login_message(data, conn->user, initresp, len); + } + else if((pop3c->authmechs & SASL_MECH_PLAIN) && + (pop3c->prefmech & SASL_MECH_PLAIN)) { + *mech = SASL_MECH_STRING_PLAIN; + *state1 = POP3_AUTH_PLAIN; + *state2 = POP3_AUTH_FINAL; + pop3c->authused = SASL_MECH_PLAIN; + + if(data->set.sasl_ir) + result = Curl_sasl_create_plain_message(data, conn->user, conn->passwd, + initresp, len); + } + + return result; +} + +/*********************************************************************** + * * Curl_pop3_write() * * This function scans the body after the end-of-body and writes everything diff --git a/lib/pop3.h b/lib/pop3.h index 0186e04..729a55a 100644 --- a/lib/pop3.h +++ b/lib/pop3.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2009 - 2014, 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 @@ -43,6 +43,11 @@ typedef enum { POP3_AUTH_DIGESTMD5_RESP, POP3_AUTH_NTLM, POP3_AUTH_NTLM_TYPE2MSG, + POP3_AUTH_GSSAPI, + POP3_AUTH_GSSAPI_TOKEN, + POP3_AUTH_GSSAPI_NO_DATA, + POP3_AUTH_XOAUTH2, + POP3_AUTH_CANCEL, POP3_AUTH_FINAL, POP3_APOP, POP3_USER, @@ -79,6 +84,7 @@ struct pop3_conn { unsigned int authused; /* SASL auth mechanism used for the connection */ char *apoptimestamp; /* APOP timestamp from the server greeting */ bool tls_supported; /* StartTLS capability supported by server */ + bool mutual_auth; /* Mutual authentication enabled (GSSAPI only) */ }; extern const struct Curl_handler Curl_handler_pop3; @@ -91,7 +97,7 @@ extern const struct Curl_handler Curl_handler_pop3s; /* Authentication type values */ #define POP3_TYPE_NONE 0 -#define POP3_TYPE_ANY ~0 +#define POP3_TYPE_ANY ~0U /* This is the 5-bytes End-Of-Body marker for POP3 */ #define POP3_EOB "\x0d\x0a\x2e\x0d\x0a" diff --git a/lib/progress.c b/lib/progress.c index dac7f8d..f147ce7 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -42,8 +42,8 @@ static void time2str(char *r, curl_off_t seconds) if(h <= CURL_OFF_T_C(99)) { m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60); s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60)); - snprintf(r, 9, "%2" FORMAT_OFF_T ":%02" FORMAT_OFF_T ":%02" FORMAT_OFF_T, - h, m, s); + snprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T + ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s); } else { /* this equals to more than 99 hours, switch to a more suitable output @@ -51,9 +51,10 @@ static void time2str(char *r, curl_off_t seconds) d = seconds / CURL_OFF_T_C(86400); h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600); if(d <= CURL_OFF_T_C(999)) - snprintf(r, 9, "%3" FORMAT_OFF_T "d %02" FORMAT_OFF_T "h", d, h); + snprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T + "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h); else - snprintf(r, 9, "%7" FORMAT_OFF_T "d", d); + snprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d); } } @@ -69,40 +70,40 @@ static char *max5data(curl_off_t bytes, char *max5) #define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE) if(bytes < CURL_OFF_T_C(100000)) - snprintf(max5, 6, "%5" FORMAT_OFF_T, bytes); + snprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes); else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE) - snprintf(max5, 6, "%4" FORMAT_OFF_T "k", bytes/ONE_KILOBYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE); else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE) /* 'XX.XM' is good as long as we're less than 100 megs */ - snprintf(max5, 6, "%2" FORMAT_OFF_T ".%0" FORMAT_OFF_T "M", - bytes/ONE_MEGABYTE, + snprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0" + CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE, (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) ); #if (CURL_SIZEOF_CURL_OFF_T > 4) else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE) /* 'XXXXM' is good until we're at 10000MB or above */ - snprintf(max5, 6, "%4" FORMAT_OFF_T "M", bytes/ONE_MEGABYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE); else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE) /* 10000 MB - 100 GB, we show it as XX.XG */ - snprintf(max5, 6, "%2" FORMAT_OFF_T ".%0" FORMAT_OFF_T "G", - bytes/ONE_GIGABYTE, + snprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0" + CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE, (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) ); else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE) /* up to 10000GB, display without decimal: XXXXG */ - snprintf(max5, 6, "%4" FORMAT_OFF_T "G", bytes/ONE_GIGABYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE); else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE) /* up to 10000TB, display without decimal: XXXXT */ - snprintf(max5, 6, "%4" FORMAT_OFF_T "T", bytes/ONE_TERABYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE); else /* up to 10000PB, display without decimal: XXXXP */ - snprintf(max5, 6, "%4" FORMAT_OFF_T "P", bytes/ONE_PETABYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE); /* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number can hold, but our data type is signed so 8192PB will be the maximum. */ @@ -110,7 +111,7 @@ static char *max5data(curl_off_t bytes, char *max5) #else else - snprintf(max5, 6, "%4" FORMAT_OFF_T "M", bytes/ONE_MEGABYTE); + snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE); #endif @@ -158,8 +159,8 @@ void Curl_pgrsResetTimesSizes(struct SessionHandle *data) data->progress.t_pretransfer = 0.0; data->progress.t_starttransfer = 0.0; - Curl_pgrsSetDownloadSize(data, 0); - Curl_pgrsSetUploadSize(data, 0); + Curl_pgrsSetDownloadSize(data, -1); + Curl_pgrsSetUploadSize(data, -1); } void Curl_pgrsTime(struct SessionHandle *data, timerid timer) @@ -171,8 +172,12 @@ void Curl_pgrsTime(struct SessionHandle *data, timerid timer) case TIMER_NONE: /* mistake filter */ break; + case TIMER_STARTOP: + /* This is set at the start of a transfer */ + data->progress.t_startop = now; + break; case TIMER_STARTSINGLE: - /* This is set at the start of a single fetch */ + /* This is set at the start of each single fetch */ data->progress.t_startsingle = now; break; @@ -229,20 +234,26 @@ void Curl_pgrsSetUploadCounter(struct SessionHandle *data, curl_off_t size) void Curl_pgrsSetDownloadSize(struct SessionHandle *data, curl_off_t size) { - data->progress.size_dl = size; - if(size >= 0) + if(size >= 0) { + data->progress.size_dl = size; data->progress.flags |= PGRS_DL_SIZE_KNOWN; - else + } + else { + data->progress.size_dl = 0; data->progress.flags &= ~PGRS_DL_SIZE_KNOWN; + } } void Curl_pgrsSetUploadSize(struct SessionHandle *data, curl_off_t size) { - data->progress.size_ul = size; - if(size >= 0) + if(size >= 0) { + data->progress.size_ul = size; data->progress.flags |= PGRS_UL_SIZE_KNOWN; - else + } + else { + data->progress.size_ul = 0; data->progress.flags &= ~PGRS_UL_SIZE_KNOWN; + } } /* @@ -392,8 +403,8 @@ int Curl_pgrsUpdate(struct connectdata *conn) if(!(data->progress.flags & PGRS_HEADERS_OUT)) { if(data->state.resume_from) { fprintf(data->set.err, - "** Resuming transfer from byte position %" FORMAT_OFF_T "\n", - data->state.resume_from); + "** Resuming transfer from byte position %" + CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from); } fprintf(data->set.err, " %% Total %% Received %% Xferd Average Speed " @@ -457,9 +468,9 @@ int Curl_pgrsUpdate(struct connectdata *conn) fprintf(data->set.err, "\r" - "%3" FORMAT_OFF_T " %s " - "%3" FORMAT_OFF_T " %s " - "%3" FORMAT_OFF_T " %s %s %s %s %s %s %s", + "%3" CURL_FORMAT_CURL_OFF_T " %s " + "%3" CURL_FORMAT_CURL_OFF_T " %s " + "%3" CURL_FORMAT_CURL_OFF_T " %s %s %s %s %s %s %s", total_percen, /* 3 letters */ /* total % */ max5data(total_expected_transfer, max5[2]), /* total size */ dlpercen, /* 3 letters */ /* rcvd % */ diff --git a/lib/progress.h b/lib/progress.h index f97fef9..a1e6f1a 100644 --- a/lib/progress.h +++ b/lib/progress.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -27,13 +27,14 @@ typedef enum { TIMER_NONE, + TIMER_STARTOP, + TIMER_STARTSINGLE, TIMER_NAMELOOKUP, TIMER_CONNECT, TIMER_APPCONNECT, TIMER_PRETRANSFER, TIMER_STARTTRANSFER, TIMER_POSTRANSFER, - TIMER_STARTSINGLE, TIMER_STARTACCEPT, TIMER_REDIRECT, TIMER_LAST /* must be last */ diff --git a/lib/qssl.c b/lib/qssl.c deleted file mode 100644 index b8a8dae..0000000 --- a/lib/qssl.c +++ /dev/null @@ -1,521 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2013, 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 http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#include "curl_setup.h" - -#ifdef USE_QSOSSL - -#include - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include -#include "urldata.h" -#include "sendf.h" -#include "qssl.h" -#include "sslgen.h" -#include "connect.h" /* for the connect timeout */ -#include "select.h" -#include "x509asn1.h" -#include "curl_memory.h" -/* The last #include file should be: */ -#include "memdebug.h" - - -int Curl_qsossl_init(void) - -{ - /* Nothing to do here. We must have connection data to initialize ssl, so - * defer. - */ - - return 1; -} - - -void Curl_qsossl_cleanup(void) - -{ - /* Nothing to do. */ -} - - -static CURLcode Curl_qsossl_init_session(struct SessionHandle * data) - -{ - int rc; - char * certname; - SSLInit initstr; - SSLInitApp initappstr; - - /* Initialize the job for SSL according to the current parameters. - * QsoSSL offers two ways to do it: SSL_Init_Application() that uses an - * application identifier to select certificates in the main certificate - * store, and SSL_Init() that uses named keyring files and a password. - * It is not possible to have different keyrings for the CAs and the - * local certificate. We thus use the certificate name to identify the - * keyring if given, else the CA file name. - * If the key file name is given, it is taken as the password for the - * keyring in certificate file. - * We first try to SSL_Init_Application(), then SSL_Init() if it failed. - */ - - certname = data->set.str[STRING_CERT]; - - if(!certname) { - certname = data->set.str[STRING_SSL_CAFILE]; - - if(!certname) - return CURLE_OK; /* Use previous setup. */ - } - - memset((char *) &initappstr, 0, sizeof initappstr); - initappstr.applicationID = certname; - initappstr.applicationIDLen = strlen(certname); - initappstr.protocol = SSL_VERSION_CURRENT; /* TLSV1 compat. SSLV[23]. */ - initappstr.sessionType = SSL_REGISTERED_AS_CLIENT; - rc = SSL_Init_Application(&initappstr); - - if(rc == SSL_ERROR_NOT_REGISTERED) { - initstr.keyringFileName = certname; - initstr.keyringPassword = data->set.str[STRING_KEY]; - initstr.cipherSuiteList = NULL; /* Use default. */ - initstr.cipherSuiteListLen = 0; - rc = SSL_Init(&initstr); - } - - switch (rc) { - - case 0: /* No error. */ - break; - - case SSL_ERROR_IO: - failf(data, "SSL_Init() I/O error: %s", strerror(errno)); - return CURLE_SSL_CONNECT_ERROR; - - case SSL_ERROR_BAD_CIPHER_SUITE: - return CURLE_SSL_CIPHER; - - case SSL_ERROR_KEYPASSWORD_EXPIRED: - case SSL_ERROR_NOT_REGISTERED: - return CURLE_SSL_CONNECT_ERROR; - - case SSL_ERROR_NO_KEYRING: - return CURLE_SSL_CACERT; - - case SSL_ERROR_CERT_EXPIRED: - return CURLE_SSL_CERTPROBLEM; - - default: - failf(data, "SSL_Init(): %s", SSL_Strerror(rc, NULL)); - return CURLE_SSL_CONNECT_ERROR; - } - - return CURLE_OK; -} - - -static CURLcode Curl_qsossl_create(struct connectdata * conn, int sockindex) - -{ - SSLHandle * h; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - - h = SSL_Create(conn->sock[sockindex], SSL_ENCRYPT); - - if(!h) { - failf(conn->data, "SSL_Create() I/O error: %s", strerror(errno)); - return CURLE_SSL_CONNECT_ERROR; - } - - connssl->handle = h; - return CURLE_OK; -} - - -static int Curl_qsossl_trap_cert(SSLHandle * h) - -{ - return 1; /* Accept certificate. */ -} - - -static CURLcode Curl_qsossl_handshake(struct connectdata * conn, int sockindex) - -{ - int rc; - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - SSLHandle * h = connssl->handle; - long timeout_ms; - - h->exitPgm = data->set.ssl.verifypeer? NULL: Curl_qsossl_trap_cert; - - /* figure out how long time we should wait at maximum */ - timeout_ms = Curl_timeleft(data, NULL, TRUE); - - if(timeout_ms < 0) { - /* time-out, bail out, go home */ - failf(data, "Connection time-out"); - return CURLE_OPERATION_TIMEDOUT; - } - - /* SSL_Handshake() timeout resolution is second, so round up. */ - h->timeout = (timeout_ms + 1000 - 1) / 1000; - - /* Set-up protocol. */ - - switch (data->set.ssl.version) { - - default: - case CURL_SSLVERSION_DEFAULT: - h->protocol = SSL_VERSION_CURRENT; /* TLSV1 compat. SSLV[23]. */ - break; - - case CURL_SSLVERSION_TLSv1: - h->protocol = TLS_VERSION_1; - break; - - case CURL_SSLVERSION_SSLv2: - h->protocol = SSL_VERSION_2; - break; - - case CURL_SSLVERSION_SSLv3: - h->protocol = SSL_VERSION_3; - break; - } - - h->peerCert = NULL; - h->peerCertLen = 0; - rc = SSL_Handshake(h, SSL_HANDSHAKE_AS_CLIENT); - - switch (rc) { - - case 0: /* No error. */ - break; - - case SSL_ERROR_BAD_CERTIFICATE: - case SSL_ERROR_BAD_CERT_SIG: - case SSL_ERROR_NOT_TRUSTED_ROOT: - return CURLE_PEER_FAILED_VERIFICATION; - - case SSL_ERROR_BAD_CIPHER_SUITE: - case SSL_ERROR_NO_CIPHERS: - return CURLE_SSL_CIPHER; - - case SSL_ERROR_CERTIFICATE_REJECTED: - case SSL_ERROR_CERT_EXPIRED: - case SSL_ERROR_NO_CERTIFICATE: - return CURLE_SSL_CERTPROBLEM; - - case SSL_ERROR_IO: - failf(data, "SSL_Handshake() I/O error: %s", strerror(errno)); - return CURLE_SSL_CONNECT_ERROR; - - default: - failf(data, "SSL_Handshake(): %s", SSL_Strerror(rc, NULL)); - return CURLE_SSL_CONNECT_ERROR; - } - - /* Verify host. */ - rc = Curl_verifyhost(conn, h->peerCert, h->peerCert + h->peerCertLen); - if(rc != CURLE_OK) - return rc; - - /* Gather certificate info. */ - if(data->set.ssl.certinfo) { - if(Curl_ssl_init_certinfo(data, 1)) - return CURLE_OUT_OF_MEMORY; - if(h->peerCert) { - rc = Curl_extract_certinfo(conn, 0, h->peerCert, - h->peerCert + h->peerCertLen); - if(rc != CURLE_OK) - return rc; - } - } - - return CURLE_OK; -} - - -static Curl_recv qsossl_recv; -static Curl_send qsossl_send; - -CURLcode Curl_qsossl_connect(struct connectdata * conn, int sockindex) - -{ - struct SessionHandle * data = conn->data; - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - int rc; - - rc = Curl_qsossl_init_session(data); - - if(rc == CURLE_OK) { - rc = Curl_qsossl_create(conn, sockindex); - - if(rc == CURLE_OK) { - rc = Curl_qsossl_handshake(conn, sockindex); - if(rc != CURLE_OK) - SSL_Destroy(connssl->handle); - } - } - - if(rc == CURLE_OK) { - conn->recv[sockindex] = qsossl_recv; - conn->send[sockindex] = qsossl_send; - connssl->state = ssl_connection_complete; - } - else { - connssl->handle = NULL; - connssl->use = FALSE; - connssl->state = ssl_connection_none; - } - - return rc; -} - - -static int Curl_qsossl_close_one(struct ssl_connect_data * conn, - struct SessionHandle * data) - -{ - int rc; - - if(!conn->handle) - return 0; - - rc = SSL_Destroy(conn->handle); - - if(rc) { - if(rc == SSL_ERROR_IO) { - failf(data, "SSL_Destroy() I/O error: %s", strerror(errno)); - return -1; - } - - /* An SSL error. */ - failf(data, "SSL_Destroy() returned error %s", SSL_Strerror(rc, NULL)); - return -1; - } - - conn->handle = NULL; - return 0; -} - - -void Curl_qsossl_close(struct connectdata *conn, int sockindex) - -{ - struct SessionHandle *data = conn->data; - struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - - if(connssl->use) - (void) Curl_qsossl_close_one(connssl, data); -} - - -int Curl_qsossl_close_all(struct SessionHandle * data) - -{ - /* Unimplemented. */ - (void) data; - return 0; -} - - -int Curl_qsossl_shutdown(struct connectdata * conn, int sockindex) - -{ - struct ssl_connect_data * connssl = &conn->ssl[sockindex]; - struct SessionHandle *data = conn->data; - ssize_t nread; - int what; - int rc; - char buf[120]; - - if(!connssl->handle) - return 0; - - if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE) - return 0; - - if(Curl_qsossl_close_one(connssl, data)) - return -1; - - rc = 0; - - what = Curl_socket_ready(conn->sock[sockindex], - CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT); - - for(;;) { - if(what < 0) { - /* anything that gets here is fatally bad */ - failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO); - rc = -1; - break; - } - - if(!what) { /* timeout */ - failf(data, "SSL shutdown timeout"); - break; - } - - /* Something to read, let's do it and hope that it is the close - notify alert from the server. No way to SSL_Read now, so use read(). */ - - nread = read(conn->sock[sockindex], buf, sizeof(buf)); - - if(nread < 0) { - failf(data, "read: %s", strerror(errno)); - rc = -1; - } - - if(nread <= 0) - break; - - what = Curl_socket_ready(conn->sock[sockindex], CURL_SOCKET_BAD, 0); - } - - return rc; -} - - -static ssize_t qsossl_send(struct connectdata * conn, int sockindex, - const void * mem, size_t len, CURLcode * curlcode) - -{ - /* SSL_Write() is said to return 'int' while write() and send() returns - 'size_t' */ - int rc; - - rc = SSL_Write(conn->ssl[sockindex].handle, (void *) mem, (int) len); - - if(rc < 0) { - switch(rc) { - - case SSL_ERROR_BAD_STATE: - /* The operation did not complete; the same SSL I/O function - should be called again later. This is basically an EWOULDBLOCK - equivalent. */ - *curlcode = CURLE_AGAIN; - return -1; - - case SSL_ERROR_IO: - switch (errno) { - case EWOULDBLOCK: - case EINTR: - *curlcode = CURLE_AGAIN; - return -1; - } - - failf(conn->data, "SSL_Write() I/O error: %s", strerror(errno)); - *curlcode = CURLE_SEND_ERROR; - return -1; - } - - /* An SSL error. */ - failf(conn->data, "SSL_Write() returned error %s", - SSL_Strerror(rc, NULL)); - *curlcode = CURLE_SEND_ERROR; - return -1; - } - - return (ssize_t) rc; /* number of bytes */ -} - - -static ssize_t qsossl_recv(struct connectdata * conn, int num, char * buf, - size_t buffersize, CURLcode * curlcode) - -{ - char error_buffer[120]; /* OpenSSL documents that this must be at - least 120 bytes long. */ - unsigned long sslerror; - int buffsize; - int nread; - - buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize; - nread = SSL_Read(conn->ssl[num].handle, buf, buffsize); - - if(nread < 0) { - /* failed SSL_read */ - - switch (nread) { - - case SSL_ERROR_BAD_STATE: - /* there's data pending, re-invoke SSL_Read(). */ - *curlcode = CURLE_AGAIN; - return -1; - - case SSL_ERROR_IO: - switch (errno) { - case EWOULDBLOCK: - *curlcode = CURLE_AGAIN; - return -1; - } - - failf(conn->data, "SSL_Read() I/O error: %s", strerror(errno)); - *curlcode = CURLE_RECV_ERROR; - return -1; - - default: - failf(conn->data, "SSL read error: %s", SSL_Strerror(nread, NULL)); - *curlcode = CURLE_RECV_ERROR; - return -1; - } - } - return (ssize_t) nread; -} - - -size_t Curl_qsossl_version(char * buffer, size_t size) - -{ - strncpy(buffer, "IBM OS/400 SSL", size); - return strlen(buffer); -} - - -int Curl_qsossl_check_cxn(struct connectdata * cxn) - -{ - int err; - int errlen; - - /* The only thing that can be tested here is at the socket level. */ - - if(!cxn->ssl[FIRSTSOCKET].handle) - return 0; /* connection has been closed */ - - err = 0; - errlen = sizeof err; - - if(getsockopt(cxn->sock[FIRSTSOCKET], SOL_SOCKET, SO_ERROR, - (unsigned char *) &err, &errlen) || - errlen != sizeof err || err) - return 0; /* connection has been closed */ - - return -1; /* connection status unknown */ -} - -#endif /* USE_QSOSSL */ diff --git a/lib/qssl.h b/lib/qssl.h deleted file mode 100644 index 1fb47b8..0000000 --- a/lib/qssl.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef HEADER_CURL_QSSL_H -#define HEADER_CURL_QSSL_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2011, 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 http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ -#include "curl_setup.h" - -/* - * This header should only be needed to get included by sslgen.c and qssl.c - */ - -#include "urldata.h" - -#ifdef USE_QSOSSL -int Curl_qsossl_init(void); -void Curl_qsossl_cleanup(void); -CURLcode Curl_qsossl_connect(struct connectdata * conn, int sockindex); -void Curl_qsossl_close(struct connectdata *conn, int sockindex); -int Curl_qsossl_close_all(struct SessionHandle * data); -int Curl_qsossl_shutdown(struct connectdata * conn, int sockindex); - -size_t Curl_qsossl_version(char * buffer, size_t size); -int Curl_qsossl_check_cxn(struct connectdata * cxn); - -/* API setup for QsoSSL */ -#define curlssl_init Curl_qsossl_init -#define curlssl_cleanup Curl_qsossl_cleanup -#define curlssl_connect Curl_qsossl_connect - -/* No session handling for QsoSSL */ -#define curlssl_session_free(x) Curl_nop_stmt -#define curlssl_close_all Curl_qsossl_close_all -#define curlssl_close Curl_qsossl_close -#define curlssl_shutdown(x,y) Curl_qsossl_shutdown(x,y) -#define curlssl_set_engine(x,y) CURLE_NOT_BUILT_IN -#define curlssl_set_engine_default(x) CURLE_NOT_BUILT_IN -#define curlssl_engines_list(x) NULL -#define curlssl_version Curl_qsossl_version -#define curlssl_check_cxn(x) Curl_qsossl_check_cxn(x) -#define curlssl_data_pending(x,y) 0 -#endif /* USE_QSOSSL */ - -#endif /* HEADER_CURL_QSSL_H */ diff --git a/lib/rtsp.c b/lib/rtsp.c index 3dc1490..029738d 100644 --- a/lib/rtsp.c +++ b/lib/rtsp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -81,6 +81,8 @@ static CURLcode rtsp_rtp_readwrite(struct SessionHandle *data, ssize_t *nread, bool *readmore); +static CURLcode rtsp_setup_connection(struct connectdata *conn); + /* this returns the socket to wait for in the DO and DOING state for the multi interface and then we're always _sending_ a request and thus we wait for @@ -104,7 +106,7 @@ CURLcode rtp_client_write(struct connectdata *conn, char *ptr, size_t len); */ const struct Curl_handler Curl_handler_rtsp = { "RTSP", /* scheme */ - ZERO_NULL, /* setup_connection */ + rtsp_setup_connection, /* setup_connection */ rtsp_do, /* do_it */ rtsp_done, /* done */ ZERO_NULL, /* do_more */ @@ -122,6 +124,19 @@ const struct Curl_handler Curl_handler_rtsp = { PROTOPT_NONE /* flags */ }; + +static CURLcode rtsp_setup_connection(struct connectdata *conn) +{ + struct RTSP *rtsp; + + conn->data->req.protop = rtsp = calloc(1, sizeof(struct RTSP)); + if(!rtsp) + return CURLE_OUT_OF_MEMORY; + + return CURLE_OK; +} + + /* * The server may send us RTP data at any point, and RTSPREQ_RECEIVE does not * want to block the application forever while receiving a stream. Therefore, @@ -185,7 +200,7 @@ static CURLcode rtsp_done(struct connectdata *conn, CURLcode status, bool premature) { struct SessionHandle *data = conn->data; - struct RTSP *rtsp = data->state.proto.rtsp; + struct RTSP *rtsp = data->req.protop; CURLcode httpStatus; long CSeq_sent; long CSeq_recv; @@ -221,7 +236,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) struct SessionHandle *data = conn->data; CURLcode result=CURLE_OK; Curl_RtspReq rtspreq = data->set.rtspreq; - struct RTSP *rtsp; + struct RTSP *rtsp = data->req.protop; struct HTTP *http; Curl_send_buffer *req_buffer; curl_off_t postsize = 0; /* for ANNOUNCE and SET_PARAMETER */ @@ -239,20 +254,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) *done = TRUE; - Curl_reset_reqproto(conn); - - if(!data->state.proto.rtsp) { - /* Only allocate this struct if we don't already have it! */ - - rtsp = calloc(1, sizeof(struct RTSP)); - if(!rtsp) - return CURLE_OUT_OF_MEMORY; - data->state.proto.rtsp = rtsp; - } - else { - rtsp = data->state.proto.rtsp; - } - http = &(rtsp->http_wrapper); /* Assert that no one has changed the RTSP struct in an evil way */ DEBUGASSERT((void *)http == (void *)rtsp); @@ -340,7 +341,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) } /* Transport Header for SETUP requests */ - p_transport = Curl_checkheaders(data, "Transport:"); + p_transport = Curl_checkheaders(conn, "Transport:"); if(rtspreq == RTSPREQ_SETUP && !p_transport) { /* New Transport: setting? */ if(data->set.str[STRING_RTSP_TRANSPORT]) { @@ -364,11 +365,11 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) /* Accept Headers for DESCRIBE requests */ if(rtspreq == RTSPREQ_DESCRIBE) { /* Accept Header */ - p_accept = Curl_checkheaders(data, "Accept:")? + p_accept = Curl_checkheaders(conn, "Accept:")? NULL:"Accept: application/sdp\r\n"; /* Accept-Encoding header */ - if(!Curl_checkheaders(data, "Accept-Encoding:") && + if(!Curl_checkheaders(conn, "Accept-Encoding:") && data->set.str[STRING_ENCODING]) { Curl_safefree(conn->allocptr.accept_encoding); conn->allocptr.accept_encoding = @@ -385,18 +386,18 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) it might have been used in the proxy connect, but if we have got a header with the user-agent string specified, we erase the previously made string here. */ - if(Curl_checkheaders(data, "User-Agent:") && conn->allocptr.uagent) { + if(Curl_checkheaders(conn, "User-Agent:") && conn->allocptr.uagent) { Curl_safefree(conn->allocptr.uagent); conn->allocptr.uagent = NULL; } - else if(!Curl_checkheaders(data, "User-Agent:") && + else if(!Curl_checkheaders(conn, "User-Agent:") && data->set.str[STRING_USERAGENT]) { p_uagent = conn->allocptr.uagent; } /* Referrer */ Curl_safefree(conn->allocptr.ref); - if(data->change.referer && !Curl_checkheaders(data, "Referer:")) + if(data->change.referer && !Curl_checkheaders(conn, "Referer:")) conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer); else conn->allocptr.ref = NULL; @@ -413,7 +414,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) (rtspreq & (RTSPREQ_PLAY | RTSPREQ_PAUSE | RTSPREQ_RECORD))) { /* Check to see if there is a range set in the custom headers */ - if(!Curl_checkheaders(data, "Range:") && data->state.range) { + if(!Curl_checkheaders(conn, "Range:") && data->state.range) { Curl_safefree(conn->allocptr.rangeline); conn->allocptr.rangeline = aprintf("Range: %s\r\n", data->state.range); p_range = conn->allocptr.rangeline; @@ -423,11 +424,11 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) /* * Sanity check the custom headers */ - if(Curl_checkheaders(data, "CSeq:")) { + if(Curl_checkheaders(conn, "CSeq:")) { failf(data, "CSeq cannot be set as a custom header."); return CURLE_RTSP_CSEQ_ERROR; } - if(Curl_checkheaders(data, "Session:")) { + if(Curl_checkheaders(conn, "Session:")) { failf(data, "Session ID cannot be set as a custom header."); return CURLE_BAD_FUNCTION_ARGUMENT; } @@ -483,7 +484,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) return result; } - result = Curl_add_custom_headers(conn, req_buffer); + result = Curl_add_custom_headers(conn, FALSE, req_buffer); if(result) return result; @@ -492,7 +493,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) rtspreq == RTSPREQ_GET_PARAMETER) { if(data->set.upload) { - putsize = data->set.infilesize; + putsize = data->state.infilesize; data->set.httpreq = HTTPREQ_PUT; } @@ -506,9 +507,9 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) if(putsize > 0 || postsize > 0) { /* As stated in the http comments, it is probably not wise to * actually set a custom Content-Length in the headers */ - if(!Curl_checkheaders(data, "Content-Length:")) { + if(!Curl_checkheaders(conn, "Content-Length:")) { result = Curl_add_bufferf(req_buffer, - "Content-Length: %" FORMAT_OFF_T"\r\n", + "Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n", (data->set.upload ? putsize : postsize)); if(result) return result; @@ -516,7 +517,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) if(rtspreq == RTSPREQ_SET_PARAMETER || rtspreq == RTSPREQ_GET_PARAMETER) { - if(!Curl_checkheaders(data, "Content-Type:")) { + if(!Curl_checkheaders(conn, "Content-Type:")) { result = Curl_add_bufferf(req_buffer, "Content-Type: text/parameters\r\n"); if(result) @@ -525,7 +526,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done) } if(rtspreq == RTSPREQ_ANNOUNCE) { - if(!Curl_checkheaders(data, "Content-Type:")) { + if(!Curl_checkheaders(conn, "Content-Type:")) { result = Curl_add_bufferf(req_buffer, "Content-Type: application/sdp\r\n"); if(result) @@ -749,7 +750,8 @@ CURLcode Curl_rtsp_parseheader(struct connectdata *conn, /* Store the received CSeq. Match is verified in rtsp_done */ int nc = sscanf(&header[4], ": %ld", &CSeq); if(nc == 1) { - data->state.proto.rtsp->CSeq_recv = CSeq; /* mark the request */ + struct RTSP *rtsp = data->req.protop; + rtsp->CSeq_recv = CSeq; /* mark the request */ data->state.rtsp_CSeq_recv = CSeq; /* update the handle */ } else { @@ -761,7 +763,7 @@ CURLcode Curl_rtsp_parseheader(struct connectdata *conn, char *start; /* Find the first non-space letter */ - start = header + 9; + start = header + 8; while(*start && ISSPACE(*start)) start++; diff --git a/lib/security.c b/lib/security.c index 495a496..607048c 100644 --- a/lib/security.c +++ b/lib/security.c @@ -7,10 +7,10 @@ * rewrite to work around the paragraph 2 in the BSD licenses as explained * below. * - * Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1998, 1999, 2013 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * - * Copyright (C) 2001 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2001 - 2014, Daniel Stenberg, , et al. * * All rights reserved. * @@ -44,7 +44,7 @@ #include "curl_setup.h" #ifndef CURL_DISABLE_FTP -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI #ifdef HAVE_NETDB_H #include @@ -57,7 +57,7 @@ #include "urldata.h" #include "curl_base64.h" #include "curl_memory.h" -#include "krb4.h" +#include "curl_sec.h" #include "ftp.h" #include "sendf.h" #include "rawstr.h" @@ -110,12 +110,9 @@ static char level_to_char(int level) { } static const struct Curl_sec_client_mech * const mechs[] = { -#if defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI &Curl_krb5_client_mech, #endif -#if defined(HAVE_KRB4) - &Curl_krb4_client_mech, -#endif NULL }; @@ -132,11 +129,11 @@ static int ftp_send_command(struct connectdata *conn, const char *message, ...) vsnprintf(print_buffer, sizeof(print_buffer), message, args); va_end(args); - if(Curl_ftpsendf(conn, print_buffer) != CURLE_OK) { + if(Curl_ftpsendf(conn, print_buffer)) { ftp_code = -1; } else { - if(Curl_GetFTPResponse(&nread, conn, &ftp_code) != CURLE_OK) + if(Curl_GetFTPResponse(&nread, conn, &ftp_code)) ftp_code = -1; } @@ -150,20 +147,20 @@ static CURLcode socket_read(curl_socket_t fd, void *to, size_t len) { char *to_p = to; - CURLcode code; + CURLcode result; ssize_t nread; while(len > 0) { - code = Curl_read_plain(fd, to_p, len, &nread); - if(code == CURLE_OK) { + result = Curl_read_plain(fd, to_p, len, &nread); + if(!result) { len -= nread; to_p += nread; } else { /* FIXME: We are doing a busy wait */ - if(code == CURLE_AGAIN) + if(result == CURLE_AGAIN) continue; - return code; + return result; } } return CURLE_OK; @@ -178,20 +175,20 @@ socket_write(struct connectdata *conn, curl_socket_t fd, const void *to, size_t len) { const char *to_p = to; - CURLcode code; + CURLcode result; ssize_t written; while(len > 0) { - code = Curl_write_plain(conn, fd, to_p, len, &written); - if(code == CURLE_OK) { + result = Curl_write_plain(conn, fd, to_p, len, &written); + if(!result) { len -= written; to_p += written; } else { /* FIXME: We are doing a busy wait */ - if(code == CURLE_AGAIN) + if(result == CURLE_AGAIN) continue; - return code; + return result; } } return CURLE_OK; @@ -199,15 +196,15 @@ socket_write(struct connectdata *conn, curl_socket_t fd, const void *to, static CURLcode read_data(struct connectdata *conn, curl_socket_t fd, - struct krb4buffer *buf) + struct krb5buffer *buf) { int len; void* tmp; - CURLcode ret; + CURLcode result; - ret = socket_read(fd, &len, sizeof(len)); - if(ret != CURLE_OK) - return ret; + result = socket_read(fd, &len, sizeof(len)); + if(result) + return result; len = ntohl(len); tmp = realloc(buf->data, len); @@ -215,9 +212,9 @@ static CURLcode read_data(struct connectdata *conn, return CURLE_OUT_OF_MEMORY; buf->data = tmp; - ret = socket_read(fd, buf->data, len); - if(ret != CURLE_OK) - return ret; + result = socket_read(fd, buf->data, len); + if(result) + return result; buf->size = conn->mech->decode(conn->app_data, buf->data, len, conn->data_prot, conn); buf->index = 0; @@ -225,7 +222,7 @@ static CURLcode read_data(struct connectdata *conn, } static size_t -buffer_read(struct krb4buffer *buf, void *data, size_t len) +buffer_read(struct krb5buffer *buf, void *data, size_t len) { if(buf->size - buf->index < len) len = buf->size - buf->index; @@ -259,7 +256,7 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex, buffer += bytes_read; while(len > 0) { - if(read_data(conn, fd, &conn->in_buffer) != CURLE_OK) + if(read_data(conn, fd, &conn->in_buffer)) return -1; if(conn->in_buffer.size == 0) { if(bytes_read > 0) @@ -298,7 +295,7 @@ static void do_sec_send(struct connectdata *conn, curl_socket_t fd, prot_level = conn->command_prot; } bytes = conn->mech->encode(conn->app_data, from, length, prot_level, - (void**)&buffer, conn); + (void**)&buffer); if(!buffer || bytes <= 0) return; /* error */ @@ -335,7 +332,6 @@ static void do_sec_send(struct connectdata *conn, curl_socket_t fd, static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd, const char *buffer, size_t length) { - /* FIXME: Check for overflow */ ssize_t tx = 0, len = conn->buffer_size; len -= conn->mech->overhead(conn->app_data, conn->data_prot, @@ -343,10 +339,9 @@ static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd, if(len <= 0) len = length; while(length) { - if(len >= 0 || length < (size_t)len) { - /* FIXME: Check for overflow. */ + if(length < (size_t)len) len = length; - } + do_sec_send(conn, fd, buffer, curlx_sztosi(len)); length -= len; buffer += len; @@ -405,7 +400,7 @@ int Curl_sec_read_msg(struct connectdata *conn, char *buffer, ret_code = 0; else { /* Check for error? */ - sscanf(buf, "%d", &ret_code); + (void)sscanf(buf, "%d", &ret_code); } if(buf[decoded_len - 1] == '\n') @@ -567,7 +562,7 @@ static CURLcode choose_mech(struct connectdata *conn) break; } - return mech != NULL ? CURLE_OK : CURLE_FAILED_INIT; + return *mech != NULL ? CURLE_OK : CURLE_FAILED_INIT; } CURLcode @@ -599,6 +594,6 @@ Curl_sec_end(struct connectdata *conn) conn->mech = NULL; } -#endif /* HAVE_KRB4 || HAVE_GSSAPI */ +#endif /* HAVE_GSSAPI */ #endif /* CURL_DISABLE_FTP */ diff --git a/lib/select.c b/lib/select.c index db7fb6d..1c6481c 100644 --- a/lib/select.c +++ b/lib/select.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -39,6 +39,10 @@ #include /* delay() */ #endif +#ifdef __VXWORKS__ +#include /* bzero() in FD_SET */ +#endif + #include #include "urldata.h" @@ -108,8 +112,10 @@ int Curl_wait_ms(int timeout_ms) if(error && error_not_EINTR) break; pending_ms = timeout_ms - elapsed_ms; - if(pending_ms <= 0) + if(pending_ms <= 0) { + r = 0; /* Simulate a "call timed out" case */ break; + } } while(r == -1); #endif /* USE_WINSOCK */ if(r) @@ -288,7 +294,37 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ pending_tv.tv_sec = 0; pending_tv.tv_usec = 0; } - r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); + + /* WinSock select() must not be called with an fd_set that contains zero + fd flags, or it will return WSAEINVAL. But, it also can't be called + with no fd_sets at all! From the documentation: + + Any two of the parameters, readfds, writefds, or exceptfds, can be + given as null. At least one must be non-null, and any non-null + descriptor set must contain at least one handle to a socket. + + We know that we have at least one bit set in at least two fd_sets in + this case, but we may have no bits set in either fds_read or fd_write, + so check for that and handle it. Luckily, with WinSock, we can _also_ + ask how many bits are set on an fd_set. + + It is unclear why WinSock doesn't just handle this for us instead of + calling this an error. + + Note also that WinSock ignores the first argument, so we don't worry + about the fact that maxfd is computed incorrectly with WinSock (since + curl_socket_t is unsigned in such cases and thus -1 is the largest + value). + */ + r = select((int)maxfd + 1, +#ifndef USE_WINSOCK + &fds_read, + &fds_write, +#else + fds_read.fd_count ? &fds_read : NULL, + fds_write.fd_count ? &fds_write : NULL, +#endif + &fds_err, ptimeout); if(r != -1) break; error = SOCKERRNO; @@ -402,8 +438,10 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) break; if(timeout_ms > 0) { pending_ms = timeout_ms - elapsed_ms; - if(pending_ms <= 0) + if(pending_ms <= 0) { + r = 0; /* Simulate a "call timed out" case */ break; + } } } while(r == -1); @@ -446,6 +484,16 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) } } +#ifdef USE_WINSOCK + /* WinSock select() can't handle zero events. See the comment about this in + Curl_check_socket(). */ + if(fds_read.fd_count == 0 && fds_write.fd_count == 0 + && fds_err.fd_count == 0) { + r = Curl_wait_ms(timeout_ms); + return r; + } +#endif + ptimeout = (timeout_ms < 0) ? NULL : &pending_tv; do { @@ -457,7 +505,19 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) pending_tv.tv_sec = 0; pending_tv.tv_usec = 0; } - r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); + r = select((int)maxfd + 1, +#ifndef USE_WINSOCK + &fds_read, &fds_write, &fds_err, +#else + /* WinSock select() can't handle fd_sets with zero bits set, so + don't give it such arguments. See the comment about this in + Curl_check_socket(). + */ + fds_read.fd_count ? &fds_read : NULL, + fds_write.fd_count ? &fds_write : NULL, + fds_err.fd_count ? &fds_err : NULL, +#endif + ptimeout); if(r != -1) break; error = SOCKERRNO; @@ -465,8 +525,10 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) break; if(timeout_ms > 0) { pending_ms = timeout_ms - elapsed_ms; - if(pending_ms <= 0) + if(pending_ms <= 0) { + r = 0; /* Simulate a "call timed out" case */ break; + } } } while(r == -1); diff --git a/lib/sendf.c b/lib/sendf.c index d5bf172..2d1a166 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -27,7 +27,7 @@ #include "urldata.h" #include "sendf.h" #include "connect.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "ssh.h" #include "multiif.h" #include "non-ascii.h" @@ -35,14 +35,6 @@ #define _MPRINTF_REPLACE /* use the internal *printf() functions */ #include -/* the krb4 functions only exists for FTP and if krb4 or gssapi is defined */ -#if !defined(CURL_DISABLE_FTP) && (defined(HAVE_KRB4) || defined(HAVE_GSSAPI)) -#include "krb4.h" -#else -#define Curl_sec_send(a,b,c,d) -1 -#define Curl_sec_read(a,b,c,d) -1 -#endif - #include "curl_memory.h" #include "strerror.h" @@ -182,7 +174,7 @@ CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn, struct SessionHandle *data = conn->data; ssize_t bytes_written; size_t write_len; - CURLcode res = CURLE_OK; + CURLcode result = CURLE_OK; char *s; char *sptr; va_list ap; @@ -198,9 +190,9 @@ CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn, for(;;) { /* Write the buffer to the socket */ - res = Curl_write(conn, sockfd, sptr, write_len, &bytes_written); + result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written); - if(CURLE_OK != res) + if(result) break; if(data->set.verbose) @@ -218,7 +210,7 @@ CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn, free(s); /* free the output string */ - return res; + return result; } /* @@ -235,10 +227,10 @@ CURLcode Curl_write(struct connectdata *conn, ssize_t *written) { ssize_t bytes_written; - CURLcode curlcode = CURLE_OK; + CURLcode result = CURLE_OK; int num = (sockfd == conn->sock[SECONDARYSOCKET]); - bytes_written = conn->send[num](conn, num, mem, len, &curlcode); + bytes_written = conn->send[num](conn, num, mem, len, &result); *written = bytes_written; if(bytes_written >= 0) @@ -246,7 +238,7 @@ CURLcode Curl_write(struct connectdata *conn, return CURLE_OK; /* handle CURLE_AGAIN or a send failure */ - switch(curlcode) { + switch(result) { case CURLE_AGAIN: *written = 0; return CURLE_OK; @@ -257,7 +249,7 @@ CURLcode Curl_write(struct connectdata *conn, default: /* we got a specific curlcode, forward it */ - return curlcode; + return result; } } @@ -308,14 +300,14 @@ CURLcode Curl_write_plain(struct connectdata *conn, ssize_t *written) { ssize_t bytes_written; - CURLcode retcode; + CURLcode result; int num = (sockfd == conn->sock[SECONDARYSOCKET]); - bytes_written = Curl_send_plain(conn, num, mem, len, &retcode); + bytes_written = Curl_send_plain(conn, num, mem, len, &result); *written = bytes_written; - return retcode; + return result; } ssize_t Curl_recv_plain(struct connectdata *conn, int num, char *buf, @@ -382,25 +374,21 @@ static CURLcode pausewrite(struct SessionHandle *data, } -/* Curl_client_write() sends data to the write callback(s) - - The bit pattern defines to what "streams" to write to. Body and/or header. - The defines are in sendf.h of course. - - If CURL_DO_LINEEND_CONV is enabled, data is converted IN PLACE to the - local character encoding. This is a problem and should be changed in - the future to leave the original data alone. +/* Curl_client_chop_write() writes chunks of data not larger than + * CURL_MAX_WRITE_SIZE via client write callback(s) and + * takes care of pause requests from the callbacks. */ -CURLcode Curl_client_write(struct connectdata *conn, - int type, - char *ptr, - size_t len) +CURLcode Curl_client_chop_write(struct connectdata *conn, + int type, + char * ptr, + size_t len) { struct SessionHandle *data = conn->data; - size_t wrote; + curl_write_callback writeheader = NULL; + curl_write_callback writebody = NULL; - if(0 == len) - len = strlen(ptr); + if(!len) + return CURLE_OK; /* If reading is actually paused, we're forced to append this chunk of data to the already held data, but only if it is the same type as otherwise it @@ -425,70 +413,107 @@ CURLcode Curl_client_write(struct connectdata *conn, /* update the pointer and the size */ data->state.tempwrite = newptr; data->state.tempwritesize = newlen; - return CURLE_OK; } - if(type & CLIENTWRITE_BODY) { - if((conn->handler->protocol&CURLPROTO_FTP) && - conn->proto.ftpc.transfertype == 'A') { - /* convert from the network encoding */ - CURLcode rc = Curl_convert_from_network(data, ptr, len); - /* Curl_convert_from_network calls failf if unsuccessful */ - if(rc) - return rc; - -#ifdef CURL_DO_LINEEND_CONV - /* convert end-of-line markers */ - len = convert_lineends(data, ptr, len); -#endif /* CURL_DO_LINEEND_CONV */ - } - /* If the previous block of data ended with CR and this block of data is - just a NL, then the length might be zero */ - if(len) { - wrote = data->set.fwrite_func(ptr, 1, len, data->set.out); - } - else { - wrote = len; - } - - if(CURL_WRITEFUNC_PAUSE == wrote) - return pausewrite(data, type, ptr, len); - - if(wrote != len) { - failf(data, "Failed writing body (%zu != %zu)", wrote, len); - return CURLE_WRITE_ERROR; - } - } - + /* Determine the callback(s) to use. */ + if(type & CLIENTWRITE_BODY) + writebody = data->set.fwrite_func; if((type & CLIENTWRITE_HEADER) && - (data->set.fwrite_header || data->set.writeheader) ) { + (data->set.fwrite_header || data->set.writeheader)) { /* * Write headers to the same callback or to the especially setup * header callback function (added after version 7.7.1). */ - curl_write_callback writeit= - data->set.fwrite_header?data->set.fwrite_header:data->set.fwrite_func; - - /* Note: The header is in the host encoding - regardless of the ftp transfer mode (ASCII/Image) */ - - wrote = writeit(ptr, 1, len, data->set.writeheader); - if(CURL_WRITEFUNC_PAUSE == wrote) - /* here we pass in the HEADER bit only since if this was body as well - then it was passed already and clearly that didn't trigger the pause, - so this is saved for later with the HEADER bit only */ - return pausewrite(data, CLIENTWRITE_HEADER, ptr, len); - - if(wrote != len) { - failf (data, "Failed writing header"); - return CURLE_WRITE_ERROR; + writeheader = + data->set.fwrite_header? data->set.fwrite_header: data->set.fwrite_func; + } + + /* Chop data, write chunks. */ + while(len) { + size_t chunklen = len <= CURL_MAX_WRITE_SIZE? len: CURL_MAX_WRITE_SIZE; + + if(writebody) { + size_t wrote = writebody(ptr, 1, chunklen, data->set.out); + + if(CURL_WRITEFUNC_PAUSE == wrote) { + if(conn->handler->flags & PROTOPT_NONETWORK) { + /* Protocols that work without network cannot be paused. This is + actually only FILE:// just now, and it can't pause since the + transfer isn't done using the "normal" procedure. */ + failf(data, "Write callback asked for PAUSE when not supported!"); + return CURLE_WRITE_ERROR; + } + else + return pausewrite(data, type, ptr, len); + } + else if(wrote != chunklen) { + failf(data, "Failed writing body (%zu != %zu)", wrote, chunklen); + return CURLE_WRITE_ERROR; + } + } + + if(writeheader) { + size_t wrote = writeheader(ptr, 1, chunklen, data->set.writeheader); + + if(CURL_WRITEFUNC_PAUSE == wrote) + /* here we pass in the HEADER bit only since if this was body as well + then it was passed already and clearly that didn't trigger the + pause, so this is saved for later with the HEADER bit only */ + return pausewrite(data, CLIENTWRITE_HEADER, ptr, len); + + if(wrote != chunklen) { + failf (data, "Failed writing header"); + return CURLE_WRITE_ERROR; + } } + + ptr += chunklen; + len -= chunklen; } return CURLE_OK; } + +/* Curl_client_write() sends data to the write callback(s) + + The bit pattern defines to what "streams" to write to. Body and/or header. + The defines are in sendf.h of course. + + If CURL_DO_LINEEND_CONV is enabled, data is converted IN PLACE to the + local character encoding. This is a problem and should be changed in + the future to leave the original data alone. + */ +CURLcode Curl_client_write(struct connectdata *conn, + int type, + char *ptr, + size_t len) +{ + struct SessionHandle *data = conn->data; + + if(0 == len) + len = strlen(ptr); + + /* FTP data may need conversion. */ + if((type & CLIENTWRITE_BODY) && + (conn->handler->protocol & PROTO_FAMILY_FTP) && + conn->proto.ftpc.transfertype == 'A') { + /* convert from the network encoding */ + CURLcode result = Curl_convert_from_network(data, ptr, len); + /* Curl_convert_from_network calls failf if unsuccessful */ + if(result) + return result; + +#ifdef CURL_DO_LINEEND_CONV + /* convert end-of-line markers */ + len = convert_lineends(data, ptr, len); +#endif /* CURL_DO_LINEEND_CONV */ + } + + return Curl_client_chop_write(conn, type, ptr, len); +} + CURLcode Curl_read_plain(curl_socket_t sockfd, char *buf, size_t bytesfromsocket, @@ -525,7 +550,7 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */ size_t sizerequested, /* max amount to read */ ssize_t *n) /* amount bytes read */ { - CURLcode curlcode = CURLE_RECV_ERROR; + CURLcode result = CURLE_RECV_ERROR; ssize_t nread = 0; size_t bytesfromsocket = 0; char *buffertofill = NULL; @@ -564,9 +589,9 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */ buffertofill = buf; } - nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &curlcode); + nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &result); if(nread < 0) - return curlcode; + return result; if(pipelining) { memcpy(buf, conn->master_buffer, nread); @@ -661,11 +686,13 @@ int Curl_debug(struct SessionHandle *data, curl_infotype type, switch (type) { case CURLINFO_HEADER_IN: w = "Header"; + /* FALLTHROUGH */ case CURLINFO_DATA_IN: t = "from"; break; case CURLINFO_HEADER_OUT: w = "Header"; + /* FALLTHROUGH */ case CURLINFO_DATA_OUT: t = "to"; break; diff --git a/lib/sendf.h b/lib/sendf.h index 39489e4..86f06cf 100644 --- a/lib/sendf.h +++ b/lib/sendf.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -51,8 +51,10 @@ void Curl_failf(struct SessionHandle *, const char *fmt, ...); #define CLIENTWRITE_HEADER (1<<1) #define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER) +CURLcode Curl_client_chop_write(struct connectdata *conn, int type, char *ptr, + size_t len) WARN_UNUSED_RESULT; CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, - size_t len); + size_t len) WARN_UNUSED_RESULT; /* internal read-function, does plain socket only */ CURLcode Curl_read_plain(curl_socket_t sockfd, diff --git a/lib/setup-os400.h b/lib/setup-os400.h index 319efec..fae8567 100644 --- a/lib/setup-os400.h +++ b/lib/setup-os400.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -33,16 +33,16 @@ typedef unsigned long u_int32_t; -/* System API wrapper prototypes and definitions to support ASCII parameters. */ +/* System API wrapper prototypes & definitions to support ASCII parameters. */ #include #include -#include #include #include #include -extern int Curl_getaddrinfo_a(const char * nodename, const char * servname, +extern int Curl_getaddrinfo_a(const char * nodename, + const char * servname, const struct addrinfo * hints, struct addrinfo * * res); #define getaddrinfo Curl_getaddrinfo_a @@ -56,20 +56,6 @@ extern int Curl_getnameinfo_a(const struct sockaddr * sa, #define getnameinfo Curl_getnameinfo_a -/* SSL wrappers. */ - -extern int Curl_SSL_Init_Application_a(SSLInitApp * init_app); -#define SSL_Init_Application Curl_SSL_Init_Application_a - - -extern int Curl_SSL_Init_a(SSLInit * init); -#define SSL_Init Curl_SSL_Init_a - - -extern char * Curl_SSL_Strerror_a(int sslreturnvalue, SSLErrorMsg * serrmsgp); -#define SSL_Strerror Curl_SSL_Strerror_a - - /* GSKit wrappers. */ extern int Curl_gsk_environment_open(gsk_handle * my_env_handle); @@ -226,5 +212,12 @@ extern int Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, #define sendto Curl_os400_sendto #define recvfrom Curl_os400_recvfrom +#ifdef HAVE_LIBZ +#define zlibVersion Curl_os400_zlibVersion +#define inflateInit_ Curl_os400_inflateInit_ +#define inflateInit2_ Curl_os400_inflateInit2_ +#define inflate Curl_os400_inflate +#define inflateEnd Curl_os400_inflateEnd +#endif #endif /* HEADER_CURL_SETUP_OS400_H */ diff --git a/lib/setup-vms.h b/lib/setup-vms.h index f5eedf7..4b3dded 100644 --- a/lib/setup-vms.h +++ b/lib/setup-vms.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -203,6 +203,19 @@ char * unix_path; #define CRYPTO_cleanup_all_ex_data CRYPTO_CLEANUP_ALL_EX_DATA #define CRYPTO_free CRYPTO_FREE #define CRYPTO_malloc CRYPTO_MALLOC +#define CONF_modules_load_file CONF_MODULES_LOAD_FILE +#ifdef __VAX +# ifdef VMS_OLD_SSL + /* Ancient OpenSSL on VAX/VMS missing this constant */ +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# undef CONF_modules_load_file + static int CONF_modules_load_file(const char *filename, + const char *appname, + unsigned long flags) { + return 1; + } +# endif +#endif #define DES_ecb_encrypt DES_ECB_ENCRYPT #define DES_set_key DES_SET_KEY #define DES_set_odd_parity DES_SET_ODD_PARITY @@ -228,6 +241,7 @@ char * unix_path; #define EVP_PKEY_free EVP_PKEY_FREE #define EVP_cleanup EVP_CLEANUP #define GENERAL_NAMES_free GENERAL_NAMES_FREE +#define i2d_X509_PUBKEY I2D_X509_PUBKEY #define MD4_Final MD4_FINAL #define MD4_Init MD4_INIT #define MD4_Update MD4_UPDATE @@ -274,6 +288,7 @@ char * unix_path; #define SSL_get_peer_cert_chain SSL_GET_PEER_CERT_CHAIN #define SSL_get_peer_certificate SSL_GET_PEER_CERTIFICATE #define SSL_get_privatekey SSL_GET_PRIVATEKEY +#define SSL_get_session SSL_GET_SESSION #define SSL_get_shutdown SSL_GET_SHUTDOWN #define SSL_get_verify_result SSL_GET_VERIFY_RESULT #define SSL_library_init SSL_LIBRARY_INIT @@ -291,7 +306,23 @@ char * unix_path; #define SSLv23_client_method SSLV23_CLIENT_METHOD #define SSLv3_client_method SSLV3_CLIENT_METHOD #define TLSv1_client_method TLSV1_CLIENT_METHOD +#define UI_create_method UI_CREATE_METHOD +#define UI_destroy_method UI_DESTROY_METHOD +#define UI_get0_user_data UI_GET0_USER_DATA +#define UI_get_input_flags UI_GET_INPUT_FLAGS +#define UI_get_string_type UI_GET_STRING_TYPE +#define UI_create_method UI_CREATE_METHOD +#define UI_destroy_method UI_DESTROY_METHOD +#define UI_method_get_closer UI_METHOD_GET_CLOSER +#define UI_method_get_opener UI_METHOD_GET_OPENER +#define UI_method_get_reader UI_METHOD_GET_READER +#define UI_method_get_writer UI_METHOD_GET_WRITER +#define UI_method_set_closer UI_METHOD_SET_CLOSER +#define UI_method_set_opener UI_METHOD_SET_OPENER +#define UI_method_set_reader UI_METHOD_SET_READER +#define UI_method_set_writer UI_METHOD_SET_WRITER #define UI_OpenSSL UI_OPENSSL +#define UI_set_result UI_SET_RESULT #define X509V3_EXT_print X509V3_EXT_PRINT #define X509_EXTENSION_get_critical X509_EXTENSION_GET_CRITICAL #define X509_EXTENSION_get_object X509_EXTENSION_GET_OBJECT diff --git a/lib/share.c b/lib/share.c index b21c9f6..b8b6bee 100644 --- a/lib/share.c +++ b/lib/share.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -25,7 +25,7 @@ #include #include "urldata.h" #include "share.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "curl_memory.h" /* The last #include file should be: */ diff --git a/lib/sigpipe.h b/lib/sigpipe.h new file mode 100644 index 0000000..e8d2acd --- /dev/null +++ b/lib/sigpipe.h @@ -0,0 +1,78 @@ +#ifndef HEADER_CURL_SIGPIPE_H +#define HEADER_CURL_SIGPIPE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2013, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "curl_setup.h" + +#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) && defined(USE_OPENSSL) +#include + +struct sigpipe_ignore { + struct sigaction old_pipe_act; + bool no_signal; +}; + +#define SIGPIPE_VARIABLE(x) struct sigpipe_ignore x + +/* + * sigpipe_ignore() makes sure we ignore SIGPIPE while running libcurl + * internals, and then sigpipe_restore() will restore the situation when we + * return from libcurl again. + */ +static void sigpipe_ignore(struct SessionHandle *data, + struct sigpipe_ignore *ig) +{ + /* get a local copy of no_signal because the SessionHandle might not be + around when we restore */ + ig->no_signal = data->set.no_signal; + if(!data->set.no_signal) { + struct sigaction action; + /* first, extract the existing situation */ + memset(&ig->old_pipe_act, 0, sizeof(struct sigaction)); + sigaction(SIGPIPE, NULL, &ig->old_pipe_act); + action = ig->old_pipe_act; + /* ignore this signal */ + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + } +} + +/* + * sigpipe_restore() puts back the outside world's opinion of signal handler + * and SIGPIPE handling. It MUST only be called after a corresponding + * sigpipe_ignore() was used. + */ +static void sigpipe_restore(struct sigpipe_ignore *ig) +{ + if(!ig->no_signal) + /* restore the outside state */ + sigaction(SIGPIPE, &ig->old_pipe_act, NULL); +} + +#else +/* for systems without sigaction */ +#define sigpipe_ignore(x,y) Curl_nop_stmt +#define sigpipe_restore(x) Curl_nop_stmt +#define SIGPIPE_VARIABLE(x) +#endif + +#endif /* HEADER_CURL_SIGPIPE_H */ diff --git a/lib/smb.c b/lib/smb.c new file mode 100644 index 0000000..e66427b --- /dev/null +++ b/lib/smb.c @@ -0,0 +1,970 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2014, Bill Nagel , Exacq Technologies + * Copyright (C) 2015, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) + +#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) + +#define BUILDING_CURL_SMB_C + +#ifdef HAVE_PROCESS_H +#include +#define getpid _getpid +#endif + +#include "smb.h" +#include "urldata.h" +#include "sendf.h" +#include "multiif.h" +#include "connect.h" +#include "progress.h" +#include "transfer.h" +#include "vtls/vtls.h" +#include "curl_ntlm_core.h" +#include "curl_memory.h" +#include "escape.h" +#include "curl_endian.h" + +/* The last #include file should be: */ +#include "memdebug.h" + +/* Local API functions */ +static CURLcode smb_setup_connection(struct connectdata *conn); +static CURLcode smb_connect(struct connectdata *conn, bool *done); +static CURLcode smb_connection_state(struct connectdata *conn, bool *done); +static CURLcode smb_request_state(struct connectdata *conn, bool *done); +static CURLcode smb_done(struct connectdata *conn, CURLcode status, + bool premature); +static CURLcode smb_disconnect(struct connectdata *conn, bool dead); +static int smb_getsock(struct connectdata *conn, curl_socket_t *socks, + int numsocks); +static CURLcode smb_parse_url_path(struct connectdata *conn); + +/* + * SMB handler interface + */ +const struct Curl_handler Curl_handler_smb = { + "SMB", /* scheme */ + smb_setup_connection, /* setup_connection */ + ZERO_NULL, /* do_it */ + smb_done, /* done */ + ZERO_NULL, /* do_more */ + smb_connect, /* connect_it */ + smb_connection_state, /* connecting */ + smb_request_state, /* doing */ + smb_getsock, /* proto_getsock */ + smb_getsock, /* doing_getsock */ + ZERO_NULL, /* domore_getsock */ + ZERO_NULL, /* perform_getsock */ + smb_disconnect, /* disconnect */ + ZERO_NULL, /* readwrite */ + PORT_SMB, /* defport */ + CURLPROTO_SMB, /* protocol */ + PROTOPT_NONE /* flags */ +}; + +#ifdef USE_SSL +/* + * SMBS handler interface + */ +const struct Curl_handler Curl_handler_smbs = { + "SMBS", /* scheme */ + smb_setup_connection, /* setup_connection */ + ZERO_NULL, /* do_it */ + smb_done, /* done */ + ZERO_NULL, /* do_more */ + smb_connect, /* connect_it */ + smb_connection_state, /* connecting */ + smb_request_state, /* doing */ + smb_getsock, /* proto_getsock */ + smb_getsock, /* doing_getsock */ + ZERO_NULL, /* domore_getsock */ + ZERO_NULL, /* perform_getsock */ + smb_disconnect, /* disconnect */ + ZERO_NULL, /* readwrite */ + PORT_SMBS, /* defport */ + CURLPROTO_SMBS, /* protocol */ + PROTOPT_SSL /* flags */ +}; +#endif + +#define MAX_PAYLOAD_SIZE 0x8000 +#define MAX_MESSAGE_SIZE (MAX_PAYLOAD_SIZE + 0x1000) +#define CLIENTNAME "curl" +#define SERVICENAME "?????" + +/* Append a string to an SMB message */ +#define MSGCAT(str) \ + strcpy(p, (str)); \ + p += strlen(str); + +/* Append a null-terminated string to an SMB message */ +#define MSGCATNULL(str) \ + strcpy(p, (str)); \ + p += strlen(str) + 1; + +/* SMB is mostly little endian */ +#if (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \ + defined(__OS400__) +static unsigned short smb_swap16(unsigned short x) +{ + return (x << 8) | ((x >> 8) & 0xff); +} + +static unsigned int smb_swap32(unsigned int x) +{ + return (x << 24) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | + ((x >> 24) & 0xff); +} + +#ifdef HAVE_LONGLONG +static unsigned long long smb_swap64(unsigned long long x) +{ + return ((unsigned long long)smb_swap32(x) << 32) | smb_swap32(x >> 32); +} +#else +static unsigned __int64 smb_swap64(unsigned __int64 x) +{ + return ((unsigned __int64)smb_swap32(x) << 32) | smb_swap32(x >> 32); +} +#endif +#else +# define smb_swap16(x) (x) +# define smb_swap32(x) (x) +# define smb_swap64(x) (x) +#endif + +/* SMB request state */ +enum smb_req_state { + SMB_REQUESTING, + SMB_TREE_CONNECT, + SMB_OPEN, + SMB_DOWNLOAD, + SMB_UPLOAD, + SMB_CLOSE, + SMB_TREE_DISCONNECT, + SMB_DONE +}; + +/* SMB request data */ +struct smb_request { + enum smb_req_state state; + char *share; + char *path; + unsigned short tid; /* Even if we connect to the same tree as another */ + unsigned short fid; /* request, the tid will be different */ + CURLcode result; +}; + +static void conn_state(struct connectdata *conn, enum smb_conn_state newstate) +{ + struct smb_conn *smb = &conn->proto.smbc; +#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) + /* For debug purposes */ + static const char * const names[] = { + "SMB_NOT_CONNECTED", + "SMB_CONNECTING", + "SMB_NEGOTIATE", + "SMB_SETUP", + "SMB_CONNECTED", + /* LAST */ + }; + + if(smb->state != newstate) + infof(conn->data, "SMB conn %p state change from %s to %s\n", + (void *)smb, names[smb->state], names[newstate]); +#endif + + smb->state = newstate; +} + +static void request_state(struct connectdata *conn, + enum smb_req_state newstate) +{ + struct smb_request *req = conn->data->req.protop; +#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) + /* For debug purposes */ + static const char * const names[] = { + "SMB_REQUESTING", + "SMB_TREE_CONNECT", + "SMB_OPEN", + "SMB_DOWNLOAD", + "SMB_UPLOAD", + "SMB_CLOSE", + "SMB_TREE_DISCONNECT", + "SMB_DONE", + /* LAST */ + }; + + if(req->state != newstate) + infof(conn->data, "SMB request %p state change from %s to %s\n", + (void *)req, names[req->state], names[newstate]); +#endif + + req->state = newstate; +} + +static CURLcode smb_setup_connection(struct connectdata *conn) +{ + struct smb_request *req; + + /* Initialize the request state */ + conn->data->req.protop = req = calloc(1, sizeof(struct smb_request)); + if(!req) + return CURLE_OUT_OF_MEMORY; + + /* Parse the URL path */ + return smb_parse_url_path(conn); +} + +static CURLcode smb_connect(struct connectdata *conn, bool *done) +{ + struct smb_conn *smbc = &conn->proto.smbc; + char *slash; + + (void) done; + + /* Check we have a username and password to authenticate with */ + if(!conn->bits.user_passwd) + return CURLE_LOGIN_DENIED; + + /* Initialize the connection state */ + memset(smbc, 0, sizeof(*smbc)); + smbc->state = SMB_CONNECTING; + smbc->recv_buf = malloc(MAX_MESSAGE_SIZE); + if(!smbc->recv_buf) + return CURLE_OUT_OF_MEMORY; + + /* Multiple requests are allowed with this connection */ + connkeep(conn, "SMB default"); + + /* Parse the username, domain, and password */ + slash = strchr(conn->user, '/'); + if(!slash) + slash = strchr(conn->user, '\\'); + + if(slash) { + smbc->user = slash + 1; + smbc->domain = strdup(conn->user); + if(!smbc->domain) + return CURLE_OUT_OF_MEMORY; + smbc->domain[slash - conn->user] = 0; + } + else { + smbc->user = conn->user; + smbc->domain = strdup(conn->host.name); + if(!smbc->domain) + return CURLE_OUT_OF_MEMORY; + } + + return CURLE_OK; +} + +static CURLcode smb_recv_message(struct connectdata *conn, void **msg) +{ + struct smb_conn *smbc = &conn->proto.smbc; + char *buf = smbc->recv_buf; + ssize_t bytes_read; + size_t nbt_size; + size_t msg_size; + size_t len = MAX_MESSAGE_SIZE - smbc->got; + CURLcode result; + + result = Curl_read(conn, FIRSTSOCKET, buf + smbc->got, len, &bytes_read); + if(result) + return result; + + if(!bytes_read) + return CURLE_OK; + + smbc->got += bytes_read; + + /* Check for a 32-bit nbt header */ + if(smbc->got < sizeof(unsigned int)) + return CURLE_OK; + + nbt_size = Curl_read16_be((unsigned char *)(buf + sizeof(unsigned short))) + + sizeof(unsigned int); + if(smbc->got < nbt_size) + return CURLE_OK; + + msg_size = sizeof(struct smb_header); + if(nbt_size >= msg_size + 1) { + /* Add the word count */ + msg_size += 1 + ((unsigned char) buf[msg_size]) * sizeof(unsigned short); + if(nbt_size >= msg_size + sizeof(unsigned short)) { + /* Add the byte count */ + msg_size += sizeof(unsigned short) + + Curl_read16_le((unsigned char *)&buf[msg_size]); + if(nbt_size < msg_size) + return CURLE_READ_ERROR; + } + } + + *msg = buf; + + return CURLE_OK; +} + +static void smb_pop_message(struct connectdata *conn) +{ + struct smb_conn *smbc = &conn->proto.smbc; + + smbc->got = 0; +} + +static void smb_format_message(struct connectdata *conn, struct smb_header *h, + unsigned char cmd, size_t len) +{ + struct smb_conn *smbc = &conn->proto.smbc; + struct smb_request *req = conn->data->req.protop; + unsigned int pid; + + memset(h, 0, sizeof(*h)); + h->nbt_length = htons((unsigned short) (sizeof(*h) - sizeof(unsigned int) + + len)); + memcpy((char *)h->magic, "\xffSMB", 4); + h->command = cmd; + h->flags = SMB_FLAGS_CANONICAL_PATHNAMES | SMB_FLAGS_CASELESS_PATHNAMES; + h->flags2 = smb_swap16(SMB_FLAGS2_IS_LONG_NAME | SMB_FLAGS2_KNOWS_LONG_NAME); + h->uid = smb_swap16(smbc->uid); + h->tid = smb_swap16(req->tid); + pid = getpid(); + h->pid_high = smb_swap16((unsigned short)(pid >> 16)); + h->pid = smb_swap16((unsigned short) pid); +} + +static CURLcode smb_send(struct connectdata *conn, ssize_t len, + size_t upload_size) +{ + struct smb_conn *smbc = &conn->proto.smbc; + ssize_t bytes_written; + CURLcode result; + + result = Curl_write(conn, FIRSTSOCKET, conn->data->state.uploadbuffer, + len, &bytes_written); + if(result) + return result; + + if(bytes_written != len) { + smbc->send_size = len; + smbc->sent = bytes_written; + } + + smbc->upload_size = upload_size; + + return CURLE_OK; +} + +static CURLcode smb_flush(struct connectdata *conn) +{ + struct smb_conn *smbc = &conn->proto.smbc; + ssize_t bytes_written; + ssize_t len = smbc->send_size - smbc->sent; + CURLcode result; + + if(!smbc->send_size) + return CURLE_OK; + + result = Curl_write(conn, FIRSTSOCKET, + conn->data->state.uploadbuffer + smbc->sent, + len, &bytes_written); + if(result) + return result; + + if(bytes_written != len) + smbc->sent += bytes_written; + else + smbc->send_size = 0; + + return CURLE_OK; +} + +static CURLcode smb_send_message(struct connectdata *conn, unsigned char cmd, + const void *msg, size_t msg_len) +{ + smb_format_message(conn, (struct smb_header *)conn->data->state.uploadbuffer, + cmd, msg_len); + memcpy(conn->data->state.uploadbuffer + sizeof(struct smb_header), + msg, msg_len); + + return smb_send(conn, sizeof(struct smb_header) + msg_len, 0); +} + +static CURLcode smb_send_negotiate(struct connectdata *conn) +{ + const char *msg = "\x00\x0c\x00\x02NT LM 0.12"; + + return smb_send_message(conn, SMB_COM_NEGOTIATE, msg, 15); +} + +static CURLcode smb_send_setup(struct connectdata *conn) +{ + struct smb_conn *smbc = &conn->proto.smbc; + struct smb_setup msg; + char *p = msg.bytes; + unsigned char lm_hash[21]; + unsigned char lm[24]; + unsigned char nt_hash[21]; + unsigned char nt[24]; + + size_t byte_count = sizeof(lm) + sizeof(nt); + byte_count += strlen(smbc->user) + strlen(smbc->domain); + byte_count += strlen(OS) + strlen(CLIENTNAME) + 4; /* 4 null chars */ + if(byte_count > sizeof(msg.bytes)) + return CURLE_FILESIZE_EXCEEDED; + + Curl_ntlm_core_mk_lm_hash(conn->data, conn->passwd, lm_hash); + Curl_ntlm_core_lm_resp(lm_hash, smbc->challenge, lm); +#if USE_NTRESPONSES + Curl_ntlm_core_mk_nt_hash(conn->data, conn->passwd, nt_hash); + Curl_ntlm_core_lm_resp(nt_hash, smbc->challenge, nt); +#else + memset(nt, 0, sizeof(nt)); +#endif + + memset(&msg, 0, sizeof(msg)); + msg.word_count = SMB_WC_SETUP_ANDX; + msg.andx.command = SMB_COM_NO_ANDX_COMMAND; + msg.max_buffer_size = smb_swap16(MAX_MESSAGE_SIZE); + msg.max_mpx_count = smb_swap16(1); + msg.vc_number = smb_swap16(1); + msg.session_key = smb_swap32(smbc->session_key); + msg.capabilities = smb_swap32(SMB_CAP_LARGE_FILES); + msg.lengths[0] = smb_swap16(sizeof(lm)); + msg.lengths[1] = smb_swap16(sizeof(nt)); + memcpy(p, lm, sizeof(lm)); + p += sizeof(lm); + memcpy(p, nt, sizeof(nt)); + p += sizeof(nt); + MSGCATNULL(smbc->user); + MSGCATNULL(smbc->domain); + MSGCATNULL(OS); + MSGCATNULL(CLIENTNAME); + byte_count = p - msg.bytes; + msg.byte_count = smb_swap16((unsigned short)byte_count); + + return smb_send_message(conn, SMB_COM_SETUP_ANDX, &msg, + sizeof(msg) - sizeof(msg.bytes) + byte_count); +} + +static CURLcode smb_send_tree_connect(struct connectdata *conn) +{ + struct smb_request *req = conn->data->req.protop; + struct smb_tree_connect msg; + char *p = msg.bytes; + + size_t byte_count = strlen(conn->host.name) + strlen(req->share); + byte_count += strlen(SERVICENAME) + 5; /* 2 nulls and 3 backslashes */ + if(byte_count > sizeof(msg.bytes)) + return CURLE_FILESIZE_EXCEEDED; + + memset(&msg, 0, sizeof(msg)); + msg.word_count = SMB_WC_TREE_CONNECT_ANDX; + msg.andx.command = SMB_COM_NO_ANDX_COMMAND; + msg.pw_len = 0; + MSGCAT("\\\\"); + MSGCAT(conn->host.name); + MSGCAT("\\"); + MSGCATNULL(req->share); + MSGCATNULL(SERVICENAME); /* Match any type of service */ + byte_count = p - msg.bytes; + msg.byte_count = smb_swap16((unsigned short)byte_count); + + return smb_send_message(conn, SMB_COM_TREE_CONNECT_ANDX, &msg, + sizeof(msg) - sizeof(msg.bytes) + byte_count); +} + +static CURLcode smb_send_open(struct connectdata *conn) +{ + struct smb_request *req = conn->data->req.protop; + struct smb_nt_create msg; + size_t byte_count; + + if((strlen(req->path) + 1) > sizeof(msg.bytes)) + return CURLE_FILESIZE_EXCEEDED; + + memset(&msg, 0, sizeof(msg)); + msg.word_count = SMB_WC_NT_CREATE_ANDX; + msg.andx.command = SMB_COM_NO_ANDX_COMMAND; + byte_count = strlen(req->path); + msg.name_length = smb_swap16((unsigned short)byte_count); + msg.share_access = smb_swap32(SMB_FILE_SHARE_ALL); + if(conn->data->set.upload) { + msg.access = smb_swap32(SMB_GENERIC_READ | SMB_GENERIC_WRITE); + msg.create_disposition = smb_swap32(SMB_FILE_OVERWRITE_IF); + } + else { + msg.access = smb_swap32(SMB_GENERIC_READ); + msg.create_disposition = smb_swap32(SMB_FILE_OPEN); + } + msg.byte_count = smb_swap16((unsigned short) ++byte_count); + strcpy(msg.bytes, req->path); + + return smb_send_message(conn, SMB_COM_NT_CREATE_ANDX, &msg, + sizeof(msg) - sizeof(msg.bytes) + byte_count); +} + +static CURLcode smb_send_close(struct connectdata *conn) +{ + struct smb_request *req = conn->data->req.protop; + struct smb_close msg; + + memset(&msg, 0, sizeof(msg)); + msg.word_count = SMB_WC_CLOSE; + msg.fid = smb_swap16(req->fid); + + return smb_send_message(conn, SMB_COM_CLOSE, &msg, sizeof(msg)); +} + +static CURLcode smb_send_tree_disconnect(struct connectdata *conn) +{ + struct smb_tree_disconnect msg; + + memset(&msg, 0, sizeof(msg)); + + return smb_send_message(conn, SMB_COM_TREE_DISCONNECT, &msg, sizeof(msg)); +} + +static CURLcode smb_send_read(struct connectdata *conn) +{ + struct smb_request *req = conn->data->req.protop; + curl_off_t offset = conn->data->req.offset; + struct smb_read msg; + + memset(&msg, 0, sizeof(msg)); + msg.word_count = SMB_WC_READ_ANDX; + msg.andx.command = SMB_COM_NO_ANDX_COMMAND; + msg.fid = smb_swap16(req->fid); + msg.offset = smb_swap32((unsigned int) offset); + msg.offset_high = smb_swap32((unsigned int) (offset >> 32)); + msg.min_bytes = smb_swap16(MAX_PAYLOAD_SIZE); + msg.max_bytes = smb_swap16(MAX_PAYLOAD_SIZE); + + return smb_send_message(conn, SMB_COM_READ_ANDX, &msg, sizeof(msg)); +} + +static CURLcode smb_send_write(struct connectdata *conn) +{ + struct smb_write *msg = (struct smb_write *)conn->data->state.uploadbuffer; + struct smb_request *req = conn->data->req.protop; + curl_off_t offset = conn->data->req.offset; + + curl_off_t upload_size = conn->data->req.size - conn->data->req.bytecount; + if(upload_size >= MAX_PAYLOAD_SIZE - 1) /* There is one byte of padding */ + upload_size = MAX_PAYLOAD_SIZE - 1; + + memset(msg, 0, sizeof(*msg)); + msg->word_count = SMB_WC_WRITE_ANDX; + msg->andx.command = SMB_COM_NO_ANDX_COMMAND; + msg->fid = smb_swap16(req->fid); + msg->offset = smb_swap32((unsigned int) offset); + msg->offset_high = smb_swap32((unsigned int) (offset >> 32)); + msg->data_length = smb_swap16((unsigned short) upload_size); + msg->data_offset = smb_swap16(sizeof(*msg) - sizeof(unsigned int)); + msg->byte_count = smb_swap16((unsigned short) (upload_size + 1)); + + smb_format_message(conn, &msg->h, SMB_COM_WRITE_ANDX, + sizeof(*msg) - sizeof(msg->h) + (size_t) upload_size); + + return smb_send(conn, sizeof(*msg), (size_t) upload_size); +} + +static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg) +{ + struct smb_conn *smbc = &conn->proto.smbc; + CURLcode result; + + /* Check if there is data in the transfer buffer */ + if(!smbc->send_size && smbc->upload_size) { + int nread = smbc->upload_size > BUFSIZE ? BUFSIZE : + (int) smbc->upload_size; + conn->data->req.upload_fromhere = conn->data->state.uploadbuffer; + result = Curl_fillreadbuffer(conn, nread, &nread); + if(result && result != CURLE_AGAIN) + return result; + if(!nread) + return CURLE_OK; + + smbc->upload_size -= nread; + smbc->send_size = nread; + smbc->sent = 0; + } + + /* Check if there is data to send */ + if(smbc->send_size) { + result = smb_flush(conn); + if(result) + return result; + } + + /* Check if there is still data to be sent */ + if(smbc->send_size || smbc->upload_size) + return CURLE_AGAIN; + + return smb_recv_message(conn, msg); +} + +static CURLcode smb_connection_state(struct connectdata *conn, bool *done) +{ + struct smb_conn *smbc = &conn->proto.smbc; + struct smb_negotiate_response *nrsp; + struct smb_header *h; + CURLcode result; + void *msg = NULL; + + if(smbc->state == SMB_CONNECTING) { +#ifdef USE_SSL + if((conn->handler->flags & PROTOPT_SSL)) { + bool ssl_done; + result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &ssl_done); + if(result && result != CURLE_AGAIN) + return result; + if(!ssl_done) + return CURLE_OK; + } +#endif + + result = smb_send_negotiate(conn); + if(result) { + connclose(conn, "SMB: failed to send negotiate message"); + return result; + } + + conn_state(conn, SMB_NEGOTIATE); + } + + /* Send the previous message and check for a response */ + result = smb_send_and_recv(conn, &msg); + if(result && result != CURLE_AGAIN) { + connclose(conn, "SMB: failed to communicate"); + return result; + } + + if(!msg) + return CURLE_OK; + + h = msg; + + switch(smbc->state) { + case SMB_NEGOTIATE: + if(h->status) { + connclose(conn, "SMB: negotiation failed"); + return CURLE_COULDNT_CONNECT; + } + nrsp = msg; + memcpy(smbc->challenge, nrsp->bytes, sizeof(smbc->challenge)); + smbc->session_key = smb_swap32(nrsp->session_key); + result = smb_send_setup(conn); + if(result) { + connclose(conn, "SMB: failed to send setup message"); + return result; + } + conn_state(conn, SMB_SETUP); + break; + + case SMB_SETUP: + if(h->status) { + connclose(conn, "SMB: authentication failed"); + return CURLE_LOGIN_DENIED; + } + smbc->uid = smb_swap16(h->uid); + conn_state(conn, SMB_CONNECTED); + *done = true; + break; + + default: + smb_pop_message(conn); + return CURLE_OK; /* ignore */ + } + + smb_pop_message(conn); + + return CURLE_OK; +} + +static CURLcode smb_request_state(struct connectdata *conn, bool *done) +{ + struct smb_request *req = conn->data->req.protop; + struct smb_header *h; + enum smb_req_state next_state = SMB_DONE; + unsigned short len; + unsigned short off; + CURLcode result; + void *msg = NULL; + + /* Start the request */ + if(req->state == SMB_REQUESTING) { + result = smb_send_tree_connect(conn); + if(result) { + connclose(conn, "SMB: failed to send tree connect message"); + return result; + } + + request_state(conn, SMB_TREE_CONNECT); + } + + /* Send the previous message and check for a response */ + result = smb_send_and_recv(conn, &msg); + if(result && result != CURLE_AGAIN) { + connclose(conn, "SMB: failed to communicate"); + return result; + } + + if(!msg) + return CURLE_OK; + + h = msg; + + switch(req->state) { + case SMB_TREE_CONNECT: + if(h->status) { + req->result = CURLE_REMOTE_FILE_NOT_FOUND; + if(h->status == smb_swap32(SMB_ERR_NOACCESS)) + req->result = CURLE_REMOTE_ACCESS_DENIED; + break; + } + req->tid = smb_swap16(h->tid); + next_state = SMB_OPEN; + break; + + case SMB_OPEN: + if(h->status) { + req->result = CURLE_REMOTE_FILE_NOT_FOUND; + next_state = SMB_TREE_DISCONNECT; + break; + } + req->fid = smb_swap16(((struct smb_nt_create_response *)msg)->fid); + conn->data->req.offset = 0; + if(conn->data->set.upload) { + conn->data->req.size = conn->data->state.infilesize; + Curl_pgrsSetUploadSize(conn->data, conn->data->req.size); + next_state = SMB_UPLOAD; + } + else { + conn->data->req.size = + smb_swap64(((struct smb_nt_create_response *)msg)->end_of_file); + Curl_pgrsSetDownloadSize(conn->data, conn->data->req.size); + next_state = SMB_DOWNLOAD; + } + break; + + case SMB_DOWNLOAD: + if(h->status) { + req->result = CURLE_RECV_ERROR; + next_state = SMB_CLOSE; + break; + } + len = Curl_read16_le(((unsigned char *) msg) + + sizeof(struct smb_header) + 11); + off = Curl_read16_le(((unsigned char *) msg) + + sizeof(struct smb_header) + 13); + if(len > 0) { + result = Curl_client_write(conn, CLIENTWRITE_BODY, + (char *)msg + off + sizeof(unsigned int), + len); + if(result) { + req->result = result; + next_state = SMB_CLOSE; + break; + } + } + conn->data->req.bytecount += len; + conn->data->req.offset += len; + Curl_pgrsSetDownloadCounter(conn->data, conn->data->req.bytecount); + next_state = (len < MAX_PAYLOAD_SIZE) ? SMB_CLOSE : SMB_DOWNLOAD; + break; + + case SMB_UPLOAD: + if(h->status) { + req->result = CURLE_UPLOAD_FAILED; + next_state = SMB_CLOSE; + break; + } + len = Curl_read16_le(((unsigned char *) msg) + + sizeof(struct smb_header) + 5); + conn->data->req.bytecount += len; + conn->data->req.offset += len; + Curl_pgrsSetUploadCounter(conn->data, conn->data->req.bytecount); + if(conn->data->req.bytecount >= conn->data->req.size) + next_state = SMB_CLOSE; + else + next_state = SMB_UPLOAD; + break; + + case SMB_CLOSE: + /* We don't care if the close failed, proceed to tree disconnect anyway */ + next_state = SMB_TREE_DISCONNECT; + break; + + case SMB_TREE_DISCONNECT: + next_state = SMB_DONE; + break; + + default: + smb_pop_message(conn); + return CURLE_OK; /* ignore */ + } + + smb_pop_message(conn); + + switch(next_state) { + case SMB_OPEN: + result = smb_send_open(conn); + break; + + case SMB_DOWNLOAD: + result = smb_send_read(conn); + break; + + case SMB_UPLOAD: + result = smb_send_write(conn); + break; + + case SMB_CLOSE: + result = smb_send_close(conn); + break; + + case SMB_TREE_DISCONNECT: + result = smb_send_tree_disconnect(conn); + break; + + case SMB_DONE: + result = req->result; + *done = true; + break; + + default: + break; + } + + if(result) { + connclose(conn, "SMB: failed to send message"); + return result; + } + + request_state(conn, next_state); + + return CURLE_OK; +} + +static CURLcode smb_done(struct connectdata *conn, CURLcode status, + bool premature) +{ + struct smb_request *req = conn->data->req.protop; + + (void) premature; + + Curl_safefree(req->share); + Curl_safefree(conn->data->req.protop); + + return status; +} + +static CURLcode smb_disconnect(struct connectdata *conn, bool dead) +{ + struct smb_conn *smbc = &conn->proto.smbc; + struct smb_request *req = conn->data->req.protop; + + (void) dead; + + Curl_safefree(smbc->domain); + Curl_safefree(smbc->recv_buf); + + /* smb_done is not always called, so cleanup the request */ + if(req) { + Curl_safefree(req->share); + Curl_safefree(conn->data->req.protop); + } + + return CURLE_OK; +} + +static int smb_getsock(struct connectdata *conn, curl_socket_t *socks, + int numsocks) +{ + struct smb_conn *smbc = &conn->proto.smbc; + + if(!numsocks) + return GETSOCK_BLANK; + + socks[0] = conn->sock[FIRSTSOCKET]; + + if(smbc->send_size || smbc->upload_size) + return GETSOCK_WRITESOCK(0); + + return GETSOCK_READSOCK(0); +} + +static CURLcode smb_parse_url_path(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct smb_request *req = data->req.protop; + char *path; + char *slash; + + /* URL decode the path */ + result = Curl_urldecode(data, data->state.path, 0, &path, NULL, TRUE); + if(result) + return result; + + /* Parse the path for the share */ + req->share = strdup((*path == '/' || *path == '\\') ? path + 1 : path); + if(!req->share) { + Curl_safefree(path); + + return CURLE_OUT_OF_MEMORY; + } + + slash = strchr(req->share, '/'); + if(!slash) + slash = strchr(req->share, '\\'); + + /* The share must be present */ + if(!slash) { + Curl_safefree(path); + + return CURLE_URL_MALFORMAT; + } + + /* Parse the path for the file path converting any forward slashes into + backslashes */ + *slash++ = 0; + req->path = slash; + for(; *slash; slash++) { + if(*slash == '/') + *slash = '\\'; + } + + Curl_safefree(path); + + return CURLE_OK; +} + +#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ + +#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */ diff --git a/lib/smb.h b/lib/smb.h new file mode 100644 index 0000000..7852fa1 --- /dev/null +++ b/lib/smb.h @@ -0,0 +1,271 @@ +#ifndef HEADER_CURL_SMB_H +#define HEADER_CURL_SMB_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2014, Bill Nagel , Exacq Technologies + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +enum smb_conn_state { + SMB_NOT_CONNECTED = 0, + SMB_CONNECTING, + SMB_NEGOTIATE, + SMB_SETUP, + SMB_CONNECTED +}; + +struct smb_conn { + enum smb_conn_state state; + char *user; + char *domain; + unsigned char challenge[8]; + unsigned int session_key; + unsigned short uid; + char *recv_buf; + size_t upload_size; + size_t send_size; + size_t sent; + size_t got; +}; + +/* + * Definitions for SMB protocol data structures + */ +#ifdef BUILDING_CURL_SMB_C + +#if defined(_MSC_VER) || defined(__ILEC400__) +# define PACK +# pragma pack(push) +# pragma pack(1) +#elif defined(__GNUC__) +# define PACK __attribute__((packed)) +#else +# define PACK +#endif + +#define SMB_COM_CLOSE 0x04 +#define SMB_COM_READ_ANDX 0x2e +#define SMB_COM_WRITE_ANDX 0x2f +#define SMB_COM_TREE_DISCONNECT 0x71 +#define SMB_COM_NEGOTIATE 0x72 +#define SMB_COM_SETUP_ANDX 0x73 +#define SMB_COM_TREE_CONNECT_ANDX 0x75 +#define SMB_COM_NT_CREATE_ANDX 0xa2 +#define SMB_COM_NO_ANDX_COMMAND 0xff + +#define SMB_WC_CLOSE 0x03 +#define SMB_WC_READ_ANDX 0x0c +#define SMB_WC_WRITE_ANDX 0x0e +#define SMB_WC_SETUP_ANDX 0x0d +#define SMB_WC_TREE_CONNECT_ANDX 0x04 +#define SMB_WC_NT_CREATE_ANDX 0x18 + +#define SMB_FLAGS_CANONICAL_PATHNAMES 0x10 +#define SMB_FLAGS_CASELESS_PATHNAMES 0x08 +#define SMB_FLAGS2_UNICODE_STRINGS 0x8000 +#define SMB_FLAGS2_IS_LONG_NAME 0x0040 +#define SMB_FLAGS2_KNOWS_LONG_NAME 0x0001 + +#define SMB_CAP_LARGE_FILES 0x08 +#define SMB_GENERIC_WRITE 0x40000000 +#define SMB_GENERIC_READ 0x80000000 +#define SMB_FILE_SHARE_ALL 0x07 +#define SMB_FILE_OPEN 0x01 +#define SMB_FILE_OVERWRITE_IF 0x05 + +#define SMB_ERR_NOACCESS 0x00050001 + +struct smb_header { + unsigned char nbt_type; + unsigned char nbt_flags; + unsigned short nbt_length; + unsigned char magic[4]; + unsigned char command; + unsigned int status; + unsigned char flags; + unsigned short flags2; + unsigned short pid_high; + unsigned char signature[8]; + unsigned short pad; + unsigned short tid; + unsigned short pid; + unsigned short uid; + unsigned short mid; +} PACK; + +struct smb_negotiate_response { + struct smb_header h; + unsigned char word_count; + unsigned short dialect_index; + unsigned char security_mode; + unsigned short max_mpx_count; + unsigned short max_number_vcs; + unsigned int max_buffer_size; + unsigned int max_raw_size; + unsigned int session_key; + unsigned int capabilities; + unsigned int system_time_low; + unsigned int system_time_high; + unsigned short server_time_zone; + unsigned char encryption_key_length; + unsigned short byte_count; + char bytes[1]; +} PACK; + +struct andx { + unsigned char command; + unsigned char pad; + unsigned short offset; +} PACK; + +struct smb_setup { + unsigned char word_count; + struct andx andx; + unsigned short max_buffer_size; + unsigned short max_mpx_count; + unsigned short vc_number; + unsigned int session_key; + unsigned short lengths[2]; + unsigned int pad; + unsigned int capabilities; + unsigned short byte_count; + char bytes[1024]; +} PACK; + +struct smb_tree_connect { + unsigned char word_count; + struct andx andx; + unsigned short flags; + unsigned short pw_len; + unsigned short byte_count; + char bytes[1024]; +} PACK; + +struct smb_nt_create { + unsigned char word_count; + struct andx andx; + unsigned char pad; + unsigned short name_length; + unsigned int flags; + unsigned int root_fid; + unsigned int access; +#ifdef HAVE_LONGLONG + unsigned long long allocation_size; +#else + unsigned __int64 allocation_size; +#endif + unsigned int ext_file_attributes; + unsigned int share_access; + unsigned int create_disposition; + unsigned int create_options; + unsigned int impersonation_level; + unsigned char security_flags; + unsigned short byte_count; + char bytes[1024]; +} PACK; + +struct smb_nt_create_response { + struct smb_header h; + unsigned char word_count; + struct andx andx; + unsigned char op_lock_level; + unsigned short fid; + unsigned int create_disposition; +#ifdef HAVE_LONGLONG + unsigned long long create_time; + unsigned long long last_access_time; + unsigned long long last_write_time; + unsigned long long last_change_time; +#else + unsigned __int64 create_time; + unsigned __int64 last_access_time; + unsigned __int64 last_write_time; + unsigned __int64 last_change_time; +#endif + unsigned int ext_file_attributes; +#ifdef HAVE_LONGLONG + unsigned long long allocation_size; + unsigned long long end_of_file; +#else + unsigned __int64 allocation_size; + unsigned __int64 end_of_file; +#endif +} PACK; + +struct smb_read { + unsigned char word_count; + struct andx andx; + unsigned short fid; + unsigned int offset; + unsigned short max_bytes; + unsigned short min_bytes; + unsigned int timeout; + unsigned short remaining; + unsigned int offset_high; + unsigned short byte_count; +} PACK; + +struct smb_write { + struct smb_header h; + unsigned char word_count; + struct andx andx; + unsigned short fid; + unsigned int offset; + unsigned int timeout; + unsigned short write_mode; + unsigned short remaining; + unsigned short pad; + unsigned short data_length; + unsigned short data_offset; + unsigned int offset_high; + unsigned short byte_count; + unsigned char pad2; +} PACK; + +struct smb_close { + unsigned char word_count; + unsigned short fid; + unsigned int last_mtime; + unsigned short byte_count; +} PACK; + +struct smb_tree_disconnect { + unsigned char word_count; + unsigned short byte_count; +} PACK; + +#if defined(_MSC_VER) || defined(__ILEC400__) +# pragma pack(pop) +#endif + +#endif /* BUILDING_CURL_SMB_C */ + +#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) + +#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) + +extern const struct Curl_handler Curl_handler_smb; +extern const struct Curl_handler Curl_handler_smbs; + +#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ + +#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */ + +#endif /* HEADER_CURL_SMB_H */ diff --git a/lib/smtp.c b/lib/smtp.c index 83fb9ec..7bd5158 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,9 +24,12 @@ * RFC3207 SMTP over TLS * RFC4422 Simple Authentication and Security Layer (SASL) * RFC4616 PLAIN authentication + * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism * RFC4954 SMTP Authentication * RFC5321 SMTP protocol - * Draft SMTP URL Interface + * RFC6749 OAuth 2.0 Authorization Framework + * Draft SMTP URL Interface + * Draft LOGIN SASL Mechanism * ***************************************************************************/ @@ -59,7 +62,6 @@ #include #include "urldata.h" #include "sendf.h" -#include "if2ip.h" #include "hostip.h" #include "progress.h" #include "transfer.h" @@ -70,7 +72,7 @@ #include "strtoofft.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" #include "strerror.h" #include "select.h" @@ -102,6 +104,11 @@ static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done); static CURLcode smtp_setup_connection(struct connectdata *conn); static CURLcode smtp_parse_url_options(struct connectdata *conn); static CURLcode smtp_parse_url_path(struct connectdata *conn); +static CURLcode smtp_parse_custom_request(struct connectdata *conn); +static CURLcode smtp_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + smtpstate *state1, smtpstate *state2); /* * SMTP protocol handler. @@ -148,7 +155,7 @@ const struct Curl_handler Curl_handler_smtps = { smtp_disconnect, /* disconnect */ ZERO_NULL, /* readwrite */ PORT_SMTPS, /* defport */ - CURLPROTO_SMTP | CURLPROTO_SMTPS, /* protocol */ + CURLPROTO_SMTPS, /* protocol */ PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NOURLQUERY /* flags */ }; @@ -161,7 +168,7 @@ const struct Curl_handler Curl_handler_smtps = { static const struct Curl_handler Curl_handler_smtp_proxy = { "SMTP", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -186,7 +193,7 @@ static const struct Curl_handler Curl_handler_smtp_proxy = { static const struct Curl_handler Curl_handler_smtps_proxy = { "SMTPS", /* scheme */ - ZERO_NULL, /* setup_connection */ + Curl_http_setup_conn, /* setup_connection */ Curl_http, /* do_it */ Curl_http_done, /* done */ ZERO_NULL, /* do_more */ @@ -217,7 +224,7 @@ static void smtp_to_smtps(struct connectdata *conn) /*********************************************************************** * - * pop3_endofresp() + * smtp_endofresp() * * Checks for an ending SMTP status code at the start of the given string, but * also detects various capabilities from the EHLO response including the @@ -228,76 +235,60 @@ static bool smtp_endofresp(struct connectdata *conn, char *line, size_t len, { struct smtp_conn *smtpc = &conn->proto.smtpc; bool result = FALSE; - size_t wordlen; + /* Nothing for us */ if(len < 4 || !ISDIGIT(line[0]) || !ISDIGIT(line[1]) || !ISDIGIT(line[2])) - return FALSE; /* Nothing for us */ - - /* Do we have a command response? */ - result = (line[3] == ' ') ? TRUE : FALSE; - if(result) + return FALSE; + + /* Do we have a command response? This should be the response code followed + by a space and optionally some text as per RFC-5321 and as outlined in + Section 4. Examples of RFC-4954 but some e-mail servers ignore this and + only send the response code instead as per Section 4.2. */ + if(line[3] == ' ' || len == 5) { + result = TRUE; *resp = curlx_sltosi(strtol(line, NULL, 10)); - /* Are we processing EHLO command data? */ - if(smtpc->state == SMTP_EHLO && (!result || (result && *resp/100 == 2))) { - line += 4; - len -= 4; - - /* Does the server support the STARTTLS capability? */ - if(len >= 8 && !memcmp(line, "STARTTLS", 8)) - smtpc->tls_supported = TRUE; - - /* Does the server support the SIZE capability? */ - else if(len >= 4 && !memcmp(line, "SIZE", 4)) - smtpc->size_supported = TRUE; - - /* Do we have the authentication mechanism list? */ - else if(len >= 5 && !memcmp(line, "AUTH ", 5)) { - line += 5; - len -= 5; - - /* Loop through the data line */ - for(;;) { - while(len && - (*line == ' ' || *line == '\t' || - *line == '\r' || *line == '\n')) { + /* Make sure real server never sends internal value */ + if(*resp == 1) + *resp = 0; + } + /* Do we have a multiline (continuation) response? */ + else if(line[3] == '-' && + (smtpc->state == SMTP_EHLO || smtpc->state == SMTP_COMMAND)) { + result = TRUE; + *resp = 1; /* Internal response code */ + } - line++; - len--; - } + return result; +} - if(!len) - break; +/*********************************************************************** + * + * smtp_get_message() + * + * Gets the authentication message from the response buffer. + */ +static void smtp_get_message(char *buffer, char** outptr) +{ + size_t len = 0; + char* message = NULL; - /* Extract the word */ - for(wordlen = 0; wordlen < len && line[wordlen] != ' ' && - line[wordlen] != '\t' && line[wordlen] != '\r' && - line[wordlen] != '\n';) - wordlen++; + /* Find the start of the message */ + for(message = buffer + 4; *message == ' ' || *message == '\t'; message++) + ; - /* Test the word for a matching authentication mechanism */ - if(wordlen == 5 && !memcmp(line, "LOGIN", 5)) - smtpc->authmechs |= SASL_MECH_LOGIN; - else if(wordlen == 5 && !memcmp(line, "PLAIN", 5)) - smtpc->authmechs |= SASL_MECH_PLAIN; - else if(wordlen == 8 && !memcmp(line, "CRAM-MD5", 8)) - smtpc->authmechs |= SASL_MECH_CRAM_MD5; - else if(wordlen == 10 && !memcmp(line, "DIGEST-MD5", 10)) - smtpc->authmechs |= SASL_MECH_DIGEST_MD5; - else if(wordlen == 6 && !memcmp(line, "GSSAPI", 6)) - smtpc->authmechs |= SASL_MECH_GSSAPI; - else if(wordlen == 8 && !memcmp(line, "EXTERNAL", 8)) - smtpc->authmechs |= SASL_MECH_EXTERNAL; - else if(wordlen == 4 && !memcmp(line, "NTLM", 4)) - smtpc->authmechs |= SASL_MECH_NTLM; + /* Find the end of the message */ + for(len = strlen(message); len--;) + if(message[len] != '\r' && message[len] != '\n' && message[len] != ' ' && + message[len] != '\t') + break; - line += wordlen; - len -= wordlen; - } - } + /* Terminate the message */ + if(++len) { + message[len] = '\0'; } - return result; + *outptr = message; } /*********************************************************************** @@ -326,7 +317,13 @@ static void state(struct connectdata *conn, smtpstate newstate) "AUTH_DIGESTMD5_RESP", "AUTH_NTLM", "AUTH_NTLM_TYPE2MSG", + "AUTH_GSSAPI", + "AUTH_GSSAPI_TOKEN", + "AUTH_GSSAPI_NO_DATA", + "AUTH_XOAUTH2", + "AUTH_CANCEL", "AUTH_FINAL", + "COMMAND", "MAIL", "RCPT", "DATA", @@ -355,10 +352,11 @@ static CURLcode smtp_perform_ehlo(struct connectdata *conn) CURLcode result = CURLE_OK; struct smtp_conn *smtpc = &conn->proto.smtpc; - smtpc->authmechs = 0; /* No known authentication mechanisms yet */ - smtpc->authused = 0; /* Clear the authentication mechanism used - for esmtp connections */ - smtpc->tls_supported = FALSE; /* Clear the TLS capability */ + smtpc->authmechs = 0; /* No known authentication mechanisms yet */ + smtpc->authused = 0; /* Clear the authentication mechanism used + for esmtp connections */ + smtpc->tls_supported = FALSE; /* Clear the TLS capability */ + smtpc->auth_supported = FALSE; /* Clear the AUTH capability */ /* Send the EHLO command */ result = Curl_pp_sendf(&smtpc->pp, "EHLO %s", smtpc->domain); @@ -440,15 +438,47 @@ static CURLcode smtp_perform_upgrade_tls(struct connectdata *conn) /*********************************************************************** * - * smtp_perform_authenticate() + * smtp_perform_auth() * - * Sends an AUTH command allowing the client to login with the appropriate - * SASL authentication mechanism. + * Sends an AUTH command allowing the client to login with the given SASL + * authentication mechanism. */ -static CURLcode smtp_perform_authenticate(struct connectdata *conn) +static CURLcode smtp_perform_auth(struct connectdata *conn, + const char *mech, + const char *initresp, size_t len, + smtpstate state1, smtpstate state2) +{ + CURLcode result = CURLE_OK; + struct smtp_conn *smtpc = &conn->proto.smtpc; + + if(initresp && 8 + strlen(mech) + len <= 512) { /* AUTH ... */ + /* Send the AUTH command with the initial response */ + result = Curl_pp_sendf(&smtpc->pp, "AUTH %s %s", mech, initresp); + + if(!result) + state(conn, state2); + } + else { + /* Send the AUTH command */ + result = Curl_pp_sendf(&smtpc->pp, "AUTH %s", mech); + + if(!result) + state(conn, state1); + } + + return result; +} + +/*********************************************************************** + * + * smtp_perform_authentication() + * + * Initiates the authentication sequence, with the appropriate SASL + * authentication mechanism. + */ +static CURLcode smtp_perform_authentication(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct SessionHandle *data = conn->data; struct smtp_conn *smtpc = &conn->proto.smtpc; const char *mech = NULL; char *initresp = NULL; @@ -456,85 +486,22 @@ static CURLcode smtp_perform_authenticate(struct connectdata *conn) smtpstate state1 = SMTP_STOP; smtpstate state2 = SMTP_STOP; - /* Check we have a username and password to authenticate with and end the - connect phase if we don't */ - if(!conn->bits.user_passwd) { + /* Check we have a username and password to authenticate with, and the + server supports authentiation, and end the connect phase if not */ + if(!conn->bits.user_passwd || !smtpc->auth_supported) { state(conn, SMTP_STOP); return result; } - /* Calculate the supported authentication mechanism, by decreasing order of - security, as well as the initial response where appropriate */ -#ifndef CURL_DISABLE_CRYPTO_AUTH - if((smtpc->authmechs & SASL_MECH_DIGEST_MD5) && - (smtpc->prefmech & SASL_MECH_DIGEST_MD5)) { - mech = "DIGEST-MD5"; - state1 = SMTP_AUTH_DIGESTMD5; - smtpc->authused = SASL_MECH_DIGEST_MD5; - } - else if((smtpc->authmechs & SASL_MECH_CRAM_MD5) && - (smtpc->prefmech & SASL_MECH_CRAM_MD5)) { - mech = "CRAM-MD5"; - state1 = SMTP_AUTH_CRAMMD5; - smtpc->authused = SASL_MECH_CRAM_MD5; - } - else -#endif -#ifdef USE_NTLM - if((smtpc->authmechs & SASL_MECH_NTLM) && - (smtpc->prefmech & SASL_MECH_NTLM)) { - mech = "NTLM"; - state1 = SMTP_AUTH_NTLM; - state2 = SMTP_AUTH_NTLM_TYPE2MSG; - smtpc->authused = SASL_MECH_NTLM; - - if(data->set.sasl_ir) - result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, - &conn->ntlm, - &initresp, &len); - } - else -#endif - if((smtpc->authmechs & SASL_MECH_LOGIN) && - (smtpc->prefmech & SASL_MECH_LOGIN)) { - mech = "LOGIN"; - state1 = SMTP_AUTH_LOGIN; - state2 = SMTP_AUTH_LOGIN_PASSWD; - smtpc->authused = SASL_MECH_LOGIN; - - if(data->set.sasl_ir) - result = Curl_sasl_create_login_message(conn->data, conn->user, - &initresp, &len); - } - else if((smtpc->authmechs & SASL_MECH_PLAIN) && - (smtpc->prefmech & SASL_MECH_PLAIN)) { - mech = "PLAIN"; - state1 = SMTP_AUTH_PLAIN; - state2 = SMTP_AUTH_FINAL; - smtpc->authused = SASL_MECH_PLAIN; - - if(data->set.sasl_ir) - result = Curl_sasl_create_plain_message(conn->data, conn->user, - conn->passwd, &initresp, &len); - } + /* Calculate the SASL login details */ + result = smtp_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); if(!result) { if(mech) { /* Perform SASL based authentication */ - if(initresp && - 8 + strlen(mech) + len <= 512) { /* AUTH ... */ - result = Curl_pp_sendf(&smtpc->pp, "AUTH %s %s", mech, initresp); - - if(!result) - state(conn, state2); - } - else { - result = Curl_pp_sendf(&smtpc->pp, "AUTH %s", mech); - - if(!result) - state(conn, state1); - } + result = smtp_perform_auth(conn, mech, initresp, len, state1, state2); Curl_safefree(initresp); } @@ -550,6 +517,35 @@ static CURLcode smtp_perform_authenticate(struct connectdata *conn) /*********************************************************************** * + * smtp_perform_command() + * + * Sends a SMTP based command. + */ +static CURLcode smtp_perform_command(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct SMTP *smtp = data->req.protop; + + /* Send the command */ + if(smtp->rcpt) + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s", + smtp->custom && smtp->custom[0] != '\0' ? + smtp->custom : "VRFY", + smtp->rcpt->data); + else + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", + smtp->custom && smtp->custom[0] != '\0' ? + smtp->custom : "HELP"); + + if(!result) + state(conn, SMTP_COMMAND); + + return result; +} + +/*********************************************************************** + * * smtp_perform_mail() * * Sends an MAIL command to initiate the upload of a message. @@ -590,8 +586,8 @@ static CURLcode smtp_perform_mail(struct connectdata *conn) } /* Calculate the optional SIZE parameter */ - if(conn->proto.smtpc.size_supported && conn->data->set.infilesize > 0) { - size = aprintf("%" FORMAT_OFF_T, data->set.infilesize); + if(conn->proto.smtpc.size_supported && conn->data->state.infilesize > 0) { + size = aprintf("%" CURL_FORMAT_CURL_OFF_T, data->state.infilesize); if(!size) { Curl_safefree(from); @@ -636,19 +632,17 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; + struct SMTP *smtp = data->req.protop; /* Send the RCPT TO command */ - if(smtp->rcpt) { - if(smtp->rcpt->data[0] == '<') - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", - smtp->rcpt->data); - else - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>", - smtp->rcpt->data); - if(!result) - state(conn, SMTP_RCPT); - } + if(smtp->rcpt->data[0] == '<') + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", + smtp->rcpt->data); + else + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>", + smtp->rcpt->data); + if(!result) + state(conn, SMTP_RCPT); return result; } @@ -708,7 +702,7 @@ static CURLcode smtp_state_starttls_resp(struct connectdata *conn, result = CURLE_USE_SSL_FAILED; } else - result = smtp_perform_authenticate(conn); + result = smtp_perform_authentication(conn); } else result = smtp_perform_upgrade_tls(conn); @@ -723,33 +717,100 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode, CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; struct smtp_conn *smtpc = &conn->proto.smtpc; + const char *line = data->state.buffer; + size_t len = strlen(line); + size_t wordlen; (void)instate; /* no use for this yet */ - if(smtpcode/100 != 2) { - if((data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use) && - !conn->bits.user_passwd) + if(smtpcode/100 != 2 && smtpcode != 1) { + if(data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use) result = smtp_perform_helo(conn); else { failf(data, "Remote access denied: %d", smtpcode); result = CURLE_REMOTE_ACCESS_DENIED; } } - else if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) { - /* We don't have a SSL/TLS connection yet, but SSL is requested */ - if(smtpc->tls_supported) - /* Switch to TLS connection now */ - result = smtp_perform_starttls(conn); - else if(data->set.use_ssl == CURLUSESSL_TRY) - /* Fallback and carry on with authentication */ - result = smtp_perform_authenticate(conn); - else { - failf(data, "STARTTLS not supported."); - result = CURLE_USE_SSL_FAILED; + else { + line += 4; + len -= 4; + + /* Does the server support the STARTTLS capability? */ + if(len >= 8 && !memcmp(line, "STARTTLS", 8)) + smtpc->tls_supported = TRUE; + + /* Does the server support the SIZE capability? */ + else if(len >= 4 && !memcmp(line, "SIZE", 4)) + smtpc->size_supported = TRUE; + + /* Does the server support authentication? */ + else if(len >= 5 && !memcmp(line, "AUTH ", 5)) { + smtpc->auth_supported = TRUE; + + /* Advance past the AUTH keyword */ + line += 5; + len -= 5; + + /* Loop through the data line */ + for(;;) { + while(len && + (*line == ' ' || *line == '\t' || + *line == '\r' || *line == '\n')) { + + line++; + len--; + } + + if(!len) + break; + + /* Extract the word */ + for(wordlen = 0; wordlen < len && line[wordlen] != ' ' && + line[wordlen] != '\t' && line[wordlen] != '\r' && + line[wordlen] != '\n';) + wordlen++; + + /* Test the word for a matching authentication mechanism */ + if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_LOGIN)) + smtpc->authmechs |= SASL_MECH_LOGIN; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_PLAIN)) + smtpc->authmechs |= SASL_MECH_PLAIN; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_CRAM_MD5)) + smtpc->authmechs |= SASL_MECH_CRAM_MD5; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_DIGEST_MD5)) + smtpc->authmechs |= SASL_MECH_DIGEST_MD5; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_GSSAPI)) + smtpc->authmechs |= SASL_MECH_GSSAPI; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_EXTERNAL)) + smtpc->authmechs |= SASL_MECH_EXTERNAL; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_NTLM)) + smtpc->authmechs |= SASL_MECH_NTLM; + else if(sasl_mech_equal(line, wordlen, SASL_MECH_STRING_XOAUTH2)) + smtpc->authmechs |= SASL_MECH_XOAUTH2; + + line += wordlen; + len -= wordlen; + } + } + + if(smtpcode != 1) { + if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) { + /* We don't have a SSL/TLS connection yet, but SSL is requested */ + if(smtpc->tls_supported) + /* Switch to TLS connection now */ + result = smtp_perform_starttls(conn); + else if(data->set.use_ssl == CURLUSESSL_TRY) + /* Fallback and carry on with authentication */ + result = smtp_perform_authentication(conn); + else { + failf(data, "STARTTLS not supported."); + result = CURLE_USE_SSL_FAILED; + } + } + else + result = smtp_perform_authentication(conn); } } - else - result = smtp_perform_authenticate(conn); return result; } @@ -794,20 +855,17 @@ static CURLcode smtp_state_auth_plain_resp(struct connectdata *conn, /* Create the authorisation message */ result = Curl_sasl_create_plain_message(conn->data, conn->user, conn->passwd, &plainauth, &len); + if(!result && plainauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", plainauth); - /* Send the message */ - if(!result) { - if(plainauth) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", plainauth); - - if(!result) - state(conn, SMTP_AUTH_FINAL); - } - - Curl_safefree(plainauth); + if(!result) + state(conn, SMTP_AUTH_FINAL); } } + Curl_safefree(plainauth); + return result; } @@ -831,20 +889,17 @@ static CURLcode smtp_state_auth_login_resp(struct connectdata *conn, /* Create the user message */ result = Curl_sasl_create_login_message(conn->data, conn->user, &authuser, &len); + if(!result && authuser) { + /* Send the user */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authuser); - /* Send the user */ - if(!result) { - if(authuser) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authuser); - - if(!result) - state(conn, SMTP_AUTH_LOGIN_PASSWD); - } - - Curl_safefree(authuser); + if(!result) + state(conn, SMTP_AUTH_LOGIN_PASSWD); } } + Curl_safefree(authuser); + return result; } @@ -868,20 +923,17 @@ static CURLcode smtp_state_auth_login_password_resp(struct connectdata *conn, /* Create the password message */ result = Curl_sasl_create_login_message(conn->data, conn->passwd, &authpasswd, &len); + if(!result && authpasswd) { + /* Send the password */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authpasswd); - /* Send the password */ - if(!result) { - if(authpasswd) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", authpasswd); - - if(!result) - state(conn, SMTP_AUTH_FINAL); - } - - Curl_safefree(authpasswd); + if(!result) + state(conn, SMTP_AUTH_FINAL); } } + Curl_safefree(authpasswd); + return result; } @@ -893,9 +945,10 @@ static CURLcode smtp_state_auth_cram_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg = NULL; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -904,38 +957,34 @@ static CURLcode smtp_state_auth_cram_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 4; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + smtp_get_message(data->state.buffer, &chlg64); - /* Terminate the challenge */ - if(*chlg64 != '=') { - for(len = strlen(chlg64); len--;) - if(chlg64[len] != '\r' && chlg64[len] != '\n' && chlg64[len] != ' ' && - chlg64[len] != '\t') - break; + /* Decode the challenge message */ + result = Curl_sasl_decode_cram_md5_message(chlg64, &chlg, &len); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*"); - if(++len) { - chlg64[len] = '\0'; - } + if(!result) + state(conn, SMTP_AUTH_CANCEL); } - - /* Create the response message */ - result = Curl_sasl_create_cram_md5_message(data, chlg64, conn->user, - conn->passwd, &rplyb64, &len); - - /* Send the response */ - if(!result) { - if(rplyb64) { + else { + /* Create the response message */ + result = Curl_sasl_create_cram_md5_message(data, chlg, conn->user, + conn->passwd, &rplyb64, &len); + if(!result && rplyb64) { + /* Send the response */ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64); if(!result) state(conn, SMTP_AUTH_FINAL); } - - Curl_safefree(rplyb64); } + Curl_safefree(chlg); + Curl_safefree(rplyb64); + return result; } @@ -946,9 +995,9 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *chlg64 = data->state.buffer; - size_t len = 0; + char *chlg64 = NULL; char *rplyb64 = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ @@ -957,67 +1006,309 @@ static CURLcode smtp_state_auth_digest_resp(struct connectdata *conn, return CURLE_LOGIN_DENIED; } - /* Get the challenge */ - for(chlg64 += 4; *chlg64 == ' ' || *chlg64 == '\t'; chlg64++) - ; + /* Get the challenge message */ + smtp_get_message(data->state.buffer, &chlg64); /* Create the response message */ - result = Curl_sasl_create_digest_md5_message(data, chlg64, conn->user, - conn->passwd, "smtp", - &rplyb64, &len); + result = Curl_sasl_create_digest_md5_message(data, chlg64, + conn->user, conn->passwd, + "smtp", &rplyb64, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*"); - /* Send the response */ - if(!result) { - if(rplyb64) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64); + if(!result) + state(conn, SMTP_AUTH_CANCEL); + } + } + else { + /* Send the response */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", rplyb64); + + if(!result) + state(conn, SMTP_AUTH_DIGESTMD5_RESP); + } + + Curl_safefree(rplyb64); + + return result; +} + +/* For AUTH DIGEST-MD5 challenge-response responses */ +static CURLcode smtp_state_auth_digest_resp_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + + (void)instate; /* no use for this yet */ + + if(smtpcode != 334) { + failf(data, "Authentication failed: %d", smtpcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Send an empty response */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", ""); + + if(!result) + state(conn, SMTP_AUTH_FINAL); + } + + return result; +} + +#endif + +#ifdef USE_NTLM +/* For AUTH NTLM (without initial response) responses */ +static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + char *type1msg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(smtpcode != 334) { + failf(data, "Access denied: %d", smtpcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the type-1 message */ + result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, + &conn->ntlm, + &type1msg, &len); + if(!result && type1msg) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type1msg); + + if(!result) + state(conn, SMTP_AUTH_NTLM_TYPE2MSG); + } + } + + Curl_safefree(type1msg); + + return result; +} + +/* For NTLM type-2 responses (sent in reponse to our type-1 message) */ +static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + char *type2msg = NULL; + char *type3msg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(smtpcode != 334) { + failf(data, "Access denied: %d", smtpcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the type-2 message */ + smtp_get_message(data->state.buffer, &type2msg); + + /* Decode the type-2 message */ + result = Curl_sasl_decode_ntlm_type2_message(data, type2msg, &conn->ntlm); + if(result) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*"); + + if(!result) + state(conn, SMTP_AUTH_CANCEL); + } + else { + /* Create the type-3 message */ + result = Curl_sasl_create_ntlm_type3_message(data, conn->user, + conn->passwd, &conn->ntlm, + &type3msg, &len); + if(!result && type3msg) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type3msg); + + if(!result) + state(conn, SMTP_AUTH_FINAL); + } + } + } + + Curl_safefree(type3msg); + + return result; +} +#endif + +#if defined(USE_KERBEROS5) +/* For AUTH GSSAPI (without initial response) responses */ +static CURLcode smtp_state_auth_gssapi_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct smtp_conn *smtpc = &conn->proto.smtpc; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(smtpcode != 334) { + failf(data, "Access denied: %d", smtpcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Create the initial response message */ + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "smtp", + smtpc->mutual_auth, NULL, + &conn->krb5, + &respmsg, &len); + if(!result && respmsg) { + /* Send the message */ + result = Curl_pp_sendf(&smtpc->pp, "%s", respmsg); + + if(!result) + state(conn, SMTP_AUTH_GSSAPI_TOKEN); + } + } + + Curl_safefree(respmsg); + + return result; +} + +/* For AUTH GSSAPI user token responses */ +static CURLcode smtp_state_auth_gssapi_token_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct smtp_conn *smtpc = &conn->proto.smtpc; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; + + (void)instate; /* no use for this yet */ + + if(smtpcode != 334) { + failf(data, "Access denied: %d", smtpcode); + result = CURLE_LOGIN_DENIED; + } + else { + /* Get the challenge message */ + smtp_get_message(data->state.buffer, &chlgmsg); + + if(smtpc->mutual_auth) + /* Decode the user token challenge and create the optional response + message */ + result = Curl_sasl_create_gssapi_user_message(data, NULL, NULL, NULL, + smtpc->mutual_auth, + chlgmsg, &conn->krb5, + &respmsg, &len); + else + /* Decode the security challenge and create the response message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&smtpc->pp, "%s", "*"); + + if(!result) + state(conn, SMTP_AUTH_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) + result = Curl_pp_sendf(&smtpc->pp, "%s", respmsg); + else + result = Curl_pp_sendf(&smtpc->pp, "%s", ""); if(!result) - state(conn, SMTP_AUTH_DIGESTMD5_RESP); + state(conn, (smtpc->mutual_auth ? SMTP_AUTH_GSSAPI_NO_DATA : + SMTP_AUTH_FINAL)); } - - Curl_safefree(rplyb64); } + Curl_safefree(respmsg); + return result; } -/* For AUTH DIGEST-MD5 challenge-response responses */ -static CURLcode smtp_state_auth_digest_resp_resp(struct connectdata *conn, - int smtpcode, - smtpstate instate) +/* For AUTH GSSAPI no data responses */ +static CURLcode smtp_state_auth_gssapi_no_data_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; + char *chlgmsg = NULL; + char *respmsg = NULL; + size_t len = 0; (void)instate; /* no use for this yet */ if(smtpcode != 334) { - failf(data, "Authentication failed: %d", smtpcode); + failf(data, "Access denied: %d", smtpcode); result = CURLE_LOGIN_DENIED; } else { - /* Send an empty response */ - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", ""); + /* Get the challenge message */ + smtp_get_message(data->state.buffer, &chlgmsg); + + /* Decode the security challenge and create the response message */ + result = Curl_sasl_create_gssapi_security_message(data, chlgmsg, + &conn->krb5, + &respmsg, &len); + if(result) { + if(result == CURLE_BAD_CONTENT_ENCODING) { + /* Send the cancellation */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "*"); - if(!result) - state(conn, SMTP_AUTH_FINAL); + if(!result) + state(conn, SMTP_AUTH_CANCEL); + } + } + else { + /* Send the response */ + if(respmsg) { + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", respmsg); + + if(!result) + state(conn, SMTP_AUTH_FINAL); + } + } } + Curl_safefree(respmsg); + return result; } - #endif -#ifdef USE_NTLM -/* For AUTH NTLM (without initial response) responses */ -static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn, - int smtpcode, - smtpstate instate) +/* For AUTH XOAUTH2 (without initial response) responses */ +static CURLcode smtp_state_auth_xoauth2_resp(struct connectdata *conn, + int smtpcode, smtpstate instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *type1msg = NULL; size_t len = 0; + char *xoauth = NULL; (void)instate; /* no use for this yet */ @@ -1026,69 +1317,67 @@ static CURLcode smtp_state_auth_ntlm_resp(struct connectdata *conn, result = CURLE_LOGIN_DENIED; } else { - /* Create the type-1 message */ - result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, - &conn->ntlm, - &type1msg, &len); - - /* Send the message */ - if(!result) { - if(type1msg) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type1msg); - - if(!result) - state(conn, SMTP_AUTH_NTLM_TYPE2MSG); - } + /* Create the authorisation message */ + result = Curl_sasl_create_xoauth2_message(conn->data, conn->user, + conn->xoauth2_bearer, + &xoauth, &len); + if(!result && xoauth) { + /* Send the message */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", xoauth); - Curl_safefree(type1msg); + if(!result) + state(conn, SMTP_AUTH_FINAL); } } + Curl_safefree(xoauth); + return result; } -/* For NTLM type-2 responses (sent in reponse to our type-1 message) */ -static CURLcode smtp_state_auth_ntlm_type2msg_resp(struct connectdata *conn, - int smtpcode, - smtpstate instate) +/* For AUTH cancellation responses */ +static CURLcode smtp_state_auth_cancel_resp(struct connectdata *conn, + int smtpcode, + smtpstate instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - char *type3msg = NULL; + struct smtp_conn *smtpc = &conn->proto.smtpc; + const char *mech = NULL; + char *initresp = NULL; size_t len = 0; + smtpstate state1 = SMTP_STOP; + smtpstate state2 = SMTP_STOP; + (void)smtpcode; (void)instate; /* no use for this yet */ - if(smtpcode != 334) { - failf(data, "Access denied: %d", smtpcode); - result = CURLE_LOGIN_DENIED; - } - else { - /* Create the type-3 message */ - result = Curl_sasl_create_ntlm_type3_message(data, - data->state.buffer + 4, - conn->user, conn->passwd, - &conn->ntlm, - &type3msg, &len); + /* Remove the offending mechanism from the supported list */ + smtpc->authmechs ^= smtpc->authused; - /* Send the message */ - if(!result) { - if(type3msg) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", type3msg); + /* Calculate alternative SASL login details */ + result = smtp_calc_sasl_details(conn, &mech, &initresp, &len, &state1, + &state2); - if(!result) - state(conn, SMTP_AUTH_FINAL); - } + if(!result) { + /* Do we have any mechanisms left? */ + if(mech) { + /* Retry SASL based authentication */ + result = smtp_perform_auth(conn, mech, initresp, len, state1, state2); + + Curl_safefree(initresp); + } + else { + failf(data, "Authentication cancelled"); - Curl_safefree(type3msg); + result = CURLE_LOGIN_DENIED; } } return result; } -#endif -/* For the final responses to the AUTH sequence */ +/* For final responses in the AUTH sequence */ static CURLcode smtp_state_auth_final_resp(struct connectdata *conn, int smtpcode, smtpstate instate) @@ -1109,26 +1398,68 @@ static CURLcode smtp_state_auth_final_resp(struct connectdata *conn, return result; } +/* For command responses */ +static CURLcode smtp_state_command_resp(struct connectdata *conn, int smtpcode, + smtpstate instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct SMTP *smtp = data->req.protop; + char *line = data->state.buffer; + size_t len = strlen(line); + + (void)instate; /* no use for this yet */ + + if((smtp->rcpt && smtpcode/100 != 2 && smtpcode != 553 && smtpcode != 1) || + (!smtp->rcpt && smtpcode/100 != 2 && smtpcode != 1)) { + failf(data, "Command failed: %d", smtpcode); + result = CURLE_RECV_ERROR; + } + else { + /* Temporarily add the LF character back and send as body to the client */ + if(!data->set.opt_no_body) { + line[len] = '\n'; + result = Curl_client_write(conn, CLIENTWRITE_BODY, line, len + 1); + line[len] = '\0'; + } + + if(smtpcode != 1) { + if(smtp->rcpt) { + smtp->rcpt = smtp->rcpt->next; + + if(smtp->rcpt) { + /* Send the next command */ + result = smtp_perform_command(conn); + } + else + /* End of DO phase */ + state(conn, SMTP_STOP); + } + else + /* End of DO phase */ + state(conn, SMTP_STOP); + } + } + + return result; +} + /* For MAIL responses */ static CURLcode smtp_state_mail_resp(struct connectdata *conn, int smtpcode, smtpstate instate) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; (void)instate; /* no use for this yet */ if(smtpcode/100 != 2) { failf(data, "MAIL failed: %d", smtpcode); result = CURLE_SEND_ERROR; - state(conn, SMTP_STOP); } - else { - smtp->rcpt = data->set.mail_rcpt; - + else + /* Start the RCPT TO command */ result = smtp_perform_rcpt_to(conn); - } return result; } @@ -1139,30 +1470,27 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, int smtpcode, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; + struct SMTP *smtp = data->req.protop; (void)instate; /* no use for this yet */ if(smtpcode/100 != 2) { failf(data, "RCPT failed: %d", smtpcode); result = CURLE_SEND_ERROR; - state(conn, SMTP_STOP); } else { - if(smtp->rcpt) { - smtp->rcpt = smtp->rcpt->next; + smtp->rcpt = smtp->rcpt->next; + + if(smtp->rcpt) + /* Send the next RCPT TO command */ result = smtp_perform_rcpt_to(conn); + else { + /* Send the DATA command */ + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA"); - /* If we failed or still are sending RCPT data then return */ - if(result || smtp->rcpt) - return result; + if(!result) + state(conn, SMTP_DATA); } - - /* Send the DATA command */ - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA"); - - if(!result) - state(conn, SMTP_DATA); } return result; @@ -1172,25 +1500,27 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, int smtpcode, static CURLcode smtp_state_data_resp(struct connectdata *conn, int smtpcode, smtpstate instate) { + CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; (void)instate; /* no use for this yet */ if(smtpcode != 354) { - state(conn, SMTP_STOP); - return CURLE_SEND_ERROR; + failf(data, "DATA failed: %d", smtpcode); + result = CURLE_SEND_ERROR; } + else { + /* Set the progress upload size */ + Curl_pgrsSetUploadSize(data, data->state.infilesize); - /* Set the progress upload size */ - Curl_pgrsSetUploadSize(data, data->set.infilesize); - - /* SMTP upload */ - Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); + /* SMTP upload */ + Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); - /* End of DO phase */ - state(conn, SMTP_STOP); + /* End of DO phase */ + state(conn, SMTP_STOP); + } - return CURLE_OK; + return result; } /* For POSTDATA responses, which are received after the entire DATA @@ -1230,16 +1560,19 @@ static CURLcode smtp_statemach_act(struct connectdata *conn) if(pp->sendleft) return Curl_pp_flushsend(pp); - /* Read the response from the server */ - result = Curl_pp_readresp(sock, pp, &smtpcode, &nread); - if(result) - return result; + do { + /* Read the response from the server */ + result = Curl_pp_readresp(sock, pp, &smtpcode, &nread); + if(result) + return result; - /* Store the latest response for later retrieval */ - if(smtpc->state != SMTP_QUIT) - data->info.httpcode = smtpcode; + /* Store the latest response for later retrieval if necessary */ + if(smtpc->state != SMTP_QUIT && smtpcode != 1) + data->info.httpcode = smtpcode; + + if(!smtpcode) + break; - if(smtpcode) { /* We have now received a full SMTP server response */ switch(smtpc->state) { case SMTP_SERVERGREET: @@ -1296,10 +1629,37 @@ static CURLcode smtp_statemach_act(struct connectdata *conn) break; #endif +#if defined(USE_KERBEROS5) + case SMTP_AUTH_GSSAPI: + result = smtp_state_auth_gssapi_resp(conn, smtpcode, smtpc->state); + break; + + case SMTP_AUTH_GSSAPI_TOKEN: + result = smtp_state_auth_gssapi_token_resp(conn, smtpcode, smtpc->state); + break; + + case SMTP_AUTH_GSSAPI_NO_DATA: + result = smtp_state_auth_gssapi_no_data_resp(conn, smtpcode, + smtpc->state); + break; +#endif + + case SMTP_AUTH_XOAUTH2: + result = smtp_state_auth_xoauth2_resp(conn, smtpcode, smtpc->state); + break; + + case SMTP_AUTH_CANCEL: + result = smtp_state_auth_cancel_resp(conn, smtpcode, smtpc->state); + break; + case SMTP_AUTH_FINAL: result = smtp_state_auth_final_resp(conn, smtpcode, smtpc->state); break; + case SMTP_COMMAND: + result = smtp_state_command_resp(conn, smtpcode, smtpc->state); + break; + case SMTP_MAIL: result = smtp_state_mail_resp(conn, smtpcode, smtpc->state); break; @@ -1323,7 +1683,7 @@ static CURLcode smtp_statemach_act(struct connectdata *conn) state(conn, SMTP_STOP); break; } - } + } while(!result && smtpc->state != SMTP_STOP && Curl_pp_moredata(pp)); return result; } @@ -1334,11 +1694,13 @@ static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done) CURLcode result = CURLE_OK; struct smtp_conn *smtpc = &conn->proto.smtpc; - if((conn->handler->flags & PROTOPT_SSL) && !smtpc->ssldone) + if((conn->handler->flags & PROTOPT_SSL) && !smtpc->ssldone) { result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone); - else - result = Curl_pp_statemach(&smtpc->pp, FALSE); + if(result || !smtpc->ssldone) + return result; + } + result = Curl_pp_statemach(&smtpc->pp, FALSE); *done = (smtpc->state == SMTP_STOP) ? TRUE : FALSE; return result; @@ -1361,13 +1723,11 @@ static CURLcode smtp_init(struct connectdata *conn) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; + struct SMTP *smtp; - if(!smtp) { - smtp = data->state.proto.smtp = calloc(sizeof(struct SMTP), 1); - if(!smtp) - result = CURLE_OUT_OF_MEMORY; - } + smtp = data->req.protop = calloc(sizeof(struct SMTP), 1); + if(!smtp) + result = CURLE_OUT_OF_MEMORY; return result; } @@ -1397,17 +1757,8 @@ static CURLcode smtp_connect(struct connectdata *conn, bool *done) *done = FALSE; /* default to not done yet */ - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - /* Initialise the SMTP layer */ - result = smtp_init(conn); - if(result) - return result; - /* We always support persistent connections in SMTP */ - conn->bits.close = FALSE; + connkeep(conn, "SMTP default"); /* Set the default response time-out */ pp->response_time = RESP_TIMEOUT; @@ -1453,15 +1804,15 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; + struct SMTP *smtp = data->req.protop; struct pingpong *pp = &conn->proto.smtpc.pp; - const char *eob; + char *eob; ssize_t len; ssize_t bytes_written; (void)premature; - if(!smtp) + if(!smtp || !pp->conn) /* When the easy handle is removed from the multi interface while libcurl is still trying to resolve the host name, the SMTP struct is not yet initialized. However, the removal action calls Curl_done() which in @@ -1469,36 +1820,51 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status, return CURLE_OK; if(status) { - conn->bits.close = TRUE; /* marked for closure */ + connclose(conn, "SMTP done with bad status"); /* marked for closure */ result = status; /* use the already set error code */ } - else if(!data->set.connect_only) { + else if(!data->set.connect_only && data->set.upload && data->set.mail_rcpt) { /* Calculate the EOB taking into account any terminating CRLF from the previous line of the email or the CRLF of the DATA command when there - is "no mail data". RFC-5321, sect. 4.1.1.4. */ - eob = SMTP_EOB; - len = SMTP_EOB_LEN; - if(smtp->trailing_crlf || !conn->data->set.infilesize) { - eob += 2; - len -= 2; + is "no mail data". RFC-5321, sect. 4.1.1.4. + + Note: As some SSL backends, such as OpenSSL, will cause Curl_write() to + fail when using a different pointer following a previous write, that + returned CURLE_AGAIN, we duplicate the EOB now rather than when the + bytes written doesn't equal len. */ + if(smtp->trailing_crlf || !conn->data->state.infilesize) { + eob = strdup(SMTP_EOB + 2); + len = SMTP_EOB_LEN - 2; + } + else { + eob = strdup(SMTP_EOB); + len = SMTP_EOB_LEN; } + if(!eob) + return CURLE_OUT_OF_MEMORY; + /* Send the end of block data */ result = Curl_write(conn, conn->writesockfd, eob, len, &bytes_written); - if(result) + if(result) { + free(eob); return result; + } if(bytes_written != len) { /* The whole chunk was not sent so keep it around and adjust the pingpong structure accordingly */ - pp->sendthis = strdup(eob); + pp->sendthis = eob; pp->sendsize = len; pp->sendleft = len - bytes_written; } - else + else { /* Successfully sent so adjust the response timeout relative to now */ pp->response = Curl_tvnow(); + free(eob); + } + state(conn, SMTP_POSTDATA); /* Run the state-machine @@ -1511,6 +1877,9 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status, result = smtp_block_statemach(conn); } + /* Cleanup our per-request based variables */ + Curl_safefree(smtp->custom); + /* Clear the transfer mode for the next request */ smtp->transfer = FTPTRANSFER_BODY; @@ -1521,31 +1890,41 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status, * * smtp_perform() * - * This is the actual DO function for SMTP. Send a mail according to the - * options previously setup. + * This is the actual DO function for SMTP. Transfer a mail, send a command + * or get some data according to the options previously setup. */ static CURLcode smtp_perform(struct connectdata *conn, bool *connected, bool *dophase_done) { /* This is SMTP and no proxy */ CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct SMTP *smtp = data->req.protop; DEBUGF(infof(conn->data, "DO phase starts\n")); - if(conn->data->set.opt_no_body) { + if(data->set.opt_no_body) { /* Requested no body means no transfer */ - struct SMTP *smtp = conn->data->state.proto.smtp; smtp->transfer = FTPTRANSFER_INFO; } *dophase_done = FALSE; /* not done yet */ + /* Store the first recipient (or NULL if not specified) */ + smtp->rcpt = data->set.mail_rcpt; + /* Start the first command in the DO phase */ - result = smtp_perform_mail(conn); + if(data->set.upload && data->set.mail_rcpt) + /* MAIL transfer */ + result = smtp_perform_mail(conn); + else + /* SMTP based command (VRFY, EXPN, NOOP, RSET or HELP) */ + result = smtp_perform_command(conn); + if(result) return result; - /* run the state-machine */ + /* Run the state-machine */ result = smtp_multi_statemach(conn, dophase_done); *connected = conn->bits.tcpconnect[FIRSTSOCKET]; @@ -1571,12 +1950,8 @@ static CURLcode smtp_do(struct connectdata *conn, bool *done) *done = FALSE; /* default to false */ - /* Since connections can be re-used between SessionHandles, there might be a - connection already existing but on a fresh SessionHandle struct. As such - we make sure we have a good SMTP struct to play with. For new connections - the SMTP struct is allocated and setup in the smtp_connect() function. */ - Curl_reset_reqproto(conn); - result = smtp_init(conn); + /* Parse the custom request */ + result = smtp_parse_custom_request(conn); if(result) return result; @@ -1592,8 +1967,7 @@ static CURLcode smtp_do(struct connectdata *conn, bool *done) * Disconnect from an SMTP server. Cleanup protocol-specific per-connection * resources. BLOCKING. */ -static CURLcode smtp_disconnect(struct connectdata *conn, - bool dead_connection) +static CURLcode smtp_disconnect(struct connectdata *conn, bool dead_connection) { struct smtp_conn *smtpc = &conn->proto.smtpc; @@ -1603,7 +1977,7 @@ static CURLcode smtp_disconnect(struct connectdata *conn, /* The SMTP session may or may not have been allocated/setup at this point! */ - if(!dead_connection && smtpc->pp.conn) + if(!dead_connection && smtpc->pp.conn && smtpc->pp.conn->bits.protoconnstart) if(!smtp_perform_quit(conn)) (void)smtp_block_statemach(conn); /* ignore errors on QUIT */ @@ -1622,7 +1996,7 @@ static CURLcode smtp_disconnect(struct connectdata *conn, /* Call this when the DO phase has completed */ static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected) { - struct SMTP *smtp = conn->data->state.proto.smtp; + struct SMTP *smtp = conn->data->req.protop; (void)connected; @@ -1671,8 +2045,8 @@ static CURLcode smtp_regular_transfer(struct connectdata *conn, /* Set the progress data */ Curl_pgrsSetUploadCounter(data, 0); Curl_pgrsSetDownloadCounter(data, 0); - Curl_pgrsSetUploadSize(data, 0); - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetUploadSize(data, -1); + Curl_pgrsSetDownloadSize(data, -1); /* Carry out the perform */ result = smtp_perform(conn, &connected, dophase_done); @@ -1687,6 +2061,7 @@ static CURLcode smtp_regular_transfer(struct connectdata *conn, static CURLcode smtp_setup_connection(struct connectdata *conn) { struct SessionHandle *data = conn->data; + CURLcode result; if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) { /* Unless we have asked to tunnel SMTP operations through the proxy, we @@ -1702,17 +2077,20 @@ static CURLcode smtp_setup_connection(struct connectdata *conn) return CURLE_UNSUPPORTED_PROTOCOL; #endif } + /* set it up as a HTTP connection instead */ + return conn->handler->setup_connection(conn); - /* We explicitly mark this connection as persistent here as we're doing - SMTP over HTTP and thus we accidentally avoid setting this value - otherwise */ - conn->bits.close = FALSE; #else failf(data, "SMTP over http proxy requires HTTP support built-in!"); return CURLE_UNSUPPORTED_PROTOCOL; #endif } + /* Initialise the SMTP layer */ + result = smtp_init(conn); + if(result) + return result; + data->state.path++; /* don't include the initial slash */ return CURLE_OK; @@ -1730,32 +2108,47 @@ static CURLcode smtp_parse_url_options(struct connectdata *conn) struct smtp_conn *smtpc = &conn->proto.smtpc; const char *options = conn->options; const char *ptr = options; + bool reset = TRUE; - if(options) { + while(ptr && *ptr) { const char *key = ptr; while(*ptr && *ptr != '=') ptr++; if(strnequal(key, "AUTH", 4)) { - const char *value = ptr + 1; + size_t len = 0; + const char *value = ++ptr; - if(strequal(value, "*")) - smtpc->prefmech = SASL_AUTH_ANY; - else if(strequal(value, "LOGIN")) - smtpc->prefmech = SASL_MECH_LOGIN; - else if(strequal(value, "PLAIN")) - smtpc->prefmech = SASL_MECH_PLAIN; - else if(strequal(value, "CRAM-MD5")) - smtpc->prefmech = SASL_MECH_CRAM_MD5; - else if(strequal(value, "DIGEST-MD5")) - smtpc->prefmech = SASL_MECH_DIGEST_MD5; - else if(strequal(value, "GSSAPI")) - smtpc->prefmech = SASL_MECH_GSSAPI; - else if(strequal(value, "NTLM")) - smtpc->prefmech = SASL_MECH_NTLM; - else + if(reset) { + reset = FALSE; smtpc->prefmech = SASL_AUTH_NONE; + } + + while(*ptr && *ptr != ';') { + ptr++; + len++; + } + + if(strnequal(value, "*", len)) + smtpc->prefmech = SASL_AUTH_ANY; + else if(strnequal(value, SASL_MECH_STRING_LOGIN, len)) + smtpc->prefmech |= SASL_MECH_LOGIN; + else if(strnequal(value, SASL_MECH_STRING_PLAIN, len)) + smtpc->prefmech |= SASL_MECH_PLAIN; + else if(strnequal(value, SASL_MECH_STRING_CRAM_MD5, len)) + smtpc->prefmech |= SASL_MECH_CRAM_MD5; + else if(strnequal(value, SASL_MECH_STRING_DIGEST_MD5, len)) + smtpc->prefmech |= SASL_MECH_DIGEST_MD5; + else if(strnequal(value, SASL_MECH_STRING_GSSAPI, len)) + smtpc->prefmech |= SASL_MECH_GSSAPI; + else if(strnequal(value, SASL_MECH_STRING_NTLM, len)) + smtpc->prefmech |= SASL_MECH_NTLM; + else if(strnequal(value, SASL_MECH_STRING_XOAUTH2, len)) + smtpc->prefmech |= SASL_MECH_XOAUTH2; + + if(*ptr == ';') + ptr++; } else result = CURLE_URL_MALFORMAT; @@ -1790,7 +2183,131 @@ static CURLcode smtp_parse_url_path(struct connectdata *conn) return Curl_urldecode(conn->data, path, 0, &smtpc->domain, NULL, TRUE); } -CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) +/*********************************************************************** + * + * smtp_parse_custom_request() + * + * Parse the custom request. + */ +static CURLcode smtp_parse_custom_request(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct SMTP *smtp = data->req.protop; + const char *custom = data->set.str[STRING_CUSTOMREQUEST]; + + /* URL decode the custom request */ + if(custom) + result = Curl_urldecode(data, custom, 0, &smtp->custom, NULL, TRUE); + + return result; +} + +/*********************************************************************** + * + * smtp_calc_sasl_details() + * + * Calculate the required login details for SASL authentication. + */ +static CURLcode smtp_calc_sasl_details(struct connectdata *conn, + const char **mech, + char **initresp, size_t *len, + smtpstate *state1, smtpstate *state2) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct smtp_conn *smtpc = &conn->proto.smtpc; + + /* Calculate the supported authentication mechanism, by decreasing order of + security, as well as the initial response where appropriate */ +#if defined(USE_KERBEROS5) + if((smtpc->authmechs & SASL_MECH_GSSAPI) && + (smtpc->prefmech & SASL_MECH_GSSAPI)) { + smtpc->mutual_auth = FALSE; /* TODO: Calculate mutual authentication */ + + *mech = SASL_MECH_STRING_GSSAPI; + *state1 = SMTP_AUTH_GSSAPI; + *state2 = SMTP_AUTH_GSSAPI_TOKEN; + smtpc->authused = SASL_MECH_GSSAPI; + + if(data->set.sasl_ir) + result = Curl_sasl_create_gssapi_user_message(data, conn->user, + conn->passwd, "smtp", + smtpc->mutual_auth, + NULL, &conn->krb5, + initresp, len); + } + else +#endif +#ifndef CURL_DISABLE_CRYPTO_AUTH + if((smtpc->authmechs & SASL_MECH_DIGEST_MD5) && + (smtpc->prefmech & SASL_MECH_DIGEST_MD5)) { + *mech = SASL_MECH_STRING_DIGEST_MD5; + *state1 = SMTP_AUTH_DIGESTMD5; + smtpc->authused = SASL_MECH_DIGEST_MD5; + } + else if((smtpc->authmechs & SASL_MECH_CRAM_MD5) && + (smtpc->prefmech & SASL_MECH_CRAM_MD5)) { + *mech = SASL_MECH_STRING_CRAM_MD5; + *state1 = SMTP_AUTH_CRAMMD5; + smtpc->authused = SASL_MECH_CRAM_MD5; + } + else +#endif +#ifdef USE_NTLM + if((smtpc->authmechs & SASL_MECH_NTLM) && + (smtpc->prefmech & SASL_MECH_NTLM)) { + *mech = SASL_MECH_STRING_NTLM; + *state1 = SMTP_AUTH_NTLM; + *state2 = SMTP_AUTH_NTLM_TYPE2MSG; + smtpc->authused = SASL_MECH_NTLM; + + if(data->set.sasl_ir) + result = Curl_sasl_create_ntlm_type1_message(conn->user, conn->passwd, + &conn->ntlm, + initresp, len); + } + else +#endif + if(((smtpc->authmechs & SASL_MECH_XOAUTH2) && + (smtpc->prefmech & SASL_MECH_XOAUTH2) && + (smtpc->prefmech != SASL_AUTH_ANY)) || conn->xoauth2_bearer) { + *mech = SASL_MECH_STRING_XOAUTH2; + *state1 = SMTP_AUTH_XOAUTH2; + *state2 = SMTP_AUTH_FINAL; + smtpc->authused = SASL_MECH_XOAUTH2; + + if(data->set.sasl_ir) + result = Curl_sasl_create_xoauth2_message(data, conn->user, + conn->xoauth2_bearer, + initresp, len); + } + else if((smtpc->authmechs & SASL_MECH_LOGIN) && + (smtpc->prefmech & SASL_MECH_LOGIN)) { + *mech = SASL_MECH_STRING_LOGIN; + *state1 = SMTP_AUTH_LOGIN; + *state2 = SMTP_AUTH_LOGIN_PASSWD; + smtpc->authused = SASL_MECH_LOGIN; + + if(data->set.sasl_ir) + result = Curl_sasl_create_login_message(data, conn->user, initresp, len); + } + else if((smtpc->authmechs & SASL_MECH_PLAIN) && + (smtpc->prefmech & SASL_MECH_PLAIN)) { + *mech = SASL_MECH_STRING_PLAIN; + *state1 = SMTP_AUTH_PLAIN; + *state2 = SMTP_AUTH_FINAL; + smtpc->authused = SASL_MECH_PLAIN; + + if(data->set.sasl_ir) + result = Curl_sasl_create_plain_message(data, conn->user, conn->passwd, + initresp, len); + } + + return result; +} + +CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread) { /* When sending a SMTP payload we must detect CRLF. sequences making sure they are sent as CRLF.. instead, as a . on the beginning of a line will @@ -1801,18 +2318,27 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) ssize_t i; ssize_t si; struct SessionHandle *data = conn->data; - struct SMTP *smtp = data->state.proto.smtp; + struct SMTP *smtp = data->req.protop; + char *scratch = data->state.scratch; + char *newscratch = NULL; + char *oldscratch = NULL; + size_t eob_sent; + + /* Do we need to allocate a scratch buffer? */ + if(!scratch || data->set.crlf) { + oldscratch = scratch; - /* Do we need to allocate the scatch buffer? */ - if(!data->state.scratch) { - data->state.scratch = malloc(2 * BUFSIZE); + scratch = newscratch = malloc(2 * BUFSIZE); + if(!newscratch) { + failf(data, "Failed to alloc scratch buffer!"); - if(!data->state.scratch) { - failf (data, "Failed to alloc scratch buffer!"); return CURLE_OUT_OF_MEMORY; } } + /* Have we already sent part of the EOB? */ + eob_sent = smtp->eob; + /* This loop can be improved by some kind of Boyer-Moore style of approach but that is saved for later... */ for(i = 0, si = 0; i < nread; i++) { @@ -1827,8 +2353,8 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) } else if(smtp->eob) { /* A previous substring matched so output that first */ - memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob); - si += smtp->eob; + memcpy(&scratch[si], &SMTP_EOB[eob_sent], smtp->eob - eob_sent); + si += smtp->eob - eob_sent; /* Then compare the first byte */ if(SMTP_EOB[0] == data->req.upload_fromhere[i]) @@ -1836,6 +2362,8 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) else smtp->eob = 0; + eob_sent = 0; + /* Reset the trailing CRLF flag as there was more data */ smtp->trailing_crlf = FALSE; } @@ -1843,31 +2371,38 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread) /* Do we have a match for CRLF. as per RFC-5321, sect. 4.5.2 */ if(SMTP_EOB_FIND_LEN == smtp->eob) { /* Copy the replacement data to the target buffer */ - memcpy(&data->state.scratch[si], SMTP_EOB_REPL, SMTP_EOB_REPL_LEN); - si += SMTP_EOB_REPL_LEN; + memcpy(&scratch[si], &SMTP_EOB_REPL[eob_sent], + SMTP_EOB_REPL_LEN - eob_sent); + si += SMTP_EOB_REPL_LEN - eob_sent; smtp->eob = 0; + eob_sent = 0; } else if(!smtp->eob) - data->state.scratch[si++] = data->req.upload_fromhere[i]; + scratch[si++] = data->req.upload_fromhere[i]; } - if(smtp->eob) { + if(smtp->eob - eob_sent) { /* A substring matched before processing ended so output that now */ - memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob); - si += smtp->eob; - smtp->eob = 0; + memcpy(&scratch[si], &SMTP_EOB[eob_sent], smtp->eob - eob_sent); + si += smtp->eob - eob_sent; } + /* Only use the new buffer if we replaced something */ if(si != nread) { - /* Only use the new buffer if we replaced something */ - nread = si; - /* Upload from the new (replaced) buffer instead */ - data->req.upload_fromhere = data->state.scratch; + data->req.upload_fromhere = scratch; + + /* Save the buffer so it can be freed later */ + data->state.scratch = scratch; + + /* Free the old scratch buffer */ + Curl_safefree(oldscratch); /* Set the new amount too */ - data->req.upload_present = nread; + data->req.upload_present = si; } + else + Curl_safefree(newscratch); return CURLE_OK; } diff --git a/lib/smtp.h b/lib/smtp.h index 4aff0c5..7a95efe 100644 --- a/lib/smtp.h +++ b/lib/smtp.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2009 - 2014, 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 @@ -44,7 +44,13 @@ typedef enum { SMTP_AUTH_DIGESTMD5_RESP, SMTP_AUTH_NTLM, SMTP_AUTH_NTLM_TYPE2MSG, + SMTP_AUTH_GSSAPI, + SMTP_AUTH_GSSAPI_TOKEN, + SMTP_AUTH_GSSAPI_NO_DATA, + SMTP_AUTH_XOAUTH2, + SMTP_AUTH_CANCEL, SMTP_AUTH_FINAL, + SMTP_COMMAND, /* VRFY, EXPN, NOOP, RSET and HELP */ SMTP_MAIL, /* MAIL FROM */ SMTP_RCPT, /* RCPT TO */ SMTP_DATA, @@ -59,6 +65,7 @@ typedef enum { used. */ struct SMTP { curl_pp_transfer transfer; + char *custom; /* Custom Request */ struct curl_slist *rcpt; /* Recipient list */ size_t eob; /* Number of bytes of the EOB (End Of Body) that have been received so far */ @@ -78,6 +85,8 @@ struct smtp_conn { bool tls_supported; /* StartTLS capability supported by server */ bool size_supported; /* If server supports SIZE extension according to RFC 1870 */ + bool auth_supported; /* AUTH capability supported by server */ + bool mutual_auth; /* Mutual authentication enabled (GSSAPI only) */ }; extern const struct Curl_handler Curl_handler_smtp; @@ -92,6 +101,6 @@ extern const struct Curl_handler Curl_handler_smtps; #define SMTP_EOB_REPL "\x0d\x0a\x2e\x2e" #define SMTP_EOB_REPL_LEN 4 -CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread); +CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread); #endif /* HEADER_CURL_SMTP_H */ diff --git a/lib/socks.c b/lib/socks.c index b101a0d..6c6585b 100644 --- a/lib/socks.c +++ b/lib/socks.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -127,7 +127,9 @@ CURLcode Curl_SOCKS4(const char *proxy_name, return CURLE_OPERATION_TIMEDOUT; } - curlx_nonblock(sock, FALSE); + (void)curlx_nonblock(sock, FALSE); + + infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port); /* * Compose socks4 request @@ -182,6 +184,8 @@ CURLcode Curl_SOCKS4(const char *proxy_name, else hp = NULL; /* fail! */ + infof(data, "SOCKS4 connect to %s (locally resolved)\n", buf); + Curl_resolv_unlock(data, dns); /* not used anymore from now on */ } @@ -234,7 +238,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name, code = Curl_write_plain(conn, sock, (char *)socksreq, packetsize + hostnamelen, &written); - if((code != CURLE_OK) || (written != packetsize + hostnamelen)) { + if(code || (written != packetsize + hostnamelen)) { failf(data, "Failed to send SOCKS4 connect request."); return CURLE_COULDNT_CONNECT; } @@ -243,7 +247,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name, hostnamelen = (ssize_t)strlen(hostname) + 1; code = Curl_write_plain(conn, sock, (char *)hostname, hostnamelen, &written); - if((code != CURLE_OK) || (written != hostnamelen)) { + if(code || (written != hostnamelen)) { failf(data, "Failed to send SOCKS4 connect request."); return CURLE_COULDNT_CONNECT; } @@ -254,7 +258,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name, /* Receive response */ result = Curl_blockread_all(conn, sock, (char *)socksreq, packetsize, &actualread); - if((result != CURLE_OK) || (actualread != packetsize)) { + if(result || (actualread != packetsize)) { failf(data, "Failed to receive SOCKS4 connect request ack."); return CURLE_COULDNT_CONNECT; } @@ -331,7 +335,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name, } } - curlx_nonblock(sock, TRUE); + (void)curlx_nonblock(sock, TRUE); return CURLE_OK; /* Proxy was successful! */ } @@ -392,7 +396,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, return CURLE_OPERATION_TIMEDOUT; } - curlx_nonblock(sock, TRUE); + (void)curlx_nonblock(sock, TRUE); /* wait until socket gets connected */ result = Curl_socket_ready(CURL_SOCKET_BAD, sock, timeout); @@ -415,7 +419,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) socksreq[1] = (char)(proxy_name ? 3 : 2); /* number of methods (below) */ socksreq[2] = 0; /* no authentication */ - socksreq[3] = 1; /* gssapi */ + socksreq[3] = 1; /* GSS-API */ socksreq[4] = 2; /* username/password */ #else socksreq[1] = (char)(proxy_name ? 2 : 1); /* number of methods (below) */ @@ -423,16 +427,16 @@ CURLcode Curl_SOCKS5(const char *proxy_name, socksreq[3] = 2; /* username/password */ #endif - curlx_nonblock(sock, FALSE); + (void)curlx_nonblock(sock, FALSE); code = Curl_write_plain(conn, sock, (char *)socksreq, (2 + (int)socksreq[1]), &written); - if((code != CURLE_OK) || (written != (2 + (int)socksreq[1]))) { + if(code || (written != (2 + (int)socksreq[1]))) { failf(data, "Unable to send initial SOCKS5 request."); return CURLE_COULDNT_CONNECT; } - curlx_nonblock(sock, TRUE); + (void)curlx_nonblock(sock, TRUE); result = Curl_socket_ready(sock, CURL_SOCKET_BAD, timeout); @@ -450,10 +454,10 @@ CURLcode Curl_SOCKS5(const char *proxy_name, return CURLE_RECV_ERROR; } - curlx_nonblock(sock, FALSE); + (void)curlx_nonblock(sock, FALSE); result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread); - if((result != CURLE_OK) || (actualread != 2)) { + if(result || (actualread != 2)) { failf(data, "Unable to receive initial SOCKS5 response."); return CURLE_COULDNT_CONNECT; } @@ -469,8 +473,8 @@ CURLcode Curl_SOCKS5(const char *proxy_name, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) else if(socksreq[1] == 1) { code = Curl_SOCKS5_gssapi_negotiate(sockindex, conn); - if(code != CURLE_OK) { - failf(data, "Unable to negotiate SOCKS5 gssapi context."); + if(code) { + failf(data, "Unable to negotiate SOCKS5 GSS-API context."); return CURLE_COULDNT_CONNECT; } } @@ -506,13 +510,13 @@ CURLcode Curl_SOCKS5(const char *proxy_name, len += proxy_password_len; code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written); - if((code != CURLE_OK) || (len != written)) { + if(code || (len != written)) { failf(data, "Failed to send SOCKS5 sub-negotiation request."); return CURLE_COULDNT_CONNECT; } result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread); - if((result != CURLE_OK) || (actualread != 2)) { + if(result || (actualread != 2)) { failf(data, "Unable to receive SOCKS5 sub-negotiation response."); return CURLE_COULDNT_CONNECT; } @@ -579,7 +583,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, if(rc == CURLRESOLV_PENDING) { /* this requires that we're in "wait for resolve" state */ code = Curl_resolver_wait_resolv(conn, &dns); - if(code != CURLE_OK) + if(code) return code; } @@ -632,13 +636,13 @@ CURLcode Curl_SOCKS5(const char *proxy_name, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) if(conn->socks5_gssapi_enctype) { - failf(data, "SOCKS5 gssapi protection not yet implemented."); + failf(data, "SOCKS5 GSS-API protection not yet implemented."); } else #endif code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written); - if((code != CURLE_OK) || (len != written)) { + if(code || (len != written)) { failf(data, "Failed to send SOCKS5 connect request."); return CURLE_COULDNT_CONNECT; } @@ -647,14 +651,14 @@ CURLcode Curl_SOCKS5(const char *proxy_name, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) if(conn->socks5_gssapi_enctype) { - failf(data, "SOCKS5 gssapi protection not yet implemented."); + failf(data, "SOCKS5 GSS-API protection not yet implemented."); } else #endif result = Curl_blockread_all(conn, sock, (char *)socksreq, len, &actualread); - if((result != CURLE_OK) || (len != actualread)) { + if(result || (len != actualread)) { failf(data, "Failed to receive SOCKS5 connect request ack."); return CURLE_COULDNT_CONNECT; } @@ -734,7 +738,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, len -= 10; result = Curl_blockread_all(conn, sock, (char *)&socksreq[10], len, &actualread); - if((result != CURLE_OK) || (len != actualread)) { + if(result || (len != actualread)) { failf(data, "Failed to receive SOCKS5 connect request ack."); return CURLE_COULDNT_CONNECT; } @@ -743,7 +747,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, } #endif - curlx_nonblock(sock, TRUE); + (void)curlx_nonblock(sock, TRUE); return CURLE_OK; /* Proxy was successful! */ } diff --git a/lib/socks.h b/lib/socks.h index dc4670b..29e3bf0 100644 --- a/lib/socks.h +++ b/lib/socks.h @@ -65,7 +65,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) /* - * This function handles the sockss5 gssapie negotiation and initialisation + * This function handles the SOCKS5 GSS-API negotiation and initialisation */ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, struct connectdata *conn); diff --git a/lib/socks_gssapi.c b/lib/socks_gssapi.c index 1f840bd..f195c1a 100644 --- a/lib/socks_gssapi.c +++ b/lib/socks_gssapi.c @@ -6,7 +6,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2009, 2011, Markus Moeller, - * Copyright (C) 2012, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -52,7 +52,7 @@ static gss_ctx_id_t gss_context = GSS_C_NO_CONTEXT; /* - * Helper gssapi error functions. + * Helper GSS-API error functions. */ static int check_gss_err(struct SessionHandle *data, OM_uint32 major_status, @@ -103,7 +103,7 @@ static int check_gss_err(struct SessionHandle *data, } gss_release_buffer(&min_stat, &status_string); } - failf(data, "GSSAPI error: %s failed:\n%s", function, buf); + failf(data, "GSS-API error: %s failed:\n%s", function, buf); return(1); } @@ -131,10 +131,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, gss_name_t gss_client_name = GSS_C_NO_NAME; unsigned short us_length; char *user=NULL; - unsigned char socksreq[4]; /* room for gssapi exchange header only */ + unsigned char socksreq[4]; /* room for GSS-API exchange header only */ char *serviceptr = data->set.str[STRING_SOCKS5_GSSAPI_SERVICE]; - /* GSSAPI request looks like + /* GSS-API request looks like * +----+------+-----+----------------+ * |VER | MTYP | LEN | TOKEN | * +----+------+----------------------+ @@ -181,9 +181,11 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, &gss_minor_status, &gss_context, server, + &Curl_krb5_mech_oid, NULL, gss_token, &gss_send_token, + TRUE, &gss_ret_flags); if(gss_token != GSS_C_NO_BUFFER) @@ -194,19 +196,19 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, gss_release_buffer(&gss_status, &gss_recv_token); gss_release_buffer(&gss_status, &gss_send_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); - failf(data, "Failed to initial GSSAPI token."); + failf(data, "Failed to initial GSS-API token."); return CURLE_COULDNT_CONNECT; } if(gss_send_token.length != 0) { - socksreq[0] = 1; /* gssapi subnegotiation version */ + socksreq[0] = 1; /* GSS-API subnegotiation version */ socksreq[1] = 1; /* authentication message type */ us_length = htons((short)gss_send_token.length); memcpy(socksreq+2,&us_length,sizeof(short)); code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written); - if((code != CURLE_OK) || (4 != written)) { - failf(data, "Failed to send GSSAPI authentication request."); + if(code || (4 != written)) { + failf(data, "Failed to send GSS-API authentication request."); gss_release_name(&gss_status, &server); gss_release_buffer(&gss_status, &gss_recv_token); gss_release_buffer(&gss_status, &gss_send_token); @@ -217,8 +219,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, code = Curl_write_plain(conn, sock, (char *)gss_send_token.value, gss_send_token.length, &written); - if((code != CURLE_OK) || ((ssize_t)gss_send_token.length != written)) { - failf(data, "Failed to send GSSAPI authentication token."); + if(code || ((ssize_t)gss_send_token.length != written)) { + failf(data, "Failed to send GSS-API authentication token."); gss_release_name(&gss_status, &server); gss_release_buffer(&gss_status, &gss_recv_token); gss_release_buffer(&gss_status, &gss_send_token); @@ -234,7 +236,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, /* analyse response */ - /* GSSAPI response looks like + /* GSS-API response looks like * +----+------+-----+----------------+ * |VER | MTYP | LEN | TOKEN | * +----+------+----------------------+ @@ -243,8 +245,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, */ result=Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread); - if(result != CURLE_OK || actualread != 4) { - failf(data, "Failed to receive GSSAPI authentication response."); + if(result || (actualread != 4)) { + failf(data, "Failed to receive GSS-API authentication response."); gss_release_name(&gss_status, &server); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; @@ -260,7 +262,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } if(socksreq[1] != 1) { /* status / messgae type */ - failf(data, "Invalid GSSAPI authentication response type (%d %d).", + failf(data, "Invalid GSS-API authentication response type (%d %d).", socksreq[0], socksreq[1]); gss_release_name(&gss_status, &server); gss_delete_sec_context(&gss_status, &gss_context, NULL); @@ -274,7 +276,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, gss_recv_token.value=malloc(us_length); if(!gss_recv_token.value) { failf(data, - "Could not allocate memory for GSSAPI authentication " + "Could not allocate memory for GSS-API authentication " "response token."); gss_release_name(&gss_status, &server); gss_delete_sec_context(&gss_status, &gss_context, NULL); @@ -284,8 +286,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, result=Curl_blockread_all(conn, sock, (char *)gss_recv_token.value, gss_recv_token.length, &actualread); - if(result != CURLE_OK || actualread != us_length) { - failf(data, "Failed to receive GSSAPI authentication token."); + if(result || (actualread != us_length)) { + failf(data, "Failed to receive GSS-API authentication token."); gss_release_name(&gss_status, &server); gss_release_buffer(&gss_status, &gss_recv_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); @@ -330,12 +332,12 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, user[gss_send_token.length] = '\0'; gss_release_name(&gss_status, &gss_client_name); gss_release_buffer(&gss_status, &gss_send_token); - infof(data, "SOCKS5 server authencticated user %s with gssapi.\n",user); + infof(data, "SOCKS5 server authencticated user %s with GSS-API.\n",user); free(user); user=NULL; /* Do encryption */ - socksreq[0] = 1; /* gssapi subnegotiation version */ + socksreq[0] = 1; /* GSS-API subnegotiation version */ socksreq[1] = 2; /* encryption message type */ gss_enc = 0; /* no data protection */ @@ -346,7 +348,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, else if(gss_ret_flags & GSS_C_INTEG_FLAG) gss_enc = 1; - infof(data, "SOCKS5 server supports gssapi %s data protection.\n", + infof(data, "SOCKS5 server supports GSS-API %s data protection.\n", (gss_enc==0)?"no":((gss_enc==1)?"integrity":"confidentiality")); /* force for the moment to no data protection */ gss_enc = 0; @@ -401,7 +403,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, gss_release_buffer(&gss_status, &gss_send_token); gss_release_buffer(&gss_status, &gss_w_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); - failf(data, "Failed to wrap GSSAPI encryption value into token."); + failf(data, "Failed to wrap GSS-API encryption value into token."); return CURLE_COULDNT_CONNECT; } gss_release_buffer(&gss_status, &gss_send_token); @@ -411,8 +413,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written); - if((code != CURLE_OK) || (4 != written)) { - failf(data, "Failed to send GSSAPI encryption request."); + if(code || (4 != written)) { + failf(data, "Failed to send GSS-API encryption request."); gss_release_buffer(&gss_status, &gss_w_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; @@ -421,8 +423,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, if(data->set.socks5_gssapi_nec) { memcpy(socksreq, &gss_enc, 1); code = Curl_write_plain(conn, sock, socksreq, 1, &written); - if((code != CURLE_OK) || ( 1 != written)) { - failf(data, "Failed to send GSSAPI encryption type."); + if(code || ( 1 != written)) { + failf(data, "Failed to send GSS-API encryption type."); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; } @@ -430,8 +432,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, else { code = Curl_write_plain(conn, sock, (char *)gss_w_token.value, gss_w_token.length, &written); - if((code != CURLE_OK) || ((ssize_t)gss_w_token.length != written)) { - failf(data, "Failed to send GSSAPI encryption type."); + if(code || ((ssize_t)gss_w_token.length != written)) { + failf(data, "Failed to send GSS-API encryption type."); gss_release_buffer(&gss_status, &gss_w_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; @@ -440,8 +442,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } result=Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread); - if(result != CURLE_OK || actualread != 4) { - failf(data, "Failed to receive GSSAPI encryption response."); + if(result || (actualread != 4)) { + failf(data, "Failed to receive GSS-API encryption response."); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; } @@ -455,7 +457,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } if(socksreq[1] != 2) { /* status / messgae type */ - failf(data, "Invalid GSSAPI encryption response type (%d %d).", + failf(data, "Invalid GSS-API encryption response type (%d %d).", socksreq[0], socksreq[1]); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; @@ -473,8 +475,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, result=Curl_blockread_all(conn, sock, (char *)gss_recv_token.value, gss_recv_token.length, &actualread); - if(result != CURLE_OK || actualread != us_length) { - failf(data, "Failed to receive GSSAPI encryptrion type."); + if(result || (actualread != us_length)) { + failf(data, "Failed to receive GSS-API encryptrion type."); gss_release_buffer(&gss_status, &gss_recv_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); return CURLE_COULDNT_CONNECT; @@ -489,13 +491,13 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, gss_release_buffer(&gss_status, &gss_recv_token); gss_release_buffer(&gss_status, &gss_w_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); - failf(data, "Failed to unwrap GSSAPI encryption value into token."); + failf(data, "Failed to unwrap GSS-API encryption value into token."); return CURLE_COULDNT_CONNECT; } gss_release_buffer(&gss_status, &gss_recv_token); if(gss_w_token.length != 1) { - failf(data, "Invalid GSSAPI encryption response length (%d).", + failf(data, "Invalid GSS-API encryption response length (%d).", gss_w_token.length); gss_release_buffer(&gss_status, &gss_w_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); @@ -507,7 +509,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } else { if(gss_recv_token.length != 1) { - failf(data, "Invalid GSSAPI encryption response length (%d).", + failf(data, "Invalid GSS-API encryption response length (%d).", gss_recv_token.length); gss_release_buffer(&gss_status, &gss_recv_token); gss_delete_sec_context(&gss_status, &gss_context, NULL); @@ -519,8 +521,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } infof(data, "SOCKS5 access with%s protection granted.\n", - (socksreq[0]==0)?"out gssapi data": - ((socksreq[0]==1)?" gssapi integrity":" gssapi confidentiality")); + (socksreq[0]==0)?"out GSS-API data": + ((socksreq[0]==1)?" GSS-API integrity":" GSS-API confidentiality")); conn->socks5_gssapi_enctype = socksreq[0]; if(socksreq[0] == 0) diff --git a/lib/socks_sspi.c b/lib/socks_sspi.c index 0313de3..0158627 100644 --- a/lib/socks_sspi.c +++ b/lib/socks_sspi.c @@ -6,7 +6,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2009, 2011, Markus Moeller, - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -43,12 +43,6 @@ #include "memdebug.h" /* - * Definitions required from ntsecapi.h are directly provided below this point - * to avoid including ntsecapi.h due to a conflict with OpenSSL's safestack.h - */ -#define KERB_WRAP_NO_ENCRYPT 0x80000001 - -/* * Helper sspi error functions. */ static int check_sspi_err(struct connectdata *conn, @@ -76,7 +70,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, ssize_t actualread; ssize_t written; int result; - /* Needs GSSAPI authentication */ + /* Needs GSS-API authentication */ SECURITY_STATUS status; unsigned long sspi_ret_flags = 0; int gss_enc; @@ -91,10 +85,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, char *service_name = NULL; unsigned short us_length; unsigned long qop; - unsigned char socksreq[4]; /* room for gssapi exchange header only */ + unsigned char socksreq[4]; /* room for GSS-API exchange header only */ char *service = data->set.str[STRING_SOCKS5_GSSAPI_SERVICE]; - /* GSSAPI request looks like + /* GSS-API request looks like * +----+------+-----+----------------+ * |VER | MTYP | LEN | TOKEN | * +----+------+----------------------+ @@ -194,23 +188,26 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, Curl_safefree(service_name); s_pSecFn->FreeCredentialsHandle(&cred_handle); s_pSecFn->DeleteSecurityContext(&sspi_context); - s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); + if(sspi_recv_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); failf(data, "Failed to initialise security context."); return CURLE_COULDNT_CONNECT; } if(sspi_send_token.cbBuffer != 0) { - socksreq[0] = 1; /* gssapi subnegotiation version */ + socksreq[0] = 1; /* GSS-API subnegotiation version */ socksreq[1] = 1; /* authentication message type */ us_length = htons((short)sspi_send_token.cbBuffer); memcpy(socksreq+2, &us_length, sizeof(short)); code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written); - if((code != CURLE_OK) || (4 != written)) { + if(code || (4 != written)) { failf(data, "Failed to send SSPI authentication request."); Curl_safefree(service_name); - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); - s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); + if(sspi_send_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + if(sspi_recv_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); s_pSecFn->FreeCredentialsHandle(&cred_handle); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; @@ -218,11 +215,13 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, code = Curl_write_plain(conn, sock, (char *)sspi_send_token.pvBuffer, sspi_send_token.cbBuffer, &written); - if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) { + if(code || (sspi_send_token.cbBuffer != (size_t)written)) { failf(data, "Failed to send SSPI authentication token."); Curl_safefree(service_name); - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); - s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); + if(sspi_send_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + if(sspi_recv_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); s_pSecFn->FreeCredentialsHandle(&cred_handle); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; @@ -230,18 +229,24 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); - sspi_send_token.pvBuffer = NULL; + if(sspi_send_token.pvBuffer) { + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + sspi_send_token.pvBuffer = NULL; + } sspi_send_token.cbBuffer = 0; - s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); - sspi_recv_token.pvBuffer = NULL; + + if(sspi_recv_token.pvBuffer) { + s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); + sspi_recv_token.pvBuffer = NULL; + } sspi_recv_token.cbBuffer = 0; + if(status != SEC_I_CONTINUE_NEEDED) break; /* analyse response */ - /* GSSAPI response looks like + /* GSS-API response looks like * +----+------+-----+----------------+ * |VER | MTYP | LEN | TOKEN | * +----+------+----------------------+ @@ -250,7 +255,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, */ result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread); - if(result != CURLE_OK || actualread != 4) { + if(result || (actualread != 4)) { failf(data, "Failed to receive SSPI authentication response."); Curl_safefree(service_name); s_pSecFn->FreeCredentialsHandle(&cred_handle); @@ -292,10 +297,11 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, result = Curl_blockread_all(conn, sock, (char *)sspi_recv_token.pvBuffer, sspi_recv_token.cbBuffer, &actualread); - if(result != CURLE_OK || actualread != us_length) { + if(result || (actualread != us_length)) { failf(data, "Failed to receive SSPI authentication token."); Curl_safefree(service_name); - s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); + if(sspi_recv_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer); s_pSecFn->FreeCredentialsHandle(&cred_handle); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; @@ -317,12 +323,12 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, failf(data, "Failed to determine user name."); return CURLE_COULDNT_CONNECT; } - infof(data, "SOCKS5 server authencticated user %s with gssapi.\n", + infof(data, "SOCKS5 server authencticated user %s with GSS-API.\n", names.sUserName); s_pSecFn->FreeContextBuffer(names.sUserName); /* Do encryption */ - socksreq[0] = 1; /* gssapi subnegotiation version */ + socksreq[0] = 1; /* GSS-API subnegotiation version */ socksreq[1] = 2; /* encryption message type */ gss_enc = 0; /* no data protection */ @@ -333,7 +339,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, else if(sspi_ret_flags & ISC_REQ_INTEGRITY) gss_enc = 1; - infof(data, "SOCKS5 server supports gssapi %s data protection.\n", + infof(data, "SOCKS5 server supports GSS-API %s data protection.\n", (gss_enc==0)?"no":((gss_enc==1)?"integrity":"confidentiality") ); /* force to no data protection, avoid encryption/decryption for now */ gss_enc = 0; @@ -457,9 +463,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } code = Curl_write_plain(conn, sock, (char *)socksreq, 4, &written); - if((code != CURLE_OK) || (4 != written)) { + if(code || (4 != written)) { failf(data, "Failed to send SSPI encryption request."); - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + if(sspi_send_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; } @@ -467,7 +474,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, if(data->set.socks5_gssapi_nec) { memcpy(socksreq,&gss_enc,1); code = Curl_write_plain(conn, sock, (char *)socksreq, 1, &written); - if((code != CURLE_OK) || (1 != written)) { + if(code || (1 != written)) { failf(data, "Failed to send SSPI encryption type."); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; @@ -476,17 +483,19 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, else { code = Curl_write_plain(conn, sock, (char *)sspi_send_token.pvBuffer, sspi_send_token.cbBuffer, &written); - if((code != CURLE_OK) || (sspi_send_token.cbBuffer != (size_t)written)) { + if(code || (sspi_send_token.cbBuffer != (size_t)written)) { failf(data, "Failed to send SSPI encryption type."); - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + if(sspi_send_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; } - s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); + if(sspi_send_token.pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_send_token.pvBuffer); } result = Curl_blockread_all(conn, sock, (char *)socksreq, 4, &actualread); - if(result != CURLE_OK || actualread != 4) { + if(result || (actualread != 4)) { failf(data, "Failed to receive SSPI encryption response."); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; @@ -520,7 +529,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, result = Curl_blockread_all(conn, sock, (char *)sspi_w_token[0].pvBuffer, sspi_w_token[0].cbBuffer, &actualread); - if(result != CURLE_OK || actualread != us_length) { + if(result || (actualread != us_length)) { failf(data, "Failed to receive SSPI encryption type."); s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer); s_pSecFn->DeleteSecurityContext(&sspi_context); @@ -541,8 +550,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, &qop); if(check_sspi_err(conn, status, "DecryptMessage")) { - s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer); - s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer); + if(sspi_w_token[0].pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer); + if(sspi_w_token[1].pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer); s_pSecFn->DeleteSecurityContext(&sspi_context); failf(data, "Failed to query security context attributes."); return CURLE_COULDNT_CONNECT; @@ -551,8 +562,10 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, if(sspi_w_token[1].cbBuffer != 1) { failf(data, "Invalid SSPI encryption response length (%lu).", (unsigned long)sspi_w_token[1].cbBuffer); - s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer); - s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer); + if(sspi_w_token[0].pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer); + if(sspi_w_token[1].pvBuffer) + s_pSecFn->FreeContextBuffer(sspi_w_token[1].pvBuffer); s_pSecFn->DeleteSecurityContext(&sspi_context); return CURLE_COULDNT_CONNECT; } @@ -574,8 +587,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex, } infof(data, "SOCKS5 access with%s protection granted.\n", - (socksreq[0]==0)?"out gssapi data": - ((socksreq[0]==1)?" gssapi integrity":" gssapi confidentiality")); + (socksreq[0]==0)?"out GSS-API data": + ((socksreq[0]==1)?" GSS-API integrity":" GSS-API confidentiality")); /* For later use if encryption is required conn->socks5_gssapi_enctype = socksreq[0]; diff --git a/lib/speedcheck.c b/lib/speedcheck.c index ea17a59..ac7447c 100644 --- a/lib/speedcheck.c +++ b/lib/speedcheck.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -57,7 +57,7 @@ CURLcode Curl_speedcheck(struct SessionHandle *data, } else { /* wait complete low_speed_time */ - Curl_expire(data, nextcheck); + Curl_expire_latest(data, nextcheck); } } else { @@ -68,7 +68,7 @@ CURLcode Curl_speedcheck(struct SessionHandle *data, /* if there is a low speed limit enabled, we set the expire timer to make this connection's speed get checked again no later than when this time is up */ - Curl_expire(data, data->set.low_speed_time*1000); + Curl_expire_latest(data, data->set.low_speed_time*1000); } return CURLE_OK; } diff --git a/lib/splay.c b/lib/splay.c index 3570712..5bb7065 100644 --- a/lib/splay.c +++ b/lib/splay.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1997 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1997 - 2014, 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 @@ -101,7 +101,7 @@ struct Curl_tree *Curl_splayinsert(struct timeval i, struct Curl_tree *t, struct Curl_tree *node) { - static struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */ + static const struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */ if(node == NULL) return t; @@ -223,7 +223,7 @@ int Curl_splayremovebyaddr(struct Curl_tree *t, struct Curl_tree *removenode, struct Curl_tree **newroot) { - static struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */ + static const struct timeval KEY_NOTUSED = {-1,-1}; /* will *NEVER* appear */ struct Curl_tree *x; if(!t || !removenode) diff --git a/lib/ssh.c b/lib/ssh.c index 422357b..d7e88c6 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -73,7 +73,7 @@ #include "getinfo.h" #include "strequal.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "connect.h" #include "strerror.h" #include "inet_ntop.h" @@ -94,6 +94,9 @@ #ifdef WIN32 # undef PATH_MAX # define PATH_MAX MAX_PATH +# ifndef R_OK +# define R_OK 4 +# endif #endif #ifndef PATH_MAX @@ -149,13 +152,15 @@ static int ssh_perform_getsock(const struct connectdata *conn, number of sockets */ int numsocks); +static CURLcode ssh_setup_connection(struct connectdata *conn); + /* * SCP protocol handler. */ const struct Curl_handler Curl_handler_scp = { "SCP", /* scheme */ - ZERO_NULL, /* setup_connection */ + ssh_setup_connection, /* setup_connection */ ssh_do, /* do_it */ scp_done, /* done */ ZERO_NULL, /* do_more */ @@ -181,7 +186,7 @@ const struct Curl_handler Curl_handler_scp = { const struct Curl_handler Curl_handler_sftp = { "SFTP", /* scheme */ - ZERO_NULL, /* setup_connection */ + ssh_setup_connection, /* setup_connection */ ssh_do, /* do_it */ sftp_done, /* done */ ZERO_NULL, /* do_more */ @@ -200,7 +205,6 @@ const struct Curl_handler Curl_handler_sftp = { | PROTOPT_NOURLQUERY /* flags */ }; - static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, @@ -327,6 +331,7 @@ static LIBSSH2_FREE_FUNC(my_libssh2_free) /* This is the ONLY way to change SSH state! */ static void state(struct connectdata *conn, sshstate nowstate) { + struct ssh_conn *sshc = &conn->proto.sshc; #if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) /* for debug purposes */ static const char * const names[] = { @@ -386,10 +391,7 @@ static void state(struct connectdata *conn, sshstate nowstate) "SSH_SESSION_FREE", "QUIT" }; -#endif - struct ssh_conn *sshc = &conn->proto.sshc; -#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) if(sshc->state != nowstate) { infof(conn->data, "SFTP %p state change from %s to %s\n", (void *)sshc, names[sshc->state], names[nowstate]); @@ -544,6 +546,17 @@ static CURLcode ssh_knownhost(struct connectdata *conn) keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)? LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS; +#ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP + keycheck = libssh2_knownhost_checkp(sshc->kh, + conn->host.name, + (conn->remote_port != PORT_SSH)? + conn->remote_port:-1, + remotekey, keylen, + LIBSSH2_KNOWNHOST_TYPE_PLAIN| + LIBSSH2_KNOWNHOST_KEYENC_RAW| + keybit, + &host); +#else keycheck = libssh2_knownhost_check(sshc->kh, conn->host.name, remotekey, keylen, @@ -551,6 +564,7 @@ static CURLcode ssh_knownhost(struct connectdata *conn) LIBSSH2_KNOWNHOST_KEYENC_RAW| keybit, &host); +#endif infof(data, "SSH host check: %d, key: %s\n", keycheck, (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)? @@ -589,8 +603,10 @@ static CURLcode ssh_knownhost(struct connectdata *conn) switch(rc) { default: /* unknown return codes will equal reject */ + /* FALLTHROUGH */ case CURLKHSTAT_REJECT: state(conn, SSH_SESSION_FREE); + /* FALLTHROUGH */ case CURLKHSTAT_DEFER: /* DEFER means bail out but keep the SSH_HOSTKEY state */ result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION; @@ -687,7 +703,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct SSHPROTO *sftp_scp = data->state.proto.ssh; + struct SSHPROTO *sftp_scp = data->req.protop; struct ssh_conn *sshc = &conn->proto.sshc; curl_socket_t sock = conn->sock[FIRSTSOCKET]; char *new_readdir_line; @@ -733,8 +749,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) * whatever) is up to us. */ result = ssh_check_fingerprint(conn); - if(result == CURLE_OK) + if(!result) state(conn, SSH_AUTHLIST); + /* ssh_check_fingerprint sets state appropriately on error */ break; case SSH_AUTHLIST: @@ -753,7 +770,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) curlx_uztoui(strlen(conn->user))); if(!sshc->authlist) { - if((err = libssh2_session_last_errno(sshc->ssh_session)) == + if(libssh2_userauth_authenticated(sshc->ssh_session)) { + sshc->authed = TRUE; + infof(data, "SSH user accepted with no authentication\n"); + state(conn, SSH_AUTH_DONE); + break; + } + else if((err = libssh2_session_last_errno(sshc->ssh_session)) == LIBSSH2_ERROR_EAGAIN) { rc = LIBSSH2_ERROR_EAGAIN; break; @@ -780,7 +803,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) && (strstr(sshc->authlist, "publickey") != NULL)) { char *home = NULL; - bool rsa_pub_empty_but_ok = FALSE; + bool out_of_memory = FALSE; sshc->rsa_pub = sshc->rsa = NULL; @@ -788,34 +811,55 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) HOME environment variable etc? */ home = curl_getenv("HOME"); - if(data->set.str[STRING_SSH_PUBLIC_KEY] && - !*data->set.str[STRING_SSH_PUBLIC_KEY]) - rsa_pub_empty_but_ok = true; - else if(data->set.str[STRING_SSH_PUBLIC_KEY]) - sshc->rsa_pub = aprintf("%s", data->set.str[STRING_SSH_PUBLIC_KEY]); - else if(home) - sshc->rsa_pub = aprintf("%s/.ssh/id_dsa.pub", home); - else - /* as a final resort, try current dir! */ - sshc->rsa_pub = strdup("id_dsa.pub"); - - if(!rsa_pub_empty_but_ok && (sshc->rsa_pub == NULL)) { - Curl_safefree(home); - state(conn, SSH_SESSION_FREE); - sshc->actualcode = CURLE_OUT_OF_MEMORY; - break; + if(data->set.str[STRING_SSH_PRIVATE_KEY]) + sshc->rsa = strdup(data->set.str[STRING_SSH_PRIVATE_KEY]); + else { + /* If no private key file is specified, try some common paths. */ + if(home) { + /* Try ~/.ssh first. */ + sshc->rsa = aprintf("%s/.ssh/id_rsa", home); + if(!sshc->rsa) + out_of_memory = TRUE; + else if(access(sshc->rsa, R_OK) != 0) { + Curl_safefree(sshc->rsa); + sshc->rsa = aprintf("%s/.ssh/id_dsa", home); + if(!sshc->rsa) + out_of_memory = TRUE; + else if(access(sshc->rsa, R_OK) != 0) { + Curl_safefree(sshc->rsa); + } + } + } + if(!out_of_memory && !sshc->rsa) { + /* Nothing found; try the current dir. */ + sshc->rsa = strdup("id_rsa"); + if(sshc->rsa && access(sshc->rsa, R_OK) != 0) { + Curl_safefree(sshc->rsa); + sshc->rsa = strdup("id_dsa"); + if(sshc->rsa && access(sshc->rsa, R_OK) != 0) { + Curl_safefree(sshc->rsa); + /* Out of guesses. Set to the empty string to avoid + * surprising info messages. */ + sshc->rsa = strdup(""); + } + } + } } - if(data->set.str[STRING_SSH_PRIVATE_KEY]) - sshc->rsa = aprintf("%s", data->set.str[STRING_SSH_PRIVATE_KEY]); - else if(home) - sshc->rsa = aprintf("%s/.ssh/id_dsa", home); - else - /* as a final resort, try current dir! */ - sshc->rsa = strdup("id_dsa"); + /* + * Unless the user explicitly specifies a public key file, let + * libssh2 extract the public key from the private key file. + * This is done by simply passing sshc->rsa_pub = NULL. + */ + if(data->set.str[STRING_SSH_PUBLIC_KEY]) { + sshc->rsa_pub = strdup(data->set.str[STRING_SSH_PUBLIC_KEY]); + if(!sshc->rsa_pub) + out_of_memory = TRUE; + } - if(sshc->rsa == NULL) { + if(out_of_memory || sshc->rsa == NULL) { Curl_safefree(home); + Curl_safefree(sshc->rsa); Curl_safefree(sshc->rsa_pub); state(conn, SSH_SESSION_FREE); sshc->actualcode = CURLE_OUT_OF_MEMORY; @@ -828,8 +872,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) Curl_safefree(home); - infof(data, "Using ssh public key file %s\n", sshc->rsa_pub); - infof(data, "Using ssh private key file %s\n", sshc->rsa); + infof(data, "Using SSH public key file '%s'\n", sshc->rsa_pub); + infof(data, "Using SSH private key file '%s'\n", sshc->rsa); state(conn, SSH_AUTH_PKEY); } @@ -925,6 +969,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) infof(data, "Could not create agent object\n"); state(conn, SSH_AUTH_KEY_INIT); + break; } } @@ -1190,7 +1235,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) using ordinary FTP. */ result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp)); free(tmp); - state(conn, SSH_SFTP_NEXT_QUOTE); + if(result) { + state(conn, SSH_SFTP_CLOSE); + sshc->nextstate = SSH_NO_STATE; + sshc->actualcode = result; + } + else + state(conn, SSH_SFTP_NEXT_QUOTE); break; } else if(cmd) { @@ -1224,8 +1275,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } /* - * SFTP is a binary protocol, so we don't send text commands to - * the server. Instead, we scan for commands for commands used by + * SFTP is a binary protocol, so we don't send text commands + * to the server. Instead, we scan for commands used by * OpenSSH's sftp program and call the appropriate libssh2 * functions. */ @@ -1561,9 +1612,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) if(data->set.upload) state(conn, SSH_SFTP_UPLOAD_INIT); else { - if(data->set.opt_no_body) - state(conn, SSH_STOP); - else if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/') + if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/') state(conn, SSH_SFTP_READDIR_INIT); else state(conn, SSH_SFTP_DOWNLOAD_INIT); @@ -1595,7 +1644,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) else { curl_off_t size = attrs.filesize; if(size < 0) { - failf(data, "Bad file size (%" FORMAT_OFF_T ")", size); + failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size); return CURLE_BAD_DOWNLOAD_RESUME; } data->state.resume_from = attrs.filesize; @@ -1667,7 +1716,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } } - /* If we have restart point then we need to seek to the correct + /* If we have a restart point then we need to seek to the correct position. */ if(data->state.resume_from > 0) { /* Let's read off the proper amount of bytes from the input. */ @@ -1706,17 +1755,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } /* now, decrease the size of the read */ - if(data->set.infilesize > 0) { - data->set.infilesize -= data->state.resume_from; - data->req.size = data->set.infilesize; - Curl_pgrsSetUploadSize(data, data->set.infilesize); + if(data->state.infilesize > 0) { + data->state.infilesize -= data->state.resume_from; + data->req.size = data->state.infilesize; + Curl_pgrsSetUploadSize(data, data->state.infilesize); } SFTP_SEEK(sshc->sftp_handle, data->state.resume_from); } - if(data->set.infilesize > 0) { - data->req.size = data->set.infilesize; - Curl_pgrsSetUploadSize(data, data->set.infilesize); + if(data->state.infilesize > 0) { + data->req.size = data->state.infilesize; + Curl_pgrsSetUploadSize(data, data->state.infilesize); } /* upload data */ Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); @@ -1759,7 +1808,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) break; case SSH_SFTP_CREATE_DIRS: - if((sshc->slash_pos = strchr(sshc->slash_pos, '/')) != NULL) { + sshc->slash_pos = strchr(sshc->slash_pos, '/'); + if(sshc->slash_pos) { *sshc->slash_pos = 0; infof(data, "Creating directory '%s'\n", sftp_scp->path); @@ -1801,6 +1851,12 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) break; case SSH_SFTP_READDIR_INIT: + Curl_pgrsSetDownloadSize(data, -1); + if(data->set.opt_no_body) { + state(conn, SSH_STOP); + break; + } + /* * This is a directory that we are trying to get, so produce a directory * listing @@ -1981,7 +2037,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) sshc->readdir_line, sshc->readdir_currLen); - if(result == CURLE_OK) { + if(!result) { /* output debug output if that is requested */ if(data->set.verbose) { @@ -2051,19 +2107,24 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) if(rc == LIBSSH2_ERROR_EAGAIN) { break; } - else if(rc) { + else if(rc || + !(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) || + (attrs.filesize == 0)) { /* * libssh2_sftp_open() didn't return an error, so maybe the server * just doesn't support stat() + * OR the server doesn't return a file size with a stat() + * OR file size is 0 */ data->req.size = -1; data->req.maxdownload = -1; + Curl_pgrsSetDownloadSize(data, -1); } else { curl_off_t size = attrs.filesize; if(size < 0) { - failf(data, "Bad file size (%" FORMAT_OFF_T ")", size); + failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size); return CURLE_BAD_DOWNLOAD_RESUME; } if(conn->data->state.use_range) { @@ -2085,8 +2146,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } if(from >= size) { failf(data, "Offset (%" - FORMAT_OFF_T ") was beyond file size (%" FORMAT_OFF_T ")", - from, attrs.filesize); + CURL_FORMAT_CURL_OFF_T ") was beyond file size (%" + CURL_FORMAT_CURL_OFF_T ")", from, attrs.filesize); return CURLE_BAD_DOWNLOAD_RESUME; } if(from > to) { @@ -2110,7 +2171,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) /* We're supposed to download the last abs(from) bytes */ if((curl_off_t)attrs.filesize < -data->state.resume_from) { failf(data, "Offset (%" - FORMAT_OFF_T ") was beyond file size (%" FORMAT_OFF_T ")", + CURL_FORMAT_CURL_OFF_T ") was beyond file size (%" + CURL_FORMAT_CURL_OFF_T ")", data->state.resume_from, attrs.filesize); return CURLE_BAD_DOWNLOAD_RESUME; } @@ -2119,8 +2181,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } else { if((curl_off_t)attrs.filesize < data->state.resume_from) { - failf(data, "Offset (%" FORMAT_OFF_T - ") was beyond file size (%" FORMAT_OFF_T ")", + failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T + ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")", data->state.resume_from, attrs.filesize); return CURLE_BAD_DOWNLOAD_RESUME; } @@ -2134,6 +2196,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) SFTP_SEEK(sshc->sftp_handle, data->state.resume_from); } } + /* Setup the actual download */ if(data->req.size == 0) { /* no data to transfer */ @@ -2155,6 +2218,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) conn->cselect_bits = CURL_CSELECT_IN; } if(result) { + /* this should never occur; the close state should be entered + at the time the error occurs */ state(conn, SSH_SFTP_CLOSE); sshc->actualcode = result; } @@ -2182,7 +2247,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) /* Check if nextstate is set and move .nextstate could be POSTQUOTE_INIT After nextstate is executed,the control should come back to SSH_SFTP_CLOSE to pass the correct result back */ - if(sshc->nextstate != SSH_NO_STATE) { + if(sshc->nextstate != SSH_NO_STATE && + sshc->nextstate != SSH_SFTP_CLOSE) { state(conn, sshc->nextstate); sshc->nextstate = SSH_SFTP_CLOSE; } @@ -2233,7 +2299,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) } if(data->set.upload) { - if(data->set.infilesize < 0) { + if(data->state.infilesize < 0) { failf(data, "SCP requires a known file size for upload"); sshc->actualcode = CURLE_UPLOAD_FAILED; state(conn, SSH_SCP_CHANNEL_FREE); @@ -2255,7 +2321,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) */ sshc->ssh_channel = SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms, - data->set.infilesize); + data->state.infilesize); if(!sshc->ssh_channel) { if(libssh2_session_last_errno(sshc->ssh_session) == LIBSSH2_ERROR_EAGAIN) { @@ -2287,6 +2353,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) sshc->actualcode = result; } else { + /* store this original bitmask setup to use later on if we can't + figure out a "real" bitmask */ + sshc->orig_waitfor = data->req.keepon; + /* we want to use the _sending_ function even when the socket turns out readable as the underlying libssh2 scp send function will deal with both accordingly */ @@ -2517,7 +2587,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) memset(sshc, 0, sizeof(struct ssh_conn)); - conn->bits.close = TRUE; + connclose(conn, "SSH session free"); sshc->state = SSH_SESSION_FREE; /* current */ sshc->nextstate = SSH_NO_STATE; state(conn, SSH_STOP); @@ -2603,9 +2673,7 @@ static void ssh_block2waitfor(struct connectdata *conn, bool block) { struct ssh_conn *sshc = &conn->proto.sshc; int dir; - if(!block) - conn->waitfor = 0; - else if((dir = libssh2_session_block_directions(sshc->ssh_session))) { + if(block && (dir = libssh2_session_block_directions(sshc->ssh_session))) { /* translate the libssh2 define bits into our own bit defines */ conn->waitfor = ((dir&LIBSSH2_SESSION_BLOCK_INBOUND)?KEEP_RECV:0) | ((dir&LIBSSH2_SESSION_BLOCK_OUTBOUND)?KEEP_SEND:0); @@ -2666,7 +2734,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn, } #ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION - if((CURLE_OK == result) && block) { + if(!result && block) { int dir = libssh2_session_block_directions(sshc->ssh_session); curl_socket_t sock = conn->sock[FIRSTSOCKET]; curl_socket_t fd_read = CURL_SOCKET_BAD; @@ -2689,25 +2757,14 @@ static CURLcode ssh_block_statemach(struct connectdata *conn, /* * SSH setup and connection */ -static CURLcode ssh_init(struct connectdata *conn) +static CURLcode ssh_setup_connection(struct connectdata *conn) { - struct SessionHandle *data = conn->data; struct SSHPROTO *ssh; - struct ssh_conn *sshc = &conn->proto.sshc; - - sshc->actualcode = CURLE_OK; /* reset error code */ - sshc->secondCreateDirs =0; /* reset the create dir attempt state - variable */ - - if(data->state.proto.ssh) - return CURLE_OK; - ssh = calloc(1, sizeof(struct SSHPROTO)); + conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO)); if(!ssh) return CURLE_OUT_OF_MEMORY; - data->state.proto.ssh = ssh; - return CURLE_OK; } @@ -2727,17 +2784,13 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done) CURLcode result; struct SessionHandle *data = conn->data; + /* initialize per-handle data if not already */ + if(!data->req.protop) + ssh_setup_connection(conn); + /* We default to persistent connections. We set this already in this connect function to make the re-use checks properly be able to check this bit. */ - conn->bits.close = FALSE; - - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - - result = ssh_init(conn); - if(result) - return result; + connkeep(conn, "SSH default"); if(conn->handler->protocol & CURLPROTO_SCP) { conn->recv[FIRSTSOCKET] = scp_recv; @@ -2853,37 +2906,30 @@ static CURLcode scp_doing(struct connectdata *conn, static CURLcode ssh_do(struct connectdata *conn, bool *done) { - CURLcode res; + CURLcode result; bool connected = 0; struct SessionHandle *data = conn->data; + struct ssh_conn *sshc = &conn->proto.sshc; *done = FALSE; /* default to false */ - /* - Since connections can be re-used between SessionHandles, this might be a - connection already existing but on a fresh SessionHandle struct so we must - make sure we have a good 'struct SSHPROTO' to play with. For new - connections, the struct SSHPROTO is allocated and setup in the - ssh_connect() function. - */ - Curl_reset_reqproto(conn); - res = ssh_init(conn); - if(res) - return res; - data->req.size = -1; /* make sure this is unknown at this point */ + sshc->actualcode = CURLE_OK; /* reset error code */ + sshc->secondCreateDirs =0; /* reset the create dir attempt state + variable */ + Curl_pgrsSetUploadCounter(data, 0); Curl_pgrsSetDownloadCounter(data, 0); - Curl_pgrsSetUploadSize(data, 0); - Curl_pgrsSetDownloadSize(data, 0); + Curl_pgrsSetUploadSize(data, -1); + Curl_pgrsSetDownloadSize(data, -1); if(conn->handler->protocol & CURLPROTO_SCP) - res = scp_perform(conn, &connected, done); + result = scp_perform(conn, &connected, done); else - res = sftp_perform(conn, &connected, done); + result = sftp_perform(conn, &connected, done); - return res; + return result; } /* BLOCKING, but the function is using the state machine so the only reason @@ -2895,7 +2941,7 @@ static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection) struct ssh_conn *ssh = &conn->proto.sshc; (void) dead_connection; - Curl_safefree(conn->data->state.proto.ssh); + Curl_safefree(conn->data->req.protop); if(ssh->ssh_session) { /* only if there's a session still around to use! */ @@ -2913,9 +2959,9 @@ static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection) static CURLcode ssh_done(struct connectdata *conn, CURLcode status) { CURLcode result = CURLE_OK; - struct SSHPROTO *sftp_scp = conn->data->state.proto.ssh; + struct SSHPROTO *sftp_scp = conn->data->req.protop; - if(status == CURLE_OK) { + if(!status) { /* run the state-machine TODO: when the multi interface is used, this _really_ should be using @@ -2943,7 +2989,7 @@ static CURLcode scp_done(struct connectdata *conn, CURLcode status, { (void)premature; /* not used */ - if(status == CURLE_OK) + if(!status) state(conn, SSH_SCP_DONE); return ssh_done(conn, status); @@ -3041,8 +3087,7 @@ CURLcode sftp_perform(struct connectdata *conn, static CURLcode sftp_doing(struct connectdata *conn, bool *dophase_done) { - CURLcode result; - result = ssh_multi_statemach(conn, dophase_done); + CURLcode result = ssh_multi_statemach(conn, dophase_done); if(*dophase_done) { DEBUGF(infof(conn->data, "DO phase is complete\n")); @@ -3060,7 +3105,7 @@ static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection) DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n")); - Curl_safefree(conn->data->state.proto.ssh); + Curl_safefree(conn->data->req.protop); if(conn->proto.sshc.ssh_session) { /* only if there's a session still around to use! */ @@ -3079,7 +3124,7 @@ static CURLcode sftp_done(struct connectdata *conn, CURLcode status, { struct ssh_conn *sshc = &conn->proto.sshc; - if(status == CURLE_OK) { + if(!status) { /* Post quote commands are executed after the SFTP_CLOSE state to avoid errors that could happen due to open file handles during POSTQUOTE operation */ @@ -3120,6 +3165,7 @@ static ssize_t sftp_send(struct connectdata *conn, int sockindex, /* * Return number of received (decrypted) bytes + * or <0 on error */ static ssize_t sftp_recv(struct connectdata *conn, int sockindex, char *mem, size_t len, CURLcode *err) @@ -3134,6 +3180,10 @@ static ssize_t sftp_recv(struct connectdata *conn, int sockindex, if(nread == LIBSSH2_ERROR_EAGAIN) { *err = CURLE_AGAIN; nread = -1; + + } + else if(nread < 0) { + *err = libssh2_session_error_to_CURLE((int)nread); } return nread; } diff --git a/lib/ssh.h b/lib/ssh.h index ff2e16b..1bc3348 100644 --- a/lib/ssh.h +++ b/lib/ssh.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -158,22 +158,34 @@ struct ssh_conn { #ifdef USE_LIBSSH2 +/* Feature detection based on version numbers to better work with + non-configure platforms */ + #if !defined(LIBSSH2_VERSION_NUM) || (LIBSSH2_VERSION_NUM < 0x001000) # error "SCP/SFTP protocols require libssh2 0.16 or later" #endif -#if defined(LIBSSH2_VERSION_NUM) && (LIBSSH2_VERSION_NUM >= 0x010000) -# define HAVE_LIBSSH2_SFTP_SEEK64 1 -#else -# undef HAVE_LIBSSH2_SFTP_SEEK64 +#if LIBSSH2_VERSION_NUM >= 0x010000 +#define HAVE_LIBSSH2_SFTP_SEEK64 1 +#endif + +#if LIBSSH2_VERSION_NUM >= 0x010100 +#define HAVE_LIBSSH2_VERSION 1 #endif -#if defined(LIBSSH2_VERSION_NUM) && (LIBSSH2_VERSION_NUM >= 0x010206) -# define HAVE_LIBSSH2_SCP_SEND64 1 -#else -# undef HAVE_LIBSSH2_SCP_SEND64 +#if LIBSSH2_VERSION_NUM >= 0x010205 +#define HAVE_LIBSSH2_INIT 1 +#define HAVE_LIBSSH2_EXIT 1 #endif +#if LIBSSH2_VERSION_NUM >= 0x010206 +#define HAVE_LIBSSH2_KNOWNHOST_CHECKP 1 +#define HAVE_LIBSSH2_SCP_SEND64 1 +#endif + +#if LIBSSH2_VERSION_NUM >= 0x010208 +#define HAVE_LIBSSH2_SESSION_HANDSHAKE 1 +#endif extern const struct Curl_handler Curl_handler_scp; extern const struct Curl_handler Curl_handler_sftp; diff --git a/lib/strdup.c b/lib/strdup.c index 3b776b1..a997b12 100644 --- a/lib/strdup.c +++ b/lib/strdup.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -19,12 +19,12 @@ * KIND, either express or implied. * ***************************************************************************/ -/* - * This file is 'mem-include-scan' clean. See test 1132. - */ #include "curl_setup.h" - #include "strdup.h" +#include "curl_memory.h" + +/* The last #include file should be: */ +#include "memdebug.h" #ifndef HAVE_STRDUP char *curlx_strdup(const char *str) @@ -50,3 +50,24 @@ char *curlx_strdup(const char *str) } #endif + +/*************************************************************************** + * + * Curl_memdup(source, length) + * + * Copies the 'source' data to a newly allocated buffer (that is + * returned). Copies 'length' bytes. + * + * Returns the new pointer or NULL on failure. + * + ***************************************************************************/ +char *Curl_memdup(const char *src, size_t length) +{ + char *buffer = malloc(length); + if(!buffer) + return NULL; /* fail */ + + memcpy(buffer, src, length); + + return buffer; +} diff --git a/lib/strdup.h b/lib/strdup.h index 49af911..23a71f8 100644 --- a/lib/strdup.h +++ b/lib/strdup.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,5 +26,6 @@ #ifndef HAVE_STRDUP extern char *curlx_strdup(const char *str); #endif +char *Curl_memdup(const char *src, size_t buffer_length); #endif /* HEADER_CURL_STRDUP_H */ diff --git a/lib/strerror.c b/lib/strerror.c index a385f55..b85b568 100644 --- a/lib/strerror.c +++ b/lib/strerror.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2004 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 2004 - 2014, 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 @@ -105,6 +105,9 @@ curl_easy_strerror(CURLcode error) case CURLE_FTP_CANT_GET_HOST: return "FTP: can't figure out the host in the PASV response"; + case CURLE_HTTP2: + return "Error in the HTTP2 framing layer"; + case CURLE_FTP_COULDNT_SET_TYPE: return "FTP: couldn't set file type"; @@ -295,8 +298,10 @@ curl_easy_strerror(CURLcode error) case CURLE_NO_CONNECTION_AVAILABLE: return "The max connection limit is reached"; + case CURLE_SSL_PINNEDPUBKEYNOTMATCH: + return "SSL public key does not match pinned public key"; + /* error codes not used by current libcurl */ - case CURLE_OBSOLETE16: case CURLE_OBSOLETE20: case CURLE_OBSOLETE24: case CURLE_OBSOLETE29: @@ -325,7 +330,7 @@ curl_easy_strerror(CURLcode error) */ return "Unknown error"; #else - if(error == CURLE_OK) + if(!error) return "No error"; else return "Error"; @@ -361,6 +366,9 @@ curl_multi_strerror(CURLMcode error) case CURLM_UNKNOWN_OPTION: return "Unknown option"; + case CURLM_ADDED_ALREADY: + return "The easy handle is already added to a multi handle"; + case CURLM_LAST: break; } @@ -589,7 +597,7 @@ get_winsock_error (int err, char *buf, size_t len) return NULL; } #else - if(err == CURLE_OK) + if(!err) return NULL; else p = "error"; @@ -676,7 +684,7 @@ const char *Curl_strerror(struct connectdata *conn, int err) #elif defined(HAVE_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R) /* * The vxworks-style strerror_r() does use the buffer we pass to the function. - * The buffer size should be at least MAXERRSTR_SIZE (150) defined in rtsold.h + * The buffer size should be at least NAME_MAX (256) */ { char buffer[256]; diff --git a/lib/strtoofft.h b/lib/strtoofft.h index b812a67..75c73d4 100644 --- a/lib/strtoofft.h +++ b/lib/strtoofft.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -45,7 +45,14 @@ # define curlx_strtoofft strtoll # else # if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_INTEGRAL_MAX_BITS >= 64) - _CRTIMP __int64 __cdecl _strtoi64(const char *, char **, int); +# if defined(_SAL_VERSION) + _Check_return_ _CRTIMP __int64 __cdecl _strtoi64( + _In_z_ const char *_String, + _Out_opt_ _Deref_post_z_ char **_EndPtr, _In_ int _Radix); +# else + _CRTIMP __int64 __cdecl _strtoi64(const char *_String, + char **_EndPtr, int _Radix); +# endif # define curlx_strtoofft _strtoi64 # else curl_off_t curlx_strtoll(const char *nptr, char **endptr, int base); diff --git a/lib/telnet.c b/lib/telnet.c index 77d8b7b..176e994 100644 --- a/lib/telnet.c +++ b/lib/telnet.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -247,7 +247,7 @@ CURLcode init_telnet(struct connectdata *conn) if(!tn) return CURLE_OUT_OF_MEMORY; - conn->data->state.proto.telnet = (void *)tn; /* make us known */ + conn->data->req.protop = tn; /* make us known */ tn->telrcv_state = CURL_TS_DATA; @@ -292,7 +292,7 @@ CURLcode init_telnet(struct connectdata *conn) static void negotiate(struct connectdata *conn) { int i; - struct TELNET *tn = (struct TELNET *) conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *) conn->data->req.protop; for(i = 0;i < CURL_NTELOPTS;i++) { if(i==CURL_TELOPT_ECHO) @@ -366,7 +366,7 @@ static void send_negotiation(struct connectdata *conn, int cmd, int option) static void set_remote_option(struct connectdata *conn, int option, int newstate) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; if(newstate == CURL_YES) { switch(tn->him[option]) { case CURL_NO: @@ -440,7 +440,7 @@ void set_remote_option(struct connectdata *conn, int option, int newstate) static void rec_will(struct connectdata *conn, int option) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; switch(tn->him[option]) { case CURL_NO: if(tn->him_preferred[option] == CURL_YES) { @@ -488,7 +488,7 @@ void rec_will(struct connectdata *conn, int option) static void rec_wont(struct connectdata *conn, int option) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; switch(tn->him[option]) { case CURL_NO: /* Already disabled */ @@ -530,7 +530,7 @@ void rec_wont(struct connectdata *conn, int option) static void set_local_option(struct connectdata *conn, int option, int newstate) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; if(newstate == CURL_YES) { switch(tn->us[option]) { case CURL_NO: @@ -604,7 +604,7 @@ set_local_option(struct connectdata *conn, int option, int newstate) static void rec_do(struct connectdata *conn, int option) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; switch(tn->us[option]) { case CURL_NO: if(tn->us_preferred[option] == CURL_YES) { @@ -664,7 +664,7 @@ void rec_do(struct connectdata *conn, int option) static void rec_dont(struct connectdata *conn, int option) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; switch(tn->us[option]) { case CURL_NO: /* Already disabled */ @@ -710,7 +710,6 @@ static void printsub(struct SessionHandle *data, size_t length) /* length of suboption data */ { unsigned int i = 0; - unsigned short *pval; if(data->set.verbose) { if(direction) { @@ -763,9 +762,9 @@ static void printsub(struct SessionHandle *data, switch(pointer[0]) { case CURL_TELOPT_NAWS: - pval = (unsigned short*)(pointer+1); - infof(data, "Width: %hu ; Height: %hu", - ntohs(pval[0]), ntohs(pval[1])); + if(length > 4) + infof(data, "Width: %hu ; Height: %hu", (pointer[1]<<8) | pointer[2], + (pointer[3]<<8) | pointer[4]); break; default: switch(pointer[1]) { @@ -822,10 +821,10 @@ static CURLcode check_telnet_options(struct connectdata *conn) { struct curl_slist *head; struct curl_slist *beg; - char option_keyword[128]; - char option_arg[256]; + char option_keyword[128] = ""; + char option_arg[256] = ""; struct SessionHandle *data = conn->data; - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; CURLcode result = CURLE_OK; int binary_option; @@ -932,10 +931,10 @@ static void suboption(struct connectdata *conn) size_t len; size_t tmplen; int err; - char varname[128]; - char varval[128]; + char varname[128] = ""; + char varval[128] = ""; struct SessionHandle *data = conn->data; - struct TELNET *tn = (struct TELNET *)data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)data->req.protop; printsub(data, '<', (unsigned char *)tn->subbuffer, CURL_SB_LEN(tn)+2); switch (CURL_SB_GET(tn)) { @@ -973,11 +972,12 @@ static void suboption(struct connectdata *conn) tmplen = (strlen(v->data) + 1); /* Add the variable only if it fits */ if(len + tmplen < (int)sizeof(temp)-6) { - sscanf(v->data, "%127[^,],%127s", varname, varval); - snprintf((char *)&temp[len], sizeof(temp) - len, - "%c%s%c%s", CURL_NEW_ENV_VAR, varname, - CURL_NEW_ENV_VALUE, varval); - len += tmplen; + if(sscanf(v->data, "%127[^,],%127s", varname, varval)) { + snprintf((char *)&temp[len], sizeof(temp) - len, + "%c%s%c%s", CURL_NEW_ENV_VAR, varname, + CURL_NEW_ENV_VALUE, varval); + len += tmplen; + } } } snprintf((char *)&temp[len], sizeof(temp) - len, @@ -1009,7 +1009,7 @@ static void sendsuboption(struct connectdata *conn, int option) unsigned char*uc1, *uc2; struct SessionHandle *data = conn->data; - struct TELNET *tn = (struct TELNET *)data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)data->req.protop; switch (option) { case CURL_TELOPT_NAWS: @@ -1067,7 +1067,7 @@ CURLcode telrcv(struct connectdata *conn, int in = 0; int startwrite=-1; struct SessionHandle *data = conn->data; - struct TELNET *tn = (struct TELNET *)data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)data->req.protop; #define startskipping() \ if(startwrite >= 0) { \ @@ -1075,7 +1075,7 @@ CURLcode telrcv(struct connectdata *conn, CLIENTWRITE_BODY, \ (char *)&inbuf[startwrite], \ in-startwrite); \ - if(result != CURLE_OK) \ + if(result) \ return result; \ } \ startwrite = -1 @@ -1229,9 +1229,9 @@ static CURLcode send_telnet_data(struct connectdata *conn, unsigned char outbuf[2]; ssize_t bytes_written, total_written; int out_count; - CURLcode rc = CURLE_OK; + CURLcode result = CURLE_OK; - while(rc == CURLE_OK && nread--) { + while(!result && nread--) { outbuf[0] = *buffer++; out_count = 1; if(outbuf[0] == CURL_IAC) @@ -1246,25 +1246,26 @@ static CURLcode send_telnet_data(struct connectdata *conn, switch (Curl_poll(pfd, 1, -1)) { case -1: /* error, abort writing */ case 0: /* timeout (will never happen) */ - rc = CURLE_SEND_ERROR; + result = CURLE_SEND_ERROR; break; default: /* write! */ bytes_written = 0; - rc = Curl_write(conn, conn->sock[FIRSTSOCKET], outbuf+total_written, - out_count-total_written, &bytes_written); + result = Curl_write(conn, conn->sock[FIRSTSOCKET], + outbuf+total_written, out_count-total_written, + &bytes_written); total_written += bytes_written; break; } - /* handle partial write */ - } while(rc == CURLE_OK && total_written < out_count); + /* handle partial write */ + } while(!result && total_written < out_count); } - return rc; + return result; } static CURLcode telnet_done(struct connectdata *conn, CURLcode status, bool premature) { - struct TELNET *tn = (struct TELNET *)conn->data->state.proto.telnet; + struct TELNET *tn = (struct TELNET *)conn->data->req.protop; (void)status; /* unused */ (void)premature; /* not used */ @@ -1274,7 +1275,7 @@ static CURLcode telnet_done(struct connectdata *conn, curl_slist_free_all(tn->telnet_vars); tn->telnet_vars = NULL; - Curl_safefree(conn->data->state.proto.telnet); + Curl_safefree(conn->data->req.protop); return CURLE_OK; } @@ -1318,7 +1319,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) if(code) return code; - tn = (struct TELNET *)data->state.proto.telnet; + tn = (struct TELNET *)data->req.protop; code = check_telnet_options(conn); if(code) @@ -1491,6 +1492,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) case WAIT_OBJECT_0: + events.lNetworkEvents = 0; if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) { if((err = SOCKERRNO) != EINPROGRESS) { infof(data,"WSAEnumNetworkEvents failed (%d)", err); diff --git a/lib/tftp.c b/lib/tftp.c index ef740b8..b9723c0 100644 --- a/lib/tftp.c +++ b/lib/tftp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -56,6 +56,7 @@ #include "multiif.h" #include "url.h" #include "rawstr.h" +#include "speedcheck.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -416,32 +417,32 @@ static size_t tftp_option_add(tftp_state_data_t *state, size_t csize, static CURLcode tftp_connect_for_tx(tftp_state_data_t *state, tftp_event_t event) { - CURLcode res; + CURLcode result; #ifndef CURL_DISABLE_VERBOSE_STRINGS struct SessionHandle *data = state->conn->data; infof(data, "%s\n", "Connected for transmit"); #endif state->state = TFTP_STATE_TX; - res = tftp_set_timeouts(state); - if(res != CURLE_OK) - return(res); + result = tftp_set_timeouts(state); + if(result) + return(result); return tftp_tx(state, event); } static CURLcode tftp_connect_for_rx(tftp_state_data_t *state, tftp_event_t event) { - CURLcode res; + CURLcode result; #ifndef CURL_DISABLE_VERBOSE_STRINGS struct SessionHandle *data = state->conn->data; infof(data, "%s\n", "Connected for receive"); #endif state->state = TFTP_STATE_RX; - res = tftp_set_timeouts(state); - if(res != CURLE_OK) - return(res); + result = tftp_set_timeouts(state); + if(result) + return(result); return tftp_rx(state, event); } @@ -476,8 +477,8 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event) setpacketevent(&state->spacket, TFTP_EVENT_WRQ); state->conn->data->req.upload_fromhere = (char *)state->spacket.data+4; - if(data->set.infilesize != -1) - Curl_pgrsSetUploadSize(data, data->set.infilesize); + if(data->state.infilesize != -1) + Curl_pgrsSetUploadSize(data, data->state.infilesize); } else { /* If we are downloading, send an RRQ */ @@ -497,8 +498,9 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event) sbytes = 4 + strlen(filename) + strlen(mode); /* add tsize option */ - if(data->set.upload && (data->set.infilesize != -1)) - snprintf( buf, sizeof(buf), "%" FORMAT_OFF_T, data->set.infilesize ); + if(data->set.upload && (data->state.infilesize != -1)) + snprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T, + data->state.infilesize); else strcpy(buf, "0"); /* the destination is large enough */ @@ -947,10 +949,6 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done) blksize = TFTP_BLKSIZE_DEFAULT; - /* If there already is a protocol-specific struct allocated for this - sessionhandle, deal with it */ - Curl_reset_reqproto(conn); - state = conn->proto.tftpc = calloc(1, sizeof(tftp_state_data_t)); if(!state) return CURLE_OUT_OF_MEMORY; @@ -976,9 +974,9 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done) return CURLE_OUT_OF_MEMORY; } - conn->bits.close = TRUE; /* we don't keep TFTP connections up bascially - because there's none or very little gain for UDP - */ + /* we don't keep TFTP connections up bascially because there's none or very + * little gain for UDP */ + connclose(conn, "TFTP"); state->conn = conn; state->sockfd = state->conn->sock[FIRSTSOCKET]; @@ -1043,7 +1041,8 @@ static CURLcode tftp_done(struct connectdata *conn, CURLcode status, return CURLE_ABORTED_BY_CALLBACK; /* If we have encountered an error */ - code = tftp_translate_code(state->error); + if(state) + code = tftp_translate_code(state->error); return code; } @@ -1209,7 +1208,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done) } else if(event != TFTP_EVENT_NONE) { result = tftp_state_machine(state, event); - if(result != CURLE_OK) + if(result) return(result); *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE; if(*done) @@ -1228,10 +1227,10 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done) } else if(rc != 0) { result = tftp_receive_packet(conn); - if(result != CURLE_OK) + if(result) return(result); result = tftp_state_machine(state, state->event); - if(result != CURLE_OK) + if(result) return(result); *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE; if(*done) @@ -1259,6 +1258,15 @@ static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done) if(*dophase_done) { DEBUGF(infof(conn->data, "DO phase is complete\n")); } + else if(!result) { + /* The multi code doesn't have this logic for the DOING state so we + provide it for TFTP since it may do the entire transfer in this + state. */ + if(Curl_pgrsUpdate(conn)) + result = CURLE_ABORTED_BY_CALLBACK; + else + result = Curl_speedcheck(conn->data, Curl_tvnow()); + } return result; } @@ -1278,8 +1286,8 @@ static CURLcode tftp_perform(struct connectdata *conn, bool *dophase_done) result = tftp_state_machine(state, TFTP_EVENT_INIT); - if(state->state == TFTP_STATE_FIN || result != CURLE_OK) - return(result); + if((state->state == TFTP_STATE_FIN) || result) + return result; tftp_multi_statemach(conn, dophase_done); @@ -1302,35 +1310,30 @@ static CURLcode tftp_perform(struct connectdata *conn, bool *dophase_done) static CURLcode tftp_do(struct connectdata *conn, bool *done) { - tftp_state_data_t *state; - CURLcode code; + tftp_state_data_t *state; + CURLcode result; *done = FALSE; - /* - Since connections can be re-used between SessionHandles, this might be a - connection already existing but on a fresh SessionHandle struct so we must - make sure we have a good 'struct TFTP' to play with. For new connections, - the struct TFTP is allocated and setup in the tftp_connect() function. - */ - Curl_reset_reqproto(conn); - if(!conn->proto.tftpc) { - code = tftp_connect(conn, done); - if(code) - return code; + result = tftp_connect(conn, done); + if(result) + return result; } + state = (tftp_state_data_t *)conn->proto.tftpc; + if(!state) + return CURLE_BAD_CALLING_ORDER; - code = tftp_perform(conn, done); + result = tftp_perform(conn, done); /* If tftp_perform() returned an error, use that for return code. If it was OK, see if tftp_translate_code() has an error. */ - if(code == CURLE_OK) + if(!result) /* If we have encountered an internal tftp error, translate it. */ - code = tftp_translate_code(state->error); + result = tftp_translate_code(state->error); - return code; + return result; } static CURLcode tftp_setup_connection(struct connectdata * conn) diff --git a/lib/timeval.c b/lib/timeval.c index 2fd7201..769eb3c 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -32,9 +32,17 @@ struct timeval curlx_tvnow(void) ** increases monotonically and wraps once 49.7 days have elapsed. */ struct timeval now; +#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \ + (_WIN32_WINNT < _WIN32_WINNT_VISTA) DWORD milliseconds = GetTickCount(); now.tv_sec = milliseconds / 1000; now.tv_usec = (milliseconds % 1000) * 1000; +#else + ULONGLONG milliseconds = GetTickCount64(); + now.tv_sec = (long) (milliseconds / 1000); + now.tv_usec = (long) (milliseconds % 1000) * 1000; +#endif + return now; } diff --git a/lib/transfer.c b/lib/transfer.c index db0318d..a7ab08e 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -70,7 +70,7 @@ #include "http.h" #include "url.h" #include "getinfo.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "http_digest.h" #include "curl_ntlm.h" #include "http_negotiate.h" @@ -87,8 +87,6 @@ /* The last #include file should be: */ #include "memdebug.h" -#define CURL_TIMEOUT_EXPECT_100 1000 /* counting ms here */ - /* * This function will call the read callback to fill our buffer with data * to upload. @@ -101,11 +99,13 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) #ifdef CURL_DOES_CONVERSIONS bool sending_http_headers = FALSE; - if((conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) && - (data->state.proto.http->sending == HTTPSEND_REQUEST)) { - /* We're sending the HTTP request headers, not the data. - Remember that so we don't re-translate them into garbage. */ - sending_http_headers = TRUE; + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { + const struct HTTP *http = data->req.protop; + + if(http->sending == HTTPSEND_REQUEST) + /* We're sending the HTTP request headers, not the data. + Remember that so we don't re-translate them into garbage. */ + sending_http_headers = TRUE; } #endif @@ -126,14 +126,24 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) return CURLE_ABORTED_BY_CALLBACK; } else if(nread == CURL_READFUNC_PAUSE) { - struct SingleRequest *k = &data->req; - /* CURL_READFUNC_PAUSE pauses read callbacks that feed socket writes */ - k->keepon |= KEEP_SEND_PAUSE; /* mark socket send as paused */ - if(data->req.upload_chunky) { - /* Back out the preallocation done above */ - data->req.upload_fromhere -= (8 + 2); + + if(conn->handler->flags & PROTOPT_NONETWORK) { + /* protocols that work without network cannot be paused. This is + actually only FILE:// just now, and it can't pause since the transfer + isn't done using the "normal" procedure. */ + failf(data, "Read callback asked for PAUSE when not supported!"); + return CURLE_READ_ERROR; + } + else { + struct SingleRequest *k = &data->req; + /* CURL_READFUNC_PAUSE pauses read callbacks that feed socket writes */ + k->keepon |= KEEP_SEND_PAUSE; /* mark socket send as paused */ + if(data->req.upload_chunky) { + /* Back out the preallocation done above */ + data->req.upload_fromhere -= (8 + 2); + } + *nreadp = 0; } - *nreadp = 0; return CURLE_OK; /* nothing was read */ } else if((size_t)nread > buffersize) { @@ -193,7 +203,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) strlen(endofline_network)); #ifdef CURL_DOES_CONVERSIONS - CURLcode res; + CURLcode result; int length; if(data->set.prefer_ascii) { /* translate the protocol and data */ @@ -203,10 +213,10 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) /* just translate the protocol portion */ length = strlen(hexbuffer); } - res = Curl_convert_to_network(data, data->req.upload_fromhere, length); + result = Curl_convert_to_network(data, data->req.upload_fromhere, length); /* Curl_convert_to_network calls failf if unsuccessful */ - if(res) - return(res); + if(result) + return(result); #endif /* CURL_DOES_CONVERSIONS */ if((nread - hexlen) == 0) @@ -217,11 +227,11 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) } #ifdef CURL_DOES_CONVERSIONS else if((data->set.prefer_ascii) && (!sending_http_headers)) { - CURLcode res; - res = Curl_convert_to_network(data, data->req.upload_fromhere, nread); + CURLcode result; + result = Curl_convert_to_network(data, data->req.upload_fromhere, nread); /* Curl_convert_to_network calls failf if unsuccessful */ - if(res != CURLE_OK) - return(res); + if(result) + return result; } #endif /* CURL_DOES_CONVERSIONS */ @@ -300,7 +310,20 @@ static int data_pending(const struct connectdata *conn) /* in the case of libssh2, we can never be really sure that we have emptied its internal buffers so we MUST always try until we get EAGAIN back */ return conn->handler->protocol&(CURLPROTO_SCP|CURLPROTO_SFTP) || +#if defined(USE_NGHTTP2) + Curl_ssl_data_pending(conn, FIRSTSOCKET) || + /* For HTTP/2, we may read up everything including responde body + with header fields in Curl_http_readwrite_headers. If no + content-length is provided, curl waits for the connection + close, which we emulate it using conn->proto.httpc.closed = + TRUE. The thing is if we read everything, then http2_recv won't + be called and we cannot signal the HTTP/2 stream has closed. As + a workaround, we return nonzero here to call http2_recv. */ + ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20 && + conn->proto.httpc.closed); +#else Curl_ssl_data_pending(conn, FIRSTSOCKET); +#endif } static void read_rewind(struct connectdata *conn, @@ -504,7 +527,7 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(0 == k->bodywrites && !is_empty_data) { /* These checks are only made the first time we are about to write a piece of the body */ - if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) { + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { /* HTTP-only checks */ if(data->req.newurl) { @@ -524,6 +547,18 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(data->state.resume_from && !k->content_range && (data->set.httpreq==HTTPREQ_GET) && !k->ignorebody) { + + if(k->size == data->state.resume_from) { + /* The resume point is at the end of file, consider this fine + even if it doesn't allow resume from here. */ + infof(data, "The entire document is already downloaded"); + connclose(conn, "already downloaded"); + /* Abort download */ + k->keepon &= ~KEEP_RECV; + *done = TRUE; + return CURLE_OK; + } + /* we wanted to resume a download, although the server doesn't * seem to support this and we did this with a GET (if it * wasn't a GET we did a POST or PUT resume) */ @@ -540,9 +575,13 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(!Curl_meets_timecondition(data, k->timeofdoc)) { *done = TRUE; + /* We're simulating a http 304 from server so we return + what should have been returned from the server */ + data->info.httpcode = 304; + infof(data, "Simulate a HTTP 304 response!\n"); /* we abort the transfer before it is completed == we ruin the re-use ability. Close the connection */ - conn->bits.close = TRUE; + connclose(conn, "Simulated 304 handling"); return CURLE_OK; } } /* we have a time condition */ @@ -584,7 +623,7 @@ static CURLcode readwrite_data(struct SessionHandle *data, failf(data, "Failed writing data"); return CURLE_WRITE_ERROR; } - failf(data, "Problem (%d) in the Chunked-Encoded data", (int)res); + failf(data, "%s in chunked-encoding", Curl_chunked_strerror(res)); return CURLE_RECV_ERROR; } else if(CHUNKE_STOP == res) { @@ -630,9 +669,9 @@ static CURLcode readwrite_data(struct SessionHandle *data, always will fit in a size_t */ infof(data, "Rewinding stream by : %zu" - " bytes on url %s (size = %" FORMAT_OFF_T - ", maxdownload = %" FORMAT_OFF_T - ", bytecount = %" FORMAT_OFF_T ", nread = %zd)\n", + " bytes on url %s (size = %" CURL_FORMAT_CURL_OFF_T + ", maxdownload = %" CURL_FORMAT_CURL_OFF_T + ", bytecount = %" CURL_FORMAT_CURL_OFF_T ", nread = %zd)\n", excess, data->state.path, k->size, k->maxdownload, k->bytecount, nread); read_rewind(conn, excess); @@ -641,9 +680,9 @@ static CURLcode readwrite_data(struct SessionHandle *data, infof(data, "Excess found in a non pipelined read:" " excess = %zu" - ", size = %" FORMAT_OFF_T - ", maxdownload = %" FORMAT_OFF_T - ", bytecount = %" FORMAT_OFF_T "\n", + ", size = %" CURL_FORMAT_CURL_OFF_T + ", maxdownload = %" CURL_FORMAT_CURL_OFF_T + ", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n", excess, k->size, k->maxdownload, k->bytecount); } } @@ -696,7 +735,7 @@ static CURLcode readwrite_data(struct SessionHandle *data, if(!k->ignorebody) { #ifndef CURL_DISABLE_POP3 - if(conn->handler->protocol&CURLPROTO_POP3) + if(conn->handler->protocol&PROTO_FAMILY_POP3) result = Curl_pop3_write(conn, k->str, nread); else #endif /* CURL_DISABLE_POP3 */ @@ -810,9 +849,10 @@ static CURLcode readwrite_upload(struct SessionHandle *data, /* HTTP pollution, this should be written nicer to become more protocol agnostic. */ int fillcount; + struct HTTP *http = data->req.protop; if((k->exp100 == EXP100_SENDING_REQUEST) && - (data->state.proto.http->sending == HTTPSEND_BODY)) { + (http->sending == HTTPSEND_BODY)) { /* If this call is to send body data, we must take some action: We have sent off the full HTTP 1.1 request, and we shall now go into the Expect: 100 state and await such a header */ @@ -822,12 +862,12 @@ static CURLcode readwrite_upload(struct SessionHandle *data, *didwhat &= ~KEEP_SEND; /* we didn't write anything actually */ /* set a timeout for the multi interface */ - Curl_expire(data, CURL_TIMEOUT_EXPECT_100); + Curl_expire(data, data->set.expect_100_timeout); break; } - if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) { - if(data->state.proto.http->sending == HTTPSEND_REQUEST) + if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) { + if(http->sending == HTTPSEND_REQUEST) /* We're sending the HTTP request headers, not the data. Remember that so we don't change the line endings. */ sending_http_headers = TRUE; @@ -863,15 +903,6 @@ static CURLcode readwrite_upload(struct SessionHandle *data, /* store number of bytes available for upload */ data->req.upload_present = nread; -#ifndef CURL_DISABLE_SMTP - if(conn->handler->protocol & CURLPROTO_SMTP) { - result = Curl_smtp_escape_eob(conn, nread); - if(result) - return result; - } - else -#endif /* CURL_DISABLE_SMTP */ - /* convert LF to CRLF if so asked */ if((!sending_http_headers) && ( #ifdef CURL_DO_LINEEND_CONV @@ -879,12 +910,16 @@ static CURLcode readwrite_upload(struct SessionHandle *data, (data->set.prefer_ascii) || #endif (data->set.crlf))) { - if(data->state.scratch == NULL) - data->state.scratch = malloc(2*BUFSIZE); - if(data->state.scratch == NULL) { - failf (data, "Failed to alloc scratch buffer!"); - return CURLE_OUT_OF_MEMORY; + /* Do we need to allocate a scratch buffer? */ + if(!data->state.scratch) { + data->state.scratch = malloc(2 * BUFSIZE); + if(!data->state.scratch) { + failf(data, "Failed to alloc scratch buffer!"); + + return CURLE_OUT_OF_MEMORY; + } } + /* * ASCII/EBCDIC Note: This is presumably a text (not binary) * transfer so the data should already be in ASCII. @@ -898,12 +933,13 @@ static CURLcode readwrite_upload(struct SessionHandle *data, if(!data->set.crlf) { /* we're here only because FTP is in ASCII mode... bump infilesize for the LF we just added */ - data->set.infilesize++; + data->state.infilesize++; } } else data->state.scratch[si] = data->req.upload_fromhere[i]; } + if(si != nread) { /* only perform the special operation if we really did replace anything */ @@ -916,6 +952,14 @@ static CURLcode readwrite_upload(struct SessionHandle *data, data->req.upload_present = nread; } } + +#ifndef CURL_DISABLE_SMTP + if(conn->handler->protocol & PROTO_FAMILY_SMTP) { + result = Curl_smtp_escape_eob(conn, nread); + if(result) + return result; + } +#endif /* CURL_DISABLE_SMTP */ } /* if 0 == data->req.upload_present */ else { /* We have a partial buffer left from a previous "round". Use @@ -939,7 +983,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data, k->writebytecount += bytes_written; - if(k->writebytecount == data->set.infilesize) { + if(k->writebytecount == data->state.infilesize) { /* we have sent all data we were supposed to */ k->upload_done = TRUE; infof(data, "We are completely uploaded and fine\n"); @@ -1058,7 +1102,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, */ long ms = Curl_tvdiff(k->now, k->start100); - if(ms > CURL_TIMEOUT_EXPECT_100) { + if(ms >= data->set.expect_100_timeout) { /* we've waited long enough, continue anyway */ k->exp100 = EXP100_SEND_DATA; k->keepon |= KEEP_SEND; @@ -1078,13 +1122,14 @@ CURLcode Curl_readwrite(struct connectdata *conn, if(0 > Curl_timeleft(data, &k->now, FALSE)) { if(k->size != -1) { failf(data, "Operation timed out after %ld milliseconds with %" - FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received", + CURL_FORMAT_CURL_OFF_T " out of %" + CURL_FORMAT_CURL_OFF_T " bytes received", Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount, k->size); } else { failf(data, "Operation timed out after %ld milliseconds with %" - FORMAT_OFF_T " bytes received", + CURL_FORMAT_CURL_OFF_T " bytes received", Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount); } return CURLE_OPERATION_TIMEDOUT; @@ -1106,7 +1151,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, (k->bytecount != (k->size + data->state.crlf_conversions)) && #endif /* CURL_DO_LINEEND_CONV */ !data->req.newurl) { - failf(data, "transfer closed with %" FORMAT_OFF_T + failf(data, "transfer closed with %" CURL_FORMAT_CURL_OFF_T " bytes remaining to read", k->size - k->bytecount); return CURLE_PARTIAL_FILE; @@ -1173,10 +1218,10 @@ int Curl_single_getsock(const struct connectdata *conn, if((data->req.keepon & KEEP_SENDBITS) == KEEP_SEND) { if((conn->sockfd != conn->writesockfd) || - !(data->req.keepon & KEEP_RECV)) { - /* only if they are not the same socket or we didn't have a readable + bitmap == GETSOCK_BLANK) { + /* only if they are not the same socket and we have a readable one, we increase index */ - if(data->req.keepon & KEEP_RECV) + if(bitmap != GETSOCK_BLANK) sockindex++; /* increase index if we need two entries */ DEBUGASSERT(conn->writesockfd != CURL_SOCKET_BAD); @@ -1249,7 +1294,7 @@ long Curl_sleep_time(curl_off_t rate_bps, curl_off_t cur_rate_bps, */ CURLcode Curl_pretransfer(struct SessionHandle *data) { - CURLcode res; + CURLcode result; if(!data->change.url) { /* we can't do anything without URL */ failf(data, "No URL set!"); @@ -1259,17 +1304,15 @@ CURLcode Curl_pretransfer(struct SessionHandle *data) /* Init the SSL session ID cache here. We do it here since we want to do it after the *_setopt() calls (that could specify the size of the cache) but before any transfer takes place. */ - res = Curl_ssl_initsessions(data, data->set.ssl.max_ssl_sessions); - if(res) - return res; + result = Curl_ssl_initsessions(data, data->set.ssl.max_ssl_sessions); + if(result) + return result; data->set.followlocation=0; /* reset the location-follow counter */ data->state.this_is_a_follow = FALSE; /* reset this */ data->state.errorbuf = FALSE; /* no error has occurred */ data->state.httpversion = 0; /* don't assume any particular server version */ - data->state.ssl_connect_retry = FALSE; - data->state.authproblem = FALSE; data->state.authhost.want = data->set.httpauth; data->state.authproxy.want = data->set.proxyauth; @@ -1282,9 +1325,9 @@ CURLcode Curl_pretransfer(struct SessionHandle *data) /* If there is a list of host pairs to deal with */ if(data->change.resolve) - res = Curl_loadhostpairs(data); + result = Curl_loadhostpairs(data); - if(!res) { + if(!result) { /* Allow data->set.use_port to set which port to use. This needs to be * disabled for example when we follow Location: headers to URLs using * different ports! */ @@ -1314,7 +1357,7 @@ CURLcode Curl_pretransfer(struct SessionHandle *data) data->state.authproxy.picked &= data->state.authproxy.want; } - return res; + return result; } /* @@ -1690,54 +1733,50 @@ CURLcode Curl_follow(struct SessionHandle *data, */ break; case 301: /* Moved Permanently */ - /* (quote from RFC2616, section 10.3.2): + /* (quote from RFC7231, section 6.4.2) * - * When automatically redirecting a POST request after receiving a 301 - * status code, some existing HTTP/1.0 user agents will erroneously change - * it into a GET request. + * Note: For historical reasons, a user agent MAY change the request + * method from POST to GET for the subsequent request. If this + * behavior is undesired, the 307 (Temporary Redirect) status code + * can be used instead. * * ---- * - * As most of the important user agents do this obvious RFC2616 violation, - * many webservers expect this. So these servers often answers to a POST - * request with an error page. To be sure that libcurl gets the page that + * Many webservers expect this, so these servers often answers to a POST + * request with an error page. To be sure that libcurl gets the page that * most user agents would get, libcurl has to force GET. * - * This behavior can be overridden with CURLOPT_POSTREDIR. + * This behaviour is forbidden by RFC1945 and the obsolete RFC2616, and + * can be overridden with CURLOPT_POSTREDIR. */ if((data->set.httpreq == HTTPREQ_POST || data->set.httpreq == HTTPREQ_POST_FORM) && !(data->set.keep_post & CURL_REDIR_POST_301)) { - infof(data, - "Violate RFC 2616/10.3.2 and switch from POST to GET\n"); + infof(data, "Switch from POST to GET\n"); data->set.httpreq = HTTPREQ_GET; } break; case 302: /* Found */ - /* (From 10.3.3) - - Note: RFC 1945 and RFC 2068 specify that the client is not allowed - to change the method on the redirected request. However, most - existing user agent implementations treat 302 as if it were a 303 - response, performing a GET on the Location field-value regardless - of the original request method. The status codes 303 and 307 have - been added for servers that wish to make unambiguously clear which - kind of reaction is expected of the client. - - (From 10.3.4) - - Note: Many pre-HTTP/1.1 user agents do not understand the 303 - status. When interoperability with such clients is a concern, the - 302 status code may be used instead, since most user agents react - to a 302 response as described here for 303. - - This behavior can be overridden with CURLOPT_POSTREDIR - */ + /* (quote from RFC7231, section 6.4.3) + * + * Note: For historical reasons, a user agent MAY change the request + * method from POST to GET for the subsequent request. If this + * behavior is undesired, the 307 (Temporary Redirect) status code + * can be used instead. + * + * ---- + * + * Many webservers expect this, so these servers often answers to a POST + * request with an error page. To be sure that libcurl gets the page that + * most user agents would get, libcurl has to force GET. + * + * This behaviour is forbidden by RFC1945 and the obsolete RFC2616, and + * can be overridden with CURLOPT_POSTREDIR. + */ if((data->set.httpreq == HTTPREQ_POST || data->set.httpreq == HTTPREQ_POST_FORM) && !(data->set.keep_post & CURL_REDIR_POST_302)) { - infof(data, - "Violate RFC 2616/10.3.3 and switch from POST to GET\n"); + infof(data, "Switch from POST to GET\n"); data->set.httpreq = HTTPREQ_GET; } break; @@ -1789,7 +1828,7 @@ Curl_reconnect_request(struct connectdata **connp) infof(data, "Re-used connection seems dead, get a new one\n"); - conn->bits.close = TRUE; /* enforce close of this connection */ + connclose(conn, "Reconnect dead connection"); /* enforce close */ result = Curl_done(&conn, result, FALSE); /* we are so done with this */ /* conn may no longer be a good pointer, clear it to avoid mistakes by @@ -1803,13 +1842,13 @@ Curl_reconnect_request(struct connectdata **connp) * (again). Slight Lack of feedback in the report, but I don't think this * extra check can do much harm. */ - if((CURLE_OK == result) || (CURLE_SEND_ERROR == result)) { + if(!result || (CURLE_SEND_ERROR == result)) { bool async; bool protocol_done = TRUE; /* Now, redo the connect and get a new connection */ result = Curl_connect(data, connp, &async, &protocol_done); - if(CURLE_OK == result) { + if(!result) { /* We have connected or sent away a name resolve query fine */ conn = *connp; /* setup conn to again point to something nice */ @@ -1844,15 +1883,13 @@ CURLcode Curl_retry_request(struct connectdata *conn, /* if we're talking upload, we can't do the checks below, unless the protocol is HTTP as when uploading over HTTP we will still get a response */ if(data->set.upload && - !(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP))) + !(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP))) return CURLE_OK; - if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry || - ((data->req.bytecount + - data->req.headerbytecount == 0) && - conn->bits.reuse && - !data->set.opt_no_body && - data->set.rtspreq != RTSPREQ_RECEIVE)) { + if((data->req.bytecount + data->req.headerbytecount == 0) && + conn->bits.reuse && + !data->set.opt_no_body && + (data->set.rtspreq != RTSPREQ_RECEIVE)) { /* We got no data, we attempted to re-use a connection and yet we want a "body". This might happen if the connection was left alive when we were done using it before, but that was closed when we wanted to read from @@ -1862,7 +1899,7 @@ CURLcode Curl_retry_request(struct connectdata *conn, if(!*url) return CURLE_OUT_OF_MEMORY; - conn->bits.close = TRUE; /* close this connection */ + connclose(conn, "retry"); /* close this connection */ conn->bits.retry = TRUE; /* mark this as a connection we're about to retry. Marking it this way should prevent i.e HTTP transfers to return @@ -1870,9 +1907,11 @@ CURLcode Curl_retry_request(struct connectdata *conn, transferred! */ - if((conn->handler->protocol&CURLPROTO_HTTP) && - data->state.proto.http->writebytecount) - return Curl_readrewind(conn); + if(conn->handler->protocol&PROTO_FAMILY_HTTP) { + struct HTTP *http = data->req.protop; + if(http->writebytecount) + return Curl_readrewind(conn); + } } return CURLE_OK; } @@ -1930,6 +1969,7 @@ Curl_setup_transfer( k->keepon |= KEEP_RECV; if(conn->writesockfd != CURL_SOCKET_BAD) { + struct HTTP *http = data->req.protop; /* HTTP 1.1 magic: Even if we require a 100-return code before uploading data, we might @@ -1940,13 +1980,15 @@ Curl_setup_transfer( state info where we wait for the 100-return code */ if((data->state.expect100header) && - (data->state.proto.http->sending == HTTPSEND_BODY)) { + (conn->handler->protocol&PROTO_FAMILY_HTTP) && + (http->sending == HTTPSEND_BODY)) { /* wait with write until we either got 100-continue or a timeout */ k->exp100 = EXP100_AWAITING_CONTINUE; k->start100 = Curl_tvnow(); - /* set a timeout for the multi interface */ - Curl_expire(data, CURL_TIMEOUT_EXPECT_100); + /* Set a timeout for the multi interface. Add the inaccuracy margin so + that we don't fire slightly too early and get denied to run. */ + Curl_expire(data, data->set.expect_100_timeout); } else { if(data->state.expect100header) diff --git a/lib/url.c b/lib/url.c index 7cec5bc..d3bb5e0 100644 --- a/lib/url.c +++ b/lib/url.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -47,6 +47,10 @@ #include #endif +#ifdef HAVE_SYS_UN_H +#include +#endif + #ifndef HAVE_SOCKET #error "We can't compile without socket() support!" #endif @@ -78,7 +82,7 @@ int curl_win32_idn_to_ascii(const char *in, char **out); #include "netrc.h" #include "formdata.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "hostip.h" #include "transfer.h" #include "sendf.h" @@ -125,6 +129,7 @@ int curl_win32_idn_to_ascii(const char *in, char **out); #include "multihandle.h" #include "pipeline.h" #include "dotdot.h" +#include "strdup.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -144,7 +149,8 @@ static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke); static CURLcode do_init(struct connectdata *conn); static CURLcode parse_url_login(struct SessionHandle *data, struct connectdata *conn, - char *user, char *passwd, char *options); + char **userptr, char **passwdptr, + char **optionsptr); static CURLcode parse_login_details(const char *login, const size_t len, char **userptr, char **passwdptr, char **optionsptr); @@ -214,6 +220,15 @@ static const struct Curl_handler * const protocols[] = { #endif #endif +#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) && \ + (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)) + &Curl_handler_smb, +#ifdef USE_SSL + &Curl_handler_smbs, +#endif +#endif + #ifndef CURL_DISABLE_SMTP &Curl_handler_smtp, #ifdef USE_SSL @@ -269,14 +284,20 @@ void Curl_freeset(struct SessionHandle *data) { /* Free all dynamic strings stored in the data->set substructure. */ enum dupstring i; - for(i=(enum dupstring)0; i < STRING_LAST; i++) + for(i=(enum dupstring)0; i < STRING_LAST; i++) { Curl_safefree(data->set.str[i]); + } if(data->change.referer_alloc) { Curl_safefree(data->change.referer); data->change.referer_alloc = FALSE; } data->change.referer = NULL; + if(data->change.url_alloc) { + Curl_safefree(data->change.url); + data->change.url_alloc = FALSE; + } + data->change.url = NULL; } static CURLcode setstropt(char **charp, char *s) @@ -298,13 +319,11 @@ static CURLcode setstropt(char **charp, char *s) return CURLE_OK; } -static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp, - char **optionsp) +static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp) { CURLcode result = CURLE_OK; char *user = NULL; char *passwd = NULL; - char *options = NULL; /* Parse the login details if specified. It not then we treat NULL as a hint to clear the existing data */ @@ -312,7 +331,7 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp, result = parse_login_details(option, strlen(option), (userp ? &user : NULL), (passwdp ? &passwd : NULL), - (optionsp ? &options : NULL)); + NULL); } if(!result) { @@ -334,12 +353,6 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp, Curl_safefree(*passwdp); *passwdp = passwd; } - - /* Store the options part of option if required */ - if(optionsp) { - Curl_safefree(*optionsp); - *optionsp = options; - } } return result; @@ -347,7 +360,7 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp, CURLcode Curl_dupset(struct SessionHandle *dst, struct SessionHandle *src) { - CURLcode r = CURLE_OK; + CURLcode result = CURLE_OK; enum dupstring i; /* Copy src->set into dst->set first, then deal with the strings @@ -358,14 +371,25 @@ CURLcode Curl_dupset(struct SessionHandle *dst, struct SessionHandle *src) memset(dst->set.str, 0, STRING_LAST * sizeof(char *)); /* duplicate all strings */ - for(i=(enum dupstring)0; i< STRING_LAST; i++) { - r = setstropt(&dst->set.str[i], src->set.str[i]); - if(r != CURLE_OK) - break; + for(i=(enum dupstring)0; i< STRING_LASTZEROTERMINATED; i++) { + result = setstropt(&dst->set.str[i], src->set.str[i]); + if(result) + return result; } - /* If a failure occurred, freeing has to be performed externally. */ - return r; + /* duplicate memory areas pointed to */ + i = STRING_COPYPOSTFIELDS; + if(src->set.postfieldsize && src->set.str[i]) { + /* postfieldsize is curl_off_t, Curl_memdup() takes a size_t ... */ + dst->set.str[i] = Curl_memdup(src->set.str[i], + curlx_sotouz(src->set.postfieldsize)); + if(!dst->set.str[i]) + return CURLE_OUT_OF_MEMORY; + /* point to the new copy */ + dst->set.postfields = dst->set.str[i]; + } + + return CURLE_OK; } /* @@ -417,7 +441,8 @@ CURLcode Curl_close(struct SessionHandle *data) Curl_safefree(data->state.pathbuffer); data->state.path = NULL; - Curl_safefree(data->state.proto.generic); + /* freed here just in case DONE wasn't called */ + Curl_free_request_state(data); /* Close down all open SSL info and sessions */ Curl_ssl_close_all(data); @@ -425,6 +450,12 @@ CURLcode Curl_close(struct SessionHandle *data) Curl_safefree(data->state.scratch); Curl_ssl_free_certinfo(data); + /* Cleanup possible redirect junk */ + if(data->req.newurl) { + free(data->req.newurl); + data->req.newurl = NULL; + } + if(data->change.referer_alloc) { Curl_safefree(data->change.referer); data->change.referer_alloc = FALSE; @@ -469,7 +500,7 @@ CURLcode Curl_close(struct SessionHandle *data) */ CURLcode Curl_init_userdefined(struct UserDefined *set) { - CURLcode res = CURLE_OK; + CURLcode result = CURLE_OK; set->out = stdout; /* default output to stdout */ set->in = stdin; /* default input from stdin */ @@ -491,7 +522,7 @@ CURLcode Curl_init_userdefined(struct UserDefined *set) set->convtonetwork = ZERO_NULL; set->convfromutf8 = ZERO_NULL; - set->infilesize = -1; /* we don't know any size */ + set->filesize = -1; /* we don't know the size */ set->postfieldsize = -1; /* unknown size */ set->maxredirs = -1; /* allow any amount by default */ @@ -535,8 +566,9 @@ CURLcode Curl_init_userdefined(struct UserDefined *set) define since we internally only use the lower 16 bits for the passed in bitmask to not conflict with the private bits */ set->allowed_protocols = CURLPROTO_ALL; - set->redir_protocols = - CURLPROTO_ALL & ~(CURLPROTO_FILE|CURLPROTO_SCP); /* not FILE or SCP */ + set->redir_protocols = CURLPROTO_ALL & /* All except FILE, SCP and SMB */ + ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB | + CURLPROTO_SMBS); #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) /* @@ -544,18 +576,18 @@ CURLcode Curl_init_userdefined(struct UserDefined *set) * seem not to follow rfc1961 section 4.3/4.4 */ set->socks5_gssapi_nec = FALSE; - /* set default gssapi service name */ - res = setstropt(&set->str[STRING_SOCKS5_GSSAPI_SERVICE], - (char *) CURL_DEFAULT_SOCKS5_GSSAPI_SERVICE); - if(res != CURLE_OK) - return res; + /* set default GSS-API service name */ + result = setstropt(&set->str[STRING_SOCKS5_GSSAPI_SERVICE], + (char *) CURL_DEFAULT_SOCKS5_GSSAPI_SERVICE); + if(result) + return result; #endif /* This is our preferred CA cert bundle/path since install time */ #if defined(CURL_CA_BUNDLE) - res = setstropt(&set->str[STRING_SSL_CAFILE], (char *) CURL_CA_BUNDLE); + result = setstropt(&set->str[STRING_SSL_CAFILE], (char *) CURL_CA_BUNDLE); #elif defined(CURL_CA_PATH) - res = setstropt(&set->str[STRING_SSL_CAPATH], (char *) CURL_CA_PATH); + result = setstropt(&set->str[STRING_SSL_CAPATH], (char *) CURL_CA_PATH); #endif set->wildcardmatch = FALSE; @@ -569,7 +601,11 @@ CURLcode Curl_init_userdefined(struct UserDefined *set) set->tcp_keepintvl = 60; set->tcp_keepidle = 60; - return res; + set->ssl_enable_npn = TRUE; + set->ssl_enable_alpn = TRUE; + + set->expect_100_timeout = 1000L; /* Wait for a second by default. */ + return result; } /** @@ -582,9 +618,8 @@ CURLcode Curl_init_userdefined(struct UserDefined *set) CURLcode Curl_open(struct SessionHandle **curl) { - CURLcode res = CURLE_OK; + CURLcode result; struct SessionHandle *data; - CURLcode status; /* Very simple start-up: alloc the struct, init it with zeroes and return */ data = calloc(1, sizeof(struct SessionHandle)); @@ -596,11 +631,11 @@ CURLcode Curl_open(struct SessionHandle **curl) data->magic = CURLEASY_MAGIC_NUMBER; - status = Curl_resolver_init(&data->state.resolver); - if(status) { + result = Curl_resolver_init(&data->state.resolver); + if(result) { DEBUGF(fprintf(stderr, "Error: resolver_init failed\n")); free(data); - return status; + return result; } /* We do some initial setup here, all those fields that can't be just 0 */ @@ -608,11 +643,10 @@ CURLcode Curl_open(struct SessionHandle **curl) data->state.headerbuff = malloc(HEADERSIZE); if(!data->state.headerbuff) { DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n")); - res = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; } else { - Curl_easy_initHandleData(data); - res = Curl_init_userdefined(&data->set); + result = Curl_init_userdefined(&data->set); data->state.headersize=HEADERSIZE; @@ -630,7 +664,7 @@ CURLcode Curl_open(struct SessionHandle **curl) data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */ } - if(res) { + if(result) { Curl_resolver_cleanup(data->state.resolver); if(data->state.headerbuff) free(data->state.headerbuff); @@ -641,7 +675,7 @@ CURLcode Curl_open(struct SessionHandle **curl) else *curl = data; - return res; + return result; } CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, @@ -736,7 +770,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, break; case CURLOPT_FAILONERROR: /* - * Don't output the >=300 error code HTML-page, but instead only + * Don't output the >=400 error code HTML-page, but instead only * return error. */ data->set.http_fail_on_error = (0 != va_arg(param, long))?TRUE:FALSE; @@ -1070,6 +1104,28 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, data->set.headers = va_arg(param, struct curl_slist *); break; + case CURLOPT_PROXYHEADER: + /* + * Set a list with proxy headers to use (or replace internals with) + * + * Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a + * long time we remain doing it this way until CURLOPT_PROXYHEADER is + * used. As soon as this option has been used, if set to anything but + * NULL, custom headers for proxies are only picked from this list. + * + * Set this option to NULL to restore the previous behavior. + */ + data->set.proxyheaders = va_arg(param, struct curl_slist *); + break; + + case CURLOPT_HEADEROPT: + /* + * Set header option. + */ + arg = va_arg(param, long); + data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE; + break; + case CURLOPT_HTTP200ALIASES: /* * Set a list of aliases for HTTP 200 in response header @@ -1109,6 +1165,8 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, /* * Set cookie file name to dump all cookies to when we're done. */ + { + struct CookieInfo *newcookies; result = setstropt(&data->set.str[STRING_COOKIEJAR], va_arg(param, char *)); @@ -1116,8 +1174,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, * Activate the cookie parser. This may or may not already * have been made. */ - data->cookies = Curl_cookie_init(data, NULL, data->cookies, - data->set.cookiesession); + newcookies = Curl_cookie_init(data, NULL, data->cookies, + data->set.cookiesession); + if(!newcookies) + result = CURLE_OUT_OF_MEMORY; + data->cookies = newcookies; + } break; case CURLOPT_COOKIESESSION: @@ -1145,30 +1207,39 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, if(argptr == NULL) break; - Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); - if(Curl_raw_equal(argptr, "ALL")) { /* clear all cookies */ + Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); Curl_cookie_clearall(data->cookies); + Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); } else if(Curl_raw_equal(argptr, "SESS")) { /* clear session cookies */ + Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); Curl_cookie_clearsess(data->cookies); + Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); } else if(Curl_raw_equal(argptr, "FLUSH")) { - /* flush cookies to file */ + /* flush cookies to file, takes care of the locking */ Curl_flush_cookies(data, 0); } + else if(Curl_raw_equal(argptr, "RELOAD")) { + /* reload cookies from file */ + Curl_cookie_loadfiles(data); + break; + } else { if(!data->cookies) /* if cookie engine was not running, activate it */ data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE); argptr = strdup(argptr); - if(!argptr) { + if(!argptr || !data->cookies) { result = CURLE_OUT_OF_MEMORY; + Curl_safefree(argptr); } else { + Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); if(checkprefix("Set-Cookie:", argptr)) /* HTTP Header format line */ @@ -1178,10 +1249,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, /* Netscape format line */ Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL); + Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); free(argptr); } } - Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); break; #endif /* CURL_DISABLE_COOKIES */ @@ -1202,7 +1273,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, * This sets a requested HTTP version to be used. The value is one of * the listed enums in curl/curl.h. */ - data->set.httpversion = va_arg(param, long); + arg = va_arg(param, long); +#ifndef USE_NGHTTP2 + if(arg == CURL_HTTP_VERSION_2_0) + return CURLE_UNSUPPORTED_PROTOCOL; +#endif + data->set.httpversion = arg; break; case CURLOPT_HTTPAUTH: @@ -1235,9 +1311,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, #elif !defined(NTLM_WB_ENABLED) auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ #endif -#ifndef USE_HTTP_NEGOTIATE - auth &= ~CURLAUTH_GSSNEGOTIATE; /* no GSS-Negotiate without GSSAPI or - WINDOWS_SSPI */ +#ifndef USE_SPNEGO + auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without + GSS-API or SSPI */ #endif /* check if any auth bit lower than CURLAUTH_ONLY is still set */ @@ -1256,6 +1332,14 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, } break; + case CURLOPT_EXPECT_100_TIMEOUT_MS: + /* + * Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. + */ + data->set.expect_100_timeout = va_arg(param, long); + break; + #endif /* CURL_DISABLE_HTTP */ case CURLOPT_CUSTOMREQUEST: @@ -1315,9 +1399,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, #elif !defined(NTLM_WB_ENABLED) auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ #endif -#ifndef USE_HTTP_NEGOTIATE - auth &= ~CURLAUTH_GSSNEGOTIATE; /* no GSS-Negotiate without GSSAPI or - WINDOWS_SSPI */ +#ifndef USE_SPNEGO + auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without + GSS-API or SSPI */ #endif /* check if any auth bit lower than CURLAUTH_ONLY is still set */ @@ -1379,7 +1463,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) case CURLOPT_SOCKS5_GSSAPI_SERVICE: /* - * Set gssapi service name + * Set GSS-API service name */ result = setstropt(&data->set.str[STRING_SOCKS5_GSSAPI_SERVICE], va_arg(param, char *)); @@ -1393,7 +1477,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, break; #endif - case CURLOPT_WRITEHEADER: + case CURLOPT_HEADERDATA: /* * Custom pointer to pass the header write callback function */ @@ -1406,7 +1490,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, */ data->set.errorbuffer = va_arg(param, char *); break; - case CURLOPT_FILE: + case CURLOPT_WRITEDATA: /* * FILE pointer to write to. Or possibly * used as argument to the write callback. @@ -1447,7 +1531,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, data->set.ftp_skip_ip = (0 != va_arg(param, long))?TRUE:FALSE; break; - case CURLOPT_INFILE: + case CURLOPT_READDATA: /* * FILE pointer to read the file to be uploaded from. Or possibly * used as argument to the read callback. @@ -1459,14 +1543,14 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, * If known, this should inform curl about the file size of the * to-be-uploaded file. */ - data->set.infilesize = va_arg(param, long); + data->set.filesize = va_arg(param, long); break; case CURLOPT_INFILESIZE_LARGE: /* * If known, this should inform curl about the file size of the * to-be-uploaded file. */ - data->set.infilesize = va_arg(param, curl_off_t); + data->set.filesize = va_arg(param, curl_off_t); break; case CURLOPT_LOW_SPEED_LIMIT: /* @@ -1547,13 +1631,13 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, case CURLOPT_USERPWD: /* - * user:password;options to use in the operation + * user:password to use in the operation */ result = setstropt_userpwd(va_arg(param, char *), &data->set.str[STRING_USERNAME], - &data->set.str[STRING_PASSWORD], - &data->set.str[STRING_OPTIONS]); + &data->set.str[STRING_PASSWORD]); break; + case CURLOPT_USERNAME: /* * authentication user name to use in the operation @@ -1561,6 +1645,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, result = setstropt(&data->set.str[STRING_USERNAME], va_arg(param, char *)); break; + case CURLOPT_PASSWORD: /* * authentication password to use in the operation @@ -1568,6 +1653,23 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, result = setstropt(&data->set.str[STRING_PASSWORD], va_arg(param, char *)); break; + + case CURLOPT_LOGIN_OPTIONS: + /* + * authentication options to use in the operation + */ + result = setstropt(&data->set.str[STRING_OPTIONS], + va_arg(param, char *)); + break; + + case CURLOPT_XOAUTH2_BEARER: + /* + * XOAUTH2 bearer token to use in the operation + */ + result = setstropt(&data->set.str[STRING_BEARER], + va_arg(param, char *)); + break; + case CURLOPT_POSTQUOTE: /* * List of RAW FTP commands to use after a transfer @@ -1637,7 +1739,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, */ result = setstropt_userpwd(va_arg(param, char *), &data->set.str[STRING_PROXYUSERNAME], - &data->set.str[STRING_PROXYPASSWORD], NULL); + &data->set.str[STRING_PROXYPASSWORD]); break; case CURLOPT_PROXYUSERNAME: /* @@ -1867,7 +1969,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, break; case CURLOPT_GSSAPI_DELEGATION: /* - * GSSAPI credential delegation + * GSS-API credential delegation */ data->set.gssapi_delegation = va_arg(param, long); break; @@ -1895,29 +1997,41 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, data->set.ssl.verifyhost = (0 != arg)?TRUE:FALSE; break; -#ifdef USE_SSLEAY - /* since these two options are only possible to use on an OpenSSL- - powered libcurl we #ifdef them on this condition so that libcurls - built against other SSL libs will return a proper error when trying - to set this option! */ case CURLOPT_SSL_CTX_FUNCTION: +#ifdef have_curlssl_ssl_ctx /* * Set a SSL_CTX callback */ data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback); +#else + result = CURLE_NOT_BUILT_IN; +#endif break; case CURLOPT_SSL_CTX_DATA: +#ifdef have_curlssl_ssl_ctx /* * Set a SSL_CTX callback parameter pointer */ data->set.ssl.fsslctxp = va_arg(param, void *); - break; +#else + result = CURLE_NOT_BUILT_IN; #endif -#if defined(USE_SSLEAY) || defined(USE_QSOSSL) || defined(USE_GSKIT) + break; case CURLOPT_CERTINFO: +#ifdef have_curlssl_certinfo data->set.ssl.certinfo = (0 != va_arg(param, long))?TRUE:FALSE; - break; +#else + result = CURLE_NOT_BUILT_IN; #endif + break; + case CURLOPT_PINNEDPUBLICKEY: + /* + * Set pinned public key for SSL connection. + * Specify file name of the public key in DER format. + */ + result = setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY], + va_arg(param, char *)); + break; case CURLOPT_CAINFO: /* * Set CA info for SSL connection. Specify file name of the CA certificate @@ -1926,6 +2040,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, va_arg(param, char *)); break; case CURLOPT_CAPATH: +#ifdef have_curlssl_ca_path /* not supported by all backends */ /* * Set CA path info for SSL connection. Specify directory name of the CA * certificates which have been prepared using openssl c_rehash utility. @@ -1933,6 +2048,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, /* This does not work on windows. */ result = setstropt(&data->set.str[STRING_SSL_CAPATH], va_arg(param, char *)); +#else + result = CURLE_NOT_BUILT_IN; +#endif break; case CURLOPT_CRLFILE: /* @@ -2251,7 +2369,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, * know that an unsigned int will always hold the value so we blindly * typecast to this type */ - data->set.scope = curlx_sltoui(va_arg(param, long)); + data->set.scope_id = curlx_sltoui(va_arg(param, long)); break; case CURLOPT_PROTOCOLS: @@ -2442,6 +2560,15 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, case CURLOPT_DNS_SERVERS: result = Curl_set_dns_servers(data, va_arg(param, char *)); break; + case CURLOPT_DNS_INTERFACE: + result = Curl_set_dns_interface(data, va_arg(param, char *)); + break; + case CURLOPT_DNS_LOCAL_IP4: + result = Curl_set_dns_local_ip4(data, va_arg(param, char *)); + break; + case CURLOPT_DNS_LOCAL_IP6: + result = Curl_set_dns_local_ip6(data, va_arg(param, char *)); + break; case CURLOPT_TCP_KEEPALIVE: data->set.tcp_keepalive = (0 != va_arg(param, long))?TRUE:FALSE; @@ -2452,6 +2579,19 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, case CURLOPT_TCP_KEEPINTVL: data->set.tcp_keepintvl = va_arg(param, long); break; + case CURLOPT_SSL_ENABLE_NPN: + data->set.ssl_enable_npn = (0 != va_arg(param, long))?TRUE:FALSE; + break; + case CURLOPT_SSL_ENABLE_ALPN: + data->set.ssl_enable_alpn = (0 != va_arg(param, long))?TRUE:FALSE; + break; + +#ifdef USE_UNIX_SOCKETS + case CURLOPT_UNIX_SOCKET_PATH: + result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH], + va_arg(param, char *)); + break; +#endif default: /* unknown tag and its companion, just ignore: */ @@ -2480,13 +2620,19 @@ static void conn_free(struct connectdata *conn) Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]); if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET]) Curl_closesocket(conn, conn->sock[FIRSTSOCKET]); + if(CURL_SOCKET_BAD != conn->tempsock[0]) + Curl_closesocket(conn, conn->tempsock[0]); + if(CURL_SOCKET_BAD != conn->tempsock[1]) + Curl_closesocket(conn, conn->tempsock[1]); -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ + defined(NTLM_WB_ENABLED) Curl_ntlm_wb_cleanup(conn); #endif Curl_safefree(conn->user); Curl_safefree(conn->passwd); + Curl_safefree(conn->xoauth2_bearer); Curl_safefree(conn->options); Curl_safefree(conn->proxyuser); Curl_safefree(conn->proxypasswd); @@ -2517,6 +2663,16 @@ static void conn_free(struct connectdata *conn) free(conn); /* free all the connection oriented data */ } +/* + * Disconnects the given connection. Note the connection may not be the + * primary connection, like when freeing room in the connection cache or + * killing of a dead old connection. + * + * This function MUST NOT reset state in the SessionHandle struct if that + * isn't strictly bound to the life-time of *this* particular connection. + * + */ + CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection) { struct SessionHandle *data; @@ -2536,38 +2692,10 @@ CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection) Curl_hostcache_prune(data); /* kill old DNS cache entries */ - { - int has_host_ntlm = (conn->ntlm.state != NTLMSTATE_NONE); - int has_proxy_ntlm = (conn->proxyntlm.state != NTLMSTATE_NONE); - - /* Authentication data is a mix of connection-related and sessionhandle- - related stuff. NTLM is connection-related so when we close the shop - we shall forget. */ - - if(has_host_ntlm) { - data->state.authhost.done = FALSE; - data->state.authhost.picked = - data->state.authhost.want; - } - - if(has_proxy_ntlm) { - data->state.authproxy.done = FALSE; - data->state.authproxy.picked = - data->state.authproxy.want; - } - - if(has_host_ntlm || has_proxy_ntlm) - data->state.authproblem = FALSE; - } - +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) /* Cleanup NTLM connection-related data */ Curl_http_ntlm_cleanup(conn); - - /* Cleanup possible redirect junk */ - if(data->req.newurl) { - free(data->req.newurl); - data->req.newurl = NULL; - } +#endif if(conn->handler->disconnect) /* This is set if protocol-specific cleanups should be made */ @@ -2606,8 +2734,6 @@ CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection) conn_free(conn); - Curl_speedinit(data); - return CURLE_OK; } @@ -2632,7 +2758,7 @@ static bool SocketIsDead(curl_socket_t sock) static bool IsPipeliningPossible(const struct SessionHandle *handle, const struct connectdata *conn) { - if((conn->handler->protocol & CURLPROTO_HTTP) && + if((conn->handler->protocol & PROTO_FAMILY_HTTP) && Curl_multi_pipeline_enabled(handle->multi) && (handle->set.httpreq == HTTPREQ_GET || handle->set.httpreq == HTTPREQ_HEAD) && @@ -2652,7 +2778,6 @@ CURLcode Curl_addHandleToPipeline(struct SessionHandle *data, { if(!Curl_llist_insert_next(pipeline, pipeline->tail, data)) return CURLE_OUT_OF_MEMORY; - infof(data, "Curl_addHandleToPipeline: length: %d\n", pipeline->size); return CURLE_OK; } @@ -2835,6 +2960,69 @@ find_oldest_idle_connection_in_bundle(struct SessionHandle *data, } /* + * This function checks if given connection is dead and disconnects if so. + * (That also removes it from the connection cache.) + * + * Returns TRUE if the connection actually was dead and disconnected. + */ +static bool disconnect_if_dead(struct connectdata *conn, + struct SessionHandle *data) +{ + size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size; + if(!pipeLen && !conn->inuse) { + /* The check for a dead socket makes sense only if there are no + handles in pipeline and the connection isn't already marked in + use */ + bool dead; + if(conn->handler->protocol & CURLPROTO_RTSP) + /* RTSP is a special case due to RTP interleaving */ + dead = Curl_rtsp_connisdead(conn); + else + dead = SocketIsDead(conn->sock[FIRSTSOCKET]); + + if(dead) { + conn->data = data; + infof(data, "Connection %ld seems to be dead!\n", conn->connection_id); + + /* disconnect resources */ + Curl_disconnect(conn, /* dead_connection */TRUE); + return TRUE; + } + } + return FALSE; +} + +/* + * Wrapper to use disconnect_if_dead() function in Curl_conncache_foreach() + * + * Returns always 0. + */ +static int call_disconnect_if_dead(struct connectdata *conn, + void *param) +{ + struct SessionHandle* data = (struct SessionHandle*)param; + disconnect_if_dead(conn, data); + return 0; /* continue iteration */ +} + +/* + * This function scans the connection cache for half-open/dead connections, + * closes and removes them. + * The cleanup is done at most once per second. + */ +static void prune_dead_connections(struct SessionHandle *data) +{ + struct timeval now = Curl_tvnow(); + long elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup); + + if(elapsed >= 1000L) { + Curl_conncache_foreach(data->state.conn_cache, data, + call_disconnect_if_dead); + data->state.conn_cache->last_cleanup = now; + } +} + +/* * Given one filled in connection struct (named needle), this function should * detect if there already is one that has all the significant details * exactly the same and thus should be used instead. @@ -2855,8 +3043,9 @@ ConnectionExists(struct SessionHandle *data, struct connectdata *check; struct connectdata *chosen = 0; bool canPipeline = IsPipeliningPossible(data, needle); - bool wantNTLM = (data->state.authhost.want==CURLAUTH_NTLM) || - (data->state.authhost.want==CURLAUTH_NTLM_WB) ? TRUE : FALSE; + bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) || + (data->state.authhost.want & CURLAUTH_NTLM_WB)) && + (needle->handler->protocol & PROTO_FAMILY_HTTP) ? TRUE : FALSE; struct connectbundle *bundle; *force_reuse = FALSE; @@ -2887,7 +3076,9 @@ ConnectionExists(struct SessionHandle *data, curr = bundle->conn_list->head; while(curr) { bool match = FALSE; +#if defined(USE_NTLM) bool credentialsMatch = FALSE; +#endif size_t pipeLen; /* @@ -2897,29 +3088,10 @@ ConnectionExists(struct SessionHandle *data, check = curr->ptr; curr = curr->next; - pipeLen = check->send_pipe->size + check->recv_pipe->size; - - if(!pipeLen && !check->inuse) { - /* The check for a dead socket makes sense only if there are no - handles in pipeline and the connection isn't already marked in - use */ - bool dead; - if(check->handler->protocol & CURLPROTO_RTSP) - /* RTSP is a special case due to RTP interleaving */ - dead = Curl_rtsp_connisdead(check); - else - dead = SocketIsDead(check->sock[FIRSTSOCKET]); - - if(dead) { - check->data = data; - infof(data, "Connection %ld seems to be dead!\n", - check->connection_id); + if(disconnect_if_dead(check, data)) + continue; - /* disconnect resources */ - Curl_disconnect(check, /* dead_connection */ TRUE); - continue; - } - } + pipeLen = check->send_pipe->size + check->recv_pipe->size; if(canPipeline) { /* Make sure the pipe has only GET requests */ @@ -3011,16 +3183,18 @@ ConnectionExists(struct SessionHandle *data, continue; } - if((needle->handler->protocol & CURLPROTO_FTP) || - ((needle->handler->protocol & CURLPROTO_HTTP) && wantNTLM)) { - /* This is FTP or HTTP+NTLM, verify that we're using the same name - and password as well */ - if(!strequal(needle->user, check->user) || - !strequal(needle->passwd, check->passwd)) { - /* one of them was different */ - continue; - } - credentialsMatch = TRUE; + if((!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) || + wantNTLMhttp) { + /* This protocol requires credentials per connection or is HTTP+NTLM, + so verify that we're using the same name and password as well */ + if(!strequal(needle->user, check->user) || + !strequal(needle->passwd, check->passwd)) { + /* one of them was different */ + continue; + } +#if defined(USE_NTLM) + credentialsMatch = TRUE; +#endif } if(!needle->bits.httpproxy || needle->handler->flags&PROTOPT_SSL || @@ -3072,12 +3246,13 @@ ConnectionExists(struct SessionHandle *data, } if(match) { - /* If we are looking for an NTLM connection, check if this is already - authenticating with the right credentials. If not, keep looking so - that we can reuse NTLM connections if possible. (Especially we - must not reuse the same connection if partway through - a handshake!) */ - if(wantNTLM) { +#if defined(USE_NTLM) + /* If we are looking for an HTTP+NTLM connection, check if this is + already authenticating with the right credentials. If not, keep + looking so that we can reuse NTLM connections if + possible. (Especially we must not reuse the same connection if + partway through a handshake!) */ + if(wantNTLMhttp) { if(credentialsMatch && check->ntlm.state != NTLMSTATE_NONE) { chosen = check; @@ -3085,9 +3260,12 @@ ConnectionExists(struct SessionHandle *data, *force_reuse = TRUE; break; } - else - continue; + else if(credentialsMatch) + /* this is a backup choice */ + chosen = check; + continue; } +#endif if(canPipeline) { /* We can pipeline if we want to. Let's continue looking for @@ -3140,7 +3318,8 @@ ConnectionDone(struct SessionHandle *data, struct connectdata *conn) { /* data->multi->maxconnects can be negative, deal with it. */ size_t maxconnects = - (data->multi->maxconnects < 0) ? 0 : data->multi->maxconnects; + (data->multi->maxconnects < 0) ? data->multi->num_easy * 4: + data->multi->maxconnects; struct connectdata *conn_candidate = NULL; /* Mark the current connection as 'unused' */ @@ -3175,19 +3354,7 @@ ConnectionDone(struct SessionHandle *data, struct connectdata *conn) static CURLcode ConnectionStore(struct SessionHandle *data, struct connectdata *conn) { - static int connection_id_counter = 0; - - CURLcode result; - - /* Assign a number to the connection for easier tracking in the log - output */ - conn->connection_id = connection_id_counter++; - - result = Curl_conncache_add_conn(data->state.conn_cache, conn); - if(result != CURLE_OK) - conn->connection_id = -1; - - return result; + return Curl_conncache_add_conn(data->state.conn_cache, conn); } /* after a TCP connection to the proxy has been verified, this function does @@ -3196,9 +3363,12 @@ static CURLcode ConnectionStore(struct SessionHandle *data, Note: this function's sub-functions call failf() */ -CURLcode Curl_connected_proxy(struct connectdata *conn) +CURLcode Curl_connected_proxy(struct connectdata *conn, + int sockindex) { - if(!conn->bits.proxy) + if(!conn->bits.proxy || sockindex) + /* this magic only works for the primary socket as the secondary is used + for FTP only and it has FTP specific magic in ftp.c */ return CURLE_OK; switch(conn->proxytype) { @@ -3229,49 +3399,6 @@ CURLcode Curl_connected_proxy(struct connectdata *conn) return CURLE_OK; } -static CURLcode ConnectPlease(struct SessionHandle *data, - struct connectdata *conn, - bool *connected) -{ - CURLcode result; - Curl_addrinfo *addr; -#ifndef CURL_DISABLE_VERBOSE_STRINGS - char *hostname = conn->bits.proxy?conn->proxy.name:conn->host.name; - - infof(data, "About to connect() to %s%s port %ld (#%ld)\n", - conn->bits.proxy?"proxy ":"", - hostname, conn->port, conn->connection_id); -#else - (void)data; -#endif - - /************************************************************* - * Connect to server/proxy - *************************************************************/ - result= Curl_connecthost(conn, - conn->dns_entry, - &conn->sock[FIRSTSOCKET], - &addr, - connected); - if(CURLE_OK == result) { - /* All is cool, we store the current information */ - conn->ip_addr = addr; - - if(*connected) { - result = Curl_connected_proxy(conn); - if(!result) { - conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; - Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */ - } - } - } - - if(result) - *connected = FALSE; /* mark it as not connected */ - - return result; -} - /* * verboseconnect() displays verbose information after a connect */ @@ -3462,6 +3589,8 @@ static bool tld_check_name(struct SessionHandle *data, static void fix_hostname(struct SessionHandle *data, struct connectdata *conn, struct hostname *host) { + size_t len; + #ifndef USE_LIBIDN (void)data; (void)conn; @@ -3471,6 +3600,13 @@ static void fix_hostname(struct SessionHandle *data, /* set the name we use to display the host name */ host->dispname = host->name; + + len = strlen(host->name); + if(host->name[len-1] == '.') + /* strip off a single trailing dot if present, primarily for SNI but + there's no use for it */ + host->name[len-1]=0; + if(!is_ASCII_name(host->name)) { #ifdef USE_LIBIDN /************************************************************* @@ -3538,13 +3674,16 @@ static struct connectdata *allocate_conn(struct SessionHandle *data) conn->sock[FIRSTSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */ conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */ + conn->tempsock[0] = CURL_SOCKET_BAD; /* no file descriptor */ + conn->tempsock[1] = CURL_SOCKET_BAD; /* no file descriptor */ conn->connection_id = -1; /* no ID */ conn->port = -1; /* unknown at this point */ + conn->remote_port = -1; /* unknown */ /* Default protocol-independent behavior doesn't support persistent connections, so we set this to force-close. Protocols that support this need to set this to FALSE in their "curl_do" functions. */ - conn->bits.close = TRUE; + connclose(conn, "Default to force-close"); /* Store creation time to help future close decision making */ conn->created = Curl_tvnow(); @@ -3585,7 +3724,8 @@ static struct connectdata *allocate_conn(struct SessionHandle *data) conn->ip_version = data->set.ipver; -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ + defined(NTLM_WB_ENABLED) conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD; conn->ntlm_auth_hlpr_pid = 0; conn->challenge_header = NULL; @@ -3606,7 +3746,7 @@ static struct connectdata *allocate_conn(struct SessionHandle *data) if(!conn->send_pipe || !conn->recv_pipe) goto error; -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI conn->data_prot = PROT_CLEAR; #endif @@ -3675,7 +3815,7 @@ static CURLcode findprotocol(struct SessionHandle *data, /* The protocol was not found in the table, but we don't have to assign it to anything since it is already assigned to a dummy-struct in the create_conn() function when the connectdata struct is allocated. */ - failf(data, "Protocol %s not supported or disabled in " LIBCURL_NAME, + failf(data, "Protocol \"%s\" not supported or disabled in " LIBCURL_NAME, protostr); return CURLE_UNSUPPORTED_PROTOCOL; @@ -3687,20 +3827,28 @@ static CURLcode findprotocol(struct SessionHandle *data, static CURLcode parseurlandfillconn(struct SessionHandle *data, struct connectdata *conn, bool *prot_missing, - char *user, char *passwd, char *options) + char **userp, char **passwdp, + char **optionsp) { char *at; char *fragment; char *path = data->state.path; char *query; int rc; - char protobuf[16]; - const char *protop; + char protobuf[16] = ""; + const char *protop = ""; CURLcode result; bool rebuild_url = FALSE; *prot_missing = FALSE; + /* We might pass the entire URL into the request so we need to make sure + * there are no bad characters in there.*/ + if(strpbrk(data->change.url, "\r\n")) { + failf(data, "Illegal characters found in URL"); + return CURLE_URL_MALFORMAT; + } + /************************************************************* * Parse the URL. * @@ -3931,33 +4079,66 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data, * Parse the login details from the URL and strip them out of * the host name */ - result = parse_url_login(data, conn, user, passwd, options); - if(result != CURLE_OK) + result = parse_url_login(data, conn, userp, passwdp, optionsp); + if(result) return result; if(conn->host.name[0] == '[') { /* This looks like an IPv6 address literal. See if there is an address - scope. */ - char *percent = strstr (conn->host.name, "%25"); + scope if there is no location header */ + char *percent = strchr(conn->host.name, '%'); if(percent) { + unsigned int identifier_offset = 3; char *endp; - unsigned long scope = strtoul (percent + 3, &endp, 10); + unsigned long scope; + if(strncmp("%25", percent, 3) != 0) { + infof(data, + "Please URL encode %% as %%25, see RFC 6874.\n"); + identifier_offset = 1; + } + scope = strtoul(percent + identifier_offset, &endp, 10); if(*endp == ']') { /* The address scope was well formed. Knock it out of the hostname. */ memmove(percent, endp, strlen(endp)+1); - if(!data->state.this_is_a_follow) - /* Don't honour a scope given in a Location: header */ - conn->scope = (unsigned int)scope; + conn->scope_id = (unsigned int)scope; + } + else { + /* Zone identifier is not numeric */ +#if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ) && defined(HAVE_IF_NAMETOINDEX) + char ifname[IFNAMSIZ + 2]; + char *square_bracket; + unsigned int scopeidx = 0; + strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2); + /* Ensure nullbyte termination */ + ifname[IFNAMSIZ + 1] = '\0'; + square_bracket = strchr(ifname, ']'); + if(square_bracket) { + /* Remove ']' */ + *square_bracket = '\0'; + scopeidx = if_nametoindex(ifname); + if(scopeidx == 0) { + infof(data, "Invalid network interface: %s; %s\n", ifname, + strerror(errno)); + } + } + if(scopeidx > 0) { + char *p = percent + identifier_offset + strlen(ifname); + + /* Remove zone identifier from hostname */ + memmove(percent, p, strlen(p) + 1); + conn->scope_id = scopeidx; + } + else +#endif /* HAVE_NET_IF_H && IFNAMSIZ */ + infof(data, "Invalid IPv6 address format\n"); } - else - infof(data, "Invalid IPv6 address format\n"); } } - if(data->set.scope) + if(data->set.scope_id) /* Override any scope that was set above. */ - conn->scope = data->set.scope; + conn->scope_id = data->set.scope_id; /* Remove the fragment part of the path. Per RFC 2396, this is always the last part of the URI. We are looking for the first '#' so that we deal @@ -3997,7 +4178,7 @@ static CURLcode setup_range(struct SessionHandle *data) free(s->range); if(s->resume_from) - s->range = aprintf("%" FORMAT_OFF_TU "-", s->resume_from); + s->range = aprintf("%" CURL_FORMAT_CURL_OFF_TU "-", s->resume_from); else s->range = strdup(data->set.str[STRING_SET_RANGE]); @@ -4016,18 +4197,32 @@ static CURLcode setup_range(struct SessionHandle *data) } -/*************************************************************** -* Setup connection internals specific to the requested protocol. -* This MUST get called after proxy magic has been figured out. -***************************************************************/ +/* + * setup_connection_internals() - + * + * Setup connection internals specific to the requested protocol in the + * SessionHandle. This is inited and setup before the connection is made but + * is about the particular protocol that is to be used. + * + * This MUST get called after proxy magic has been figured out. + */ static CURLcode setup_connection_internals(struct connectdata *conn) { const struct Curl_handler * p; CURLcode result; + struct SessionHandle *data = conn->data; - conn->socktype = SOCK_STREAM; /* most of them are TCP streams */ + /* in some case in the multi state-machine, we go back to the CONNECT state + and then a second (or third or...) call to this function will be made + without doing a DISCONNECT or DONE in between (since the connection is + yet in place) and therefore this function needs to first make sure + there's no lingering previous data allocated. */ + Curl_free_request_state(data); + + memset(&data->req, 0, sizeof(struct SingleRequest)); + data->req.maxdownload = -1; - /* Scan protocol handler table. */ + conn->socktype = SOCK_STREAM; /* most of them are TCP streams */ /* Perform setup complement if some. */ p = conn->handler; @@ -4035,7 +4230,7 @@ static CURLcode setup_connection_internals(struct connectdata *conn) if(p->setup_connection) { result = (*p->setup_connection)(conn); - if(result != CURLE_OK) + if(result) return result; p = conn->handler; /* May have changed. */ @@ -4045,11 +4240,27 @@ static CURLcode setup_connection_internals(struct connectdata *conn) /* we check for -1 here since if proxy was detected already, this was very likely already set to the proxy port */ conn->port = p->defport; - conn->remote_port = (unsigned short)conn->given->defport; + + /* only if remote_port was not already parsed off the URL we use the + default port number */ + if(conn->remote_port < 0) + conn->remote_port = (unsigned short)conn->given->defport; return CURLE_OK; } +/* + * Curl_free_request_state() should free temp data that was allocated in the + * SessionHandle for this single request. + */ + +void Curl_free_request_state(struct SessionHandle *data) +{ + Curl_safefree(data->req.protop); + Curl_safefree(data->req.newurl); +} + + #ifndef CURL_DISABLE_PROXY /**************************************************************** * Checks if the host is in the noproxy list. returns true if it matches @@ -4193,9 +4404,8 @@ static char *detect_proxy(struct connectdata *conn) prox=curl_getenv(proxy_env); } - if(prox && *prox) { /* don't count "" strings */ + if(prox) proxy = prox; /* use this */ - } else { proxy = curl_getenv("all_proxy"); /* default proxy to use */ if(!proxy) @@ -4255,13 +4465,12 @@ static CURLcode parse_proxy(struct SessionHandle *data, /* Is there a username and password given in this proxy url? */ atsign = strchr(proxyptr, '@'); if(atsign) { - CURLcode res = CURLE_OK; char *proxyuser = NULL; char *proxypasswd = NULL; - - res = parse_login_details(proxyptr, atsign - proxyptr, - &proxyuser, &proxypasswd, NULL); - if(!res) { + CURLcode result = + parse_login_details(proxyptr, atsign - proxyptr, + &proxyuser, &proxypasswd, NULL); + if(!result) { /* found user and password, rip them out. note that we are unescaping them, as there is otherwise no way to have a username or password with reserved characters like ':' in @@ -4273,7 +4482,7 @@ static CURLcode parse_proxy(struct SessionHandle *data, conn->proxyuser = strdup(""); if(!conn->proxyuser) - res = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; else { Curl_safefree(conn->proxypasswd); if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH) @@ -4282,36 +4491,42 @@ static CURLcode parse_proxy(struct SessionHandle *data, conn->proxypasswd = strdup(""); if(!conn->proxypasswd) - res = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; } - if(!res) { + if(!result) { conn->bits.proxy_user_passwd = TRUE; /* enable it */ atsign++; /* the right side of the @-letter */ - if(atsign) - proxyptr = atsign; /* now use this instead */ - else - res = CURLE_OUT_OF_MEMORY; + proxyptr = atsign; /* now use this instead */ } } Curl_safefree(proxyuser); Curl_safefree(proxypasswd); - if(res) - return res; + if(result) + return result; } /* start scanning for port number at this point */ portptr = proxyptr; - /* detect and extract RFC2732-style IPv6-addresses */ + /* detect and extract RFC6874-style IPv6-addresses */ if(*proxyptr == '[') { char *ptr = ++proxyptr; /* advance beyond the initial bracket */ - while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '%') || - (*ptr == '.'))) + while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.'))) ptr++; + if(*ptr == '%') { + /* There might be a zone identifier */ + if(strncmp("%25", ptr, 3)) + infof(data, "Please URL encode %% as %%25, see RFC 6874.\n"); + ptr++; + /* Allow unresered characters as defined in RFC 3986 */ + while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') || + (*ptr == '.') || (*ptr == '_') || (*ptr == '~'))) + ptr++; + } if(*ptr == ']') /* yeps, it ended nicely with a bracket as well */ *ptr++ = 0; @@ -4411,7 +4626,7 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data, */ static CURLcode parse_url_login(struct SessionHandle *data, struct connectdata *conn, - char *user, char *passwd, char *options) + char **user, char **passwd, char **options) { CURLcode result = CURLE_OK; char *userp = NULL; @@ -4428,90 +4643,82 @@ static CURLcode parse_url_login(struct SessionHandle *data, char *ptr = strchr(conn->host.name, '@'); char *login = conn->host.name; - user[0] = 0; /* to make everything well-defined */ - passwd[0] = 0; - options[0] = 0; + DEBUGASSERT(!**user); + DEBUGASSERT(!**passwd); + DEBUGASSERT(!**options); + + if(!ptr) + goto out; /* We will now try to extract the * possible login information in a string like: * ftp://user:password@ftp.my.site:8021/README */ - if(ptr) { - /* There's login information to the left of the @ */ - - conn->host.name = ++ptr; - - /* So the hostname is sane. Only bother interpreting the - * results if we could care. It could still be wasted - * work because it might be overtaken by the programmatically - * set user/passwd, but doing that first adds more cases here :-( - */ + conn->host.name = ++ptr; - if(data->set.use_netrc != CURL_NETRC_REQUIRED) { - /* We could use the login information in the URL so extract it */ - result = parse_login_details(login, ptr - login - 1, - &userp, &passwdp, &optionsp); - if(!result) { - if(userp) { - char *newname; - - /* We have a user in the URL */ - conn->bits.userpwd_in_url = TRUE; - conn->bits.user_passwd = TRUE; /* enable user+password */ - - /* Decode the user */ - newname = curl_easy_unescape(data, userp, 0, NULL); - if(!newname) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } + /* So the hostname is sane. Only bother interpreting the + * results if we could care. It could still be wasted + * work because it might be overtaken by the programmatically + * set user/passwd, but doing that first adds more cases here :-( + */ - if(strlen(newname) < MAX_CURL_USER_LENGTH) - strcpy(user, newname); + if(data->set.use_netrc == CURL_NETRC_REQUIRED) + goto out; - free(newname); - } + /* We could use the login information in the URL so extract it */ + result = parse_login_details(login, ptr - login - 1, + &userp, &passwdp, &optionsp); + if(result) + goto out; - if(passwdp) { - /* We have a password in the URL so decode it */ - char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL); - if(!newpasswd) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } + if(userp) { + char *newname; - if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH) - strcpy(passwd, newpasswd); + /* We have a user in the URL */ + conn->bits.userpwd_in_url = TRUE; + conn->bits.user_passwd = TRUE; /* enable user+password */ - free(newpasswd); - } + /* Decode the user */ + newname = curl_easy_unescape(data, userp, 0, NULL); + if(!newname) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } - if(optionsp) { - /* We have an options list in the URL so decode it */ - char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL); - if(!newoptions) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } + free(*user); + *user = newname; + } - if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH) - strcpy(options, newoptions); + if(passwdp) { + /* We have a password in the URL so decode it */ + char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL); + if(!newpasswd) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } - free(newoptions); - } - } + free(*passwd); + *passwd = newpasswd; + } - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); + if(optionsp) { + /* We have an options list in the URL so decode it */ + char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL); + if(!newoptions) { + result = CURLE_OUT_OF_MEMORY; + goto out; } + + free(*options); + *options = newoptions; } + + out: + + Curl_safefree(userp); + Curl_safefree(passwdp); + Curl_safefree(optionsp); + return result; } @@ -4735,24 +4942,21 @@ static CURLcode parse_remote_port(struct SessionHandle *data, /* no CURLOPT_PORT given, extract the one from the URL */ char *rest; - unsigned long port; - - port=strtoul(portptr+1, &rest, 10); /* Port number must be decimal */ + long port; - if(rest != (portptr+1) && *rest == '\0') { - /* The colon really did have only digits after it, - * so it is either a port number or a mistake */ + port=strtol(portptr+1, &rest, 10); /* Port number must be decimal */ - if(port > 0xffff) { /* Single unix standard says port numbers are - * 16 bits long */ - failf(data, "Port number too large: %lu", port); - return CURLE_URL_MALFORMAT; - } + if((port < 0) || (port > 0xffff)) { + /* Single unix standard says port numbers are 16 bits long */ + failf(data, "Port number out of range"); + return CURLE_URL_MALFORMAT; + } + else if(rest != &portptr[1]) { *portptr = '\0'; /* cut off the name there */ conn->remote_port = curlx_ultous(port); } - else if(!port) + else /* Browser behavior adaptation. If there's a colon with no digits after, just cut off the name there which makes us ignore the colon and just use the default port. Firefox and Chrome both do that. */ @@ -4765,34 +4969,44 @@ static CURLcode parse_remote_port(struct SessionHandle *data, * Override the login details from the URL with that in the CURLOPT_USERPWD * option or a .netrc file, if applicable. */ -static void override_login(struct SessionHandle *data, - struct connectdata *conn, - char *user, char *passwd, char *options) +static CURLcode override_login(struct SessionHandle *data, + struct connectdata *conn, + char **userp, char **passwdp, char **optionsp) { if(data->set.str[STRING_USERNAME]) { - strncpy(user, data->set.str[STRING_USERNAME], MAX_CURL_USER_LENGTH); - user[MAX_CURL_USER_LENGTH - 1] = '\0'; /* To be on safe side */ + free(*userp); + *userp = strdup(data->set.str[STRING_USERNAME]); + if(!*userp) + return CURLE_OUT_OF_MEMORY; } if(data->set.str[STRING_PASSWORD]) { - strncpy(passwd, data->set.str[STRING_PASSWORD], MAX_CURL_PASSWORD_LENGTH); - passwd[MAX_CURL_PASSWORD_LENGTH - 1] = '\0'; /* To be on safe side */ + free(*passwdp); + *passwdp = strdup(data->set.str[STRING_PASSWORD]); + if(!*passwdp) + return CURLE_OUT_OF_MEMORY; } if(data->set.str[STRING_OPTIONS]) { - strncpy(options, data->set.str[STRING_OPTIONS], MAX_CURL_OPTIONS_LENGTH); - options[MAX_CURL_OPTIONS_LENGTH - 1] = '\0'; /* To be on safe side */ + free(*optionsp); + *optionsp = strdup(data->set.str[STRING_OPTIONS]); + if(!*optionsp) + return CURLE_OUT_OF_MEMORY; } conn->bits.netrc = FALSE; if(data->set.use_netrc != CURL_NETRC_IGNORED) { - if(Curl_parsenetrc(conn->host.name, - user, passwd, - data->set.str[STRING_NETRC_FILE])) { + int ret = Curl_parsenetrc(conn->host.name, + userp, passwdp, + data->set.str[STRING_NETRC_FILE]); + if(ret > 0) { infof(data, "Couldn't find host %s in the " DOT_CHAR "netrc file; using defaults\n", conn->host.name); } + else if(ret < 0 ) { + return CURLE_OUT_OF_MEMORY; + } else { /* set bits.netrc TRUE to remember that we got the name from a .netrc file, so that it is safe to use even if we followed a Location: to a @@ -4802,10 +5016,12 @@ static void override_login(struct SessionHandle *data, conn->bits.user_passwd = TRUE; /* enable user+password */ } } + + return CURLE_OK; } /* - * Set password so it's available in the connection. + * Set the login details so they're available in the connection */ static CURLcode set_login(struct connectdata *conn, const char *user, const char *passwd, @@ -4878,6 +5094,32 @@ static CURLcode resolve_server(struct SessionHandle *data, /* set a pointer to the hostname we display */ fix_hostname(data, conn, &conn->host); +#ifdef USE_UNIX_SOCKETS + if(data->set.str[STRING_UNIX_SOCKET_PATH]) { + /* Unix domain sockets are local. The host gets ignored, just use the + * specified domain socket address. Do not cache "DNS entries". There is + * no DNS involved and we already have the filesystem path available */ + const char *path = data->set.str[STRING_UNIX_SOCKET_PATH]; + + hostaddr = calloc(1, sizeof(struct Curl_dns_entry)); + if(!hostaddr) + result = CURLE_OUT_OF_MEMORY; + else if((hostaddr->addr = Curl_unix2addr(path)) != NULL) + hostaddr->inuse++; + else { + /* Long paths are not supported for now */ + if(strlen(path) >= sizeof(((struct sockaddr_un *)0)->sun_path)) { + failf(data, "Unix socket path too long: '%s'", path); + result = CURLE_COULDNT_RESOLVE_HOST; + } + else + result = CURLE_OUT_OF_MEMORY; + free(hostaddr); + hostaddr = NULL; + } + } + else +#endif if(!conn->proxy.name || !*conn->proxy.name) { /* If not connecting via a proxy, extract the port from the URL, if it is * there, thus overriding any defaults that might have been set above. */ @@ -5018,14 +5260,14 @@ static CURLcode create_conn(struct SessionHandle *data, struct connectdata *conn; struct connectdata *conn_temp = NULL; size_t urllen; - char user[MAX_CURL_USER_LENGTH]; - char passwd[MAX_CURL_PASSWORD_LENGTH]; - char options[MAX_CURL_OPTIONS_LENGTH]; + char *user = NULL; + char *passwd = NULL; + char *options = NULL; bool reuse; char *proxy = NULL; bool prot_missing = FALSE; bool no_connections_available = FALSE; - bool force_reuse; + bool force_reuse = FALSE; size_t max_host_connections = Curl_multi_max_host_connections(data->multi); size_t max_total_connections = Curl_multi_max_total_connections(data->multi); @@ -5035,8 +5277,10 @@ static CURLcode create_conn(struct SessionHandle *data, * Check input data *************************************************************/ - if(!data->change.url) - return CURLE_URL_MALFORMAT; + if(!data->change.url) { + result = CURLE_URL_MALFORMAT; + goto out; + } /* First, split up the current URL in parts so that we can use the parts for checking against the already present connections. In order @@ -5044,8 +5288,10 @@ static CURLcode create_conn(struct SessionHandle *data, connection data struct and fill in for comparison purposes. */ conn = allocate_conn(data); - if(!conn) - return CURLE_OUT_OF_MEMORY; + if(!conn) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } /* We must set the return variable as soon as possible, so that our parent can cleanup any possible allocs we may have done before @@ -5075,24 +5321,35 @@ static CURLcode create_conn(struct SessionHandle *data, data->state.path = NULL; data->state.pathbuffer = malloc(urllen+2); - if(NULL == data->state.pathbuffer) - return CURLE_OUT_OF_MEMORY; /* really bad error */ + if(NULL == data->state.pathbuffer) { + result = CURLE_OUT_OF_MEMORY; /* really bad error */ + goto out; + } data->state.path = data->state.pathbuffer; conn->host.rawalloc = malloc(urllen+2); if(NULL == conn->host.rawalloc) { Curl_safefree(data->state.pathbuffer); data->state.path = NULL; - return CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; + goto out; } conn->host.name = conn->host.rawalloc; conn->host.name[0] = 0; - result = parseurlandfillconn(data, conn, &prot_missing, user, passwd, - options); - if(result != CURLE_OK) - return result; + user = strdup(""); + passwd = strdup(""); + options = strdup(""); + if(!user || !passwd || !options) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } + + result = parseurlandfillconn(data, conn, &prot_missing, &user, &passwd, + &options); + if(result) + goto out; /************************************************************* * No protocol part in URL was used, add it! @@ -5106,8 +5363,8 @@ static CURLcode create_conn(struct SessionHandle *data, reurl = aprintf("%s://%s", conn->handler->scheme, data->change.url); if(!reurl) { - Curl_safefree(proxy); - return CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; + goto out; } if(data->change.url_alloc) { @@ -5121,7 +5378,7 @@ static CURLcode create_conn(struct SessionHandle *data, /************************************************************* * If the protocol can't handle url query strings, then cut - * of the unhandable part + * off the unhandable part *************************************************************/ if((conn->given->flags&PROTOPT_NOURLQUERY)) { char *path_q_sep = strchr(conn->data->state.path, '?'); @@ -5137,14 +5394,22 @@ static CURLcode create_conn(struct SessionHandle *data, } } + if(data->set.str[STRING_BEARER]) { + conn->xoauth2_bearer = strdup(data->set.str[STRING_BEARER]); + if(!conn->xoauth2_bearer) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } + } + #ifndef CURL_DISABLE_PROXY /************************************************************* * Extract the user and password from the authentication string *************************************************************/ if(conn->bits.proxy_user_passwd) { result = parse_proxy_auth(data, conn); - if(result != CURLE_OK) - return result; + if(result) + goto out; } /************************************************************* @@ -5155,7 +5420,8 @@ static CURLcode create_conn(struct SessionHandle *data, /* if global proxy is set, this is it */ if(NULL == proxy) { failf(data, "memory shortage"); - return CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; + goto out; } } @@ -5169,6 +5435,13 @@ static CURLcode create_conn(struct SessionHandle *data, else if(!proxy) proxy = detect_proxy(conn); +#ifdef USE_UNIX_SOCKETS + if(proxy && data->set.str[STRING_UNIX_SOCKET_PATH]) { + free(proxy); /* Unix domain sockets cannot be proxied, so disable it */ + proxy = NULL; + } +#endif + if(proxy && (!*proxy || (conn->handler->flags & PROTOPT_NONETWORK))) { free(proxy); /* Don't bother with an empty proxy string or if the protocol doesn't work with network */ @@ -5183,20 +5456,21 @@ static CURLcode create_conn(struct SessionHandle *data, if(proxy) { result = parse_proxy(data, conn, proxy); - free(proxy); /* parse_proxy copies the proxy string */ + Curl_safefree(proxy); /* parse_proxy copies the proxy string */ if(result) - return result; + goto out; if((conn->proxytype == CURLPROXY_HTTP) || (conn->proxytype == CURLPROXY_HTTP_1_0)) { #ifdef CURL_DISABLE_HTTP /* asking for a HTTP proxy is a bit funny when HTTP is disabled... */ - return CURLE_UNSUPPORTED_PROTOCOL; + result = CURLE_UNSUPPORTED_PROTOCOL; + goto out; #else /* force this connection's protocol to become HTTP if not already compatible - if it isn't tunneling through */ - if(!(conn->handler->protocol & CURLPROTO_HTTP) && + if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) && !conn->bits.tunnel_proxy) conn->handler = &Curl_handler_http; @@ -5218,14 +5492,35 @@ static CURLcode create_conn(struct SessionHandle *data, #endif /* CURL_DISABLE_PROXY */ /************************************************************* + * If the protocol is using SSL and HTTP proxy is used, we set + * the tunnel_proxy bit. + *************************************************************/ + if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy) + conn->bits.tunnel_proxy = TRUE; + + /************************************************************* + * Figure out the remote port number and fix it in the URL + *************************************************************/ + result = parse_remote_port(data, conn); + if(result) + goto out; + + /* Check for overridden login details and set them accordingly so they + they are known when protocol->setup_connection is called! */ + result = override_login(data, conn, &user, &passwd, &options); + if(result) + goto out; + result = set_login(conn, user, passwd, options); + if(result) + goto out; + + /************************************************************* * Setup internals depending on protocol. Needs to be done after * we figured out what/if proxy to use. *************************************************************/ result = setup_connection_internals(conn); - if(result != CURLE_OK) { - Curl_safefree(proxy); - return result; - } + if(result) + goto out; conn->recv[FIRSTSOCKET] = Curl_recv_plain; conn->send[FIRSTSOCKET] = Curl_send_plain; @@ -5244,7 +5539,7 @@ static CURLcode create_conn(struct SessionHandle *data, result = conn->handler->connect_it(conn, &done); /* Setup a "faked" transfer that'll do nothing */ - if(CURLE_OK == result) { + if(!result) { conn->data = data; conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; /* we are "connected */ @@ -5258,7 +5553,7 @@ static CURLcode create_conn(struct SessionHandle *data, DEBUGASSERT(conn->handler->done); /* we ignore the return code for the protocol-specific DONE */ (void)conn->handler->done(conn, result, FALSE); - return result; + goto out; } Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */ @@ -5266,32 +5561,12 @@ static CURLcode create_conn(struct SessionHandle *data, } /* since we skip do_init() */ - Curl_speedinit(data); + do_init(conn); - return result; + goto out; } #endif - /************************************************************* - * If the protocol is using SSL and HTTP proxy is used, we set - * the tunnel_proxy bit. - *************************************************************/ - if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy) - conn->bits.tunnel_proxy = TRUE; - - /************************************************************* - * Figure out the remote port number and fix it in the URL - *************************************************************/ - result = parse_remote_port(data, conn); - if(result != CURLE_OK) - return result; - - /* Check for overridden login details and set them accordingly */ - override_login(data, conn, user, passwd, options); - result = set_login(conn, user, passwd, options); - if(result != CURLE_OK) - return result; - /* Get a cloned copy of the SSL config situation stored in the connection struct. But to get this going nicely, we must first make sure that the strings in the master copy are pointing to the correct @@ -5313,8 +5588,12 @@ static CURLcode create_conn(struct SessionHandle *data, data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD]; #endif - if(!Curl_clone_ssl_config(&data->set.ssl, &conn->ssl_config)) - return CURLE_OUT_OF_MEMORY; + if(!Curl_clone_ssl_config(&data->set.ssl, &conn->ssl_config)) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } + + prune_dead_connections(data); /************************************************************* * Check the current list of connections to see if we can @@ -5417,7 +5696,8 @@ static CURLcode create_conn(struct SessionHandle *data, conn_free(conn); *in_connect = NULL; - return CURLE_NO_CONNECTION_AVAILABLE; + result = CURLE_NO_CONNECTION_AVAILABLE; + goto out; } else { /* @@ -5426,6 +5706,23 @@ static CURLcode create_conn(struct SessionHandle *data, */ ConnectionStore(data, conn); } + +#if defined(USE_NTLM) + /* If NTLM is requested in a part of this connection, make sure we don't + assume the state is fine as this is a fresh connection and NTLM is + connection based. */ + if((data->state.authhost.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && + data->state.authhost.done) { + infof(data, "NTLM picked AND auth done set, clear picked!\n"); + data->state.authhost.picked = CURLAUTH_NONE; + } + + if((data->state.authproxy.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && + data->state.authproxy.done) { + infof(data, "NTLM-proxy picked AND auth done set, clear picked!\n"); + data->state.authproxy.picked = CURLAUTH_NONE; + } +#endif } /* Mark the connection as used */ @@ -5439,7 +5736,7 @@ static CURLcode create_conn(struct SessionHandle *data, */ result = setup_range(data); if(result) - return result; + goto out; /* Continue connectdata initialization here. */ @@ -5457,6 +5754,12 @@ static CURLcode create_conn(struct SessionHandle *data, *************************************************************/ result = resolve_server(data, conn, async); + out: + + Curl_safefree(options); + Curl_safefree(passwd); + Curl_safefree(user); + Curl_safefree(proxy); return result; } @@ -5512,53 +5815,19 @@ CURLcode Curl_setup_conn(struct connectdata *conn, is later set again for the progress meter purpose */ conn->now = Curl_tvnow(); - for(;;) { - /* loop for CURL_SERVER_CLOSED_CONNECTION */ - - if(CURL_SOCKET_BAD == conn->sock[FIRSTSOCKET]) { - /* Try to connect only if not already connected */ - bool connected = FALSE; - - result = ConnectPlease(data, conn, &connected); - - if(result && !conn->ip_addr) { - /* transport connection failure not related with authentication */ - conn->bits.tcpconnect[FIRSTSOCKET] = FALSE; - return result; - } - - if(connected) { - result = Curl_protocol_connect(conn, protocol_done); - if(CURLE_OK == result) - conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; - } - else - conn->bits.tcpconnect[FIRSTSOCKET] = FALSE; - - /* if the connection was closed by the server while exchanging - authentication informations, retry with the new set - authentication information */ - if(conn->bits.proxy_connect_closed) { - /* reset the error buffer */ - if(data->set.errorbuffer) - data->set.errorbuffer[0] = '\0'; - data->state.errorbuf = FALSE; - continue; - } - - if(CURLE_OK != result) - return result; - } - else { - Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */ - Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */ - conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; - *protocol_done = TRUE; - Curl_verboseconnect(conn); - Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]); - } - /* Stop the loop now */ - break; + if(CURL_SOCKET_BAD == conn->sock[FIRSTSOCKET]) { + conn->bits.tcpconnect[FIRSTSOCKET] = FALSE; + result = Curl_connecthost(conn, conn->dns_entry); + if(result) + return result; + } + else { + Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */ + Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */ + conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; + *protocol_done = TRUE; + Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]); + Curl_verboseconnect(conn); } conn->now = Curl_tvnow(); /* time this *after* the connect is done, we @@ -5585,14 +5854,14 @@ CURLcode Curl_connect(struct SessionHandle *data, bool *asyncp, bool *protocol_done) { - CURLcode code; + CURLcode result; *asyncp = FALSE; /* assume synchronous resolves by default */ /* call the stuff that needs to be called */ - code = create_conn(data, in_connect, asyncp); + result = create_conn(data, in_connect, asyncp); - if(CURLE_OK == code) { + if(!result) { /* no error */ if((*in_connect)->send_pipe->size || (*in_connect)->recv_pipe->size) /* pipelining */ @@ -5601,23 +5870,23 @@ CURLcode Curl_connect(struct SessionHandle *data, /* DNS resolution is done: that's either because this is a reused connection, in which case DNS was unnecessary, or because DNS really did finish already (synch resolver/fast async resolve) */ - code = Curl_setup_conn(*in_connect, protocol_done); + result = Curl_setup_conn(*in_connect, protocol_done); } } - if(code == CURLE_NO_CONNECTION_AVAILABLE) { + if(result == CURLE_NO_CONNECTION_AVAILABLE) { *in_connect = NULL; - return code; + return result; } - if(code && *in_connect) { + if(result && *in_connect) { /* We're not allowed to return failure with memory left allocated in the connectdata struct, free those here */ Curl_disconnect(*in_connect, FALSE); /* close the connection */ *in_connect = NULL; /* return a NULL */ } - return code; + return result; } CURLcode Curl_done(struct connectdata **connp, @@ -5666,20 +5935,26 @@ CURLcode Curl_done(struct connectdata **connp, conn->dns_entry = NULL; } - if(status == CURLE_ABORTED_BY_CALLBACK) + switch(status) { + case CURLE_ABORTED_BY_CALLBACK: + case CURLE_READ_ERROR: + case CURLE_WRITE_ERROR: /* When we're aborted due to a callback return code it basically have to be counted as premature as there is trouble ahead if we don't. We have many callbacks and protocols work differently, we could potentially do this more fine-grained in the future. */ premature = TRUE; + default: + break; + } /* this calls the protocol-specific function pointer previously set */ if(conn->handler->done) result = conn->handler->done(conn, status, premature); else - result = CURLE_OK; + result = status; - if(Curl_pgrsDone(conn) && !result) + if(!result && Curl_pgrsDone(conn)) result = CURLE_ABORTED_BY_CALLBACK; /* if the transfer was completed in a paused state there can be buffered @@ -5690,7 +5965,8 @@ CURLcode Curl_done(struct connectdata **connp, } /* if data->set.reuse_forbid is TRUE, it means the libcurl client has - forced us to close this no matter what we think. + forced us to close this connection. This is ignored for requests taking + place in a NTLM authentication handshake if conn->bits.close is TRUE, it means that the connection should be closed in spite of all our efforts to be nice, due to protocol @@ -5702,7 +5978,13 @@ CURLcode Curl_done(struct connectdata **connp, we can add code that keep track of if we really must close it here or not, but currently we have no such detail knowledge. */ - if(data->set.reuse_forbid || conn->bits.close || premature) { + + if((data->set.reuse_forbid +#if defined(USE_NTLM) + && !(conn->ntlm.state == NTLMSTATE_TYPE2 || + conn->proxyntlm.state == NTLMSTATE_TYPE2) +#endif + ) || conn->bits.close || premature) { CURLcode res2 = Curl_disconnect(conn, premature); /* close connection */ /* If we had an error already, make sure we return that one. But @@ -5728,6 +6010,7 @@ CURLcode Curl_done(struct connectdata **connp, this was either closed or handed over to the connection cache here, and therefore cannot be used from this point on */ + Curl_free_request_state(data); return result; } @@ -5760,9 +6043,6 @@ static CURLcode do_init(struct connectdata *conn) HTTP. */ data->set.httpreq = HTTPREQ_GET; - /* NB: the content encoding software depends on this initialization */ - Curl_easy_initHandleData(data); - k->start = Curl_tvnow(); /* start time */ k->now = k->start; /* current time is now */ k->header = TRUE; /* assume header */ @@ -5816,7 +6096,7 @@ CURLcode Curl_do(struct connectdata **connp, bool *done) if(!data->multi) { result = Curl_reconnect_request(connp); - if(result == CURLE_OK) { + if(!result) { /* ... finally back to actually retry the DO phase */ conn = *connp; /* re-assign conn since Curl_reconnect_request creates a new connection */ @@ -5827,7 +6107,7 @@ CURLcode Curl_do(struct connectdata **connp, bool *done) return result; } - if((result == CURLE_OK) && *done) + if(!result && *done) /* do_complete must be called after the protocol-specific DO function */ do_complete(conn); } @@ -5860,14 +6140,3 @@ CURLcode Curl_do_more(struct connectdata *conn, int *complete) return result; } - -/* Called on connect, and if there's already a protocol-specific struct - allocated for a different connection, this frees it that it can be setup - properly later on. */ -void Curl_reset_reqproto(struct connectdata *conn) -{ - struct SessionHandle *data = conn->data; - - Curl_safefree(data->state.proto.generic); - data->state.proto.generic = NULL; -} diff --git a/lib/url.h b/lib/url.h index c0d9c38..cd46a92 100644 --- a/lib/url.h +++ b/lib/url.h @@ -45,6 +45,7 @@ CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done); CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done); CURLcode Curl_setup_conn(struct connectdata *conn, bool *protocol_done); +void Curl_free_request_state(struct SessionHandle *data); int Curl_protocol_getsock(struct connectdata *conn, curl_socket_t *socks, @@ -65,16 +66,11 @@ void Curl_getoff_all_pipelines(struct SessionHandle *data, void Curl_close_connections(struct SessionHandle *data); -/* Called on connect, and if there's already a protocol-specific struct - allocated for a different connection, this frees it that it can be setup - properly later on. */ -void Curl_reset_reqproto(struct connectdata *conn); - #define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */ #define CURL_DEFAULT_SOCKS5_GSSAPI_SERVICE "rcmd" /* default socks5 gssapi service */ -CURLcode Curl_connected_proxy(struct connectdata *conn); +CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex); #ifdef CURL_DISABLE_VERBOSE_STRINGS #define Curl_verboseconnect(x) Curl_nop_stmt diff --git a/lib/urldata.h b/lib/urldata.h index d597c67..5f77470 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -40,6 +40,8 @@ #define PORT_IMAPS 993 #define PORT_POP3 110 #define PORT_POP3S 995 +#define PORT_SMB 445 +#define PORT_SMBS 445 #define PORT_SMTP 25 #define PORT_SMTPS 465 /* sometimes called SSMTP */ #define PORT_RTSP 554 @@ -58,6 +60,15 @@ #define CURL_DEFAULT_USER "anonymous" #define CURL_DEFAULT_PASSWORD "ftp@example.com" +/* Convenience defines for checking protocols or their SSL based version. Each + protocol handler should only ever have a single CURLPROTO_ in its protocol + field. */ +#define PROTO_FAMILY_HTTP (CURLPROTO_HTTP|CURLPROTO_HTTPS) +#define PROTO_FAMILY_FTP (CURLPROTO_FTP|CURLPROTO_FTPS) +#define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S) +#define PROTO_FAMILY_SMB (CURLPROTO_SMB|CURLPROTO_SMBS) +#define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS) + #define DEFAULT_CONNCACHE_SIZE 5 /* length of longest IPv6 address string including the trailing null */ @@ -130,10 +141,6 @@ #include #endif -#ifdef USE_QSOSSL -#include -#endif - #ifdef USE_GSKIT #include #endif @@ -187,6 +194,7 @@ #include "ssh.h" #include "http.h" #include "rtsp.h" +#include "smb.h" #include "wildcard.h" #include "multihandle.h" @@ -222,9 +230,9 @@ #define CURLMIN(x,y) ((x)<(y)?(x):(y)) -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) -/* Types needed for krb4/5-ftp connections */ -struct krb4buffer { +#ifdef HAVE_GSSAPI +/* Types needed for krb5-ftp connections */ +struct krb5buffer { void *data; size_t size; size_t index; @@ -280,6 +288,9 @@ struct ssl_connect_data { current state of the connection. */ bool use; ssl_connection_state state; +#ifdef USE_NGHTTP2 + bool asked_for_h2; +#endif #ifdef USE_SSLEAY /* these ones requires specific SSL-types */ SSL_CTX* ctx; @@ -288,26 +299,21 @@ struct ssl_connect_data { ssl_connect_state connecting_state; #endif /* USE_SSLEAY */ #ifdef USE_GNUTLS - gnutls_session session; - gnutls_certificate_credentials cred; + gnutls_session_t session; + gnutls_certificate_credentials_t cred; #ifdef USE_TLS_SRP - gnutls_srp_client_credentials srp_client_cred; + gnutls_srp_client_credentials_t srp_client_cred; #endif ssl_connect_state connecting_state; #endif /* USE_GNUTLS */ #ifdef USE_POLARSSL -#if POLARSSL_VERSION_NUMBER<0x01010000 - havege_state hs; -#else - /* from v1.1.0, use ctr_drbg and entropy */ ctr_drbg_context ctr_drbg; entropy_context entropy; -#endif /* POLARSSL_VERSION_NUMBER<0x01010000 */ ssl_context ssl; ssl_session ssn; int server_fd; - x509_cert cacert; - x509_cert clicert; + x509_crt cacert; + x509_crt clicert; x509_crl crl; rsa_context rsa; ssl_connect_state connecting_state; @@ -323,10 +329,8 @@ struct ssl_connect_data { struct SessionHandle *data; struct curl_llist *obj_list; PK11GenericObject *obj_clicert; + ssl_connect_state connecting_state; #endif /* USE_NSS */ -#ifdef USE_QSOSSL - SSLHandle *handle; -#endif /* USE_QSOSSL */ #ifdef USE_GSKIT gsk_handle handle; int iocport; @@ -388,12 +392,16 @@ struct curl_ssl_session { void *sessionid; /* as returned from the SSL layer */ size_t idsize; /* if known, otherwise 0 */ long age; /* just a number, the higher the more recent */ - unsigned short remote_port; /* remote port to connect to */ + int remote_port; /* remote port to connect to */ struct ssl_config_data ssl_config; /* setup for this session */ }; /* Struct used for Digest challenge-response authentication */ struct digestdata { +#if defined(USE_WINDOWS_SSPI) + BYTE *input_token; + size_t input_token_len; +#else char *nonce; char *cnonce; char *realm; @@ -403,6 +411,7 @@ struct digestdata { char *qop; char *algorithm; int nc; /* nounce count */ +#endif }; typedef enum { @@ -421,30 +430,51 @@ typedef enum { #include #endif +/* Struct used for GSSAPI (Kerberos V5) authentication */ +#if defined(USE_KERBEROS5) +struct kerberos5data { +#if defined(USE_WINDOWS_SSPI) + CredHandle *credentials; + CtxtHandle *context; + TCHAR *spn; + SEC_WINNT_AUTH_IDENTITY identity; + SEC_WINNT_AUTH_IDENTITY *p_identity; + size_t token_max; + BYTE *output_token; +#else + gss_ctx_id_t context; + gss_name_t spn; +#endif +}; +#endif + /* Struct used for NTLM challenge-response authentication */ +#if defined(USE_NTLM) struct ntlmdata { curlntlm state; #ifdef USE_WINDOWS_SSPI - CredHandle handle; - CtxtHandle c_handle; + CredHandle *credentials; + CtxtHandle *context; SEC_WINNT_AUTH_IDENTITY identity; SEC_WINNT_AUTH_IDENTITY *p_identity; - int has_handles; - void *type_2; - unsigned long n_type_2; + size_t token_max; + BYTE *output_token; + BYTE *input_token; + size_t input_token_len; #else unsigned int flags; unsigned char nonce[8]; + void* target_info; /* TargetInfo received in the ntlm type-2 message */ + unsigned int target_info_len; #endif }; +#endif -#ifdef USE_HTTP_NEGOTIATE +#ifdef USE_SPNEGO struct negotiatedata { - /* when doing Negotiate we first need to receive an auth token and then we - need to send our header */ + /* When doing Negotiate (SPNEGO) auth, we first need to send a token + and then validate the received one. */ enum { GSS_AUTHNONE, GSS_AUTHRECV, GSS_AUTHSENT } state; - bool gss; /* Whether we're processing GSS-Negotiate or Negotiate */ - const char* protocol; /* "GSS-Negotiate" or "Negotiate" */ #ifdef HAVE_GSSAPI OM_uint32 status; gss_ctx_id_t context; @@ -453,10 +483,12 @@ struct negotiatedata { #else #ifdef USE_WINDOWS_SSPI DWORD status; - CtxtHandle *context; CredHandle *credentials; - char server_name[1024]; - size_t max_token_length; + CtxtHandle *context; + SEC_WINNT_AUTH_IDENTITY identity; + SEC_WINNT_AUTH_IDENTITY *p_identity; + TCHAR *server_name; + size_t token_max; BYTE *output_token; size_t output_token_length; #endif @@ -469,6 +501,7 @@ struct negotiatedata { * Boolean values that concerns this connection. */ struct ConnectBits { + /* always modify bits.close with the connclose() and connkeep() macros! */ bool close; /* if set, we close the connection after this request */ bool reuse; /* if set, this is a re-used connection */ bool proxy; /* if set, this transfer is done through a proxy - any type */ @@ -580,7 +613,6 @@ struct Curl_async { typedef CURLcode (*Curl_do_more_func)(struct connectdata *, int *); typedef CURLcode (*Curl_done_func)(struct connectdata *, CURLcode, bool); - enum expect100 { EXP100_SEND_DATA, /* enough waiting, just send the body now */ EXP100_AWAITING_CONTINUE, /* waiting for the 100 Continue header */ @@ -589,6 +621,19 @@ enum expect100 { EXP100_FAILED /* used on 417 Expectation Failed */ }; +enum upgrade101 { + UPGR101_INIT, /* default state */ + UPGR101_REQUESTED, /* upgrade requested */ + UPGR101_RECEIVED, /* response received */ + UPGR101_WORKING /* talking upgraded protocol */ +}; + +enum negotiatenpn { + NPN_INIT, /* default state */ + NPN_HTTP1_1, /* HTTP/1.1 negotiated */ + NPN_HTTP2 /* HTTP2 (draft-xx) negotiated */ +}; + /* * Request specific data in the easy handle (SessionHandle). Previously, * these members were on the connectdata struct but since a conn struct may @@ -639,6 +684,7 @@ struct SingleRequest { 'RTSP/1.? XXX' line */ struct timeval start100; /* time stamp to wait for the 100 code from */ enum expect100 exp100; /* expect 100 continue state */ + enum upgrade101 upgr101; /* 101 upgrade state */ int auto_decoding; /* What content encoding. sec 3.5, RFC2616. */ @@ -692,6 +738,9 @@ struct SingleRequest { bool forbidchunk; /* used only to explicitly forbid chunk-upload for specific upload buffers. See readmoredata() in http.c for details. */ + + void *protop; /* Allocated protocol-specific data. Each protocol + handler makes sure this points to data it needs. */ }; /* @@ -764,7 +813,8 @@ struct Curl_handler { ssize_t *nread, bool *readmore); long defport; /* Default port. */ - unsigned int protocol; /* See CURLPROTO_* */ + unsigned int protocol; /* See CURLPROTO_* - this needs to be the single + specific protocol bit */ unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */ }; @@ -782,6 +832,8 @@ struct Curl_handler { gets a default */ #define PROTOPT_NOURLQUERY (1<<6) /* protocol can't handle url query strings (?foo=bar) ! */ +#define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login credentials per + request instead of per connection */ /* return the count of bytes sent, or -1 on error */ @@ -835,13 +887,14 @@ struct connectdata { within the DNS cache, so this pointer is only valid as long as the DNS cache entry remains locked. It gets unlocked in Curl_done() */ Curl_addrinfo *ip_addr; + Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */ /* 'ip_addr_str' is the ip_addr data as a human readable string. It remains available as long as the connection does, which is longer than the ip_addr itself. */ char ip_addr_str[MAX_IPADR_LEN]; - unsigned int scope; /* address scope for IPv6 */ + unsigned int scope_id; /* Scope id for IPv6 */ int socktype; /* SOCK_STREAM or SOCK_DGRAM */ @@ -849,8 +902,7 @@ struct connectdata { struct hostname proxy; long port; /* which port to use locally */ - unsigned short remote_port; /* what remote port to connect to, - not the proxy port! */ + int remote_port; /* what remote port to connect to, not the proxy port! */ /* 'primary_ip' and 'primary_port' get filled with peer's numerical ip address and port number whenever an outgoing connection is @@ -873,6 +925,8 @@ struct connectdata { char *passwd; /* password string, allocated */ char *options; /* options string, allocated */ + char *xoauth2_bearer; /* bearer token for xoauth2, allocated */ + char *proxyuser; /* proxy user name string, allocated */ char *proxypasswd; /* proxy password string, allocated */ curl_proxytype proxytype; /* what kind of proxy that is in use */ @@ -884,6 +938,7 @@ struct connectdata { struct timeval created; /* creation time */ curl_socket_t sock[2]; /* two sockets, the second is used for the data transfer when doing FTP */ + curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */ bool sock_accepted[2]; /* TRUE if the socket on this index was created with accept() */ Curl_recv *recv[2]; @@ -930,18 +985,22 @@ struct connectdata { char *te; /* TE: request header */ } allocptr; - int sec_complete; /* if kerberos is enabled for this connection */ -#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI) +#ifdef HAVE_GSSAPI + int sec_complete; /* if Kerberos is enabled for this connection */ enum protection_level command_prot; enum protection_level data_prot; enum protection_level request_data_prot; size_t buffer_size; - struct krb4buffer in_buffer; + struct krb5buffer in_buffer; void *app_data; const struct Curl_sec_client_mech *mech; struct sockaddr_in local_addr; #endif +#if defined(USE_KERBEROS5) /* Consider moving some of the above GSS-API */ + struct kerberos5data krb5; /* variables into the structure definition, */ +#endif /* however, some of them are ftp specific. */ + /* the two following *_inuse fields are only flags, not counters in any way. If TRUE it means the channel is in use, and if FALSE it means the channel is up for grabs by one. */ @@ -969,18 +1028,20 @@ struct connectdata { curl_read_callback fread_func; /* function that reads the input */ void *fread_in; /* pointer to pass to the fread() above */ +#if defined(USE_NTLM) struct ntlmdata ntlm; /* NTLM differs from other authentication schemes because it authenticates connections, not single requests! */ struct ntlmdata proxyntlm; /* NTLM data for proxy */ -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if defined(NTLM_WB_ENABLED) /* used for communication with Samba's winbind daemon helper ntlm_auth */ curl_socket_t ntlm_auth_hlpr_socket; pid_t ntlm_auth_hlpr_pid; char* challenge_header; char* response_header; #endif +#endif char syserr_buf [256]; /* buffer for Curl_strerror() */ @@ -996,13 +1057,15 @@ struct connectdata { union { struct ftp_conn ftpc; + struct http_conn httpc; struct ssh_conn sshc; struct tftp_state_data *tftpc; struct imap_conn imapc; struct pop3_conn pop3c; struct smtp_conn smtpc; struct rtsp_conn rtspc; - void *generic; + struct smb_conn smbc; + void *generic; /* RTMP and LDAP use this */ } proto; int cselect_bits; /* bitmask of socket events */ @@ -1031,6 +1094,8 @@ struct connectdata { TUNNEL_COMPLETE /* CONNECT response received completely */ } tunnel_state[2]; /* two separate ones to allow FTP */ struct connectbundle *bundle; /* The bundle we are member of */ + + enum negotiatenpn negnpn; }; /* The end of connectdata. */ @@ -1104,6 +1169,7 @@ struct Progress { struct timeval start; struct timeval t_startsingle; + struct timeval t_startop; struct timeval t_acceptdata; #define CURR_TIME (5+1) /* 6 entries for 5 seconds */ @@ -1149,7 +1215,6 @@ typedef enum { * Session-data MUST be put in the connectdata struct and here. */ #define MAX_CURL_USER_LENGTH 256 #define MAX_CURL_PASSWORD_LENGTH 256 -#define MAX_CURL_OPTIONS_LENGTH 256 struct auth { unsigned long want; /* Bitmask set to the authentication methods wanted by @@ -1215,7 +1280,7 @@ struct UrlState { struct digestdata digest; /* state data for host Digest auth */ struct digestdata proxydigest; /* state data for proxy Digest auth */ -#ifdef USE_HTTP_NEGOTIATE +#ifdef USE_SPNEGO struct negotiatedata negotiate; /* state data for host Negotiate auth */ struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */ #endif @@ -1274,30 +1339,8 @@ struct UrlState { long rtsp_next_server_CSeq; /* the session's next server CSeq */ long rtsp_CSeq_recv; /* most recent CSeq received */ - /* Protocol specific data. - * - ************************************************************************* - * Note that this data will be REMOVED after each request, so anything that - * should be kept/stored on a per-connection basis and thus live for the - * next request on the same connection MUST be put in the connectdata struct! - *************************************************************************/ - union { - struct HTTP *http; - struct HTTP *https; /* alias, just for the sake of being more readable */ - struct RTSP *rtsp; - struct FTP *ftp; - /* void *tftp; not used */ - struct FILEPROTO *file; - void *telnet; /* private for telnet.c-eyes only */ - void *generic; - struct SSHPROTO *ssh; - struct IMAP *imap; - struct POP3 *pop3; - struct SMTP *smtp; - } proto; - - /* if true, force SSL connection retry (workaround for certain servers) */ - bool ssl_connect_retry; + curl_off_t infilesize; /* size of file to upload, -1 means unknown. + Copied from set.filesize at start of operation */ }; @@ -1347,13 +1390,13 @@ enum dupstring { STRING_KRB_LEVEL, /* krb security level */ STRING_NETRC_FILE, /* if not NULL, use this instead of trying to find $HOME/.netrc */ - STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */ STRING_PROXY, /* proxy to use */ STRING_SET_RANGE, /* range, if used */ STRING_SET_REFERER, /* custom string for the HTTP referer field */ STRING_SET_URL, /* what original URL to work on */ STRING_SSL_CAPATH, /* CA directory name (doesn't work on windows) */ STRING_SSL_CAFILE, /* certificate file to verify peer against */ + STRING_SSL_PINNEDPUBLICKEY, /* public key file to verify peer against */ STRING_SSL_CIPHER_LIST, /* list of ciphers to use */ STRING_SSL_EGDSOCKET, /* path to file containing the EGD daemon socket */ STRING_SSL_RANDOM_FILE, /* path to file containing "random" data */ @@ -1377,17 +1420,29 @@ enum dupstring { STRING_SSH_KNOWNHOSTS, /* file name of knownhosts file */ #endif #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - STRING_SOCKS5_GSSAPI_SERVICE, /* GSSAPI service name */ + STRING_SOCKS5_GSSAPI_SERVICE, /* GSSAPI service name */ #endif STRING_MAIL_FROM, STRING_MAIL_AUTH, #ifdef USE_TLS_SRP - STRING_TLSAUTH_USERNAME, /* TLS auth */ - STRING_TLSAUTH_PASSWORD, /* TLS auth */ + STRING_TLSAUTH_USERNAME, /* TLS auth */ + STRING_TLSAUTH_PASSWORD, /* TLS auth */ +#endif + STRING_BEARER, /* , if used */ +#ifdef USE_UNIX_SOCKETS + STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */ #endif - /* -- end of strings -- */ + /* -- end of zero-terminated strings -- */ + + STRING_LASTZEROTERMINATED, + + /* -- below this are pointers to binary data that cannot be strdup'ed. + Each such pointer must be added manually to Curl_dupset() --- */ + + STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */ + STRING_LAST /* not used, just an end-of-list marker */ }; @@ -1457,7 +1512,7 @@ struct UserDefined { long accepttimeout; /* in milliseconds, 0 means no timeout */ long server_response_timeout; /* in milliseconds, 0 means no timeout */ long tftp_blksize ; /* in bytes, 0 means use default */ - curl_off_t infilesize; /* size of file to upload, -1 means unknown */ + curl_off_t filesize; /* size of file to upload, -1 means unknown */ long low_speed_limit; /* bytes/second */ long low_speed_time; /* number of seconds */ curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */ @@ -1465,7 +1520,9 @@ struct UserDefined { download */ curl_off_t set_resume_from; /* continue [ftp] transfer from here */ struct curl_slist *headers; /* linked list of extra headers */ + struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */ struct curl_httppost *httppost; /* linked list of POST data */ + bool sep_headers; /* handle host and proxy headers separately */ bool cookiesession; /* new cookie session? */ bool crlf; /* convert crlf on ftp upload(?) */ struct curl_slist *quote; /* after connection is established */ @@ -1518,7 +1575,7 @@ struct UserDefined { bool ftp_list_only; /* switch FTP command for listing directories */ bool ftp_use_port; /* use the FTP PORT command */ bool hide_progress; /* don't use the progress meter */ - bool http_fail_on_error; /* fail on HTTP error codes >= 300 */ + bool http_fail_on_error; /* fail on HTTP error codes >= 400 */ bool http_follow_location; /* follow HTTP redirects */ bool http_transfer_encoding; /* request compressed HTTP transfer-encoding */ bool http_disable_hostname_check_before_authentication; @@ -1531,7 +1588,7 @@ struct UserDefined { enum CURL_NETRC_OPTION use_netrc; /* defined in include/curl.h */ bool verbose; /* output verbosity */ - bool krb; /* kerberos connection requested */ + bool krb; /* Kerberos connection requested */ bool reuse_forbid; /* forbidden to be reused, close after use */ bool reuse_fresh; /* do not re-use an existing connection */ bool ftp_use_epsv; /* if EPSV is to be attempted or not */ @@ -1561,7 +1618,7 @@ struct UserDefined { bool proxy_transfer_mode; /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */ - unsigned int scope; /* address scope for IPv6 */ + unsigned int scope_id; /* Scope id for IPv6 */ long allowed_protocols; long redir_protocols; #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) @@ -1581,7 +1638,7 @@ struct UserDefined { to pattern (e.g. if WILDCARDMATCH is on) */ void *fnmatch_data; - long gssapi_delegation; /* GSSAPI credential delegation, see the + long gssapi_delegation; /* GSS-API credential delegation, see the documentation of CURLOPT_GSSAPI_DELEGATION */ bool tcp_keepalive; /* use TCP keepalives */ @@ -1589,6 +1646,11 @@ struct UserDefined { long tcp_keepintvl; /* seconds between TCP keepalive probes */ size_t maxconnects; /* Max idle connections in the connection cache */ + + bool ssl_enable_npn; /* TLS NPN extension? */ + bool ssl_enable_alpn; /* TLS ALPN extension? */ + + long expect_100_timeout; /* in milliseconds */ }; struct Names { @@ -1650,6 +1712,8 @@ struct SessionHandle { other dynamic purposes */ struct WildcardData wildcard; /* wildcard download state info */ struct PureInfo info; /* stats, reports and info data */ + struct curl_tlssessioninfo tsi; /* Information about the TLS session, only + valid after a client has asked for it */ #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV) iconv_t outbound_cd; /* for translating to the network encoding */ iconv_t inbound_cd; /* for translating from the network encoding */ diff --git a/lib/version.c b/lib/version.c index d39fe0c..9ac9226 100644 --- a/lib/version.c +++ b/lib/version.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,8 @@ #include #include "urldata.h" -#include "sslgen.h" +#include "vtls/vtls.h" +#include "http2.h" #define _MPRINTF_REPLACE /* use the internal *printf() functions */ #include @@ -122,6 +123,11 @@ char *curl_version(void) left -= len; ptr += len; #endif +#ifdef USE_NGHTTP2 + len = Curl_http2_ver(ptr, left); + left -= len; + ptr += len; +#endif #ifdef USE_LIBRTMP { char suff[2]; @@ -210,6 +216,14 @@ static const char * const protocols[] = { #ifdef USE_LIBSSH2 "sftp", #endif +#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) && \ + (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)) + "smb", +# ifdef USE_SSL + "smbs", +# endif +#endif #ifndef CURL_DISABLE_SMTP "smtp", #endif @@ -235,27 +249,31 @@ static curl_version_info_data version_info = { #ifdef ENABLE_IPV6 | CURL_VERSION_IPV6 #endif -#ifdef HAVE_KRB4 - | CURL_VERSION_KERBEROS4 -#endif #ifdef USE_SSL | CURL_VERSION_SSL #endif #ifdef USE_NTLM | CURL_VERSION_NTLM #endif -#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) +#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ + defined(NTLM_WB_ENABLED) | CURL_VERSION_NTLM_WB #endif +#ifdef USE_SPNEGO + | CURL_VERSION_SPNEGO +#endif +#ifdef USE_KERBEROS5 + | CURL_VERSION_KERBEROS5 +#endif +#ifdef HAVE_GSSAPI + | CURL_VERSION_GSSAPI +#endif #ifdef USE_WINDOWS_SSPI | CURL_VERSION_SSPI #endif #ifdef HAVE_LIBZ | CURL_VERSION_LIBZ #endif -#ifdef USE_HTTP_NEGOTIATE - | CURL_VERSION_GSSNEGOTIATE -#endif #ifdef DEBUGBUILD | CURL_VERSION_DEBUG #endif @@ -265,9 +283,6 @@ static curl_version_info_data version_info = { #ifdef CURLRES_ASYNCH | CURL_VERSION_ASYNCHDNS #endif -#ifdef HAVE_SPNEGO - | CURL_VERSION_SPNEGO -#endif #if (CURL_SIZEOF_CURL_OFF_T > 4) && \ ( (SIZEOF_OFF_T > 4) || defined(USE_WIN32_LARGE_FILES) ) | CURL_VERSION_LARGEFILE @@ -278,6 +293,12 @@ static curl_version_info_data version_info = { #if defined(USE_TLS_SRP) | CURL_VERSION_TLSAUTH_SRP #endif +#if defined(USE_NGHTTP2) + | CURL_VERSION_HTTP2 +#endif +#if defined(USE_UNIX_SOCKETS) + | CURL_VERSION_UNIX_SOCKETS +#endif , NULL, /* ssl_version */ 0, /* ssl_version_num, this is kept at zero */ diff --git a/lib/axtls.c b/lib/vtls/axtls.c similarity index 91% rename from lib/axtls.c rename to lib/vtls/axtls.c index 44e6b93..1b577b1 100644 --- a/lib/axtls.c +++ b/lib/vtls/axtls.c @@ -5,8 +5,8 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2010, DirecTV - * contact: Eric Hu + * Copyright (C) 2010, DirecTV, Contact: Eric Hu, . + * Copyright (C) 2010 - 2014, 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 @@ -23,7 +23,7 @@ /* * Source file for all axTLS-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. */ #include "curl_setup.h" @@ -34,7 +34,7 @@ #include "sendf.h" #include "inet_pton.h" -#include "sslgen.h" +#include "vtls.h" #include "parsedate.h" #include "connect.h" /* for the connect timeout */ #include "select.h" @@ -164,7 +164,8 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex) case CURL_SSLVERSION_TLSv1: break; default: - failf(data, "axTLS only supports TLSv1"); + failf(data, "axTLS only supports TLS 1.0 and 1.1, " + "and it cannot be specified which one to use"); return CURLE_SSL_CONNECT_ERROR; } @@ -389,7 +390,7 @@ static CURLcode connect_finish(struct connectdata *conn, int sockindex) /* * Use axTLS's non-blocking connection feature to open an SSL connection. * This is called after a TCP connection is already established. -*/ + */ CURLcode Curl_axtls_connect_nonblocking( struct connectdata *conn, int sockindex, @@ -397,6 +398,7 @@ CURLcode Curl_axtls_connect_nonblocking( { CURLcode conn_step; int ssl_fcn_return; + int i; *done = FALSE; /* connectdata is calloc'd and connecting_state is only changed in this @@ -413,14 +415,17 @@ CURLcode Curl_axtls_connect_nonblocking( if(conn->ssl[sockindex].connecting_state == ssl_connect_2) { /* Check to make sure handshake was ok. */ if(ssl_handshake_status(conn->ssl[sockindex].ssl) != SSL_OK) { - ssl_fcn_return = ssl_read(conn->ssl[sockindex].ssl, NULL); - if(ssl_fcn_return < 0) { - Curl_axtls_close(conn, sockindex); - ssl_display_error(ssl_fcn_return); /* goes to stdout. */ - return map_error_to_curl(ssl_fcn_return); - } - else { - return CURLE_OK; /* Return control to caller for retries */ + /* Loop to perform more work in between sleeps. This is work around the + fact that axtls does not expose any knowledge about when work needs + to be performed. This can save ~25% of time on SSL handshakes. */ + for(i=0; i<5; i++) { + ssl_fcn_return = ssl_read(conn->ssl[sockindex].ssl, NULL); + if(ssl_fcn_return < 0) { + Curl_axtls_close(conn, sockindex); + ssl_display_error(ssl_fcn_return); /* goes to stdout. */ + return map_error_to_curl(ssl_fcn_return); + } + return CURLE_OK; } } infof (conn->data, "handshake completed successfully\n"); @@ -476,6 +481,7 @@ Curl_axtls_connect(struct connectdata *conn, return map_error_to_curl(ssl_fcn_return); } usleep(10000); + /* TODO: check for timeout as this could hang indefinitely otherwise */ } infof (conn->data, "handshake completed successfully\n"); @@ -521,10 +527,10 @@ void Curl_axtls_close(struct connectdata *conn, int sockindex) infof(conn->data, " Curl_axtls_close\n"); - /* line from ssluse.c: (void)SSL_shutdown(connssl->ssl); + /* line from openssl.c: (void)SSL_shutdown(connssl->ssl); axTLS compat layer does nothing for SSL_shutdown */ - /* The following line is from ssluse.c. There seems to be no axTLS + /* The following line is from openssl.c. There seems to be no axTLS equivalent. ssl_free and ssl_ctx_free close things. SSL_set_connect_state(connssl->handle); */ @@ -537,7 +543,7 @@ void Curl_axtls_close(struct connectdata *conn, int sockindex) */ int Curl_axtls_shutdown(struct connectdata *conn, int sockindex) { - /* Outline taken from ssluse.c since functions are in axTLS compat layer. + /* Outline taken from openssl.c since functions are in axTLS compat layer. axTLS's error set is much smaller, so a lot of error-handling was removed. */ int retval = 0; @@ -621,7 +627,7 @@ static ssize_t axtls_recv(struct connectdata *conn, /* connection data */ } else { failf(conn->data, "axTLS recv error (%d)", ret); - *err = map_error_to_curl(ret); + *err = map_error_to_curl((int) ret); ret = -1; } } @@ -637,7 +643,7 @@ static ssize_t axtls_recv(struct connectdata *conn, /* connection data */ */ int Curl_axtls_check_cxn(struct connectdata *conn) { - /* ssluse.c line: rc = SSL_peek(conn->ssl[FIRSTSOCKET].ssl, (void*)&buf, 1); + /* openssl.c line: rc = SSL_peek(conn->ssl[FIRSTSOCKET].ssl, (void*)&buf, 1); axTLS compat layer always returns the last argument, so connection is always alive? */ @@ -649,7 +655,7 @@ void Curl_axtls_session_free(void *ptr) { (void)ptr; /* free the ID */ - /* both ssluse.c and gtls.c do something here, but axTLS's OpenSSL + /* both openssl.c and gtls.c do something here, but axTLS's OpenSSL compatibility layer does nothing, so we do nothing too. */ } @@ -658,4 +664,21 @@ size_t Curl_axtls_version(char *buffer, size_t size) return snprintf(buffer, size, "axTLS/%s", ssl_version()); } +int Curl_axtls_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length) +{ + static bool ssl_seeded = FALSE; + (void)data; + if(!ssl_seeded) { + ssl_seeded = TRUE; + /* Initialize the seed if not already done. This call is not exactly thread + * safe (and neither is the ssl_seeded check), but the worst effect of a + * race condition is that some global resources will leak. */ + RNG_initialize(); + } + get_random(length, entropy); + return 0; +} + #endif /* USE_AXTLS */ diff --git a/lib/axtls.h b/lib/vtls/axtls.h similarity index 78% rename from lib/axtls.h rename to lib/vtls/axtls.h index db91365..62b4ab0 100644 --- a/lib/axtls.h +++ b/lib/vtls/axtls.h @@ -7,8 +7,8 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2010, DirecTV - * contact: Eric Hu + * Copyright (C) 2010, DirecTV, Contact: Eric Hu + * Copyright (C) 2010 - 2014, 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 @@ -46,6 +46,9 @@ void Curl_axtls_session_free(void *ptr); size_t Curl_axtls_version(char *buffer, size_t size); int Curl_axtls_shutdown(struct connectdata *conn, int sockindex); int Curl_axtls_check_cxn(struct connectdata *conn); +int Curl_axtls_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length); /* API setup for axTLS */ #define curlssl_init Curl_axtls_init @@ -56,12 +59,14 @@ int Curl_axtls_check_cxn(struct connectdata *conn); #define curlssl_close_all Curl_axtls_close_all #define curlssl_close Curl_axtls_close #define curlssl_shutdown(x,y) Curl_axtls_shutdown(x,y) -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_axtls_version #define curlssl_check_cxn(x) Curl_axtls_check_cxn(x) -#define curlssl_data_pending(x,y) (x=x, y=y, 0) +#define curlssl_data_pending(x,y) ((void)x, (void)y, 0) +#define curlssl_random(x,y,z) Curl_axtls_random(x,y,z) +#define CURL_SSL_BACKEND CURLSSLBACKEND_AXTLS #endif /* USE_AXTLS */ #endif /* HEADER_CURL_AXTLS_H */ diff --git a/lib/curl_darwinssl.c b/lib/vtls/curl_darwinssl.c similarity index 74% rename from lib/curl_darwinssl.c rename to lib/vtls/curl_darwinssl.c index 4ecf2d9..c056198 100644 --- a/lib/curl_darwinssl.c +++ b/lib/vtls/curl_darwinssl.c @@ -5,8 +5,8 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012-2013, Nick Zitzmann, . - * Copyright (C) 2012-2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, Nick Zitzmann, . + * Copyright (C) 2012 - 2015, 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 @@ -23,11 +23,15 @@ /* * Source file for all iOS and Mac OS X SecureTransport-specific code for the - * TLS/SSL layer. No code but sslgen.c should ever call or use these functions. + * TLS/SSL layer. No code but vtls.c should ever call or use these functions. */ #include "curl_setup.h" +#include "urldata.h" /* for the SessionHandle definition */ +#include "curl_base64.h" +#include "strtok.h" + #ifdef USE_DARWINSSL #ifdef HAVE_LIMITS_H @@ -52,12 +56,14 @@ #endif /* MAC_OS_X_VERSION_MAX_ALLOWED < 1050 */ #define CURL_BUILD_IOS 0 +#define CURL_BUILD_IOS_7 0 #define CURL_BUILD_MAC 1 /* This is the maximum API level we are allowed to use when building: */ #define CURL_BUILD_MAC_10_5 MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 #define CURL_BUILD_MAC_10_6 MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 #define CURL_BUILD_MAC_10_7 MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 #define CURL_BUILD_MAC_10_8 MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 +#define CURL_BUILD_MAC_10_9 MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 /* These macros mean "the following code is present to allow runtime backward compatibility with at least this cat or earlier": (You set this at build-time by setting the MACOSX_DEPLOYMENT_TARGET @@ -66,9 +72,11 @@ #define CURL_SUPPORT_MAC_10_6 MAC_OS_X_VERSION_MIN_REQUIRED <= 1060 #define CURL_SUPPORT_MAC_10_7 MAC_OS_X_VERSION_MIN_REQUIRED <= 1070 #define CURL_SUPPORT_MAC_10_8 MAC_OS_X_VERSION_MIN_REQUIRED <= 1080 +#define CURL_SUPPORT_MAC_10_9 MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 #elif TARGET_OS_EMBEDDED || TARGET_OS_IPHONE #define CURL_BUILD_IOS 1 +#define CURL_BUILD_IOS_7 __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 #define CURL_BUILD_MAC 0 #define CURL_BUILD_MAC_10_5 0 #define CURL_BUILD_MAC_10_6 0 @@ -78,6 +86,7 @@ #define CURL_SUPPORT_MAC_10_6 0 #define CURL_SUPPORT_MAC_10_7 0 #define CURL_SUPPORT_MAC_10_8 0 +#define CURL_SUPPORT_MAC_10_9 0 #else #error "The darwinssl back-end requires iOS or OS X." @@ -92,7 +101,7 @@ #include "inet_pton.h" #include "connect.h" #include "select.h" -#include "sslgen.h" +#include "vtls.h" #include "curl_darwinssl.h" #define _MPRINTF_REPLACE /* use our functions only */ @@ -660,6 +669,110 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher) { return "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"; break; #endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */ +#if CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 + /* TLS PSK (RFC 4279): */ + case TLS_PSK_WITH_RC4_128_SHA: + return "TLS_PSK_WITH_RC4_128_SHA"; + break; + case TLS_PSK_WITH_3DES_EDE_CBC_SHA: + return "TLS_PSK_WITH_3DES_EDE_CBC_SHA"; + break; + case TLS_PSK_WITH_AES_128_CBC_SHA: + return "TLS_PSK_WITH_AES_128_CBC_SHA"; + break; + case TLS_PSK_WITH_AES_256_CBC_SHA: + return "TLS_PSK_WITH_AES_256_CBC_SHA"; + break; + case TLS_DHE_PSK_WITH_RC4_128_SHA: + return "TLS_DHE_PSK_WITH_RC4_128_SHA"; + break; + case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA: + return "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"; + break; + case TLS_DHE_PSK_WITH_AES_128_CBC_SHA: + return "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"; + break; + case TLS_DHE_PSK_WITH_AES_256_CBC_SHA: + return "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"; + break; + case TLS_RSA_PSK_WITH_RC4_128_SHA: + return "TLS_RSA_PSK_WITH_RC4_128_SHA"; + break; + case TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA: + return "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"; + break; + case TLS_RSA_PSK_WITH_AES_128_CBC_SHA: + return "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"; + break; + case TLS_RSA_PSK_WITH_AES_256_CBC_SHA: + return "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"; + break; + /* More TLS PSK (RFC 4785): */ + case TLS_PSK_WITH_NULL_SHA: + return "TLS_PSK_WITH_NULL_SHA"; + break; + case TLS_DHE_PSK_WITH_NULL_SHA: + return "TLS_DHE_PSK_WITH_NULL_SHA"; + break; + case TLS_RSA_PSK_WITH_NULL_SHA: + return "TLS_RSA_PSK_WITH_NULL_SHA"; + break; + /* Even more TLS PSK (RFC 5487): */ + case TLS_PSK_WITH_AES_128_GCM_SHA256: + return "TLS_PSK_WITH_AES_128_GCM_SHA256"; + break; + case TLS_PSK_WITH_AES_256_GCM_SHA384: + return "TLS_PSK_WITH_AES_256_GCM_SHA384"; + break; + case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256: + return "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"; + break; + case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384: + return "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"; + break; + case TLS_RSA_PSK_WITH_AES_128_GCM_SHA256: + return "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"; + break; + case TLS_RSA_PSK_WITH_AES_256_GCM_SHA384: + return "TLS_PSK_WITH_AES_256_GCM_SHA384"; + break; + case TLS_PSK_WITH_AES_128_CBC_SHA256: + return "TLS_PSK_WITH_AES_128_CBC_SHA256"; + break; + case TLS_PSK_WITH_AES_256_CBC_SHA384: + return "TLS_PSK_WITH_AES_256_CBC_SHA384"; + break; + case TLS_PSK_WITH_NULL_SHA256: + return "TLS_PSK_WITH_NULL_SHA256"; + break; + case TLS_PSK_WITH_NULL_SHA384: + return "TLS_PSK_WITH_NULL_SHA384"; + break; + case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256: + return "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"; + break; + case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384: + return "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"; + break; + case TLS_DHE_PSK_WITH_NULL_SHA256: + return "TLS_DHE_PSK_WITH_NULL_SHA256"; + break; + case TLS_DHE_PSK_WITH_NULL_SHA384: + return "TLS_RSA_PSK_WITH_NULL_SHA384"; + break; + case TLS_RSA_PSK_WITH_AES_128_CBC_SHA256: + return "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"; + break; + case TLS_RSA_PSK_WITH_AES_256_CBC_SHA384: + return "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"; + break; + case TLS_RSA_PSK_WITH_NULL_SHA256: + return "TLS_RSA_PSK_WITH_NULL_SHA256"; + break; + case TLS_RSA_PSK_WITH_NULL_SHA384: + return "TLS_RSA_PSK_WITH_NULL_SHA384"; + break; +#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */ } return "TLS_NULL_WITH_NULL_NULL"; } @@ -671,6 +784,7 @@ CF_INLINE void GetDarwinVersionNumber(int *major, int *minor) char *os_version; size_t os_version_len; char *os_version_major, *os_version_minor/*, *os_version_point*/; + char *tok_buf; /* Get the Darwin kernel version from the kernel using sysctl(): */ mib[0] = CTL_KERN; @@ -686,9 +800,9 @@ CF_INLINE void GetDarwinVersionNumber(int *major, int *minor) } /* Parse the version: */ - os_version_major = strtok(os_version, "."); - os_version_minor = strtok(NULL, "."); - /*os_version_point = strtok(NULL, ".");*/ + os_version_major = strtok_r(os_version, ".", &tok_buf); + os_version_minor = strtok_r(NULL, ".", &tok_buf); + /*os_version_point = strtok_r(NULL, ".", &tok_buf);*/ *major = atoi(os_version_major); *minor = atoi(os_version_minor); free(os_version); @@ -726,7 +840,7 @@ CF_INLINE CFStringRef CopyCertSubject(SecCertificateRef cert) return server_cert_summary; } -#if CURL_SUPPORT_MAC_10_7 +#if CURL_SUPPORT_MAC_10_6 /* The SecKeychainSearch API was deprecated in Lion, and using it will raise deprecation warnings, so let's not compile this unless it's necessary: */ static OSStatus CopyIdentityWithLabelOldSchool(char *label, @@ -766,7 +880,7 @@ static OSStatus CopyIdentityWithLabelOldSchool(char *label, CFRelease(search); return status; } -#endif /* CURL_SUPPORT_MAC_10_7 */ +#endif /* CURL_SUPPORT_MAC_10_6 */ static OSStatus CopyIdentityWithLabel(char *label, SecIdentityRef *out_cert_and_key) @@ -806,12 +920,12 @@ static OSStatus CopyIdentityWithLabel(char *label, CFRelease(query_dict); } else { -#if CURL_SUPPORT_MAC_10_7 +#if CURL_SUPPORT_MAC_10_6 /* On Leopard and Snow Leopard, fall back to SecKeychainSearch. */ status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key); #endif /* CURL_SUPPORT_MAC_10_7 */ } -#elif CURL_SUPPORT_MAC_10_7 +#elif CURL_SUPPORT_MAC_10_6 /* For developers building on older cats, we have no choice but to fall back to SecKeychainSearch. */ status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key); @@ -819,6 +933,72 @@ static OSStatus CopyIdentityWithLabel(char *label, return status; } +static OSStatus CopyIdentityFromPKCS12File(const char *cPath, + const char *cPassword, + SecIdentityRef *out_cert_and_key) +{ + OSStatus status = errSecItemNotFound; + CFURLRef pkcs_url = CFURLCreateFromFileSystemRepresentation(NULL, + (const UInt8 *)cPath, strlen(cPath), false); + CFStringRef password = cPassword ? CFStringCreateWithCString(NULL, + cPassword, kCFStringEncodingUTF8) : NULL; + CFDataRef pkcs_data = NULL; + + /* We can import P12 files on iOS or OS X 10.7 or later: */ + /* These constants are documented as having first appeared in 10.6 but they + raise linker errors when used on that cat for some reason. */ +#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS + if(CFURLCreateDataAndPropertiesFromResource(NULL, pkcs_url, &pkcs_data, + NULL, NULL, &status)) { + const void *cKeys[] = {kSecImportExportPassphrase}; + const void *cValues[] = {password}; + CFDictionaryRef options = CFDictionaryCreate(NULL, cKeys, cValues, + password ? 1L : 0L, NULL, NULL); + CFArrayRef items = NULL; + + /* Here we go: */ + status = SecPKCS12Import(pkcs_data, options, &items); + if(status == noErr && items && CFArrayGetCount(items)) { + CFDictionaryRef identity_and_trust = CFArrayGetValueAtIndex(items, 0L); + const void *temp_identity = CFDictionaryGetValue(identity_and_trust, + kSecImportItemIdentity); + + /* Retain the identity; we don't care about any other data... */ + CFRetain(temp_identity); + *out_cert_and_key = (SecIdentityRef)temp_identity; + } + + if(items) + CFRelease(items); + CFRelease(options); + CFRelease(pkcs_data); + } +#endif /* CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS */ + if(password) + CFRelease(password); + CFRelease(pkcs_url); + return status; +} + +/* This code was borrowed from nss.c, with some modifications: + * Determine whether the nickname passed in is a filename that needs to + * be loaded as a PEM or a regular NSS nickname. + * + * returns 1 for a file + * returns 0 for not a file + */ +CF_INLINE bool is_file(const char *filename) +{ + struct_stat st; + + if(filename == NULL) + return false; + + if(stat(filename, &st) == 0) + return S_ISREG(st.st_mode); + return false; +} + static CURLcode darwinssl_connect_step1(struct connectdata *conn, int sockindex) { @@ -878,16 +1058,30 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, #if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS if(SSLSetProtocolVersionMax != NULL) { switch(data->set.ssl.version) { - case CURL_SSLVERSION_DEFAULT: default: - (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol3); + default: + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: + (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol1); (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol12); break; - case CURL_SSLVERSION_TLSv1: + case CURL_SSLVERSION_TLSv1_0: (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol1); + (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol1); + break; + case CURL_SSLVERSION_TLSv1_1: + (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol11); + (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol11); + break; + case CURL_SSLVERSION_TLSv1_2: + (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol12); (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol12); break; case CURL_SSLVERSION_SSLv3: - (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol3); + err = SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol3); + if(err != noErr) { + failf(data, "Your version of the OS does not support SSLv3"); + return CURLE_SSL_CONNECT_ERROR; + } (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kSSLProtocol3); break; case CURL_SSLVERSION_SSLv2: @@ -905,10 +1099,9 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, kSSLProtocolAll, false); switch (data->set.ssl.version) { - case CURL_SSLVERSION_DEFAULT: default: - (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, - kSSLProtocol3, - true); + default: + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kTLSProtocol1, true); @@ -919,21 +1112,29 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, kTLSProtocol12, true); break; - case CURL_SSLVERSION_TLSv1: + case CURL_SSLVERSION_TLSv1_0: (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kTLSProtocol1, true); + break; + case CURL_SSLVERSION_TLSv1_1: (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kTLSProtocol11, true); + break; + case CURL_SSLVERSION_TLSv1_2: (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kTLSProtocol12, true); break; case CURL_SSLVERSION_SSLv3: - (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, + err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocol3, true); + if(err != noErr) { + failf(data, "Your version of the OS does not support SSLv3"); + return CURLE_SSL_CONNECT_ERROR; + } break; case CURL_SSLVERSION_SSLv2: err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx, @@ -952,18 +1153,18 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, switch(data->set.ssl.version) { default: case CURL_SSLVERSION_DEFAULT: - (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, - kSSLProtocol3, - true); - (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, - kTLSProtocol1, - true); - break; case CURL_SSLVERSION_TLSv1: + case CURL_SSLVERSION_TLSv1_0: (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kTLSProtocol1, true); break; + case CURL_SSLVERSION_TLSv1_1: + failf(data, "Your version of the OS does not support TLSv1.1"); + return CURLE_SSL_CONNECT_ERROR; + case CURL_SSLVERSION_TLSv1_2: + failf(data, "Your version of the OS does not support TLSv1.2"); + return CURLE_SSL_CONNECT_ERROR; case CURL_SSLVERSION_SSLv2: err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocol2, @@ -974,9 +1175,13 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, } break; case CURL_SSLVERSION_SSLv3: - (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, + err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocol3, true); + if(err != noErr) { + failf(data, "Your version of the OS does not support SSLv3"); + return CURLE_SSL_CONNECT_ERROR; + } break; } #endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */ @@ -988,9 +1193,27 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, if(data->set.str[STRING_CERT]) { SecIdentityRef cert_and_key = NULL; + bool is_cert_file = is_file(data->set.str[STRING_CERT]); + + /* User wants to authenticate with a client cert. Look for it: + If we detect that this is a file on disk, then let's load it. + Otherwise, assume that the user wants to use an identity loaded + from the Keychain. */ + if(is_cert_file) { + if(!data->set.str[STRING_CERT_TYPE]) + infof(data, "WARNING: SSL: Certificate type not set, assuming " + "PKCS#12 format.\n"); + else if(strncmp(data->set.str[STRING_CERT_TYPE], "P12", + strlen(data->set.str[STRING_CERT_TYPE])) != 0) + infof(data, "WARNING: SSL: The Security framework only supports " + "loading identities that are in PKCS#12 format.\n"); + + err = CopyIdentityFromPKCS12File(data->set.str[STRING_CERT], + data->set.str[STRING_KEY_PASSWD], &cert_and_key); + } + else + err = CopyIdentityWithLabel(data->set.str[STRING_CERT], &cert_and_key); - /* User wants to authenticate with a client cert. Look for it: */ - err = CopyIdentityWithLabel(data->set.str[STRING_CERT], &cert_and_key); if(err == noErr) { SecCertificateRef cert = NULL; CFTypeRef certs_c[1]; @@ -1027,8 +1250,29 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, CFRelease(cert_and_key); } else { - failf(data, "SSL: Can't find the certificate \"%s\" and its private key " - "in the Keychain.", data->set.str[STRING_CERT]); + switch(err) { + case errSecAuthFailed: case -25264: /* errSecPkcs12VerifyFailure */ + failf(data, "SSL: Incorrect password for the certificate \"%s\" " + "and its private key.", data->set.str[STRING_CERT]); + break; + case -26275: /* errSecDecode */ case -25257: /* errSecUnknownFormat */ + failf(data, "SSL: Couldn't make sense of the data in the " + "certificate \"%s\" and its private key.", + data->set.str[STRING_CERT]); + break; + case -25260: /* errSecPassphraseRequired */ + failf(data, "SSL The certificate \"%s\" requires a password.", + data->set.str[STRING_CERT]); + break; + case errSecItemNotFound: + failf(data, "SSL: Can't find the certificate \"%s\" and its private " + "key in the Keychain.", data->set.str[STRING_CERT]); + break; + default: + failf(data, "SSL: Can't load the certificate \"%s\" and its private " + "key: OSStatus %d", data->set.str[STRING_CERT], err); + break; + } return CURLE_SSL_CERTPROBLEM; } } @@ -1051,9 +1295,11 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, #else if(SSLSetSessionOption != NULL) { #endif /* CURL_BUILD_MAC */ + bool break_on_auth = !data->set.ssl.verifypeer || + data->set.str[STRING_SSL_CAFILE]; err = SSLSetSessionOption(connssl->ssl_ctx, kSSLSessionOptionBreakOnServerAuth, - data->set.ssl.verifypeer?false:true); + break_on_auth); if(err != noErr) { failf(data, "SSL: SSLSetSessionOption() failed: OSStatus %d", err); return CURLE_SSL_CONNECT_ERROR; @@ -1078,20 +1324,41 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, } #endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */ - /* If this is a domain name and not an IP address, then configure SNI. + if(data->set.str[STRING_SSL_CAFILE]) { + bool is_cert_file = is_file(data->set.str[STRING_SSL_CAFILE]); + + if(!is_cert_file) { + failf(data, "SSL: can't load CA certificate file %s", + data->set.str[STRING_SSL_CAFILE]); + return CURLE_SSL_CACERT_BADFILE; + } + if(!data->set.ssl.verifypeer) { + failf(data, "SSL: CA certificate set, but certificate verification " + "is disabled"); + return CURLE_SSL_CONNECT_ERROR; + } + } + + /* Configure hostname check. SNI is used if available. + * Both hostname check and SNI require SSLSetPeerDomainName(). * Also: the verifyhost setting influences SNI usage */ - /* If this is a domain name and not an IP address, then configure SNI: */ - if((0 == Curl_inet_pton(AF_INET, conn->host.name, &addr)) && -#ifdef ENABLE_IPV6 - (0 == Curl_inet_pton(AF_INET6, conn->host.name, &addr)) && -#endif - data->set.ssl.verifyhost) { + if(data->set.ssl.verifyhost) { err = SSLSetPeerDomainName(connssl->ssl_ctx, conn->host.name, - strlen(conn->host.name)); + strlen(conn->host.name)); + if(err != noErr) { infof(data, "WARNING: SSL: SSLSetPeerDomainName() failed: OSStatus %d\n", err); } + + if((Curl_inet_pton(AF_INET, conn->host.name, &addr)) + #ifdef ENABLE_IPV6 + || (Curl_inet_pton(AF_INET6, conn->host.name, &addr)) + #endif + ) { + infof(data, "WARNING: using IP address, SNI is being disabled by " + "the OS.\n"); + } } /* Disable cipher suites that ST supports but are not safe. These ciphers @@ -1121,11 +1388,21 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, case SSL_NULL_WITH_NULL_NULL: case SSL_RSA_WITH_NULL_MD5: case SSL_RSA_WITH_NULL_SHA: + case 0x003B: /* TLS_RSA_WITH_NULL_SHA256 */ case SSL_FORTEZZA_DMS_WITH_NULL_SHA: case 0xC001: /* TLS_ECDH_ECDSA_WITH_NULL_SHA */ case 0xC006: /* TLS_ECDHE_ECDSA_WITH_NULL_SHA */ case 0xC00B: /* TLS_ECDH_RSA_WITH_NULL_SHA */ case 0xC010: /* TLS_ECDHE_RSA_WITH_NULL_SHA */ + case 0x002C: /* TLS_PSK_WITH_NULL_SHA */ + case 0x002D: /* TLS_DHE_PSK_WITH_NULL_SHA */ + case 0x002E: /* TLS_RSA_PSK_WITH_NULL_SHA */ + case 0x00B0: /* TLS_PSK_WITH_NULL_SHA256 */ + case 0x00B1: /* TLS_PSK_WITH_NULL_SHA384 */ + case 0x00B4: /* TLS_DHE_PSK_WITH_NULL_SHA256 */ + case 0x00B5: /* TLS_DHE_PSK_WITH_NULL_SHA384 */ + case 0x00B8: /* TLS_RSA_PSK_WITH_NULL_SHA256 */ + case 0x00B9: /* TLS_RSA_PSK_WITH_NULL_SHA384 */ /* Disable anonymous ciphersuites: */ case SSL_DH_anon_EXPORT_WITH_RC4_40_MD5: case SSL_DH_anon_WITH_RC4_128_MD5: @@ -1181,9 +1458,17 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, Curl_safefree(all_ciphers); Curl_safefree(allowed_ciphers); +#if CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 + /* We want to enable 1/n-1 when using a CBC cipher unless the user + specifically doesn't want us doing that: */ + if(SSLSetSessionOption != NULL) + SSLSetSessionOption(connssl->ssl_ctx, kSSLSessionOptionSendOneByteRecord, + !data->set.ssl_enable_beast); +#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */ + /* Check if there's a cached ID we can/should use here! */ if(!Curl_ssl_getsessionid(conn, (void **)&ssl_sessionid, - &ssl_sessionid_len)) { + &ssl_sessionid_len)) { /* we got a session id, use it! */ err = SSLSetPeerID(connssl->ssl_ctx, ssl_sessionid, ssl_sessionid_len); if(err != noErr) { @@ -1196,20 +1481,23 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, /* If there isn't one, then let's make one up! This has to be done prior to starting the handshake. */ else { - CURLcode retcode; + CURLcode result; + ssl_sessionid = + aprintf("%s:%d:%d:%s:%hu", data->set.str[STRING_SSL_CAFILE], + data->set.ssl.verifypeer, data->set.ssl.verifyhost, + conn->host.name, conn->remote_port); + ssl_sessionid_len = strlen(ssl_sessionid); - ssl_sessionid = malloc(256*sizeof(char)); - ssl_sessionid_len = snprintf(ssl_sessionid, 256, "curl:%s:%hu", - conn->host.name, conn->remote_port); err = SSLSetPeerID(connssl->ssl_ctx, ssl_sessionid, ssl_sessionid_len); if(err != noErr) { failf(data, "SSL: SSLSetPeerID() failed: OSStatus %d", err); return CURLE_SSL_CONNECT_ERROR; } - retcode = Curl_ssl_addsessionid(conn, ssl_sessionid, ssl_sessionid_len); - if(retcode!= CURLE_OK) { + + result = Curl_ssl_addsessionid(conn, ssl_sessionid, ssl_sessionid_len); + if(result) { failf(data, "failed to store ssl session"); - return retcode; + return result; } } @@ -1234,6 +1522,294 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn, return CURLE_OK; } +static long pem_to_der(const char *in, unsigned char **out, size_t *outlen) +{ + char *sep_start, *sep_end, *cert_start, *cert_end; + size_t i, j, err; + size_t len; + unsigned char *b64; + + /* Jump through the separators at the beginning of the certificate. */ + sep_start = strstr(in, "-----"); + if(sep_start == NULL) + return 0; + cert_start = strstr(sep_start + 1, "-----"); + if(cert_start == NULL) + return -1; + + cert_start += 5; + + /* Find separator after the end of the certificate. */ + cert_end = strstr(cert_start, "-----"); + if(cert_end == NULL) + return -1; + + sep_end = strstr(cert_end + 1, "-----"); + if(sep_end == NULL) + return -1; + sep_end += 5; + + len = cert_end - cert_start; + b64 = malloc(len + 1); + if(!b64) + return -1; + + /* Create base64 string without linefeeds. */ + for(i = 0, j = 0; i < len; i++) { + if(cert_start[i] != '\r' && cert_start[i] != '\n') + b64[j++] = cert_start[i]; + } + b64[j] = '\0'; + + err = Curl_base64_decode((const char *)b64, out, outlen); + free(b64); + if(err) { + free(*out); + return -1; + } + + return sep_end - in; +} + +static int read_cert(const char *file, unsigned char **out, size_t *outlen) +{ + int fd; + ssize_t n, len = 0, cap = 512; + unsigned char buf[cap], *data; + + fd = open(file, 0); + if(fd < 0) + return -1; + + data = malloc(cap); + if(!data) { + close(fd); + return -1; + } + + for(;;) { + n = read(fd, buf, sizeof(buf)); + if(n < 0) { + close(fd); + free(data); + return -1; + } + else if(n == 0) { + close(fd); + break; + } + + if(len + n >= cap) { + cap *= 2; + data = realloc(data, cap); + if(!data) { + close(fd); + return -1; + } + } + + memcpy(data + len, buf, n); + len += n; + } + data[len] = '\0'; + + *out = data; + *outlen = len; + + return 0; +} + +static int sslerr_to_curlerr(struct SessionHandle *data, int err) +{ + switch(err) { + case errSSLXCertChainInvalid: + failf(data, "SSL certificate problem: Invalid certificate chain"); + return CURLE_SSL_CACERT; + case errSSLUnknownRootCert: + failf(data, "SSL certificate problem: Untrusted root certificate"); + return CURLE_SSL_CACERT; + case errSSLNoRootCert: + failf(data, "SSL certificate problem: No root certificate"); + return CURLE_SSL_CACERT; + case errSSLCertExpired: + failf(data, "SSL certificate problem: Certificate chain had an " + "expired certificate"); + return CURLE_SSL_CACERT; + case errSSLBadCert: + failf(data, "SSL certificate problem: Couldn't understand the server " + "certificate format"); + return CURLE_SSL_CONNECT_ERROR; + case errSSLHostNameMismatch: + failf(data, "SSL certificate peer hostname mismatch"); + return CURLE_PEER_FAILED_VERIFICATION; + default: + failf(data, "SSL unexpected certificate error %d", err); + return CURLE_SSL_CACERT; + } +} + +static int append_cert_to_array(struct SessionHandle *data, + unsigned char *buf, size_t buflen, + CFMutableArrayRef array) +{ + CFDataRef certdata = CFDataCreate(kCFAllocatorDefault, buf, buflen); + if(!certdata) { + failf(data, "SSL: failed to allocate array for CA certificate"); + return CURLE_OUT_OF_MEMORY; + } + + SecCertificateRef cacert = + SecCertificateCreateWithData(kCFAllocatorDefault, certdata); + CFRelease(certdata); + if(!cacert) { + failf(data, "SSL: failed to create SecCertificate from CA certificate"); + return CURLE_SSL_CACERT; + } + + /* Check if cacert is valid. */ + CFStringRef subject = CopyCertSubject(cacert); + if(subject) { + char subject_cbuf[128]; + memset(subject_cbuf, 0, 128); + if(!CFStringGetCString(subject, + subject_cbuf, + 128, + kCFStringEncodingUTF8)) { + CFRelease(cacert); + failf(data, "SSL: invalid CA certificate subject"); + return CURLE_SSL_CACERT; + } + CFRelease(subject); + } + else { + CFRelease(cacert); + failf(data, "SSL: invalid CA certificate"); + return CURLE_SSL_CACERT; + } + + CFArrayAppendValue(array, cacert); + CFRelease(cacert); + + return CURLE_OK; +} + +static int verify_cert(const char *cafile, struct SessionHandle *data, + SSLContextRef ctx) +{ + int n = 0, rc; + long res; + unsigned char *certbuf, *der; + size_t buflen, derlen, offset = 0; + + if(read_cert(cafile, &certbuf, &buflen) < 0) { + failf(data, "SSL: failed to read or invalid CA certificate"); + return CURLE_SSL_CACERT; + } + + /* + * Certbuf now contains the contents of the certificate file, which can be + * - a single DER certificate, + * - a single PEM certificate or + * - a bunch of PEM certificates (certificate bundle). + * + * Go through certbuf, and convert any PEM certificate in it into DER + * format. + */ + CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeArrayCallBacks); + if(array == NULL) { + free(certbuf); + failf(data, "SSL: out of memory creating CA certificate array"); + return CURLE_OUT_OF_MEMORY; + } + + while(offset < buflen) { + n++; + + /* + * Check if the certificate is in PEM format, and convert it to DER. If + * this fails, we assume the certificate is in DER format. + */ + res = pem_to_der((const char *)certbuf + offset, &der, &derlen); + if(res < 0) { + free(certbuf); + CFRelease(array); + failf(data, "SSL: invalid CA certificate #%d (offset %d) in bundle", + n, offset); + return CURLE_SSL_CACERT; + } + offset += res; + + if(res == 0 && offset == 0) { + /* This is not a PEM file, probably a certificate in DER format. */ + rc = append_cert_to_array(data, certbuf, buflen, array); + free(certbuf); + if(rc != CURLE_OK) { + CFRelease(array); + return rc; + } + break; + } + else if(res == 0) { + /* No more certificates in the bundle. */ + free(certbuf); + break; + } + + rc = append_cert_to_array(data, der, derlen, array); + free(der); + if(rc != CURLE_OK) { + free(certbuf); + CFRelease(array); + return rc; + } + } + + SecTrustRef trust; + OSStatus ret = SSLCopyPeerTrust(ctx, &trust); + if(trust == NULL) { + failf(data, "SSL: error getting certificate chain"); + CFRelease(array); + return CURLE_OUT_OF_MEMORY; + } + else if(ret != noErr) { + CFRelease(array); + return sslerr_to_curlerr(data, ret); + } + + ret = SecTrustSetAnchorCertificates(trust, array); + if(ret != noErr) { + CFRelease(trust); + return sslerr_to_curlerr(data, ret); + } + ret = SecTrustSetAnchorCertificatesOnly(trust, true); + if(ret != noErr) { + CFRelease(trust); + return sslerr_to_curlerr(data, ret); + } + + SecTrustResultType trust_eval = 0; + ret = SecTrustEvaluate(trust, &trust_eval); + CFRelease(array); + CFRelease(trust); + if(ret != noErr) { + return sslerr_to_curlerr(data, ret); + } + + switch (trust_eval) { + case kSecTrustResultUnspecified: + case kSecTrustResultProceed: + return CURLE_OK; + + case kSecTrustResultRecoverableTrustFailure: + case kSecTrustResultDeny: + default: + failf(data, "SSL: certificate verification failed (result: %d)", + trust_eval); + return CURLE_PEER_FAILED_VERIFICATION; + } +} + static CURLcode darwinssl_connect_step2(struct connectdata *conn, int sockindex) { @@ -1260,6 +1836,12 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex) /* The below is errSSLServerAuthCompleted; it's not defined in Leopard's headers */ case -9841: + if(data->set.str[STRING_SSL_CAFILE]) { + int res = verify_cert(data->set.str[STRING_SSL_CAFILE], data, + connssl->ssl_ctx); + if(res != CURLE_OK) + return res; + } /* the documentation says we need to call SSLHandshake() again */ return darwinssl_connect_step2(conn, sockindex); @@ -1494,7 +2076,7 @@ darwinssl_connect_common(struct connectdata *conn, bool nonblocking, bool *done) { - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; curl_socket_t sockfd = conn->sock[sockindex]; @@ -1516,9 +2098,10 @@ darwinssl_connect_common(struct connectdata *conn, failf(data, "SSL connection timeout"); return CURLE_OPERATION_TIMEDOUT; } - retcode = darwinssl_connect_step1(conn, sockindex); - if(retcode) - return retcode; + + result = darwinssl_connect_step1(conn, sockindex); + if(result) + return result; } while(ssl_connect_2 == connssl->connecting_state || @@ -1535,8 +2118,8 @@ darwinssl_connect_common(struct connectdata *conn, } /* if ssl is expecting something, check if it's available. */ - if(connssl->connecting_state == ssl_connect_2_reading - || connssl->connecting_state == ssl_connect_2_writing) { + if(connssl->connecting_state == ssl_connect_2_reading || + connssl->connecting_state == ssl_connect_2_writing) { curl_socket_t writefd = ssl_connect_2_writing == connssl->connecting_state?sockfd:CURL_SOCKET_BAD; @@ -1569,23 +2152,23 @@ darwinssl_connect_common(struct connectdata *conn, * before step2 has completed while ensuring that a client using select() * or epoll() will always have a valid fdset to wait on. */ - retcode = darwinssl_connect_step2(conn, sockindex); - if(retcode || (nonblocking && - (ssl_connect_2 == connssl->connecting_state || - ssl_connect_2_reading == connssl->connecting_state || - ssl_connect_2_writing == connssl->connecting_state))) - return retcode; + result = darwinssl_connect_step2(conn, sockindex); + if(result || (nonblocking && + (ssl_connect_2 == connssl->connecting_state || + ssl_connect_2_reading == connssl->connecting_state || + ssl_connect_2_writing == connssl->connecting_state))) + return result; } /* repeat step2 until all transactions are done. */ - if(ssl_connect_3==connssl->connecting_state) { - retcode = darwinssl_connect_step3(conn, sockindex); - if(retcode) - return retcode; + if(ssl_connect_3 == connssl->connecting_state) { + result = darwinssl_connect_step3(conn, sockindex); + if(result) + return result; } - if(ssl_connect_done==connssl->connecting_state) { + if(ssl_connect_done == connssl->connecting_state) { connssl->state = ssl_connection_complete; conn->recv[sockindex] = darwinssl_recv; conn->send[sockindex] = darwinssl_send; @@ -1612,13 +2195,13 @@ CURLcode Curl_darwinssl_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = darwinssl_connect_common(conn, sockindex, FALSE, &done); + result = darwinssl_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + if(result) + return result; DEBUGASSERT(done); @@ -1762,9 +2345,8 @@ bool Curl_darwinssl_data_pending(const struct connectdata *conn, return false; } -void Curl_darwinssl_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length) +int Curl_darwinssl_random(unsigned char *entropy, + size_t length) { /* arc4random_buf() isn't available on cats older than Lion, so let's do this manually for the benefit of the older cats. */ @@ -1778,7 +2360,7 @@ void Curl_darwinssl_random(struct SessionHandle *data, random_number >>= 8; } i = random_number = 0; - (void)data; + return 0; } void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */ diff --git a/lib/curl_darwinssl.h b/lib/vtls/curl_darwinssl.h similarity index 83% rename from lib/curl_darwinssl.h rename to lib/vtls/curl_darwinssl.h index 432d3d7..7c80edf 100644 --- a/lib/curl_darwinssl.h +++ b/lib/vtls/curl_darwinssl.h @@ -7,7 +7,8 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012 - 2013, Nick Zitzmann, . + * Copyright (C) 2012 - 2014, Nick Zitzmann, . + * Copyright (C) 2012 - 2014, 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 @@ -44,18 +45,13 @@ int Curl_darwinssl_check_cxn(struct connectdata *conn); bool Curl_darwinssl_data_pending(const struct connectdata *conn, int connindex); -void Curl_darwinssl_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length); +int Curl_darwinssl_random(unsigned char *entropy, + size_t length); void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum, /* output */ size_t md5len); -/* this backend provides these functions: */ -#define have_curlssl_random 1 -#define have_curlssl_md5sum 1 - /* API setup for SecureTransport */ #define curlssl_init() (1) #define curlssl_cleanup() Curl_nop_stmt @@ -65,14 +61,15 @@ void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */ #define curlssl_close_all Curl_darwinssl_close_all #define curlssl_close Curl_darwinssl_close #define curlssl_shutdown(x,y) 0 -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_darwinssl_version #define curlssl_check_cxn Curl_darwinssl_check_cxn #define curlssl_data_pending(x,y) Curl_darwinssl_data_pending(x, y) -#define curlssl_random(x,y,z) Curl_darwinssl_random(x,y,z) +#define curlssl_random(x,y,z) ((void)x, Curl_darwinssl_random(y,z)) #define curlssl_md5sum(a,b,c,d) Curl_darwinssl_md5sum(a,b,c,d) +#define CURL_SSL_BACKEND CURLSSLBACKEND_DARWINSSL #endif /* USE_DARWINSSL */ #endif /* HEADER_CURL_DARWINSSL_H */ diff --git a/lib/curl_schannel.c b/lib/vtls/curl_schannel.c similarity index 88% rename from lib/curl_schannel.c rename to lib/vtls/curl_schannel.c index 68139db..b3fe526 100644 --- a/lib/curl_schannel.c +++ b/lib/vtls/curl_schannel.c @@ -5,9 +5,9 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012 - 2013, Marc Hoersken, + * Copyright (C) 2012 - 2014, Marc Hoersken, * Copyright (C) 2012, Mark Salisbury, - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -24,7 +24,7 @@ /* * Source file for all SChannel-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. * */ @@ -61,7 +61,7 @@ #include "curl_sspi.h" #include "curl_schannel.h" -#include "sslgen.h" +#include "vtls.h" #include "sendf.h" #include "connect.h" /* for the connect timeout */ #include "strerror.h" @@ -127,7 +127,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) conn->host.name, conn->remote_port); /* check for an existing re-usable credential handle */ - if(!Curl_ssl_getsessionid(conn, (void**)&old_cred, NULL)) { + if(!Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL)) { connssl->cred = old_cred; infof(data, "schannel: re-using existing credential handle\n"); } @@ -156,17 +156,6 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) infof(data, "schannel: disable server certificate revocation checks\n"); } - if(Curl_inet_pton(AF_INET, conn->host.name, &addr) -#ifdef ENABLE_IPV6 - || Curl_inet_pton(AF_INET6, conn->host.name, &addr6) -#endif - ) { - schannel_cred.dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK; - infof(data, "schannel: using IP address, SNI is being disabled by " - "disabling the servername check against the " - "subject names in server certificates.\n"); - } - if(!data->set.ssl.verifyhost) { schannel_cred.dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK; infof(data, "schannel: verifyhost setting prevents Schannel from " @@ -175,11 +164,22 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) } switch(data->set.ssl.version) { + default: + case CURL_SSLVERSION_DEFAULT: case CURL_SSLVERSION_TLSv1: schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_0_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_2_CLIENT; break; + case CURL_SSLVERSION_TLSv1_0: + schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_0_CLIENT; + break; + case CURL_SSLVERSION_TLSv1_1: + schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_1_CLIENT; + break; + case CURL_SSLVERSION_TLSv1_2: + schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT; + break; case CURL_SSLVERSION_SSLv3: schannel_cred.grbitEnabledProtocols = SP_PROT_SSL3_CLIENT; break; @@ -189,7 +189,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) } /* allocate memory for the re-usable credential handle */ - connssl->cred = malloc(sizeof(struct curl_schannel_cred)); + connssl->cred = (struct curl_schannel_cred *) + malloc(sizeof(struct curl_schannel_cred)); if(!connssl->cred) { failf(data, "schannel: unable to allocate memory"); return CURLE_OUT_OF_MEMORY; @@ -213,6 +214,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) } } + /* Warn if SNI is disabled due to use of an IP address */ + if(Curl_inet_pton(AF_INET, conn->host.name, &addr) +#ifdef ENABLE_IPV6 + || Curl_inet_pton(AF_INET6, conn->host.name, &addr6) +#endif + ) { + infof(data, "schannel: using IP address, SNI is not supported by OS.\n"); + } + /* setup output buffer */ InitSecBuffer(&outbuf, SECBUFFER_EMPTY, NULL, 0); InitSecBufferDesc(&outbuf_desc, &outbuf, 1); @@ -223,7 +233,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) ISC_REQ_STREAM; /* allocate memory for the security context handle */ - connssl->ctxt = malloc(sizeof(struct curl_schannel_ctxt)); + connssl->ctxt = (struct curl_schannel_ctxt *) + malloc(sizeof(struct curl_schannel_ctxt)); if(!connssl->ctxt) { failf(data, "schannel: unable to allocate memory"); return CURLE_OUT_OF_MEMORY; @@ -283,6 +294,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex) ssize_t nread = -1, written = -1; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + unsigned char *reallocated_buffer; + size_t reallocated_length; SecBuffer outbuf[2]; SecBufferDesc outbuf_desc; SecBuffer inbuf[2]; @@ -297,6 +310,9 @@ schannel_connect_step2(struct connectdata *conn, int sockindex) infof(data, "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n", conn->host.name, conn->remote_port); + if(!connssl->cred || !connssl->ctxt) + return CURLE_SSL_CONNECT_ERROR; + /* buffer to store previously received and encrypted data */ if(connssl->encdata_buffer == NULL) { connssl->encdata_offset = 0; @@ -312,14 +328,19 @@ schannel_connect_step2(struct connectdata *conn, int sockindex) if(connssl->encdata_length - connssl->encdata_offset < CURL_SCHANNEL_BUFFER_FREE_SIZE) { /* increase internal encrypted data buffer */ - connssl->encdata_length *= CURL_SCHANNEL_BUFFER_STEP_FACTOR; - connssl->encdata_buffer = realloc(connssl->encdata_buffer, - connssl->encdata_length); + reallocated_length = connssl->encdata_offset + + CURL_SCHANNEL_BUFFER_FREE_SIZE; + reallocated_buffer = realloc(connssl->encdata_buffer, + reallocated_length); - if(connssl->encdata_buffer == NULL) { + if(reallocated_buffer == NULL) { failf(data, "schannel: unable to re-allocate memory"); return CURLE_OUT_OF_MEMORY; } + else { + connssl->encdata_buffer = reallocated_buffer; + connssl->encdata_length = reallocated_length; + } } for(;;) { @@ -484,17 +505,20 @@ schannel_connect_step2(struct connectdata *conn, int sockindex) static CURLcode schannel_connect_step3(struct connectdata *conn, int sockindex) { - CURLcode retcode = CURLE_OK; + CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; struct curl_schannel_cred *old_cred = NULL; - int incache; + bool incache; DEBUGASSERT(ssl_connect_3 == connssl->connecting_state); infof(data, "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n", conn->host.name, conn->remote_port); + if(!connssl->cred) + return CURLE_SSL_CONNECT_ERROR; + /* check if the required context attributes are met */ if(connssl->ret_flags != connssl->req_flags) { if(!(connssl->ret_flags & ISC_RET_SEQUENCE_DETECT)) @@ -518,20 +542,21 @@ schannel_connect_step3(struct connectdata *conn, int sockindex) } /* save the current session data for possible re-use */ - incache = !(Curl_ssl_getsessionid(conn, (void**)&old_cred, NULL)); + incache = !(Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL)); if(incache) { if(old_cred != connssl->cred) { infof(data, "schannel: old credential handle is stale, removing\n"); - Curl_ssl_delsessionid(conn, (void*)old_cred); + Curl_ssl_delsessionid(conn, (void *)old_cred); incache = FALSE; } } + if(!incache) { - retcode = Curl_ssl_addsessionid(conn, (void*)connssl->cred, - sizeof(struct curl_schannel_cred)); - if(retcode) { + result = Curl_ssl_addsessionid(conn, (void *)connssl->cred, + sizeof(struct curl_schannel_cred)); + if(result) { failf(data, "schannel: failed to store credential handle"); - return retcode; + return result; } else { connssl->cred->cached = TRUE; @@ -548,7 +573,7 @@ static CURLcode schannel_connect_common(struct connectdata *conn, int sockindex, bool nonblocking, bool *done) { - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; curl_socket_t sockfd = conn->sock[sockindex]; @@ -571,9 +596,9 @@ schannel_connect_common(struct connectdata *conn, int sockindex, return CURLE_OPERATION_TIMEDOUT; } - retcode = schannel_connect_step1(conn, sockindex); - if(retcode) - return retcode; + result = schannel_connect_step1(conn, sockindex); + if(result) + return result; } while(ssl_connect_2 == connssl->connecting_state || @@ -625,19 +650,19 @@ schannel_connect_common(struct connectdata *conn, int sockindex, * ensuring that a client using select() or epoll() will always * have a valid fdset to wait on. */ - retcode = schannel_connect_step2(conn, sockindex); - if(retcode || (nonblocking && - (ssl_connect_2 == connssl->connecting_state || - ssl_connect_2_reading == connssl->connecting_state || - ssl_connect_2_writing == connssl->connecting_state))) - return retcode; + result = schannel_connect_step2(conn, sockindex); + if(result || (nonblocking && + (ssl_connect_2 == connssl->connecting_state || + ssl_connect_2_reading == connssl->connecting_state || + ssl_connect_2_writing == connssl->connecting_state))) + return result; } /* repeat step2 until all transactions are done. */ if(ssl_connect_3 == connssl->connecting_state) { - retcode = schannel_connect_step3(conn, sockindex); - if(retcode) - return retcode; + result = schannel_connect_step3(conn, sockindex); + if(result) + return result; } if(ssl_connect_done == connssl->connecting_state) { @@ -689,7 +714,7 @@ schannel_send(struct connectdata *conn, int sockindex, /* calculate the complete message length and allocate a buffer for it */ data_len = connssl->stream_sizes.cbHeader + len + connssl->stream_sizes.cbTrailer; - data = (unsigned char*) malloc(data_len); + data = (unsigned char *) malloc(data_len); if(data == NULL) { *err = CURLE_OUT_OF_MEMORY; return -1; @@ -744,7 +769,7 @@ schannel_send(struct connectdata *conn, int sockindex, this_write = 0; - timeleft = Curl_timeleft(conn->data, NULL, TRUE); + timeleft = Curl_timeleft(conn->data, NULL, FALSE); if(timeleft < 0) { /* we already got the timeout */ failf(conn->data, "schannel: timed out sending data " @@ -808,9 +833,11 @@ schannel_recv(struct connectdata *conn, int sockindex, { size_t size = 0; ssize_t nread = 0, ret = -1; - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + unsigned char *reallocated_buffer; + size_t reallocated_length; bool done = FALSE; SecBuffer inbuf[4]; SecBufferDesc inbuf_desc; @@ -832,18 +859,27 @@ schannel_recv(struct connectdata *conn, int sockindex, } /* increase buffer in order to fit the requested amount of data */ - while(connssl->encdata_length - connssl->encdata_offset < - CURL_SCHANNEL_BUFFER_FREE_SIZE || connssl->encdata_length < len) { + if(connssl->encdata_length - connssl->encdata_offset < + CURL_SCHANNEL_BUFFER_FREE_SIZE || connssl->encdata_length < len) { /* increase internal encrypted data buffer */ - connssl->encdata_length *= CURL_SCHANNEL_BUFFER_STEP_FACTOR; - connssl->encdata_buffer = realloc(connssl->encdata_buffer, - connssl->encdata_length); + reallocated_length = connssl->encdata_offset + + CURL_SCHANNEL_BUFFER_FREE_SIZE; + /* make sure that the requested amount of data fits */ + if(reallocated_length < len) { + reallocated_length = len; + } + reallocated_buffer = realloc(connssl->encdata_buffer, + reallocated_length); - if(connssl->encdata_buffer == NULL) { + if(reallocated_buffer == NULL) { failf(data, "schannel: unable to re-allocate memory"); *err = CURLE_OUT_OF_MEMORY; return -1; } + else { + connssl->encdata_buffer = reallocated_buffer; + connssl->encdata_length = reallocated_length; + } } /* read encrypted data from socket */ @@ -895,10 +931,11 @@ schannel_recv(struct connectdata *conn, int sockindex, } /* check if everything went fine (server may want to renegotiate - context) */ + or shutdown the connection context) */ if(sspi_status == SEC_E_OK || sspi_status == SEC_I_RENEGOTIATE || sspi_status == SEC_I_CONTEXT_EXPIRED) { - /* check for successfully decrypted data */ + /* check for successfully decrypted data, even before actual + renegotiation or shutdown of the connection context */ if(inbuf[1].BufferType == SECBUFFER_DATA) { infof(data, "schannel: decrypted data length: %lu\n", inbuf[1].cbBuffer); @@ -906,18 +943,26 @@ schannel_recv(struct connectdata *conn, int sockindex, /* increase buffer in order to fit the received amount of data */ size = inbuf[1].cbBuffer > CURL_SCHANNEL_BUFFER_FREE_SIZE ? inbuf[1].cbBuffer : CURL_SCHANNEL_BUFFER_FREE_SIZE; - while(connssl->decdata_length - connssl->decdata_offset < size || - connssl->decdata_length < len) { + if(connssl->decdata_length - connssl->decdata_offset < size || + connssl->decdata_length < len) { /* increase internal decrypted data buffer */ - connssl->decdata_length *= CURL_SCHANNEL_BUFFER_STEP_FACTOR; - connssl->decdata_buffer = realloc(connssl->decdata_buffer, - connssl->decdata_length); + reallocated_length = connssl->decdata_offset + size; + /* make sure that the requested amount of data fits */ + if(reallocated_length < len) { + reallocated_length = len; + } + reallocated_buffer = realloc(connssl->decdata_buffer, + reallocated_length); - if(connssl->decdata_buffer == NULL) { + if(reallocated_buffer == NULL) { failf(data, "schannel: unable to re-allocate memory"); *err = CURLE_OUT_OF_MEMORY; return -1; } + else { + connssl->decdata_buffer = reallocated_buffer; + connssl->decdata_length = reallocated_length; + } } /* copy decrypted data to internal buffer */ @@ -967,9 +1012,9 @@ schannel_recv(struct connectdata *conn, int sockindex, infof(data, "schannel: renegotiating SSL/TLS connection\n"); connssl->state = ssl_connection_negotiating; connssl->connecting_state = ssl_connect_2_writing; - retcode = schannel_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - *err = retcode; + result = schannel_connect_common(conn, sockindex, FALSE, &done); + if(result) + *err = result; else { infof(data, "schannel: SSL/TLS connection renegotiated\n"); /* now retry receiving data */ @@ -996,6 +1041,8 @@ schannel_recv(struct connectdata *conn, int sockindex, infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n", connssl->decdata_offset, connssl->decdata_length); } + else + ret = 0; /* check if the server closed the connection */ if(ret <= 0 && ( /* special check for Windows 2000 Professional */ @@ -1027,12 +1074,12 @@ Curl_schannel_connect_nonblocking(struct connectdata *conn, int sockindex, CURLcode Curl_schannel_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = schannel_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + result = schannel_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; DEBUGASSERT(done); @@ -1124,29 +1171,29 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex) " (bytes written: %zd)\n", curl_easy_strerror(code), written); } } + } - /* free SSPI Schannel API security context handle */ - if(connssl->ctxt) { - infof(data, "schannel: clear security context handle\n"); - s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle); - Curl_safefree(connssl->ctxt); - } + /* free SSPI Schannel API security context handle */ + if(connssl->ctxt) { + infof(data, "schannel: clear security context handle\n"); + s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle); + Curl_safefree(connssl->ctxt); + } - /* free SSPI Schannel API credential handle */ - if(connssl->cred) { - /* decrement the reference counter of the credential/session handle */ - if(connssl->cred->refcount > 0) { - connssl->cred->refcount--; - infof(data, "schannel: decremented credential handle refcount = %d\n", - connssl->cred->refcount); - } + /* free SSPI Schannel API credential handle */ + if(connssl->cred) { + /* decrement the reference counter of the credential/session handle */ + if(connssl->cred->refcount > 0) { + connssl->cred->refcount--; + infof(data, "schannel: decremented credential handle refcount = %d\n", + connssl->cred->refcount); + } - /* if the handle was not cached and the refcount is zero */ - if(!connssl->cred->cached && connssl->cred->refcount == 0) { - infof(data, "schannel: clear credential handle\n"); - s_pSecFn->FreeCredentialsHandle(&connssl->cred->cred_handle); - Curl_safefree(connssl->cred); - } + /* if the handle was not cached and the refcount is zero */ + if(!connssl->cred->cached && connssl->cred->refcount == 0) { + infof(data, "schannel: clear credential handle\n"); + s_pSecFn->FreeCredentialsHandle(&connssl->cred->cred_handle); + Curl_safefree(connssl->cred); } } @@ -1194,6 +1241,23 @@ size_t Curl_schannel_version(char *buffer, size_t size) return size; } +int Curl_schannel_random(unsigned char *entropy, size_t length) +{ + HCRYPTPROV hCryptProv = 0; + + if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) + return 1; + + if(!CryptGenRandom(hCryptProv, (DWORD)length, entropy)) { + CryptReleaseContext(hCryptProv, 0UL); + return 1; + } + + CryptReleaseContext(hCryptProv, 0UL); + return 0; +} + #ifdef _WIN32_WCE static CURLcode verify_certificate(struct connectdata *conn, int sockindex) { diff --git a/lib/curl_schannel.h b/lib/vtls/curl_schannel.h similarity index 80% rename from lib/curl_schannel.h rename to lib/vtls/curl_schannel.h index b82c734..11e83f9 100644 --- a/lib/curl_schannel.h +++ b/lib/vtls/curl_schannel.h @@ -8,7 +8,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2012, Marc Hoersken, , et al. - * Copyright (C) 2012, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -72,30 +72,8 @@ #define SECBUFFER_ALERT 17 #endif -#ifndef ISC_RET_REPLAY_DETECT -#define ISC_RET_REPLAY_DETECT 0x00000004 -#endif - -#ifndef ISC_RET_SEQUENCE_DETECT -#define ISC_RET_SEQUENCE_DETECT 0x00000008 -#endif - -#ifndef ISC_RET_CONFIDENTIALITY -#define ISC_RET_CONFIDENTIALITY 0x00000010 -#endif - -#ifndef ISC_RET_ALLOCATED_MEMORY -#define ISC_RET_ALLOCATED_MEMORY 0x00000100 -#endif - -#ifndef ISC_RET_STREAM -#define ISC_RET_STREAM 0x00008000 -#endif - - #define CURL_SCHANNEL_BUFFER_INIT_SIZE 4096 #define CURL_SCHANNEL_BUFFER_FREE_SIZE 1024 -#define CURL_SCHANNEL_BUFFER_STEP_FACTOR 2 CURLcode Curl_schannel_connect(struct connectdata *conn, int sockindex); @@ -113,20 +91,25 @@ int Curl_schannel_init(void); void Curl_schannel_cleanup(void); size_t Curl_schannel_version(char *buffer, size_t size); +int Curl_schannel_random(unsigned char *entropy, size_t length); + /* API setup for Schannel */ #define curlssl_init Curl_schannel_init #define curlssl_cleanup Curl_schannel_cleanup #define curlssl_connect Curl_schannel_connect #define curlssl_connect_nonblocking Curl_schannel_connect_nonblocking #define curlssl_session_free Curl_schannel_session_free -#define curlssl_close_all(x) (x=x, CURLE_NOT_BUILT_IN) +#define curlssl_close_all(x) ((void)x) #define curlssl_close Curl_schannel_close #define curlssl_shutdown Curl_schannel_shutdown -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_schannel_version -#define curlssl_check_cxn(x) (x=x, -1) +#define curlssl_check_cxn(x) ((void)x, -1) #define curlssl_data_pending Curl_schannel_data_pending +#define CURL_SSL_BACKEND CURLSSLBACKEND_SCHANNEL +#define curlssl_random(x,y,z) ((void)x, Curl_schannel_random(y,z)) + #endif /* USE_SCHANNEL */ #endif /* HEADER_CURL_SCHANNEL_H */ diff --git a/lib/cyassl.c b/lib/vtls/cyassl.c similarity index 87% rename from lib/cyassl.c rename to lib/vtls/cyassl.c index 7c78464..3333fc3 100644 --- a/lib/cyassl.c +++ b/lib/vtls/cyassl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ /* * Source file for all CyaSSL-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. * */ @@ -38,7 +38,7 @@ #include "sendf.h" #include "inet_pton.h" #include "cyassl.h" -#include "sslgen.h" +#include "vtls.h" #include "parsedate.h" #include "connect.h" /* for the connect timeout */ #include "select.h" @@ -47,11 +47,17 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include #include "curl_memory.h" -/* The last #include file should be: */ -#include "memdebug.h" + #include +#ifdef HAVE_CYASSL_ERROR_SSL_H +#include +#else #include +#endif +#include +/* The last #include file should be: */ +#include "memdebug.h" static Curl_recv cyassl_recv; static Curl_send cyassl_send; @@ -93,18 +99,25 @@ cyassl_connect_step1(struct connectdata *conn, /* check to see if we've been told to use an explicit SSL/TLS version */ switch(data->set.ssl.version) { + default: case CURL_SSLVERSION_DEFAULT: - /* we try to figure out version */ - req_method = SSLv23_client_method(); - break; case CURL_SSLVERSION_TLSv1: + infof(data, "CyaSSL cannot be configured to use TLS 1.0-1.2, " + "TLS 1.0 is used exclusively\n"); + req_method = TLSv1_client_method(); + break; + case CURL_SSLVERSION_TLSv1_0: req_method = TLSv1_client_method(); break; + case CURL_SSLVERSION_TLSv1_1: + req_method = TLSv1_1_client_method(); + break; + case CURL_SSLVERSION_TLSv1_2: + req_method = TLSv1_2_client_method(); + break; case CURL_SSLVERSION_SSLv3: req_method = SSLv3_client_method(); break; - default: - req_method = TLSv1_client_method(); } if(!req_method) { @@ -128,7 +141,7 @@ cyassl_connect_step1(struct connectdata *conn, data->set.str[STRING_SSL_CAFILE], data->set.str[STRING_SSL_CAPATH])) { if(data->set.ssl.verifypeer) { - /* Fail if we insiste on successfully verifying the server. */ + /* Fail if we insist on successfully verifying the server. */ failf(data,"error setting certificate verify locations:\n" " CAfile: %s\n CApath: %s", data->set.str[STRING_SSL_CAFILE]? @@ -138,7 +151,7 @@ cyassl_connect_step1(struct connectdata *conn, return CURLE_SSL_CACERT_BADFILE; } else { - /* Just continue with a warning if no strict certificate + /* Just continue with a warning if no strict certificate verification is required. */ infof(data, "error setting certificate verify locations," " continuing anyway:\n"); @@ -283,6 +296,20 @@ cyassl_connect_step2(struct connectdata *conn, } #endif } +#if LIBCYASSL_VERSION_HEX >= 0x02007000 /* 2.7.0 */ + else if(ASN_NO_SIGNER_E == detail) { + if(data->set.ssl.verifypeer) { + failf(data, "\tCA signer not available for verification\n"); + return CURLE_SSL_CACERT_BADFILE; + } + else { + /* Just continue with a warning if no strict certificate + verification is required. */ + infof(data, "CA signer not available for verification, " + "continuing anyway\n"); + } + } +#endif else { failf(data, "SSL_connect failed with error %d: %s", detail, ERR_error_string(detail, error_buffer)); @@ -301,11 +328,11 @@ static CURLcode cyassl_connect_step3(struct connectdata *conn, int sockindex) { - CURLcode retcode = CURLE_OK; + CURLcode result = CURLE_OK; void *old_ssl_sessionid=NULL; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - int incache; + bool incache; SSL_SESSION *our_ssl_sessionid; DEBUGASSERT(ssl_connect_3 == connssl->connecting_state); @@ -320,18 +347,19 @@ cyassl_connect_step3(struct connectdata *conn, incache = FALSE; } } + if(!incache) { - retcode = Curl_ssl_addsessionid(conn, our_ssl_sessionid, - 0 /* unknown size */); - if(retcode) { + result = Curl_ssl_addsessionid(conn, our_ssl_sessionid, + 0 /* unknown size */); + if(result) { failf(data, "failed to store ssl session"); - return retcode; + return result; } } connssl->connecting_state = ssl_connect_done; - return retcode; + return result; } @@ -476,7 +504,7 @@ cyassl_connect_common(struct connectdata *conn, bool nonblocking, bool *done) { - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; curl_socket_t sockfd = conn->sock[sockindex]; @@ -498,9 +526,10 @@ cyassl_connect_common(struct connectdata *conn, failf(data, "SSL connection timeout"); return CURLE_OPERATION_TIMEDOUT; } - retcode = cyassl_connect_step1(conn, sockindex); - if(retcode) - return retcode; + + result = cyassl_connect_step1(conn, sockindex); + if(result) + return result; } while(ssl_connect_2 == connssl->connecting_state || @@ -552,22 +581,21 @@ cyassl_connect_common(struct connectdata *conn, * ensuring that a client using select() or epoll() will always * have a valid fdset to wait on. */ - retcode = cyassl_connect_step2(conn, sockindex); - if(retcode || (nonblocking && - (ssl_connect_2 == connssl->connecting_state || - ssl_connect_2_reading == connssl->connecting_state || - ssl_connect_2_writing == connssl->connecting_state))) - return retcode; - + result = cyassl_connect_step2(conn, sockindex); + if(result || (nonblocking && + (ssl_connect_2 == connssl->connecting_state || + ssl_connect_2_reading == connssl->connecting_state || + ssl_connect_2_writing == connssl->connecting_state))) + return result; } /* repeat step2 until all transactions are done. */ - if(ssl_connect_3==connssl->connecting_state) { - retcode = cyassl_connect_step3(conn, sockindex); - if(retcode) - return retcode; + if(ssl_connect_3 == connssl->connecting_state) { + result = cyassl_connect_step3(conn, sockindex); + if(result) + return result; } - if(ssl_connect_done==connssl->connecting_state) { + if(ssl_connect_done == connssl->connecting_state) { connssl->state = ssl_connection_complete; conn->recv[sockindex] = cyassl_recv; conn->send[sockindex] = cyassl_send; @@ -596,16 +624,29 @@ CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = cyassl_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + result = cyassl_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; DEBUGASSERT(done); return CURLE_OK; } +int Curl_cyassl_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length) +{ + RNG rng; + (void)data; + if(InitRng(&rng)) + return 1; + if(RNG_GenerateBlock(&rng, entropy, length)) + return 1; + return 0; +} + #endif diff --git a/lib/cyassl.h b/lib/vtls/cyassl.h similarity index 81% rename from lib/cyassl.h rename to lib/vtls/cyassl.h index 7728a0c..a691e16 100644 --- a/lib/cyassl.h +++ b/lib/vtls/cyassl.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -43,6 +43,9 @@ int Curl_cyassl_init(void); CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn, int sockindex, bool *done); +int Curl_cyassl_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length); /* API setup for CyaSSL */ #define curlssl_init Curl_cyassl_init @@ -53,12 +56,14 @@ CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn, #define curlssl_close_all Curl_cyassl_close_all #define curlssl_close Curl_cyassl_close #define curlssl_shutdown(x,y) Curl_cyassl_shutdown(x,y) -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_cyassl_version -#define curlssl_check_cxn(x) (x=x, -1) +#define curlssl_check_cxn(x) ((void)x, -1) #define curlssl_data_pending(x,y) Curl_cyassl_data_pending(x,y) +#define curlssl_random(x,y,z) Curl_cyassl_random(x,y,z) +#define CURL_SSL_BACKEND CURLSSLBACKEND_CYASSL #endif /* USE_CYASSL */ #endif /* HEADER_CURL_CYASSL_H */ diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c new file mode 100644 index 0000000..ac05f05 --- /dev/null +++ b/lib/vtls/gskit.c @@ -0,0 +1,1078 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#ifdef USE_GSKIT + +#include +#include + +/* Some symbols are undefined/unsupported on OS400 versions < V7R1. */ +#ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST +#define GSK_SSL_EXTN_SERVERNAME_REQUEST 230 +#endif + +#ifndef GSK_TLSV10_CIPHER_SPECS +#define GSK_TLSV10_CIPHER_SPECS 236 +#endif + +#ifndef GSK_TLSV11_CIPHER_SPECS +#define GSK_TLSV11_CIPHER_SPECS 237 +#endif + +#ifndef GSK_TLSV12_CIPHER_SPECS +#define GSK_TLSV12_CIPHER_SPECS 238 +#endif + +#ifndef GSK_PROTOCOL_TLSV11 +#define GSK_PROTOCOL_TLSV11 437 +#endif + +#ifndef GSK_PROTOCOL_TLSV12 +#define GSK_PROTOCOL_TLSV12 438 +#endif + +#ifndef GSK_FALSE +#define GSK_FALSE 0 +#endif + +#ifndef GSK_TRUE +#define GSK_TRUE 1 +#endif + + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include +#include "urldata.h" +#include "sendf.h" +#include "gskit.h" +#include "vtls.h" +#include "connect.h" /* for the connect timeout */ +#include "select.h" +#include "strequal.h" +#include "x509asn1.h" + +#define _MPRINTF_REPLACE /* use our functions only */ +#include + +#include "curl_memory.h" +/* The last #include file should be: */ +#include "memdebug.h" + + +/* SSL version flags. */ +#define CURL_GSKPROTO_SSLV2 0 +#define CURL_GSKPROTO_SSLV2_MASK (1 << CURL_GSKPROTO_SSLV2) +#define CURL_GSKPROTO_SSLV3 1 +#define CURL_GSKPROTO_SSLV3_MASK (1 << CURL_GSKPROTO_SSLV3) +#define CURL_GSKPROTO_TLSV10 2 +#define CURL_GSKPROTO_TLSV10_MASK (1 << CURL_GSKPROTO_TLSV10) +#define CURL_GSKPROTO_TLSV11 3 +#define CURL_GSKPROTO_TLSV11_MASK (1 << CURL_GSKPROTO_TLSV11) +#define CURL_GSKPROTO_TLSV12 4 +#define CURL_GSKPROTO_TLSV12_MASK (1 << CURL_GSKPROTO_TLSV12) +#define CURL_GSKPROTO_LAST 5 + + +/* Supported ciphers. */ +typedef struct { + const char *name; /* Cipher name. */ + const char *gsktoken; /* Corresponding token for GSKit String. */ + unsigned int versions; /* SSL version flags. */ +} gskit_cipher; + +static const gskit_cipher ciphertable[] = { + { "null-md5", "01", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK }, + { "null-sha", "02", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK }, + { "exp-rc4-md5", "03", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK }, + { "rc4-md5", "04", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK }, + { "rc4-sha", "05", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK }, + { "exp-rc2-cbc-md5", "06", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK }, + { "exp-des-cbc-sha", "09", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK }, + { "des-cbc3-sha", "0A", + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK }, + { "aes128-sha", "2F", + CURL_GSKPROTO_TLSV10_MASK | CURL_GSKPROTO_TLSV11_MASK | + CURL_GSKPROTO_TLSV12_MASK }, + { "aes256-sha", "35", + CURL_GSKPROTO_TLSV10_MASK | CURL_GSKPROTO_TLSV11_MASK | + CURL_GSKPROTO_TLSV12_MASK }, + { "null-sha256", "3B", CURL_GSKPROTO_TLSV12_MASK }, + { "aes128-sha256", "3C", CURL_GSKPROTO_TLSV12_MASK }, + { "aes256-sha256", "3D", CURL_GSKPROTO_TLSV12_MASK }, + { "aes128-gcm-sha256", + "9C", CURL_GSKPROTO_TLSV12_MASK }, + { "aes256-gcm-sha384", + "9D", CURL_GSKPROTO_TLSV12_MASK }, + { "rc4-md5", "1", CURL_GSKPROTO_SSLV2_MASK }, + { "exp-rc4-md5", "2", CURL_GSKPROTO_SSLV2_MASK }, + { "rc2-md5", "3", CURL_GSKPROTO_SSLV2_MASK }, + { "exp-rc2-md5", "4", CURL_GSKPROTO_SSLV2_MASK }, + { "des-cbc-md5", "6", CURL_GSKPROTO_SSLV2_MASK }, + { "des-cbc3-md5", "7", CURL_GSKPROTO_SSLV2_MASK }, + { (const char *) NULL, (const char *) NULL, 0 } +}; + + +static bool is_separator(char c) +{ + /* Return whether character is a cipher list separator. */ + switch (c) { + case ' ': + case '\t': + case ':': + case ',': + case ';': + return true; + } + return false; +} + + +static CURLcode gskit_status(struct SessionHandle *data, int rc, + const char *procname, CURLcode defcode) +{ + /* Process GSKit status and map it to a CURLcode. */ + switch (rc) { + case GSK_OK: + case GSK_OS400_ASYNCHRONOUS_SOC_INIT: + return CURLE_OK; + case GSK_KEYRING_OPEN_ERROR: + case GSK_OS400_ERROR_NO_ACCESS: + return CURLE_SSL_CACERT_BADFILE; + case GSK_INSUFFICIENT_STORAGE: + return CURLE_OUT_OF_MEMORY; + case GSK_ERROR_BAD_V2_CIPHER: + case GSK_ERROR_BAD_V3_CIPHER: + case GSK_ERROR_NO_CIPHERS: + return CURLE_SSL_CIPHER; + case GSK_OS400_ERROR_NOT_TRUSTED_ROOT: + case GSK_ERROR_CERT_VALIDATION: + return CURLE_PEER_FAILED_VERIFICATION; + case GSK_OS400_ERROR_TIMED_OUT: + return CURLE_OPERATION_TIMEDOUT; + case GSK_WOULD_BLOCK: + return CURLE_AGAIN; + case GSK_OS400_ERROR_NOT_REGISTERED: + break; + case GSK_ERROR_IO: + switch (errno) { + case ENOMEM: + return CURLE_OUT_OF_MEMORY; + default: + failf(data, "%s I/O error: %s", procname, strerror(errno)); + break; + } + break; + default: + failf(data, "%s: %s", procname, gsk_strerror(rc)); + break; + } + return defcode; +} + + +static CURLcode set_enum(struct SessionHandle *data, gsk_handle h, + GSK_ENUM_ID id, GSK_ENUM_VALUE value, bool unsupported_ok) +{ + int rc = gsk_attribute_set_enum(h, id, value); + + switch (rc) { + case GSK_OK: + return CURLE_OK; + case GSK_ERROR_IO: + failf(data, "gsk_attribute_set_enum() I/O error: %s", strerror(errno)); + break; + case GSK_ATTRIBUTE_INVALID_ID: + if(unsupported_ok) + return CURLE_UNSUPPORTED_PROTOCOL; + default: + failf(data, "gsk_attribute_set_enum(): %s", gsk_strerror(rc)); + break; + } + return CURLE_SSL_CONNECT_ERROR; +} + + +static CURLcode set_buffer(struct SessionHandle *data, gsk_handle h, + GSK_BUF_ID id, const char *buffer, bool unsupported_ok) +{ + int rc = gsk_attribute_set_buffer(h, id, buffer, 0); + + switch (rc) { + case GSK_OK: + return CURLE_OK; + case GSK_ERROR_IO: + failf(data, "gsk_attribute_set_buffer() I/O error: %s", strerror(errno)); + break; + case GSK_ATTRIBUTE_INVALID_ID: + if(unsupported_ok) + return CURLE_UNSUPPORTED_PROTOCOL; + default: + failf(data, "gsk_attribute_set_buffer(): %s", gsk_strerror(rc)); + break; + } + return CURLE_SSL_CONNECT_ERROR; +} + + +static CURLcode set_numeric(struct SessionHandle *data, + gsk_handle h, GSK_NUM_ID id, int value) +{ + int rc = gsk_attribute_set_numeric_value(h, id, value); + + switch (rc) { + case GSK_OK: + return CURLE_OK; + case GSK_ERROR_IO: + failf(data, "gsk_attribute_set_numeric_value() I/O error: %s", + strerror(errno)); + break; + default: + failf(data, "gsk_attribute_set_numeric_value(): %s", gsk_strerror(rc)); + break; + } + return CURLE_SSL_CONNECT_ERROR; +} + + +static CURLcode set_callback(struct SessionHandle *data, + gsk_handle h, GSK_CALLBACK_ID id, void *info) +{ + int rc = gsk_attribute_set_callback(h, id, info); + + switch (rc) { + case GSK_OK: + return CURLE_OK; + case GSK_ERROR_IO: + failf(data, "gsk_attribute_set_callback() I/O error: %s", strerror(errno)); + break; + default: + failf(data, "gsk_attribute_set_callback(): %s", gsk_strerror(rc)); + break; + } + return CURLE_SSL_CONNECT_ERROR; +} + + +static CURLcode set_ciphers(struct SessionHandle *data, + gsk_handle h, unsigned int *protoflags) +{ + const char *cipherlist = data->set.str[STRING_SSL_CIPHER_LIST]; + const char *clp; + const gskit_cipher *ctp; + int i; + int l; + bool unsupported; + CURLcode result; + struct { + char *buf; + char *ptr; + } ciphers[CURL_GSKPROTO_LAST]; + + /* Compile cipher list into GSKit-compatible cipher lists. */ + + if(!cipherlist) + return CURLE_OK; + while(is_separator(*cipherlist)) /* Skip initial separators. */ + cipherlist++; + if(!*cipherlist) + return CURLE_OK; + + /* We allocate GSKit buffers of the same size as the input string: since + GSKit tokens are always shorter than their cipher names, allocated buffers + will always be large enough to accomodate the result. */ + l = strlen(cipherlist) + 1; + memset((char *) ciphers, 0, sizeof ciphers); + for(i = 0; i < CURL_GSKPROTO_LAST; i++) { + ciphers[i].buf = malloc(l); + if(!ciphers[i].buf) { + while(i--) + free(ciphers[i].buf); + return CURLE_OUT_OF_MEMORY; + } + ciphers[i].ptr = ciphers[i].buf; + *ciphers[i].ptr = '\0'; + } + + /* Process each cipher in input string. */ + unsupported = FALSE; + result = CURLE_OK; + for(;;) { + for(clp = cipherlist; *cipherlist && !is_separator(*cipherlist);) + cipherlist++; + l = cipherlist - clp; + if(!l) + break; + /* Search the cipher in our table. */ + for(ctp = ciphertable; ctp->name; ctp++) + if(strnequal(ctp->name, clp, l) && !ctp->name[l]) + break; + if(!ctp->name) { + failf(data, "Unknown cipher %.*s", l, clp); + result = CURLE_SSL_CIPHER; + } + else { + unsupported |= !(ctp->versions & (CURL_GSKPROTO_SSLV2_MASK | + CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK)); + for(i = 0; i < CURL_GSKPROTO_LAST; i++) { + if(ctp->versions & (1 << i)) { + strcpy(ciphers[i].ptr, ctp->gsktoken); + ciphers[i].ptr += strlen(ctp->gsktoken); + } + } + } + + /* Advance to next cipher name or end of string. */ + while(is_separator(*cipherlist)) + cipherlist++; + } + + /* Disable protocols with empty cipher lists. */ + for(i = 0; i < CURL_GSKPROTO_LAST; i++) { + if(!(*protoflags & (1 << i)) || !ciphers[i].buf[0]) { + *protoflags &= ~(1 << i); + ciphers[i].buf[0] = '\0'; + } + } + + /* Try to set-up TLSv1.1 and TLSv2.1 ciphers. */ + if(*protoflags & CURL_GSKPROTO_TLSV11_MASK) { + result = set_buffer(data, h, GSK_TLSV11_CIPHER_SPECS, + ciphers[CURL_GSKPROTO_TLSV11].buf, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + result = CURLE_OK; + if(unsupported) { + failf(data, "TLSv1.1-only ciphers are not yet supported"); + result = CURLE_SSL_CIPHER; + } + } + } + if(!result && (*protoflags & CURL_GSKPROTO_TLSV12_MASK)) { + result = set_buffer(data, h, GSK_TLSV12_CIPHER_SPECS, + ciphers[CURL_GSKPROTO_TLSV12].buf, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + result = CURLE_OK; + if(unsupported) { + failf(data, "TLSv1.2-only ciphers are not yet supported"); + result = CURLE_SSL_CIPHER; + } + } + } + + /* Try to set-up TLSv1.0 ciphers. If not successful, concatenate them to + the SSLv3 ciphers. OS/400 prior to version 7.1 will understand it. */ + if(!result && (*protoflags & CURL_GSKPROTO_TLSV10_MASK)) { + result = set_buffer(data, h, GSK_TLSV10_CIPHER_SPECS, + ciphers[CURL_GSKPROTO_TLSV10].buf, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + result = CURLE_OK; + strcpy(ciphers[CURL_GSKPROTO_SSLV3].ptr, + ciphers[CURL_GSKPROTO_TLSV10].ptr); + } + } + + /* Set-up other ciphers. */ + if(!result && (*protoflags & CURL_GSKPROTO_SSLV3_MASK)) + result = set_buffer(data, h, GSK_V3_CIPHER_SPECS, + ciphers[CURL_GSKPROTO_SSLV3].buf, FALSE); + if(!result && (*protoflags & CURL_GSKPROTO_SSLV2_MASK)) + result = set_buffer(data, h, GSK_V2_CIPHER_SPECS, + ciphers[CURL_GSKPROTO_SSLV2].buf, FALSE); + + /* Clean-up. */ + for(i = 0; i < CURL_GSKPROTO_LAST; i++) + free(ciphers[i].buf); + + return result; +} + + +int Curl_gskit_init(void) +{ + /* No initialisation needed. */ + + return 1; +} + + +void Curl_gskit_cleanup(void) +{ + /* Nothing to do. */ +} + + +static CURLcode init_environment(struct SessionHandle *data, + gsk_handle *envir, const char *appid, + const char *file, const char *label, + const char *password) +{ + int rc; + CURLcode result; + gsk_handle h; + + /* Creates the GSKit environment. */ + + rc = gsk_environment_open(&h); + switch (rc) { + case GSK_OK: + break; + case GSK_INSUFFICIENT_STORAGE: + return CURLE_OUT_OF_MEMORY; + default: + failf(data, "gsk_environment_open(): %s", gsk_strerror(rc)); + return CURLE_SSL_CONNECT_ERROR; + } + + result = set_enum(data, h, GSK_SESSION_TYPE, GSK_CLIENT_SESSION, FALSE); + if(!result && appid) + result = set_buffer(data, h, GSK_OS400_APPLICATION_ID, appid, FALSE); + if(!result && file) + result = set_buffer(data, h, GSK_KEYRING_FILE, file, FALSE); + if(!result && label) + result = set_buffer(data, h, GSK_KEYRING_LABEL, label, FALSE); + if(!result && password) + result = set_buffer(data, h, GSK_KEYRING_PW, password, FALSE); + + if(!result) { + /* Locate CAs, Client certificate and key according to our settings. + Note: this call may be blocking for some tenths of seconds. */ + result = gskit_status(data, gsk_environment_init(h), + "gsk_environment_init()", CURLE_SSL_CERTPROBLEM); + if(!result) { + *envir = h; + return result; + } + } + /* Error: rollback. */ + gsk_environment_close(&h); + return result; +} + + +static void cancel_async_handshake(struct connectdata *conn, int sockindex) +{ + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + Qso_OverlappedIO_t cstat; + + if(QsoCancelOperation(conn->sock[sockindex], 0) > 0) + QsoWaitForIOCompletion(connssl->iocport, &cstat, (struct timeval *) NULL); +} + + +static void close_async_handshake(struct ssl_connect_data *connssl) +{ + QsoDestroyIOCompletionPort(connssl->iocport); + connssl->iocport = -1; +} + + +static void close_one(struct ssl_connect_data *conn, + struct SessionHandle *data) +{ + if(conn->handle) { + gskit_status(data, gsk_secure_soc_close(&conn->handle), + "gsk_secure_soc_close()", 0); + conn->handle = (gsk_handle) NULL; + } + if(conn->iocport >= 0) + close_async_handshake(conn); +} + + +static ssize_t gskit_send(struct connectdata *conn, int sockindex, + const void *mem, size_t len, CURLcode *curlcode) +{ + struct SessionHandle *data = conn->data; + CURLcode cc; + int written; + + cc = gskit_status(data, + gsk_secure_soc_write(conn->ssl[sockindex].handle, + (char *) mem, (int) len, &written), + "gsk_secure_soc_write()", CURLE_SEND_ERROR); + if(cc != CURLE_OK) { + *curlcode = cc; + written = -1; + } + return (ssize_t) written; /* number of bytes */ +} + + +static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf, + size_t buffersize, CURLcode *curlcode) +{ + struct SessionHandle *data = conn->data; + int buffsize; + int nread; + CURLcode cc; + + buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize; + cc = gskit_status(data, gsk_secure_soc_read(conn->ssl[num].handle, + buf, buffsize, &nread), + "gsk_secure_soc_read()", CURLE_RECV_ERROR); + if(cc != CURLE_OK) { + *curlcode = cc; + nread = -1; + } + return (ssize_t) nread; +} + + +static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex) +{ + struct SessionHandle *data = conn->data; + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + gsk_handle envir; + CURLcode result; + int rc; + char *keyringfile; + char *keyringpwd; + char *keyringlabel; + char *sni; + unsigned int protoflags; + long timeout; + Qso_OverlappedIO_t commarea; + + /* Create SSL environment, start (preferably asynchronous) handshake. */ + + connssl->handle = (gsk_handle) NULL; + connssl->iocport = -1; + + /* GSKit supports two ways of specifying an SSL context: either by + * application identifier (that should have been defined at the system + * level) or by keyring file, password and certificate label. + * Local certificate name (CURLOPT_SSLCERT) is used to hold either the + * application identifier of the certificate label. + * Key password (CURLOPT_KEYPASSWD) holds the keyring password. + * It is not possible to have different keyrings for the CAs and the + * local certificate. We thus use the CA file (CURLOPT_CAINFO) to identify + * the keyring file. + * If no key password is given and the keyring is the system keyring, + * application identifier mode is tried first, as recommended in IBM doc. + */ + + keyringfile = data->set.str[STRING_SSL_CAFILE]; + keyringpwd = data->set.str[STRING_KEY_PASSWD]; + keyringlabel = data->set.str[STRING_CERT]; + envir = (gsk_handle) NULL; + + if(keyringlabel && *keyringlabel && !keyringpwd && + !strcmp(keyringfile, CURL_CA_BUNDLE)) { + /* Try application identifier mode. */ + init_environment(data, &envir, keyringlabel, (const char *) NULL, + (const char *) NULL, (const char *) NULL); + } + + if(!envir) { + /* Use keyring mode. */ + result = init_environment(data, &envir, (const char *) NULL, + keyringfile, keyringlabel, keyringpwd); + if(result) + return result; + } + + /* Create secure session. */ + result = gskit_status(data, gsk_secure_soc_open(envir, &connssl->handle), + "gsk_secure_soc_open()", CURLE_SSL_CONNECT_ERROR); + gsk_environment_close(&envir); + if(result) + return result; + + /* Determine which SSL/TLS version should be enabled. */ + protoflags = CURL_GSKPROTO_TLSV10_MASK | CURL_GSKPROTO_TLSV11_MASK | + CURL_GSKPROTO_TLSV12_MASK; + sni = conn->host.name; + switch (data->set.ssl.version) { + case CURL_SSLVERSION_SSLv2: + protoflags = CURL_GSKPROTO_SSLV2_MASK; + sni = (char *) NULL; + break; + case CURL_SSLVERSION_SSLv3: + protoflags = CURL_GSKPROTO_SSLV2_MASK; + sni = (char *) NULL; + break; + case CURL_SSLVERSION_TLSv1: + protoflags = CURL_GSKPROTO_TLSV10_MASK | + CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK; + break; + case CURL_SSLVERSION_TLSv1_0: + protoflags = CURL_GSKPROTO_TLSV10_MASK; + break; + case CURL_SSLVERSION_TLSv1_1: + protoflags = CURL_GSKPROTO_TLSV11_MASK; + break; + case CURL_SSLVERSION_TLSv1_2: + protoflags = CURL_GSKPROTO_TLSV12_MASK; + break; + } + + /* Process SNI. Ignore if not supported (on OS400 < V7R1). */ + if(sni) { + result = set_buffer(data, connssl->handle, + GSK_SSL_EXTN_SERVERNAME_REQUEST, sni, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) + result = CURLE_OK; + } + + /* Set session parameters. */ + if(!result) { + /* Compute the handshake timeout. Since GSKit granularity is 1 second, + we round up the required value. */ + timeout = Curl_timeleft(data, NULL, TRUE); + if(timeout < 0) + result = CURLE_OPERATION_TIMEDOUT; + else + result = set_numeric(data, connssl->handle, GSK_HANDSHAKE_TIMEOUT, + (timeout + 999) / 1000); + } + if(!result) + result = set_numeric(data, connssl->handle, GSK_FD, conn->sock[sockindex]); + if(!result) + result = set_ciphers(data, connssl->handle, &protoflags); + if(!protoflags) { + failf(data, "No SSL protocol/cipher combination enabled"); + result = CURLE_SSL_CIPHER; + } + if(!result) + result = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV2, + (protoflags & CURL_GSKPROTO_SSLV2_MASK)? + GSK_PROTOCOL_SSLV2_ON: GSK_PROTOCOL_SSLV2_OFF, FALSE); + if(!result) + result = set_enum(data, connssl->handle, GSK_PROTOCOL_SSLV3, + (protoflags & CURL_GSKPROTO_SSLV3_MASK)? + GSK_PROTOCOL_SSLV3_ON: GSK_PROTOCOL_SSLV3_OFF, FALSE); + if(!result) + result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV1, + (protoflags & CURL_GSKPROTO_TLSV10_MASK)? + GSK_PROTOCOL_TLSV1_ON: GSK_PROTOCOL_TLSV1_OFF, FALSE); + if(!result) { + result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV11, + (protoflags & CURL_GSKPROTO_TLSV11_MASK)? + GSK_TRUE: GSK_FALSE, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + result = CURLE_OK; + if(protoflags == CURL_GSKPROTO_TLSV11_MASK) { + failf(data, "TLS 1.1 not yet supported"); + result = CURLE_SSL_CIPHER; + } + } + } + if(!result) { + result = set_enum(data, connssl->handle, GSK_PROTOCOL_TLSV12, + (protoflags & CURL_GSKPROTO_TLSV12_MASK)? + GSK_TRUE: GSK_FALSE, TRUE); + if(result == CURLE_UNSUPPORTED_PROTOCOL) { + result = CURLE_OK; + if(protoflags == CURL_GSKPROTO_TLSV12_MASK) { + failf(data, "TLS 1.2 not yet supported"); + result = CURLE_SSL_CIPHER; + } + } + } + if(!result) + result = set_enum(data, connssl->handle, GSK_SERVER_AUTH_TYPE, + data->set.ssl.verifypeer? GSK_SERVER_AUTH_FULL: + GSK_SERVER_AUTH_PASSTHRU, FALSE); + + if(!result) { + /* Start handshake. Try asynchronous first. */ + memset(&commarea, 0, sizeof commarea); + connssl->iocport = QsoCreateIOCompletionPort(); + if(connssl->iocport != -1) { + result = gskit_status(data, + gsk_secure_soc_startInit(connssl->handle, + connssl->iocport, + &commarea), + "gsk_secure_soc_startInit()", + CURLE_SSL_CONNECT_ERROR); + if(!result) { + connssl->connecting_state = ssl_connect_2; + return CURLE_OK; + } + else + close_async_handshake(connssl); + } + else if(errno != ENOBUFS) + result = gskit_status(data, GSK_ERROR_IO, + "QsoCreateIOCompletionPort()", 0); + else { + /* No more completion port available. Use synchronous IO. */ + result = gskit_status(data, gsk_secure_soc_init(connssl->handle), + "gsk_secure_soc_init()", CURLE_SSL_CONNECT_ERROR); + if(!result) { + connssl->connecting_state = ssl_connect_3; + return CURLE_OK; + } + } + } + + /* Error: rollback. */ + close_one(connssl, data); + return result; +} + + +static CURLcode gskit_connect_step2(struct connectdata *conn, int sockindex, + bool nonblocking) +{ + struct SessionHandle *data = conn->data; + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + Qso_OverlappedIO_t cstat; + long timeout_ms; + struct timeval stmv; + CURLcode result; + + /* Poll or wait for end of SSL asynchronous handshake. */ + + for(;;) { + timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE); + if(timeout_ms < 0) + timeout_ms = 0; + stmv.tv_sec = timeout_ms / 1000; + stmv.tv_usec = (timeout_ms - stmv.tv_sec * 1000) * 1000; + switch (QsoWaitForIOCompletion(connssl->iocport, &cstat, &stmv)) { + case 1: /* Operation complete. */ + break; + case -1: /* An error occurred: handshake still in progress. */ + if(errno == EINTR) { + if(nonblocking) + return CURLE_OK; + continue; /* Retry. */ + } + if(errno != ETIME) { + failf(data, "QsoWaitForIOCompletion() I/O error: %s", strerror(errno)); + cancel_async_handshake(conn, sockindex); + close_async_handshake(connssl); + return CURLE_SSL_CONNECT_ERROR; + } + /* FALL INTO... */ + case 0: /* Handshake in progress, timeout occurred. */ + if(nonblocking) + return CURLE_OK; + cancel_async_handshake(conn, sockindex); + close_async_handshake(connssl); + return CURLE_OPERATION_TIMEDOUT; + } + break; + } + result = gskit_status(data, cstat.returnValue, "SSL handshake", + CURLE_SSL_CONNECT_ERROR); + if(!result) + connssl->connecting_state = ssl_connect_3; + close_async_handshake(connssl); + return result; +} + + +static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex) +{ + struct SessionHandle *data = conn->data; + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + const gsk_cert_data_elem *cdev; + int cdec; + const gsk_cert_data_elem *p; + const char *cert = (const char *) NULL; + const char *certend; + const char *ptr; + int i; + CURLcode result; + + /* SSL handshake done: gather certificate info and verify host. */ + + if(gskit_status(data, gsk_attribute_get_cert_info(connssl->handle, + GSK_PARTNER_CERT_INFO, + &cdev, &cdec), + "gsk_attribute_get_cert_info()", CURLE_SSL_CONNECT_ERROR) == + CURLE_OK) { + infof(data, "Server certificate:\n"); + p = cdev; + for(i = 0; i++ < cdec; p++) + switch (p->cert_data_id) { + case CERT_BODY_DER: + cert = p->cert_data_p; + certend = cert + cdev->cert_data_l; + break; + case CERT_DN_PRINTABLE: + infof(data, "\t subject: %.*s\n", p->cert_data_l, p->cert_data_p); + break; + case CERT_ISSUER_DN_PRINTABLE: + infof(data, "\t issuer: %.*s\n", p->cert_data_l, p->cert_data_p); + break; + case CERT_VALID_FROM: + infof(data, "\t start date: %.*s\n", p->cert_data_l, p->cert_data_p); + break; + case CERT_VALID_TO: + infof(data, "\t expire date: %.*s\n", p->cert_data_l, p->cert_data_p); + break; + } + } + + /* Verify host. */ + result = Curl_verifyhost(conn, cert, certend); + if(result) + return result; + + /* The only place GSKit can get the whole CA chain is a validation + callback where no user data pointer is available. Therefore it's not + possible to copy this chain into our structures for CAINFO. + However the server certificate may be available, thus we can return + info about it. */ + if(data->set.ssl.certinfo) { + result = Curl_ssl_init_certinfo(data, 1); + if(result) + return result; + + if(cert) { + result = Curl_extract_certinfo(conn, 0, cert, certend); + if(result) + return result; + } + } + + /* Check pinned public key. */ + ptr = data->set.str[STRING_SSL_PINNEDPUBLICKEY]; + if(!result && ptr) { + curl_X509certificate x509; + curl_asn1Element *p; + + if(!cert) + return CURLE_SSL_PINNEDPUBKEYNOTMATCH; + Curl_parseX509(&x509, cert, certend); + p = &x509.subjectPublicKeyInfo; + result = Curl_pin_peer_pubkey(ptr, p->header, p->end - p->header); + if(result) { + failf(data, "SSL: public key does not match pinned public key!"); + return result; + } + } + + connssl->connecting_state = ssl_connect_done; + return CURLE_OK; +} + + +static CURLcode gskit_connect_common(struct connectdata *conn, int sockindex, + bool nonblocking, bool *done) +{ + struct SessionHandle *data = conn->data; + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + long timeout_ms; + Qso_OverlappedIO_t cstat; + CURLcode result = CURLE_OK; + + *done = connssl->state == ssl_connection_complete; + if(*done) + return CURLE_OK; + + /* Step 1: create session, start handshake. */ + if(connssl->connecting_state == ssl_connect_1) { + /* check allowed time left */ + timeout_ms = Curl_timeleft(data, NULL, TRUE); + + if(timeout_ms < 0) { + /* no need to continue if time already is up */ + failf(data, "SSL connection timeout"); + result = CURLE_OPERATION_TIMEDOUT; + } + else + result = gskit_connect_step1(conn, sockindex); + } + + /* Step 2: check if handshake is over. */ + if(!result && connssl->connecting_state == ssl_connect_2) { + /* check allowed time left */ + timeout_ms = Curl_timeleft(data, NULL, TRUE); + + if(timeout_ms < 0) { + /* no need to continue if time already is up */ + failf(data, "SSL connection timeout"); + result = CURLE_OPERATION_TIMEDOUT; + } + else + result = gskit_connect_step2(conn, sockindex, nonblocking); + } + + /* Step 3: gather certificate info, verify host. */ + if(!result && connssl->connecting_state == ssl_connect_3) + result = gskit_connect_step3(conn, sockindex); + + if(result) + close_one(connssl, data); + else if(connssl->connecting_state == ssl_connect_done) { + connssl->state = ssl_connection_complete; + connssl->connecting_state = ssl_connect_1; + conn->recv[sockindex] = gskit_recv; + conn->send[sockindex] = gskit_send; + *done = TRUE; + } + + return result; +} + + +CURLcode Curl_gskit_connect_nonblocking(struct connectdata *conn, + int sockindex, + bool *done) +{ + CURLcode result; + + result = gskit_connect_common(conn, sockindex, TRUE, done); + if(*done || result) + conn->ssl[sockindex].connecting_state = ssl_connect_1; + return result; +} + + +CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex) +{ + CURLcode result; + bool done; + + conn->ssl[sockindex].connecting_state = ssl_connect_1; + result = gskit_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; + + DEBUGASSERT(done); + + return CURLE_OK; +} + + +void Curl_gskit_close(struct connectdata *conn, int sockindex) +{ + struct SessionHandle *data = conn->data; + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + + if(connssl->use) + close_one(connssl, data); +} + + +void Curl_gskit_close_all(struct SessionHandle *data) +{ + /* Unimplemented. */ + (void) data; +} + + +int Curl_gskit_shutdown(struct connectdata *conn, int sockindex) +{ + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + struct SessionHandle *data = conn->data; + ssize_t nread; + int what; + int rc; + char buf[120]; + + if(!connssl->handle) + return 0; + + if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE) + return 0; + + close_one(connssl, data); + rc = 0; + what = Curl_socket_ready(conn->sock[sockindex], + CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT); + + for(;;) { + if(what < 0) { + /* anything that gets here is fatally bad */ + failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO); + rc = -1; + break; + } + + if(!what) { /* timeout */ + failf(data, "SSL shutdown timeout"); + break; + } + + /* Something to read, let's do it and hope that it is the close + notify alert from the server. No way to gsk_secure_soc_read() now, so + use read(). */ + + nread = read(conn->sock[sockindex], buf, sizeof(buf)); + + if(nread < 0) { + failf(data, "read: %s", strerror(errno)); + rc = -1; + } + + if(nread <= 0) + break; + + what = Curl_socket_ready(conn->sock[sockindex], CURL_SOCKET_BAD, 0); + } + + return rc; +} + + +size_t Curl_gskit_version(char *buffer, size_t size) +{ + strncpy(buffer, "GSKit", size); + return strlen(buffer); +} + + +int Curl_gskit_check_cxn(struct connectdata *cxn) +{ + int err; + int errlen; + + /* The only thing that can be tested here is at the socket level. */ + + if(!cxn->ssl[FIRSTSOCKET].handle) + return 0; /* connection has been closed */ + + err = 0; + errlen = sizeof err; + + if(getsockopt(cxn->sock[FIRSTSOCKET], SOL_SOCKET, SO_ERROR, + (unsigned char *) &err, &errlen) || + errlen != sizeof err || err) + return 0; /* connection has been closed */ + + return -1; /* connection status unknown */ +} + +#endif /* USE_GSKIT */ diff --git a/lib/gskit.h b/lib/vtls/gskit.h similarity index 87% rename from lib/gskit.h rename to lib/vtls/gskit.h index 0d59aa7..baec823 100644 --- a/lib/gskit.h +++ b/lib/vtls/gskit.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,7 +24,7 @@ #include "curl_setup.h" /* - * This header should only be needed to get included by sslgen.c and gskit.c + * This header should only be needed to get included by vtls.c and gskit.c */ #include "urldata.h" @@ -36,12 +36,15 @@ CURLcode Curl_gskit_connect(struct connectdata * conn, int sockindex); CURLcode Curl_gskit_connect_nonblocking(struct connectdata * conn, int sockindex, bool * done); void Curl_gskit_close(struct connectdata *conn, int sockindex); -int Curl_gskit_close_all(struct SessionHandle * data); +void Curl_gskit_close_all(struct SessionHandle * data); int Curl_gskit_shutdown(struct connectdata * conn, int sockindex); size_t Curl_gskit_version(char * buffer, size_t size); int Curl_gskit_check_cxn(struct connectdata * cxn); +/* this backend supports CURLOPT_CERTINFO */ +#define have_curlssl_certinfo 1 + /* API setup for GSKit */ #define curlssl_init Curl_gskit_init #define curlssl_cleanup Curl_gskit_cleanup @@ -59,6 +62,8 @@ int Curl_gskit_check_cxn(struct connectdata * cxn); #define curlssl_version Curl_gskit_version #define curlssl_check_cxn(x) Curl_gskit_check_cxn(x) #define curlssl_data_pending(x,y) 0 +#define curlssl_random(x,y,z) -1 +#define CURL_SSL_BACKEND CURLSSLBACKEND_GSKIT #endif /* USE_GSKIT */ #endif /* HEADER_CURL_GSKIT_H */ diff --git a/lib/gtls.c b/lib/vtls/gtls.c similarity index 74% rename from lib/gtls.c rename to lib/vtls/gtls.c index 700e46a..5d4e48a 100644 --- a/lib/gtls.c +++ b/lib/vtls/gtls.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ /* * Source file for all GnuTLS-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. * * Note: don't use the GnuTLS' *_t variable type names in this source code, * since they were not present in 1.0.X. @@ -32,6 +32,7 @@ #ifdef USE_GNUTLS +#include #include #include @@ -46,11 +47,12 @@ #include "sendf.h" #include "inet_pton.h" #include "gtls.h" -#include "sslgen.h" +#include "vtls.h" #include "parsedate.h" #include "connect.h" /* for the connect timeout */ #include "select.h" #include "rawstr.h" +#include "warnless.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -89,6 +91,13 @@ static bool gtls_inited = FALSE; # if (GNUTLS_VERSION_NUMBER >= 0x020c03) # define GNUTLS_MAPS_WINSOCK_ERRORS 1 # endif + +# ifdef USE_NGHTTP2 +# undef HAS_ALPN +# if (GNUTLS_VERSION_NUMBER >= 0x030200) +# define HAS_ALPN +# endif +# endif #endif /* @@ -207,10 +216,10 @@ static void showtime(struct SessionHandle *data, infof(data, "%s\n", data->state.buffer); } -static gnutls_datum load_file (const char *file) +static gnutls_datum_t load_file (const char *file) { FILE *f; - gnutls_datum loaded_file = { NULL, 0 }; + gnutls_datum_t loaded_file = { NULL, 0 }; long filelen; void *ptr; @@ -233,7 +242,7 @@ out: return loaded_file; } -static void unload_file(gnutls_datum data) { +static void unload_file(gnutls_datum_t data) { free(data.data); } @@ -246,7 +255,7 @@ static CURLcode handshake(struct connectdata *conn, { struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - gnutls_session session = conn->ssl[sockindex].session; + gnutls_session_t session = conn->ssl[sockindex].session; curl_socket_t sockfd = conn->sock[sockindex]; long timeout_ms; int rc; @@ -298,8 +307,6 @@ static CURLcode handshake(struct connectdata *conn, gnutls_record_get_direction(session)? ssl_connect_2_writing:ssl_connect_2_reading; continue; - if(nonblocking) - return CURLE_OK; } else if((rc < 0) && !gnutls_error_is_fatal(rc)) { const char *strerr = NULL; @@ -335,7 +342,7 @@ static CURLcode handshake(struct connectdata *conn, } } -static gnutls_x509_crt_fmt do_file_type(const char *type) +static gnutls_x509_crt_fmt_t do_file_type(const char *type) { if(!type || !type[0]) return GNUTLS_X509_FMT_PEM; @@ -350,11 +357,8 @@ static CURLcode gtls_connect_step1(struct connectdata *conn, int sockindex) { -#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT - static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 }; -#endif struct SessionHandle *data = conn->data; - gnutls_session session; + gnutls_session_t session; int rc; void *ssl_sessionid; size_t ssl_idsize; @@ -364,6 +368,34 @@ gtls_connect_step1(struct connectdata *conn, #else struct in_addr addr; #endif +#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT + static const int cipher_priority[] = { + /* These two ciphers were added to GnuTLS as late as ver. 3.0.1, + but this code path is only ever used for ver. < 2.12.0. + GNUTLS_CIPHER_AES_128_GCM, + GNUTLS_CIPHER_AES_256_GCM, + */ + GNUTLS_CIPHER_AES_128_CBC, + GNUTLS_CIPHER_AES_256_CBC, + GNUTLS_CIPHER_CAMELLIA_128_CBC, + GNUTLS_CIPHER_CAMELLIA_256_CBC, + GNUTLS_CIPHER_3DES_CBC, + }; + static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 }; + static int protocol_priority[] = { 0, 0, 0, 0 }; +#else +#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509" +/* If GnuTLS was compiled without support for SRP it will error out if SRP is + requested in the priority string, so treat it specially + */ +#define GNUTLS_SRP "+SRP" + const char* prioritylist; + const char *err = NULL; +#endif +#ifdef HAS_ALPN + int protocols_size = 2; + gnutls_datum_t protocols[2]; +#endif if(conn->ssl[sockindex].state == ssl_connection_complete) /* to make us tolerant against being called more than once for the @@ -471,32 +503,127 @@ gtls_connect_step1(struct connectdata *conn, if(rc != GNUTLS_E_SUCCESS) return CURLE_SSL_CONNECT_ERROR; - if(data->set.ssl.version == CURL_SSLVERSION_SSLv3) { #ifndef USE_GNUTLS_PRIORITY_SET_DIRECT - static const int protocol_priority[] = { GNUTLS_SSL3, 0 }; - rc = gnutls_protocol_set_priority(session, protocol_priority); -#else - const char *err; - /* the combination of the cipher ARCFOUR with SSL 3.0 and TLS 1.0 is not - vulnerable to attacks such as the BEAST, why this code now explicitly - asks for that - */ - rc = gnutls_priority_set_direct(session, - "NORMAL:-VERS-TLS-ALL:+VERS-SSL3.0:" - "-CIPHER-ALL:+ARCFOUR-128", - &err); -#endif - if(rc != GNUTLS_E_SUCCESS) - return CURLE_SSL_CONNECT_ERROR; - } + rc = gnutls_cipher_set_priority(session, cipher_priority); + if(rc != GNUTLS_E_SUCCESS) + return CURLE_SSL_CONNECT_ERROR; -#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT /* Sets the priority on the certificate types supported by gnutls. Priority - is higher for types specified before others. After specifying the types - you want, you must append a 0. */ + is higher for types specified before others. After specifying the types + you want, you must append a 0. */ rc = gnutls_certificate_type_set_priority(session, cert_type_priority); if(rc != GNUTLS_E_SUCCESS) return CURLE_SSL_CONNECT_ERROR; + + if(data->set.ssl.cipher_list != NULL) { + failf(data, "can't pass a custom cipher list to older GnuTLS" + " versions"); + return CURLE_SSL_CONNECT_ERROR; + } + + switch (data->set.ssl.version) { + case CURL_SSLVERSION_SSLv3: + protocol_priority[0] = GNUTLS_SSL3; + break; + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: + protocol_priority[0] = GNUTLS_TLS1_0; + protocol_priority[1] = GNUTLS_TLS1_1; + protocol_priority[2] = GNUTLS_TLS1_2; + break; + case CURL_SSLVERSION_TLSv1_0: + protocol_priority[0] = GNUTLS_TLS1_0; + break; + case CURL_SSLVERSION_TLSv1_1: + protocol_priority[0] = GNUTLS_TLS1_1; + break; + case CURL_SSLVERSION_TLSv1_2: + protocol_priority[0] = GNUTLS_TLS1_2; + break; + case CURL_SSLVERSION_SSLv2: + default: + failf(data, "GnuTLS does not support SSLv2"); + return CURLE_SSL_CONNECT_ERROR; + break; + } + rc = gnutls_protocol_set_priority(session, protocol_priority); + if(rc != GNUTLS_E_SUCCESS) { + failf(data, "Did you pass a valid GnuTLS cipher list?"); + return CURLE_SSL_CONNECT_ERROR; + } + +#else + /* Ensure +SRP comes at the *end* of all relevant strings so that it can be + * removed if a run-time error indicates that SRP is not supported by this + * GnuTLS version */ + switch (data->set.ssl.version) { + case CURL_SSLVERSION_SSLv3: + prioritylist = GNUTLS_CIPHERS ":-VERS-TLS-ALL:+VERS-SSL3.0"; + sni = false; + break; + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: + prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:" GNUTLS_SRP; + break; + case CURL_SSLVERSION_TLSv1_0: + prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:" + "+VERS-TLS1.0:" GNUTLS_SRP; + break; + case CURL_SSLVERSION_TLSv1_1: + prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:" + "+VERS-TLS1.1:" GNUTLS_SRP; + break; + case CURL_SSLVERSION_TLSv1_2: + prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:" + "+VERS-TLS1.2:" GNUTLS_SRP; + break; + case CURL_SSLVERSION_SSLv2: + default: + failf(data, "GnuTLS does not support SSLv2"); + return CURLE_SSL_CONNECT_ERROR; + break; + } + rc = gnutls_priority_set_direct(session, prioritylist, &err); + if((rc == GNUTLS_E_INVALID_REQUEST) && err) { + if(!strcmp(err, GNUTLS_SRP)) { + /* This GnuTLS was probably compiled without support for SRP. + * Note that fact and try again without it. */ + int validprioritylen = curlx_uztosi(err - prioritylist); + char *prioritycopy = strdup(prioritylist); + if(!prioritycopy) + return CURLE_OUT_OF_MEMORY; + + infof(data, "This GnuTLS does not support SRP\n"); + if(validprioritylen) + /* Remove the :+SRP */ + prioritycopy[validprioritylen - 1] = 0; + rc = gnutls_priority_set_direct(session, prioritycopy, &err); + free(prioritycopy); + } + } + if(rc != GNUTLS_E_SUCCESS) { + failf(data, "Error %d setting GnuTLS cipher list starting with %s", + rc, err); + return CURLE_SSL_CONNECT_ERROR; + } +#endif + +#ifdef HAS_ALPN + if(data->set.httpversion == CURL_HTTP_VERSION_2_0) { + if(data->set.ssl_enable_alpn) { + protocols[0].data = NGHTTP2_PROTO_VERSION_ID; + protocols[0].size = NGHTTP2_PROTO_VERSION_ID_LEN; + protocols[1].data = ALPN_HTTP_1_1; + protocols[1].size = ALPN_HTTP_1_1_LENGTH; + gnutls_alpn_set_protocols(session, protocols, protocols_size, 0); + infof(data, "ALPN, offering %s, %s\n", NGHTTP2_PROTO_VERSION_ID, + ALPN_HTTP_1_1); + connssl->asked_for_h2 = TRUE; + } + else { + infof(data, "SSL, can't negotiate HTTP/2.0 without ALPN\n"); + } + } #endif if(data->set.str[STRING_CERT]) { @@ -550,6 +677,62 @@ gtls_connect_step1(struct connectdata *conn, return CURLE_OK; } +static CURLcode pkp_pin_peer_pubkey(gnutls_x509_crt_t cert, + const char *pinnedpubkey) +{ + /* Scratch */ + size_t len1 = 0, len2 = 0; + unsigned char *buff1 = NULL; + + gnutls_pubkey_t key = NULL; + + /* Result is returned to caller */ + int ret = 0; + CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH; + + /* if a path wasn't specified, don't pin */ + if(NULL == pinnedpubkey) + return CURLE_OK; + + if(NULL == cert) + return result; + + do { + /* Begin Gyrations to get the public key */ + gnutls_pubkey_init(&key); + + ret = gnutls_pubkey_import_x509(key, cert, 0); + if(ret < 0) + break; /* failed */ + + ret = gnutls_pubkey_export(key, GNUTLS_X509_FMT_DER, NULL, &len1); + if(ret != GNUTLS_E_SHORT_MEMORY_BUFFER || len1 == 0) + break; /* failed */ + + buff1 = malloc(len1); + if(NULL == buff1) + break; /* failed */ + + len2 = len1; + + ret = gnutls_pubkey_export(key, GNUTLS_X509_FMT_DER, buff1, &len2); + if(ret < 0 || len1 != len2) + break; /* failed */ + + /* End Gyrations */ + + /* The one good exit point */ + result = Curl_pin_peer_pubkey(pinnedpubkey, buff1, len1); + } while(0); + + if(NULL != key) + gnutls_pubkey_deinit(key); + + Curl_safefree(buff1); + + return result; +} + static Curl_recv gtls_recv; static Curl_send gtls_send; @@ -558,21 +741,24 @@ gtls_connect_step3(struct connectdata *conn, int sockindex) { unsigned int cert_list_size; - const gnutls_datum *chainp; + const gnutls_datum_t *chainp; unsigned int verify_status; - gnutls_x509_crt x509_cert,x509_issuer; - gnutls_datum issuerp; - char certbuf[256]; /* big enough? */ + gnutls_x509_crt_t x509_cert,x509_issuer; + gnutls_datum_t issuerp; + char certbuf[256] = ""; /* big enough? */ size_t size; unsigned int algo; unsigned int bits; time_t certclock; const char *ptr; struct SessionHandle *data = conn->data; - gnutls_session session = conn->ssl[sockindex].session; + gnutls_session_t session = conn->ssl[sockindex].session; int rc; - int incache; + bool incache; void *ssl_sessionid; +#ifdef HAS_ALPN + gnutls_datum_t proto; +#endif CURLcode result = CURLE_OK; /* This function will return the peer's raw certificate (chain) as sent by @@ -633,27 +819,28 @@ gtls_connect_step3(struct connectdata *conn, else infof(data, "\t server certificate verification OK\n"); } - else { + else infof(data, "\t server certificate verification SKIPPED\n"); - goto after_server_cert_verification; - } /* initialize an X.509 certificate structure. */ gnutls_x509_crt_init(&x509_cert); - /* convert the given DER or PEM encoded Certificate to the native - gnutls_x509_crt_t format */ - gnutls_x509_crt_import(x509_cert, chainp, GNUTLS_X509_FMT_DER); + if(chainp) + /* convert the given DER or PEM encoded Certificate to the native + gnutls_x509_crt_t format */ + gnutls_x509_crt_import(x509_cert, chainp, GNUTLS_X509_FMT_DER); if(data->set.ssl.issuercert) { gnutls_x509_crt_init(&x509_issuer); issuerp = load_file(data->set.ssl.issuercert); gnutls_x509_crt_import(x509_issuer, &issuerp, GNUTLS_X509_FMT_PEM); rc = gnutls_x509_crt_check_issuer(x509_cert,x509_issuer); + gnutls_x509_crt_deinit(x509_issuer); unload_file(issuerp); if(rc <= 0) { failf(data, "server certificate issuer check failed (IssuerCert: %s)", data->set.ssl.issuercert?data->set.ssl.issuercert:"none"); + gnutls_x509_crt_deinit(x509_cert); return CURLE_SSL_ISSUER_ERROR; } infof(data,"\t server certificate issuer check OK (Issuer Cert: %s)\n", @@ -677,7 +864,48 @@ gtls_connect_step3(struct connectdata *conn, alternative name PKIX extension. Returns non zero on success, and zero on failure. */ rc = gnutls_x509_crt_check_hostname(x509_cert, conn->host.name); +#if GNUTLS_VERSION_NUMBER < 0x030306 + /* Before 3.3.6, gnutls_x509_crt_check_hostname() didn't check IP + addresses. */ + if(!rc) { +#ifdef ENABLE_IPV6 + #define use_addr in6_addr +#else + #define use_addr in_addr +#endif + unsigned char addrbuf[sizeof(struct use_addr)]; + unsigned char certaddr[sizeof(struct use_addr)]; + size_t addrlen = 0, certaddrlen; + int i; + int ret = 0; + + if(Curl_inet_pton(AF_INET, conn->host.name, addrbuf) > 0) + addrlen = 4; +#ifdef ENABLE_IPV6 + else if(Curl_inet_pton(AF_INET6, conn->host.name, addrbuf) > 0) + addrlen = 16; +#endif + if(addrlen) { + for(i=0; ; i++) { + certaddrlen = sizeof(certaddr); + ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr, + &certaddrlen, NULL); + /* If this happens, it wasn't an IP address. */ + if(ret == GNUTLS_E_SHORT_MEMORY_BUFFER) + continue; + if(ret < 0) + break; + if(ret != GNUTLS_SAN_IPADDRESS) + continue; + if(certaddrlen == addrlen && !memcmp(addrbuf, certaddr, addrlen)) { + rc = 1; + break; + } + } + } + } +#endif if(!rc) { if(data->set.ssl.verifyhost) { failf(data, "SSL: certificate subject name (%s) does not match " @@ -696,38 +924,62 @@ gtls_connect_step3(struct connectdata *conn, certclock = gnutls_x509_crt_get_expiration_time(x509_cert); if(certclock == (time_t)-1) { - failf(data, "server cert expiration date verify failed"); - return CURLE_SSL_CONNECT_ERROR; - } - - if(certclock < time(NULL)) { if(data->set.ssl.verifypeer) { - failf(data, "server certificate expiration date has passed."); - return CURLE_PEER_FAILED_VERIFICATION; + failf(data, "server cert expiration date verify failed"); + gnutls_x509_crt_deinit(x509_cert); + return CURLE_SSL_CONNECT_ERROR; } else - infof(data, "\t server certificate expiration date FAILED\n"); + infof(data, "\t server certificate expiration date verify FAILED\n"); + } + else { + if(certclock < time(NULL)) { + if(data->set.ssl.verifypeer) { + failf(data, "server certificate expiration date has passed."); + gnutls_x509_crt_deinit(x509_cert); + return CURLE_PEER_FAILED_VERIFICATION; + } + else + infof(data, "\t server certificate expiration date FAILED\n"); + } + else + infof(data, "\t server certificate expiration date OK\n"); } - else - infof(data, "\t server certificate expiration date OK\n"); certclock = gnutls_x509_crt_get_activation_time(x509_cert); if(certclock == (time_t)-1) { - failf(data, "server cert activation date verify failed"); - return CURLE_SSL_CONNECT_ERROR; - } - - if(certclock > time(NULL)) { if(data->set.ssl.verifypeer) { - failf(data, "server certificate not activated yet."); - return CURLE_PEER_FAILED_VERIFICATION; + failf(data, "server cert activation date verify failed"); + gnutls_x509_crt_deinit(x509_cert); + return CURLE_SSL_CONNECT_ERROR; } else - infof(data, "\t server certificate activation date FAILED\n"); + infof(data, "\t server certificate activation date verify FAILED\n"); + } + else { + if(certclock > time(NULL)) { + if(data->set.ssl.verifypeer) { + failf(data, "server certificate not activated yet."); + gnutls_x509_crt_deinit(x509_cert); + return CURLE_PEER_FAILED_VERIFICATION; + } + else + infof(data, "\t server certificate activation date FAILED\n"); + } + else + infof(data, "\t server certificate activation date OK\n"); + } + + ptr = data->set.str[STRING_SSL_PINNEDPUBLICKEY]; + if(ptr) { + result = pkp_pin_peer_pubkey(x509_cert, ptr); + if(result != CURLE_OK) { + failf(data, "SSL: public key does not match pinned public key!"); + gnutls_x509_crt_deinit(x509_cert); + return result; + } } - else - infof(data, "\t server certificate activation date OK\n"); /* Show: @@ -766,8 +1018,6 @@ gtls_connect_step3(struct connectdata *conn, gnutls_x509_crt_deinit(x509_cert); -after_server_cert_verification: - /* compression algorithm (if any) */ ptr = gnutls_compression_get_name(gnutls_compression_get(session)); /* the *_get_name() says "NULL" if GNUTLS_COMP_NULL is returned */ @@ -781,6 +1031,29 @@ after_server_cert_verification: ptr = gnutls_mac_get_name(gnutls_mac_get(session)); infof(data, "\t MAC: %s\n", ptr); +#ifdef HAS_ALPN + if(data->set.ssl_enable_alpn) { + rc = gnutls_alpn_get_selected_protocol(session, &proto); + if(rc == 0) { + infof(data, "ALPN, server accepted to use %.*s\n", proto.size, + proto.data); + + if(proto.size == NGHTTP2_PROTO_VERSION_ID_LEN && + memcmp(NGHTTP2_PROTO_VERSION_ID, proto.data, + NGHTTP2_PROTO_VERSION_ID_LEN) == 0) { + conn->negnpn = NPN_HTTP2; + } + else if(proto.size == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1, + proto.data, ALPN_HTTP_1_1_LENGTH) == 0) { + conn->negnpn = NPN_HTTP1_1; + } + } + else if(connssl->asked_for_h2) { + infof(data, "ALPN, server did not agree to a protocol\n"); + } + } +#endif + conn->ssl[sockindex].state = ssl_connection_complete; conn->recv[sockindex] = gtls_recv; conn->send[sockindex] = gtls_send; @@ -791,7 +1064,7 @@ after_server_cert_verification: might've been rejected and then a new one is in use now and we need to detect that. */ void *connect_sessionid; - size_t connect_idsize; + size_t connect_idsize = 0; /* get the session ID data size */ gnutls_session_get_data(session, NULL, &connect_idsize); @@ -878,12 +1151,12 @@ Curl_gtls_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = gtls_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + result = gtls_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; DEBUGASSERT(done); @@ -1031,10 +1304,10 @@ static ssize_t gtls_recv(struct connectdata *conn, /* connection data */ if(ret == GNUTLS_E_REHANDSHAKE) { /* BLOCKING call, this is bad but a work-around for now. Fixing this "the proper way" takes a whole lot of work. */ - CURLcode rc = handshake(conn, num, FALSE, FALSE); - if(rc) + CURLcode result = handshake(conn, num, FALSE, FALSE); + if(result) /* handshake() writes error message on its own */ - *curlcode = rc; + *curlcode = result; else *curlcode = CURLE_AGAIN; /* then return as if this was a wouldblock */ return -1; @@ -1060,16 +1333,15 @@ size_t Curl_gtls_version(char *buffer, size_t size) return snprintf(buffer, size, "GnuTLS/%s", gnutls_check_version(NULL)); } -int Curl_gtls_seed(struct SessionHandle *data) +#ifndef USE_GNUTLS_NETTLE +static int Curl_gtls_seed(struct SessionHandle *data) { /* we have the "SSL is seeded" boolean static to prevent multiple time-consuming seedings in vain */ static bool ssl_seeded = FALSE; /* Quickly add a bit of entropy */ -#ifndef USE_GNUTLS_NETTLE gcry_fast_random_poll(); -#endif if(!ssl_seeded || data->set.str[STRING_SSL_RANDOM_FILE] || data->set.str[STRING_SSL_EGDSOCKET]) { @@ -1083,18 +1355,22 @@ int Curl_gtls_seed(struct SessionHandle *data) } return 0; } +#endif -void Curl_gtls_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length) +/* data might be NULL! */ +int Curl_gtls_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length) { #if defined(USE_GNUTLS_NETTLE) (void)data; gnutls_rnd(GNUTLS_RND_RANDOM, entropy, length); #elif defined(USE_GNUTLS) - Curl_gtls_seed(data); /* Initiate the seed if not already done */ + if(data) + Curl_gtls_seed(data); /* Initiate the seed if not already done */ gcry_randomize(entropy, length, GCRY_STRONG_RANDOM); #endif + return 0; } void Curl_gtls_md5sum(unsigned char *tmp, /* input */ @@ -1105,8 +1381,8 @@ void Curl_gtls_md5sum(unsigned char *tmp, /* input */ #if defined(USE_GNUTLS_NETTLE) struct md5_ctx MD5pw; md5_init(&MD5pw); - md5_update(&MD5pw, tmplen, tmp); - md5_digest(&MD5pw, md5len, md5sum); + md5_update(&MD5pw, (unsigned int)tmplen, tmp); + md5_digest(&MD5pw, (unsigned int)md5len, md5sum); #elif defined(USE_GNUTLS) gcry_md_hd_t MD5pw; gcry_md_open(&MD5pw, GCRY_MD_MD5, 0); diff --git a/lib/gtls.h b/lib/vtls/gtls.h similarity index 80% rename from lib/gtls.h rename to lib/vtls/gtls.h index 453542e..12460be 100644 --- a/lib/gtls.h +++ b/lib/vtls/gtls.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -45,20 +45,14 @@ void Curl_gtls_close(struct connectdata *conn, int sockindex); void Curl_gtls_session_free(void *ptr); size_t Curl_gtls_version(char *buffer, size_t size); int Curl_gtls_shutdown(struct connectdata *conn, int sockindex); -int Curl_gtls_seed(struct SessionHandle *data); - -void Curl_gtls_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length); +int Curl_gtls_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length); void Curl_gtls_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum, /* output */ size_t md5len); -/* this backend provides these functions: */ -#define have_curlssl_random 1 -#define have_curlssl_md5sum 1 - /* API setup for GnuTLS */ #define curlssl_init Curl_gtls_init #define curlssl_cleanup Curl_gtls_cleanup @@ -68,14 +62,15 @@ void Curl_gtls_md5sum(unsigned char *tmp, /* input */ #define curlssl_close_all Curl_gtls_close_all #define curlssl_close Curl_gtls_close #define curlssl_shutdown(x,y) Curl_gtls_shutdown(x,y) -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_gtls_version -#define curlssl_check_cxn(x) (x=x, -1) -#define curlssl_data_pending(x,y) (x=x, y=y, 0) +#define curlssl_check_cxn(x) ((void)x, -1) +#define curlssl_data_pending(x,y) ((void)x, (void)y, 0) #define curlssl_random(x,y,z) Curl_gtls_random(x,y,z) #define curlssl_md5sum(a,b,c,d) Curl_gtls_md5sum(a,b,c,d) +#define CURL_SSL_BACKEND CURLSSLBACKEND_GNUTLS #endif /* USE_GNUTLS */ #endif /* HEADER_CURL_GTLS_H */ diff --git a/lib/nss.c b/lib/vtls/nss.c similarity index 68% rename from lib/nss.c rename to lib/vtls/nss.c index cc3d9c9..dd83a9d 100644 --- a/lib/nss.c +++ b/lib/vtls/nss.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ /* * Source file for all NSS-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. */ #include "curl_setup.h" @@ -36,7 +36,7 @@ #include "connect.h" #include "strequal.h" #include "select.h" -#include "sslgen.h" +#include "vtls.h" #include "llist.h" #define _MPRINTF_REPLACE /* use the internal *printf() functions */ @@ -63,6 +63,7 @@ #include "curl_memory.h" #include "rawstr.h" #include "warnless.h" +#include "x509asn1.h" /* The last #include file should be: */ #include "memdebug.h" @@ -76,9 +77,8 @@ PRFileDesc *PR_ImportTCPSocket(PRInt32 osfd); PRLock * nss_initlock = NULL; PRLock * nss_crllock = NULL; -#ifdef HAVE_NSS_INITCONTEXT +struct curl_llist *nss_crl_list = NULL; NSSInitContext * nss_context = NULL; -#endif volatile int initialized = 0; @@ -124,9 +124,12 @@ static const cipher_s cipherlist[] = { {"rsa_des_56_sha", TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA}, {"rsa_rc4_56_sha", TLS_RSA_EXPORT1024_WITH_RC4_56_SHA}, /* AES ciphers. */ + {"dhe_dss_aes_128_cbc_sha", TLS_DHE_DSS_WITH_AES_128_CBC_SHA}, + {"dhe_dss_aes_256_cbc_sha", TLS_DHE_DSS_WITH_AES_256_CBC_SHA}, + {"dhe_rsa_aes_128_cbc_sha", TLS_DHE_RSA_WITH_AES_128_CBC_SHA}, + {"dhe_rsa_aes_256_cbc_sha", TLS_DHE_RSA_WITH_AES_256_CBC_SHA}, {"rsa_aes_128_sha", TLS_RSA_WITH_AES_128_CBC_SHA}, {"rsa_aes_256_sha", TLS_RSA_WITH_AES_256_CBC_SHA}, -#ifdef NSS_ENABLE_ECC /* ECC ciphers. */ {"ecdh_ecdsa_null_sha", TLS_ECDH_ECDSA_WITH_NULL_SHA}, {"ecdh_ecdsa_rc4_128_sha", TLS_ECDH_ECDSA_WITH_RC4_128_SHA}, @@ -153,24 +156,35 @@ static const cipher_s cipherlist[] = { {"ecdh_anon_3des_sha", TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA}, {"ecdh_anon_aes_128_sha", TLS_ECDH_anon_WITH_AES_128_CBC_SHA}, {"ecdh_anon_aes_256_sha", TLS_ECDH_anon_WITH_AES_256_CBC_SHA}, +#ifdef TLS_RSA_WITH_NULL_SHA256 + /* new HMAC-SHA256 cipher suites specified in RFC */ + {"rsa_null_sha_256", TLS_RSA_WITH_NULL_SHA256}, + {"rsa_aes_128_cbc_sha_256", TLS_RSA_WITH_AES_128_CBC_SHA256}, + {"rsa_aes_256_cbc_sha_256", TLS_RSA_WITH_AES_256_CBC_SHA256}, + {"dhe_rsa_aes_128_cbc_sha_256", TLS_DHE_RSA_WITH_AES_128_CBC_SHA256}, + {"dhe_rsa_aes_256_cbc_sha_256", TLS_DHE_RSA_WITH_AES_256_CBC_SHA256}, + {"ecdhe_ecdsa_aes_128_cbc_sha_256", TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256}, + {"ecdhe_rsa_aes_128_cbc_sha_256", TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256}, +#endif +#ifdef TLS_RSA_WITH_AES_128_GCM_SHA256 + /* AES GCM cipher suites in RFC 5288 and RFC 5289 */ + {"rsa_aes_128_gcm_sha_256", TLS_RSA_WITH_AES_128_GCM_SHA256}, + {"dhe_rsa_aes_128_gcm_sha_256", TLS_DHE_RSA_WITH_AES_128_GCM_SHA256}, + {"dhe_dss_aes_128_gcm_sha_256", TLS_DHE_DSS_WITH_AES_128_GCM_SHA256}, + {"ecdhe_ecdsa_aes_128_gcm_sha_256", TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256}, + {"ecdh_ecdsa_aes_128_gcm_sha_256", TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256}, + {"ecdhe_rsa_aes_128_gcm_sha_256", TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + {"ecdh_rsa_aes_128_gcm_sha_256", TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256}, #endif -}; - -/* following ciphers are new in NSS 3.4 and not enabled by default, therefore - they are enabled explicitly */ -static const int enable_ciphers_by_default[] = { - TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - TLS_RSA_WITH_AES_128_CBC_SHA, - TLS_RSA_WITH_AES_256_CBC_SHA, - SSL_NULL_WITH_NULL_NULL }; static const char* pem_library = "libnsspem.so"; SECMODModule* mod = NULL; +/* NSPR I/O layer we use to detect blocking direction during SSL handshake */ +static PRDescIdentity nspr_io_identity = PR_INVALID_IO_LAYER; +static PRIOMethods nspr_io_methods; + static const char* nss_error_to_name(PRErrorCode code) { const char *name = PR_ErrorToName(code); @@ -192,14 +206,13 @@ static SECStatus set_ciphers(struct SessionHandle *data, PRFileDesc * model, PRBool cipher_state[NUM_OF_CIPHERS]; PRBool found; char *cipher; - SECStatus rv; /* First disable all ciphers. This uses a different max value in case * NSS adds more ciphers later we don't want them available by * accident */ for(i=0; iobj_list, ssl->obj_list->tail, obj)) { PK11_DestroyGenericObject(obj); @@ -379,19 +394,27 @@ static void nss_destroy_object(void *user, void *ptr) PK11_DestroyGenericObject(obj); } +/* same as nss_destroy_object() but for CRL items */ +static void nss_destroy_crl_item(void *user, void *ptr) +{ + SECItem *crl_der = (SECItem *)ptr; + (void) user; + SECITEM_FreeItem(crl_der, PR_TRUE); +} + static CURLcode nss_load_cert(struct ssl_connect_data *ssl, const char *filename, PRBool cacert) { - CURLcode err = (cacert) + CURLcode result = (cacert) ? CURLE_SSL_CACERT_BADFILE : CURLE_SSL_CERTPROBLEM; /* libnsspem.so leaks memory if the requested file does not exist. For more * details, go to . */ if(is_file(filename)) - err = nss_create_object(ssl, CKO_CERTIFICATE, filename, cacert); + result = nss_create_object(ssl, CKO_CERTIFICATE, filename, cacert); - if(CURLE_OK == err && !cacert) { + if(!result && !cacert) { /* we have successfully loaded a client certificate */ CERTCertificate *cert; char *nickname = NULL; @@ -413,47 +436,54 @@ static CURLcode nss_load_cert(struct ssl_connect_data *ssl, } } - return err; + return result; } /* add given CRL to cache if it is not already there */ -static SECStatus nss_cache_crl(SECItem *crlDER) +static CURLcode nss_cache_crl(SECItem *crl_der) { CERTCertDBHandle *db = CERT_GetDefaultCertDB(); - CERTSignedCrl *crl = SEC_FindCrlByDERCert(db, crlDER, 0); + CERTSignedCrl *crl = SEC_FindCrlByDERCert(db, crl_der, 0); if(crl) { /* CRL already cached */ SEC_DestroyCrl(crl); - SECITEM_FreeItem(crlDER, PR_FALSE); - return SECSuccess; + SECITEM_FreeItem(crl_der, PR_TRUE); + return CURLE_OK; } - /* acquire lock before call of CERT_CacheCRL() */ + /* acquire lock before call of CERT_CacheCRL() and accessing nss_crl_list */ PR_Lock(nss_crllock); - if(SECSuccess != CERT_CacheCRL(db, crlDER)) { + + /* store the CRL item so that we can free it in Curl_nss_cleanup() */ + if(!Curl_llist_insert_next(nss_crl_list, nss_crl_list->tail, crl_der)) { + SECITEM_FreeItem(crl_der, PR_TRUE); + PR_Unlock(nss_crllock); + return CURLE_OUT_OF_MEMORY; + } + + if(SECSuccess != CERT_CacheCRL(db, crl_der)) { /* unable to cache CRL */ PR_Unlock(nss_crllock); - SECITEM_FreeItem(crlDER, PR_FALSE); - return SECFailure; + return CURLE_SSL_CRL_BADFILE; } /* we need to clear session cache, so that the CRL could take effect */ SSL_ClearSessionCache(); PR_Unlock(nss_crllock); - return SECSuccess; + return CURLE_OK; } -static SECStatus nss_load_crl(const char* crlfilename) +static CURLcode nss_load_crl(const char* crlfilename) { PRFileDesc *infile; PRFileInfo info; SECItem filedata = { 0, NULL, 0 }; - SECItem crlDER = { 0, NULL, 0 }; + SECItem *crl_der = NULL; char *body; infile = PR_Open(crlfilename, PR_RDONLY, 0); if(!infile) - return SECFailure; + return CURLE_SSL_CRL_BADFILE; if(PR_SUCCESS != PR_GetOpenFileInfo(infile, &info)) goto fail; @@ -464,6 +494,10 @@ static SECStatus nss_load_crl(const char* crlfilename) if(info.size != PR_Read(infile, filedata.data, info.size)) goto fail; + crl_der = SECITEM_AllocItem(NULL, NULL, 0U); + if(!crl_der) + goto fail; + /* place a trailing zero right after the visible data */ body = (char*)filedata.data; body[--filedata.len] = '\0'; @@ -484,22 +518,23 @@ static SECStatus nss_load_crl(const char* crlfilename) /* retrieve DER from ASCII */ *trailer = '\0'; - if(ATOB_ConvertAsciiToItem(&crlDER, begin)) + if(ATOB_ConvertAsciiToItem(crl_der, begin)) goto fail; SECITEM_FreeItem(&filedata, PR_FALSE); } else /* assume DER */ - crlDER = filedata; + *crl_der = filedata; PR_Close(infile); - return nss_cache_crl(&crlDER); + return nss_cache_crl(crl_der); fail: PR_Close(infile); + SECITEM_FreeItem(crl_der, PR_TRUE); SECITEM_FreeItem(&filedata, PR_FALSE); - return SECFailure; + return CURLE_SSL_CRL_BADFILE; } static CURLcode nss_load_key(struct connectdata *conn, int sockindex, @@ -507,14 +542,15 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex, { PK11SlotInfo *slot; SECStatus status; - CURLcode rv; + CURLcode result; struct ssl_connect_data *ssl = conn->ssl; + (void)sockindex; /* unused */ - rv = nss_create_object(ssl, CKO_PRIVATE_KEY, key_file, FALSE); - if(CURLE_OK != rv) { + result = nss_create_object(ssl, CKO_PRIVATE_KEY, key_file, FALSE); + if(result) { PR_SetError(SEC_ERROR_BAD_KEY, 0); - return rv; + return result; } slot = PK11_FindSlotByName("PEM Token #1"); @@ -528,9 +564,8 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex, status = PK11_Authenticate(slot, PR_TRUE, conn->data->set.str[STRING_KEY_PASSWD]); PK11_FreeSlot(slot); - return (SECSuccess == status) - ? CURLE_OK - : CURLE_SSL_CERTPROBLEM; + + return (SECSuccess == status) ? CURLE_OK : CURLE_SSL_CERTPROBLEM; } static int display_error(struct connectdata *conn, PRInt32 err, @@ -553,35 +588,35 @@ static CURLcode cert_stuff(struct connectdata *conn, int sockindex, char *cert_file, char *key_file) { struct SessionHandle *data = conn->data; - CURLcode rv; + CURLcode result; if(cert_file) { - rv = nss_load_cert(&conn->ssl[sockindex], cert_file, PR_FALSE); - if(CURLE_OK != rv) { + result = nss_load_cert(&conn->ssl[sockindex], cert_file, PR_FALSE); + if(result) { const PRErrorCode err = PR_GetError(); if(!display_error(conn, err, cert_file)) { const char *err_name = nss_error_to_name(err); failf(data, "unable to load client cert: %d (%s)", err, err_name); } - return rv; + return result; } } if(key_file || (is_file(cert_file))) { if(key_file) - rv = nss_load_key(conn, sockindex, key_file); + result = nss_load_key(conn, sockindex, key_file); else /* In case the cert file also has the key */ - rv = nss_load_key(conn, sockindex, cert_file); - if(CURLE_OK != rv) { + result = nss_load_key(conn, sockindex, cert_file); + if(result) { const PRErrorCode err = PR_GetError(); if(!display_error(conn, err, key_file)) { const char *err_name = nss_error_to_name(err); failf(data, "unable to load client key: %d (%s)", err, err_name); } - return rv; + return result; } } @@ -591,6 +626,7 @@ static CURLcode cert_stuff(struct connectdata *conn, int sockindex, static char * nss_get_password(PK11SlotInfo * slot, PRBool retry, void *arg) { (void)slot; /* unused */ + if(retry || NULL == arg) return NULL; else @@ -616,8 +652,49 @@ static SECStatus nss_auth_cert_hook(void *arg, PRFileDesc *fd, PRBool checksig, */ static void HandshakeCallback(PRFileDesc *sock, void *arg) { +#ifdef USE_NGHTTP2 + struct connectdata *conn = (struct connectdata*) arg; + unsigned int buflenmax = 50; + unsigned char buf[50]; + unsigned int buflen; + SSLNextProtoState state; + + if(!conn->data->set.ssl_enable_npn && !conn->data->set.ssl_enable_alpn) { + return; + } + + if(SSL_GetNextProto(sock, &state, buf, &buflen, buflenmax) == SECSuccess) { + + switch(state) { + case SSL_NEXT_PROTO_NO_SUPPORT: + case SSL_NEXT_PROTO_NO_OVERLAP: + if(connssl->asked_for_h2) + infof(conn->data, "TLS, neither ALPN nor NPN succeeded\n"); + return; +#ifdef SSL_ENABLE_ALPN + case SSL_NEXT_PROTO_SELECTED: + infof(conn->data, "ALPN, server accepted to use %.*s\n", buflen, buf); + break; +#endif + case SSL_NEXT_PROTO_NEGOTIATED: + infof(conn->data, "NPN, server accepted to use %.*s\n", buflen, buf); + break; + } + + if(buflen == NGHTTP2_PROTO_VERSION_ID_LEN && + memcmp(NGHTTP2_PROTO_VERSION_ID, buf, NGHTTP2_PROTO_VERSION_ID_LEN) + == 0) { + conn->negnpn = NPN_HTTP2; + } + else if(buflen == ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1, buf, + ALPN_HTTP_1_1_LENGTH)) { + conn->negnpn = NPN_HTTP1_1; + } + } +#else (void)sock; (void)arg; +#endif } static void display_cert_info(struct SessionHandle *data, @@ -648,11 +725,16 @@ static void display_cert_info(struct SessionHandle *data, PR_Free(common_name); } -static void display_conn_info(struct connectdata *conn, PRFileDesc *sock) +static CURLcode display_conn_info(struct connectdata *conn, PRFileDesc *sock) { + CURLcode result = CURLE_OK; SSLChannelInfo channel; SSLCipherSuiteInfo suite; CERTCertificate *cert; + CERTCertificate *cert2; + CERTCertificate *cert3; + PRTime now; + int i; if(SSL_GetChannelInfo(sock, &channel, sizeof channel) == SECSuccess && channel.length == sizeof channel && @@ -663,13 +745,54 @@ static void display_conn_info(struct connectdata *conn, PRFileDesc *sock) } } - infof(conn->data, "Server certificate:\n"); - cert = SSL_PeerCertificate(sock); - display_cert_info(conn->data, cert); - CERT_DestroyCertificate(cert); + if(cert) { + infof(conn->data, "Server certificate:\n"); + + if(!conn->data->set.ssl.certinfo) { + display_cert_info(conn->data, cert); + CERT_DestroyCertificate(cert); + } + else { + /* Count certificates in chain. */ + now = PR_Now(); + i = 1; + if(!cert->isRoot) { + cert2 = CERT_FindCertIssuer(cert, now, certUsageSSLCA); + while(cert2) { + i++; + if(cert2->isRoot) { + CERT_DestroyCertificate(cert2); + break; + } + cert3 = CERT_FindCertIssuer(cert2, now, certUsageSSLCA); + CERT_DestroyCertificate(cert2); + cert2 = cert3; + } + } + + result = Curl_ssl_init_certinfo(conn->data, i); + if(!result) { + for(i = 0; cert; cert = cert2) { + result = Curl_extract_certinfo(conn, i++, (char *)cert->derCert.data, + (char *)cert->derCert.data + + cert->derCert.len); + if(result) + break; + + if(cert->isRoot) { + CERT_DestroyCertificate(cert); + break; + } + + cert2 = CERT_FindCertIssuer(cert, now, certUsageSSLCA); + CERT_DestroyCertificate(cert); + } + } + } + } - return; + return result; } static SECStatus BadCertHandler(void *arg, PRFileDesc *sock) @@ -822,39 +945,62 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock, return SECSuccess; } -/* This function is supposed to decide, which error codes should be used - * to conclude server is TLS intolerant. - * - * taken from xulrunner - nsNSSIOLayer.cpp - */ -static PRBool -isTLSIntoleranceError(PRInt32 err) +/* update blocking direction in case of PR_WOULD_BLOCK_ERROR */ +static void nss_update_connecting_state(ssl_connect_state state, void *secret) { - switch (err) { - case SSL_ERROR_BAD_MAC_ALERT: - case SSL_ERROR_BAD_MAC_READ: - case SSL_ERROR_HANDSHAKE_FAILURE_ALERT: - case SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT: - case SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE: - case SSL_ERROR_ILLEGAL_PARAMETER_ALERT: - case SSL_ERROR_NO_CYPHER_OVERLAP: - case SSL_ERROR_BAD_SERVER: - case SSL_ERROR_BAD_BLOCK_PADDING: - case SSL_ERROR_UNSUPPORTED_VERSION: - case SSL_ERROR_PROTOCOL_VERSION_ALERT: - case SSL_ERROR_RX_MALFORMED_FINISHED: - case SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE: - case SSL_ERROR_DECODE_ERROR_ALERT: - case SSL_ERROR_RX_UNKNOWN_ALERT: - return PR_TRUE; + struct ssl_connect_data *connssl = (struct ssl_connect_data *)secret; + if(PR_GetError() != PR_WOULD_BLOCK_ERROR) + /* an unrelated error is passing by */ + return; + + switch(connssl->connecting_state) { + case ssl_connect_2: + case ssl_connect_2_reading: + case ssl_connect_2_writing: + break; default: - return PR_FALSE; + /* we are not called from an SSL handshake */ + return; } + + /* update the state accordingly */ + connssl->connecting_state = state; +} + +/* recv() wrapper we use to detect blocking direction during SSL handshake */ +static PRInt32 nspr_io_recv(PRFileDesc *fd, void *buf, PRInt32 amount, + PRIntn flags, PRIntervalTime timeout) +{ + const PRRecvFN recv_fn = fd->lower->methods->recv; + const PRInt32 rv = recv_fn(fd->lower, buf, amount, flags, timeout); + if(rv < 0) + /* check for PR_WOULD_BLOCK_ERROR and update blocking direction */ + nss_update_connecting_state(ssl_connect_2_reading, fd->secret); + return rv; +} + +/* send() wrapper we use to detect blocking direction during SSL handshake */ +static PRInt32 nspr_io_send(PRFileDesc *fd, const void *buf, PRInt32 amount, + PRIntn flags, PRIntervalTime timeout) +{ + const PRSendFN send_fn = fd->lower->methods->send; + const PRInt32 rv = send_fn(fd->lower, buf, amount, flags, timeout); + if(rv < 0) + /* check for PR_WOULD_BLOCK_ERROR and update blocking direction */ + nss_update_connecting_state(ssl_connect_2_writing, fd->secret); + return rv; +} + +/* close() wrapper to avoid assertion failure due to fd->secret != NULL */ +static PRStatus nspr_io_close(PRFileDesc *fd) +{ + const PRCloseFN close_fn = PR_GetDefaultIOMethods()->close; + fd->secret = NULL; + return close_fn(fd); } static CURLcode nss_init_core(struct SessionHandle *data, const char *cert_dir) { -#ifdef HAVE_NSS_INITCONTEXT NSSInitParameters initparams; if(nss_context != NULL) @@ -862,49 +1008,29 @@ static CURLcode nss_init_core(struct SessionHandle *data, const char *cert_dir) memset((void *) &initparams, '\0', sizeof(initparams)); initparams.length = sizeof(initparams); -#else /* HAVE_NSS_INITCONTEXT */ - SECStatus rv; - - if(NSS_IsInitialized()) - return CURLE_OK; -#endif if(cert_dir) { - const bool use_sql = NSS_VersionCheck("3.12.0"); - char *certpath = aprintf("%s%s", use_sql ? "sql:" : "", cert_dir); + char *certpath = aprintf("sql:%s", cert_dir); if(!certpath) return CURLE_OUT_OF_MEMORY; infof(data, "Initializing NSS with certpath: %s\n", certpath); -#ifdef HAVE_NSS_INITCONTEXT nss_context = NSS_InitContext(certpath, "", "", "", &initparams, NSS_INIT_READONLY | NSS_INIT_PK11RELOAD); free(certpath); if(nss_context != NULL) return CURLE_OK; -#else /* HAVE_NSS_INITCONTEXT */ - rv = NSS_Initialize(certpath, "", "", "", NSS_INIT_READONLY); - free(certpath); - - if(rv == SECSuccess) - return CURLE_OK; -#endif infof(data, "Unable to initialize NSS database\n"); } infof(data, "Initializing NSS with certpath: none\n"); -#ifdef HAVE_NSS_INITCONTEXT nss_context = NSS_InitContext("", "", "", "", &initparams, NSS_INIT_READONLY | NSS_INIT_NOCERTDB | NSS_INIT_NOMODDB | NSS_INIT_FORCEOPEN | NSS_INIT_NOROOTINIT | NSS_INIT_OPTIMIZESPACE | NSS_INIT_PK11RELOAD); if(nss_context != NULL) return CURLE_OK; -#else /* HAVE_NSS_INITCONTEXT */ - if(NSS_NoDB_Init(NULL) == SECSuccess) - return CURLE_OK; -#endif infof(data, "Unable to initialize NSS\n"); return CURLE_SSL_CACERT_BADFILE; @@ -914,11 +1040,16 @@ static CURLcode nss_init(struct SessionHandle *data) { char *cert_dir; struct_stat st; - CURLcode rv; + CURLcode result; if(initialized) return CURLE_OK; + /* list of all CRL items we need to destroy in Curl_nss_cleanup() */ + nss_crl_list = Curl_llist_alloc(nss_destroy_crl_item); + if(!nss_crl_list) + return CURLE_OUT_OF_MEMORY; + /* First we check if $SSL_DIR points to a valid dir */ cert_dir = getenv("SSL_DIR"); if(cert_dir) { @@ -936,14 +1067,30 @@ static CURLcode nss_init(struct SessionHandle *data) } } - rv = nss_init_core(data, cert_dir); - if(rv) - return rv; + if(nspr_io_identity == PR_INVALID_IO_LAYER) { + /* allocate an identity for our own NSPR I/O layer */ + nspr_io_identity = PR_GetUniqueIdentity("libcurl"); + if(nspr_io_identity == PR_INVALID_IO_LAYER) + return CURLE_OUT_OF_MEMORY; + + /* the default methods just call down to the lower I/O layer */ + memcpy(&nspr_io_methods, PR_GetDefaultIOMethods(), sizeof nspr_io_methods); + + /* override certain methods in the table by our wrappers */ + nspr_io_methods.recv = nspr_io_recv; + nspr_io_methods.send = nspr_io_send; + nspr_io_methods.close = nspr_io_close; + } + + result = nss_init_core(data, cert_dir); + if(result) + return result; if(num_enabled_ciphers() == 0) NSS_SetDomesticPolicy(); initialized = 1; + return CURLE_OK; } @@ -969,18 +1116,18 @@ int Curl_nss_init(void) CURLcode Curl_nss_force_init(struct SessionHandle *data) { - CURLcode rv; + CURLcode result; if(!nss_initlock) { - failf(data, - "unable to initialize NSS, curl_global_init() should have been " - "called with CURL_GLOBAL_SSL or CURL_GLOBAL_ALL"); + failf(data, "unable to initialize NSS, curl_global_init() should have " + "been called with CURL_GLOBAL_SSL or CURL_GLOBAL_ALL"); return CURLE_FAILED_INIT; } PR_Lock(nss_initlock); - rv = nss_init(data); + result = nss_init(data); PR_Unlock(nss_initlock); - return rv; + + return result; } /* Global cleanup */ @@ -1000,13 +1147,14 @@ void Curl_nss_cleanup(void) SECMOD_DestroyModule(mod); mod = NULL; } -#ifdef HAVE_NSS_INITCONTEXT NSS_ShutdownContext(nss_context); nss_context = NULL; -#else /* HAVE_NSS_INITCONTEXT */ - NSS_Shutdown(); -#endif } + + /* destroy all CRL items */ + Curl_llist_destroy(nss_crl_list, NULL); + nss_crl_list = NULL; + PR_Unlock(nss_initlock); PR_DestroyLock(nss_initlock); @@ -1080,10 +1228,9 @@ void Curl_nss_close(struct connectdata *conn, int sockindex) * This function is called when the 'data' struct is going away. Close * down everything and free all resources! */ -int Curl_nss_close_all(struct SessionHandle *data) +void Curl_nss_close_all(struct SessionHandle *data) { (void)data; - return 0; } /* return true if NSS can provide error code (and possibly msg) for the @@ -1128,9 +1275,9 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn, const char *capath = data->set.ssl.CApath; if(cafile) { - CURLcode rv = nss_load_cert(&conn->ssl[sockindex], cafile, PR_TRUE); - if(CURLE_OK != rv) - return rv; + CURLcode result = nss_load_cert(&conn->ssl[sockindex], cafile, PR_TRUE); + if(result) + return result; } if(capath) { @@ -1172,26 +1319,125 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn, return CURLE_OK; } -CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) +static CURLcode nss_init_sslver(SSLVersionRange *sslver, + struct SessionHandle *data) +{ + switch(data->set.ssl.version) { + default: + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: + sslver->min = SSL_LIBRARY_VERSION_TLS_1_0; +#ifdef SSL_LIBRARY_VERSION_TLS_1_2 + sslver->max = SSL_LIBRARY_VERSION_TLS_1_2; +#elif defined SSL_LIBRARY_VERSION_TLS_1_1 + sslver->max = SSL_LIBRARY_VERSION_TLS_1_1; +#else + sslver->max = SSL_LIBRARY_VERSION_TLS_1_0; +#endif + return CURLE_OK; + + case CURL_SSLVERSION_SSLv2: + sslver->min = SSL_LIBRARY_VERSION_2; + sslver->max = SSL_LIBRARY_VERSION_2; + return CURLE_OK; + + case CURL_SSLVERSION_SSLv3: + sslver->min = SSL_LIBRARY_VERSION_3_0; + sslver->max = SSL_LIBRARY_VERSION_3_0; + return CURLE_OK; + + case CURL_SSLVERSION_TLSv1_0: + sslver->min = SSL_LIBRARY_VERSION_TLS_1_0; + sslver->max = SSL_LIBRARY_VERSION_TLS_1_0; + return CURLE_OK; + + case CURL_SSLVERSION_TLSv1_1: +#ifdef SSL_LIBRARY_VERSION_TLS_1_1 + sslver->min = SSL_LIBRARY_VERSION_TLS_1_1; + sslver->max = SSL_LIBRARY_VERSION_TLS_1_1; + return CURLE_OK; +#endif + break; + + case CURL_SSLVERSION_TLSv1_2: +#ifdef SSL_LIBRARY_VERSION_TLS_1_2 + sslver->min = SSL_LIBRARY_VERSION_TLS_1_2; + sslver->max = SSL_LIBRARY_VERSION_TLS_1_2; + return CURLE_OK; +#endif + break; + } + + failf(data, "TLS minor version cannot be set"); + return CURLE_SSL_CONNECT_ERROR; +} + +static CURLcode nss_fail_connect(struct ssl_connect_data *connssl, + struct SessionHandle *data, + CURLcode curlerr) { PRErrorCode err = 0; + + if(is_nss_error(curlerr)) { + /* read NSPR error code */ + err = PR_GetError(); + if(is_cc_error(err)) + curlerr = CURLE_SSL_CERTPROBLEM; + + /* print the error number and error string */ + infof(data, "NSS error %d (%s)\n", err, nss_error_to_name(err)); + + /* print a human-readable message describing the error if available */ + nss_print_error_message(data, err); + } + + /* cleanup on connection failure */ + Curl_llist_destroy(connssl->obj_list, NULL); + connssl->obj_list = NULL; + + return curlerr; +} + +/* Switch the SSL socket into non-blocking mode. */ +static CURLcode nss_set_nonblock(struct ssl_connect_data *connssl, + struct SessionHandle *data) +{ + static PRSocketOptionData sock_opt; + sock_opt.option = PR_SockOpt_Nonblocking; + sock_opt.value.non_blocking = PR_TRUE; + + if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS) + return nss_fail_connect(connssl, data, CURLE_SSL_CONNECT_ERROR); + + return CURLE_OK; +} + +static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex) +{ PRFileDesc *model = NULL; - PRBool ssl2 = PR_FALSE; - PRBool ssl3 = PR_FALSE; - PRBool tlsv1 = PR_FALSE; + PRFileDesc *nspr_io = NULL; + PRFileDesc *nspr_io_stub = NULL; PRBool ssl_no_cache; PRBool ssl_cbc_random_iv; struct SessionHandle *data = conn->data; curl_socket_t sockfd = conn->sock[sockindex]; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - CURLcode curlerr; - const int *cipher_to_enable; - PRSocketOptionData sock_opt; - long time_left; - PRUint32 timeout; - - if(connssl->state == ssl_connection_complete) - return CURLE_OK; + CURLcode result; + + SSLVersionRange sslver = { + SSL_LIBRARY_VERSION_TLS_1_0, /* min */ + SSL_LIBRARY_VERSION_TLS_1_0 /* max */ + }; + +#ifdef USE_NGHTTP2 +#if defined(SSL_ENABLE_NPN) || defined(SSL_ENABLE_ALPN) + unsigned int alpn_protos_len = NGHTTP2_PROTO_VERSION_ID_LEN + + ALPN_HTTP_1_1_LENGTH + 2; + unsigned char alpn_protos[NGHTTP2_PROTO_VERSION_ID_LEN + ALPN_HTTP_1_1_LENGTH + + 2]; + int cur = 0; +#endif +#endif connssl->data = data; @@ -1202,13 +1448,13 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) /* FIXME. NSS doesn't support multiple databases open at the same time. */ PR_Lock(nss_initlock); - curlerr = nss_init(conn->data); - if(CURLE_OK != curlerr) { + result = nss_init(conn->data); + if(result) { PR_Unlock(nss_initlock); goto error; } - curlerr = CURLE_SSL_CONNECT_ERROR; + result = CURLE_SSL_CONNECT_ERROR; if(!mod) { char *configstring = aprintf("library=%s name=PEM", pem_library); @@ -1225,7 +1471,7 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) mod = NULL; } infof(data, "WARNING: failed to load NSS PEM library %s. Using " - "OpenSSL PEM certificates will not work.\n", pem_library); + "OpenSSL PEM certificates will not work.\n", pem_library); } } @@ -1244,39 +1490,16 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) if(SSL_OptionSet(model, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE) != SECSuccess) goto error; - /* do not use SSL cache if we are not going to verify peer */ - ssl_no_cache = (data->set.ssl.verifypeer) ? PR_FALSE : PR_TRUE; + /* do not use SSL cache if disabled or we are not going to verify peer */ + ssl_no_cache = (conn->ssl_config.sessionid && data->set.ssl.verifypeer) ? + PR_FALSE : PR_TRUE; if(SSL_OptionSet(model, SSL_NO_CACHE, ssl_no_cache) != SECSuccess) goto error; - switch (data->set.ssl.version) { - default: - case CURL_SSLVERSION_DEFAULT: - ssl3 = PR_TRUE; - if(data->state.ssl_connect_retry) - infof(data, "TLS disabled due to previous handshake failure\n"); - else - tlsv1 = PR_TRUE; - break; - case CURL_SSLVERSION_TLSv1: - tlsv1 = PR_TRUE; - break; - case CURL_SSLVERSION_SSLv2: - ssl2 = PR_TRUE; - break; - case CURL_SSLVERSION_SSLv3: - ssl3 = PR_TRUE; - break; - } - - if(SSL_OptionSet(model, SSL_ENABLE_SSL2, ssl2) != SECSuccess) - goto error; - if(SSL_OptionSet(model, SSL_ENABLE_SSL3, ssl3) != SECSuccess) + /* enable/disable the requested SSL version(s) */ + if(nss_init_sslver(&sslver, data) != CURLE_OK) goto error; - if(SSL_OptionSet(model, SSL_ENABLE_TLS, tlsv1) != SECSuccess) - goto error; - - if(SSL_OptionSet(model, SSL_V2_COMPATIBLE_HELLO, ssl2) != SECSuccess) + if(SSL_VersionRangeSet(model, &sslver) != SECSuccess) goto error; ssl_cbc_random_iv = !data->set.ssl_enable_beast; @@ -1291,22 +1514,9 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) infof(data, "warning: support for SSL_CBC_RANDOM_IV not compiled in\n"); #endif - /* reset the flag to avoid an infinite loop */ - data->state.ssl_connect_retry = FALSE; - - /* enable all ciphers from enable_ciphers_by_default */ - cipher_to_enable = enable_ciphers_by_default; - while(SSL_NULL_WITH_NULL_NULL != *cipher_to_enable) { - if(SSL_CipherPrefSet(model, *cipher_to_enable, PR_TRUE) != SECSuccess) { - curlerr = CURLE_SSL_CIPHER; - goto error; - } - cipher_to_enable++; - } - if(data->set.ssl.cipher_list) { if(set_ciphers(data, model, data->set.ssl.cipher_list) != SECSuccess) { - curlerr = CURLE_SSL_CIPHER; + result = CURLE_SSL_CIPHER; goto error; } } @@ -1323,25 +1533,24 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) if(SSL_BadCertHook(model, BadCertHandler, conn) != SECSuccess) goto error; - if(SSL_HandshakeCallback(model, HandshakeCallback, NULL) != SECSuccess) + if(SSL_HandshakeCallback(model, HandshakeCallback, conn) != SECSuccess) goto error; if(data->set.ssl.verifypeer) { const CURLcode rv = nss_load_ca_certificates(conn, sockindex); - if(CURLE_OK != rv) { - curlerr = rv; + if(rv) { + result = rv; goto error; } } if(data->set.ssl.CRLfile) { - if(SECSuccess != nss_load_crl(data->set.ssl.CRLfile)) { - curlerr = CURLE_SSL_CRL_BADFILE; + const CURLcode rv = nss_load_crl(data->set.ssl.CRLfile); + if(rv) { + result = rv; goto error; } - infof(data, - " CRLfile: %s\n", - data->set.ssl.CRLfile ? data->set.ssl.CRLfile : "none"); + infof(data, " CRLfile: %s\n", data->set.ssl.CRLfile); } if(data->set.str[STRING_CERT]) { @@ -1353,9 +1562,9 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) else { CURLcode rv = cert_stuff(conn, sockindex, data->set.str[STRING_CERT], data->set.str[STRING_KEY]); - if(CURLE_OK != rv) { + if(rv) { /* failf() is already done in cert_stuff() */ - curlerr = rv; + result = rv; goto error; } } @@ -1368,15 +1577,38 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) if(SSL_GetClientAuthDataHook(model, SelectClientCert, (void *)connssl) != SECSuccess) { - curlerr = CURLE_SSL_CERTPROBLEM; + result = CURLE_SSL_CERTPROBLEM; goto error; } - /* Import our model socket onto the existing file descriptor */ - connssl->handle = PR_ImportTCPSocket(sockfd); - connssl->handle = SSL_ImportFD(model, connssl->handle); - if(!connssl->handle) + /* wrap OS file descriptor by NSPR's file descriptor abstraction */ + nspr_io = PR_ImportTCPSocket(sockfd); + if(!nspr_io) + goto error; + + /* create our own NSPR I/O layer */ + nspr_io_stub = PR_CreateIOLayerStub(nspr_io_identity, &nspr_io_methods); + if(!nspr_io_stub) { + PR_Close(nspr_io); goto error; + } + + /* make the per-connection data accessible from NSPR I/O callbacks */ + nspr_io_stub->secret = (void *)connssl; + + /* push our new layer to the NSPR I/O stack */ + if(PR_PushIOLayer(nspr_io, PR_TOP_IO_LAYER, nspr_io_stub) != PR_SUCCESS) { + PR_Close(nspr_io); + PR_Close(nspr_io_stub); + goto error; + } + + /* import our model socket onto the current I/O stack */ + connssl->handle = SSL_ImportFD(model, nspr_io); + if(!connssl->handle) { + PR_Close(nspr_io); + goto error; + } PR_Close(model); /* We don't need this any more */ model = NULL; @@ -1386,41 +1618,93 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) SSL_SetPKCS11PinArg(connssl->handle, data->set.str[STRING_KEY_PASSWD]); } +#ifdef USE_NGHTTP2 + if(data->set.httpversion == CURL_HTTP_VERSION_2_0) { +#ifdef SSL_ENABLE_NPN + if(data->set.ssl_enable_npn) { + if(SSL_OptionSet(connssl->handle, SSL_ENABLE_NPN, PR_TRUE) != SECSuccess) + goto error; + } +#endif + +#ifdef SSL_ENABLE_ALPN + if(data->set.ssl_enable_alpn) { + if(SSL_OptionSet(connssl->handle, SSL_ENABLE_ALPN, PR_TRUE) + != SECSuccess) + goto error; + } +#endif + +#if defined(SSL_ENABLE_NPN) || defined(SSL_ENABLE_ALPN) + if(data->set.ssl_enable_npn || data->set.ssl_enable_alpn) { + alpn_protos[cur] = NGHTTP2_PROTO_VERSION_ID_LEN; + cur++; + memcpy(&alpn_protos[cur], NGHTTP2_PROTO_VERSION_ID, + NGHTTP2_PROTO_VERSION_ID_LEN); + cur += NGHTTP2_PROTO_VERSION_ID_LEN; + alpn_protos[cur] = ALPN_HTTP_1_1_LENGTH; + cur++; + memcpy(&alpn_protos[cur], ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH); + + if(SSL_SetNextProtoNego(connssl->handle, alpn_protos, alpn_protos_len) + != SECSuccess) + goto error; + connssl->asked_for_h2 = TRUE; + } + else { + infof(data, "SSL, can't negotiate HTTP/2.0 with neither NPN nor ALPN\n"); + } +#endif + } +#endif + + /* Force handshake on next I/O */ SSL_ResetHandshake(connssl->handle, /* asServer */ PR_FALSE); SSL_SetURL(connssl->handle, conn->host.name); + return CURLE_OK; + +error: + if(model) + PR_Close(model); + + return nss_fail_connect(connssl, data, result); +} + +static CURLcode nss_do_connect(struct connectdata *conn, int sockindex) +{ + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + struct SessionHandle *data = conn->data; + CURLcode result = CURLE_SSL_CONNECT_ERROR; + PRUint32 timeout; + /* check timeout situation */ - time_left = Curl_timeleft(data, NULL, TRUE); + const long time_left = Curl_timeleft(data, NULL, TRUE); if(time_left < 0L) { failf(data, "timed out before SSL handshake"); - curlerr = CURLE_OPERATION_TIMEDOUT; + result = CURLE_OPERATION_TIMEDOUT; goto error; } - timeout = PR_MillisecondsToInterval((PRUint32) time_left); /* Force the handshake now */ + timeout = PR_MillisecondsToInterval((PRUint32) time_left); if(SSL_ForceHandshakeWithTimeout(connssl->handle, timeout) != SECSuccess) { - if(conn->data->set.ssl.certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN) - curlerr = CURLE_PEER_FAILED_VERIFICATION; + if(PR_GetError() == PR_WOULD_BLOCK_ERROR) + /* blocking direction is updated by nss_update_connecting_state() */ + return CURLE_AGAIN; + else if(conn->data->set.ssl.certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN) + result = CURLE_PEER_FAILED_VERIFICATION; else if(conn->data->set.ssl.certverifyresult!=0) - curlerr = CURLE_SSL_CACERT; + result = CURLE_SSL_CACERT; goto error; } - /* switch the SSL socket into non-blocking mode */ - sock_opt.option = PR_SockOpt_Nonblocking; - sock_opt.value.non_blocking = PR_TRUE; - if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS) + result = display_conn_info(conn, connssl->handle); + if(result) goto error; - connssl->state = ssl_connection_complete; - conn->recv[sockindex] = nss_recv; - conn->send[sockindex] = nss_send; - - display_conn_info(conn, connssl->handle); - if(data->set.str[STRING_SSL_ISSUERCERT]) { SECStatus ret = SECFailure; char *nickname = dup_nickname(data, STRING_SSL_ISSUERCERT); @@ -1432,7 +1716,7 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) if(SECFailure == ret) { infof(data,"SSL certificate issuer check failed\n"); - curlerr = CURLE_SSL_ISSUER_ERROR; + result = CURLE_SSL_ISSUER_ERROR; goto error; } else { @@ -1442,38 +1726,79 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) return CURLE_OK; - error: - /* reset the flag to avoid an infinite loop */ - data->state.ssl_connect_retry = FALSE; +error: + return nss_fail_connect(connssl, data, result); +} - if(is_nss_error(curlerr)) { - /* read NSPR error code */ - err = PR_GetError(); - if(is_cc_error(err)) - curlerr = CURLE_SSL_CERTPROBLEM; +static CURLcode nss_connect_common(struct connectdata *conn, int sockindex, + bool *done) +{ + struct ssl_connect_data *connssl = &conn->ssl[sockindex]; + struct SessionHandle *data = conn->data; + const bool blocking = (done == NULL); + CURLcode result; - /* print the error number and error string */ - infof(data, "NSS error %d (%s)\n", err, nss_error_to_name(err)); + if(connssl->state == ssl_connection_complete) + return CURLE_OK; - /* print a human-readable message describing the error if available */ - nss_print_error_message(data, err); - } + if(connssl->connecting_state == ssl_connect_1) { + result = nss_setup_connect(conn, sockindex); + if(result) + /* we do not expect CURLE_AGAIN from nss_setup_connect() */ + return result; + + if(!blocking) { + /* in non-blocking mode, set NSS non-blocking mode before handshake */ + result = nss_set_nonblock(connssl, data); + if(result) + return result; + } - if(model) - PR_Close(model); + connssl->connecting_state = ssl_connect_2; + } - /* cleanup on connection failure */ - Curl_llist_destroy(connssl->obj_list, NULL); - connssl->obj_list = NULL; + result = nss_do_connect(conn, sockindex); + switch(result) { + case CURLE_OK: + break; + case CURLE_AGAIN: + if(!blocking) + /* CURLE_AGAIN in non-blocking mode is not an error */ + return CURLE_OK; + /* fall through */ + default: + return result; + } - if(ssl3 && tlsv1 && isTLSIntoleranceError(err)) { - /* schedule reconnect through Curl_retry_request() */ - data->state.ssl_connect_retry = TRUE; - infof(data, "Error in TLS handshake, trying SSLv3...\n"); - return CURLE_OK; + if(blocking) { + /* in blocking mode, set NSS non-blocking mode _after_ SSL handshake */ + result = nss_set_nonblock(connssl, data); + if(result) + return result; } + else + /* signal completed SSL handshake */ + *done = TRUE; - return curlerr; + connssl->state = ssl_connection_complete; + conn->recv[sockindex] = nss_recv; + conn->send[sockindex] = nss_send; + + /* ssl_connect_done is never used outside, go back to the initial state */ + connssl->connecting_state = ssl_connect_1; + + return CURLE_OK; +} + +CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) +{ + return nss_connect_common(conn, sockindex, /* blocking */ NULL); +} + +CURLcode Curl_nss_connect_nonblocking(struct connectdata *conn, + int sockindex, bool *done) +{ + return nss_connect_common(conn, sockindex, done); } static ssize_t nss_send(struct connectdata *conn, /* connection data */ @@ -1500,8 +1825,10 @@ static ssize_t nss_send(struct connectdata *conn, /* connection data */ ? CURLE_SSL_CERTPROBLEM : CURLE_SEND_ERROR; } + return -1; } + return rc; /* number of bytes */ } @@ -1531,8 +1858,10 @@ static ssize_t nss_recv(struct connectdata * conn, /* connection data */ ? CURLE_SSL_CERTPROBLEM : CURLE_RECV_ERROR; } + return -1; } + return nread; } @@ -1543,17 +1872,25 @@ size_t Curl_nss_version(char *buffer, size_t size) int Curl_nss_seed(struct SessionHandle *data) { - /* TODO: implement? */ - (void) data; - return 0; + /* make sure that NSS is initialized */ + return !!Curl_nss_force_init(data); } -void Curl_nss_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length) +/* data might be NULL */ +int Curl_nss_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length) { - Curl_nss_seed(data); /* Initiate the seed if not already done */ - PK11_GenerateRandom(entropy, curlx_uztosi(length)); + if(data) + Curl_nss_seed(data); /* Initiate the seed if not already done */ + + if(SECSuccess != PK11_GenerateRandom(entropy, curlx_uztosi(length))) { + /* no way to signal a failure from here, we have to abort */ + failf(data, "PK11_GenerateRandom() failed, calling abort()..."); + abort(); + } + + return 0; } void Curl_nss_md5sum(unsigned char *tmp, /* input */ @@ -1563,6 +1900,7 @@ void Curl_nss_md5sum(unsigned char *tmp, /* input */ { PK11Context *MD5pw = PK11_CreateDigestContext(SEC_OID_MD5); unsigned int MD5out; + PK11_DigestOp(MD5pw, tmp, curlx_uztoui(tmplen)); PK11_DigestFinal(MD5pw, md5sum, &MD5out, curlx_uztoui(md5len)); PK11_DestroyContext(MD5pw, PR_TRUE); diff --git a/lib/nssg.h b/lib/vtls/nssg.h similarity index 74% rename from lib/nssg.h rename to lib/vtls/nssg.h index cd32706..74840e8 100644 --- a/lib/nssg.h +++ b/lib/vtls/nssg.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -25,7 +25,7 @@ #ifdef USE_NSS /* - * This header should only be needed to get included by sslgen.c and nss.c + * This header should only be needed to get included by vtls.c and nss.c */ #include "urldata.h" @@ -39,7 +39,7 @@ void Curl_nss_close(struct connectdata *conn, int sockindex); /* tell NSS to close down all open information regarding connections (and thus session ID caching etc) */ -int Curl_nss_close_all(struct SessionHandle *data); +void Curl_nss_close_all(struct SessionHandle *data); int Curl_nss_init(void); void Curl_nss_cleanup(void); @@ -51,38 +51,42 @@ int Curl_nss_seed(struct SessionHandle *data); /* initialize NSS library if not already */ CURLcode Curl_nss_force_init(struct SessionHandle *data); -void Curl_nss_random(struct SessionHandle *data, - unsigned char *entropy, - size_t length); +int Curl_nss_random(struct SessionHandle *data, + unsigned char *entropy, + size_t length); void Curl_nss_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum, /* output */ size_t md5len); -/* this backend provides these functions: */ -#define have_curlssl_random 1 -#define have_curlssl_md5sum 1 +/* this backend supports the CAPATH option */ +#define have_curlssl_ca_path 1 + +/* this backend supports CURLOPT_CERTINFO */ +#define have_curlssl_certinfo 1 /* API setup for NSS */ #define curlssl_init Curl_nss_init #define curlssl_cleanup Curl_nss_cleanup #define curlssl_connect Curl_nss_connect +#define curlssl_connect_nonblocking Curl_nss_connect_nonblocking /* NSS has its own session ID cache */ #define curlssl_session_free(x) Curl_nop_stmt #define curlssl_close_all Curl_nss_close_all #define curlssl_close Curl_nss_close /* NSS has no shutdown function provided and thus always fail */ -#define curlssl_shutdown(x,y) (x=x, y=y, 1) -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_shutdown(x,y) ((void)x, (void)y, 1) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_nss_version #define curlssl_check_cxn(x) Curl_nss_check_cxn(x) -#define curlssl_data_pending(x,y) (x=x, y=y, 0) +#define curlssl_data_pending(x,y) ((void)x, (void)y, 0) #define curlssl_random(x,y,z) Curl_nss_random(x,y,z) #define curlssl_md5sum(a,b,c,d) Curl_nss_md5sum(a,b,c,d) +#define CURL_SSL_BACKEND CURLSSLBACKEND_NSS #endif /* USE_NSS */ #endif /* HEADER_CURL_NSSG_H */ diff --git a/lib/ssluse.c b/lib/vtls/openssl.c similarity index 81% rename from lib/ssluse.c rename to lib/vtls/openssl.c index 69328f6..a68d88e 100644 --- a/lib/ssluse.c +++ b/lib/vtls/openssl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,7 +22,7 @@ /* * Source file for all OpenSSL-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. */ /* @@ -41,12 +41,12 @@ #include "formdata.h" /* for the boundary function */ #include "url.h" /* for the ssl config check function */ #include "inet_pton.h" -#include "ssluse.h" +#include "openssl.h" #include "connect.h" #include "slist.h" #include "strequal.h" #include "select.h" -#include "sslgen.h" +#include "vtls.h" #include "rawstr.h" #include "hostcheck.h" @@ -62,6 +62,8 @@ #include #include #include +#include +#include #else #include #include @@ -129,7 +131,8 @@ #define HAVE_ERR_REMOVE_THREAD_STATE 1 #endif -#ifndef HAVE_SSLV2_CLIENT_METHOD +#if !defined(HAVE_SSLV2_CLIENT_METHOD) || \ + OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0+ has no SSLv2 */ #undef OPENSSL_NO_SSL2 /* undef first to avoid compiler warnings */ #define OPENSSL_NO_SSL2 #endif @@ -258,7 +261,7 @@ static int ossl_seed(struct SessionHandle *data) return nread; } -int Curl_ossl_seed(struct SessionHandle *data) +static int Curl_ossl_seed(struct SessionHandle *data) { /* we have the "SSL is seeded" boolean static to prevent multiple time-consuming seedings in vain */ @@ -294,6 +297,48 @@ static int do_file_type(const char *type) return -1; } +#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_LOAD_FOUR_ARGS) +/* + * Supply default password to the engine user interface conversation. + * The password is passed by OpenSSL engine from ENGINE_load_private_key() + * last argument to the ui and can be obtained by UI_get0_user_data(ui) here. + */ +static int ssl_ui_reader(UI *ui, UI_STRING *uis) +{ + const char *password; + switch(UI_get_string_type(uis)) { + case UIT_PROMPT: + case UIT_VERIFY: + password = (const char*)UI_get0_user_data(ui); + if(password && (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) { + UI_set_result(ui, uis, password); + return 1; + } + default: + break; + } + return (UI_method_get_reader(UI_OpenSSL()))(ui, uis); +} + +/* + * Suppress interactive request for a default password if available. + */ +static int ssl_ui_writer(UI *ui, UI_STRING *uis) +{ + switch(UI_get_string_type(uis)) { + case UIT_PROMPT: + case UIT_VERIFY: + if(UI_get0_user_data(ui) && + (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) { + return 1; + } + default: + break; + } + return (UI_method_get_writer(UI_OpenSSL()))(ui, uis); +} +#endif + static int cert_stuff(struct connectdata *conn, SSL_CTX* ctx, @@ -306,7 +351,7 @@ int cert_stuff(struct connectdata *conn, int file_type = do_file_type(cert_type); - if(cert_file != NULL || file_type == SSL_FILETYPE_ENGINE) { + if(cert_file || (file_type == SSL_FILETYPE_ENGINE)) { SSL *ssl; X509 *x509; int cert_done = 0; @@ -495,6 +540,7 @@ int cert_stuff(struct connectdata *conn, if(!cert_done) return 0; /* failure! */ + break; #else failf(data, "file type P12 for certificate not supported"); return 0; @@ -511,7 +557,7 @@ int cert_stuff(struct connectdata *conn, case SSL_FILETYPE_PEM: if(cert_done) break; - if(key_file == NULL) + if(!key_file) /* cert & key can only be in PEM case in the same file */ key_file=cert_file; case SSL_FILETYPE_ASN1: @@ -527,7 +573,16 @@ int cert_stuff(struct connectdata *conn, EVP_PKEY *priv_key = NULL; if(data->state.engine) { #ifdef HAVE_ENGINE_LOAD_FOUR_ARGS - UI_METHOD *ui_method = UI_OpenSSL(); + UI_METHOD *ui_method = + UI_create_method((char *)"cURL user interface"); + if(!ui_method) { + failf(data, "unable do create OpenSSL user-interface method"); + return 0; + } + UI_method_set_opener(ui_method, UI_method_get_opener(UI_OpenSSL())); + UI_method_set_closer(ui_method, UI_method_get_closer(UI_OpenSSL())); + UI_method_set_reader(ui_method, ssl_ui_reader); + UI_method_set_writer(ui_method, ssl_ui_writer); #endif /* the typecast below was added to please mingw32 */ priv_key = (EVP_PKEY *) @@ -536,6 +591,9 @@ int cert_stuff(struct connectdata *conn, ui_method, #endif data->set.str[STRING_KEY_PASSWD]); +#ifdef HAVE_ENGINE_LOAD_FOUR_ARGS + UI_destroy_method(ui_method); +#endif if(!priv_key) { failf(data, "failed to load private key from crypto engine"); return 0; @@ -569,7 +627,7 @@ int cert_stuff(struct connectdata *conn, } ssl=SSL_new(ctx); - if(NULL == ssl) { + if(!ssl) { failf(data,"unable to create an SSL structure"); return 0; } @@ -578,7 +636,7 @@ int cert_stuff(struct connectdata *conn, /* This version was provided by Evan Jordan and is supposed to not leak memory as the previous version: */ - if(x509 != NULL) { + if(x509) { EVP_PKEY *pktmp = X509_get_pubkey(x509); EVP_PKEY_copy_parameters(pktmp,SSL_get_privatekey(ssl)); EVP_PKEY_free(pktmp); @@ -685,6 +743,23 @@ int Curl_ossl_init(void) OpenSSL_add_all_algorithms(); + + /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately + that function makes an exit() call on wrongly formatted config files + which makes it hard to use in some situations. OPENSSL_config() itself + calls CONF_modules_load_file() and we use that instead and we ignore + its return code! */ + + /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and + 0.9.8e */ +#ifndef CONF_MFLAGS_DEFAULT_SECTION +#define CONF_MFLAGS_DEFAULT_SECTION 0x0 +#endif + + (void)CONF_modules_load_file(NULL, NULL, + CONF_MFLAGS_DEFAULT_SECTION| + CONF_MFLAGS_IGNORE_MISSING_FILE); + return 1; } @@ -963,7 +1038,7 @@ void Curl_ossl_session_free(void *ptr) * This function is called when the 'data' struct is going away. Close * down everything and free all resources! */ -int Curl_ossl_close_all(struct SessionHandle *data) +void Curl_ossl_close_all(struct SessionHandle *data) { #ifdef HAVE_OPENSSL_ENGINE_H if(data->state.engine) { @@ -974,7 +1049,6 @@ int Curl_ossl_close_all(struct SessionHandle *data) #else (void)data; #endif - return 0; } static int asn1_output(const ASN1_UTCTIME *tm, @@ -1044,8 +1118,7 @@ static int asn1_output(const ASN1_UTCTIME *tm, in the certificate and must exactly match the IP in the URI. */ -static CURLcode verifyhost(struct connectdata *conn, - X509 *server_cert) +static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert) { int matched = -1; /* -1 is no alternative match yet, 1 means match and 0 means mismatch */ @@ -1058,7 +1131,7 @@ static CURLcode verifyhost(struct connectdata *conn, #else struct in_addr addr; #endif - CURLcode res = CURLE_OK; + CURLcode result = CURLE_OK; #ifdef ENABLE_IPV6 if(conn->bits.ipv6_ip && @@ -1137,7 +1210,9 @@ static CURLcode verifyhost(struct connectdata *conn, /* an alternative name field existed, but didn't match and then we MUST fail */ infof(data, "\t subjectAltName does not match %s\n", conn->host.dispname); - res = CURLE_PEER_FAILED_VERIFICATION; + failf(data, "SSL: no alternative certificate subject name matches " + "target host name '%s'", conn->host.dispname); + result = CURLE_PEER_FAILED_VERIFICATION; } else { /* we have to look to the last occurrence of a commonName in the @@ -1184,7 +1259,7 @@ static CURLcode verifyhost(struct connectdata *conn, /* there was a terminating zero before the end of string, this cannot match and we return failure! */ failf(data, "SSL: illegal cert name field"); - res = CURLE_PEER_FAILED_VERIFICATION; + result = CURLE_PEER_FAILED_VERIFICATION; } } } @@ -1201,18 +1276,18 @@ static CURLcode verifyhost(struct connectdata *conn, } } - if(res) + if(result) /* error already detected, pass through */ ; else if(!peer_CN) { failf(data, "SSL: unable to obtain common name from peer certificate"); - res = CURLE_PEER_FAILED_VERIFICATION; + result = CURLE_PEER_FAILED_VERIFICATION; } else if(!Curl_cert_hostcheck((const char *)peer_CN, conn->host.name)) { failf(data, "SSL: certificate subject name '%s' does not match " "target host name '%s'", peer_CN, conn->host.dispname); - res = CURLE_PEER_FAILED_VERIFICATION; + result = CURLE_PEER_FAILED_VERIFICATION; } else { infof(data, "\t common name: %s (matched)\n", peer_CN); @@ -1220,7 +1295,8 @@ static CURLcode verifyhost(struct connectdata *conn, if(peer_CN) OPENSSL_free(peer_CN); } - return res; + + return result; } #endif /* USE_SSLEAY */ @@ -1230,6 +1306,7 @@ static CURLcode verifyhost(struct connectdata *conn, static const char *ssl_msg_type(int ssl_ver, int msg) { +#ifdef SSL2_VERSION_MAJOR if(ssl_ver == SSL2_VERSION_MAJOR) { switch (msg) { case SSL2_MT_ERROR: @@ -1252,7 +1329,9 @@ static const char *ssl_msg_type(int ssl_ver, int msg) return "Client CERT"; } } - else if(ssl_ver == SSL3_VERSION_MAJOR) { + else +#endif + if(ssl_ver == SSL3_VERSION_MAJOR) { switch (msg) { case SSL3_MT_HELLO_REQUEST: return "Hello request"; @@ -1300,16 +1379,47 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type, struct SessionHandle *data; const char *msg_name, *tls_rt_name; char ssl_buf[1024]; - int ver, msg_type, txt_len; + char unknown[32]; + int msg_type, txt_len; + const char *verstr; if(!conn || !conn->data || !conn->data->set.fdebug || (direction != 0 && direction != 1)) return; data = conn->data; - ssl_ver >>= 8; - ver = (ssl_ver == SSL2_VERSION_MAJOR ? '2' : - ssl_ver == SSL3_VERSION_MAJOR ? '3' : '?'); + + switch(ssl_ver) { +#ifdef SSL2_VERSION_MAJOR /* removed in recent versions */ + case SSL2_VERSION_MAJOR: + verstr = "SSLv2"; + break; +#endif +#ifdef SSL3_VERSION + case SSL3_VERSION: + verstr = "SSLv3"; + break; +#endif + case TLS1_VERSION: + verstr = "TLSv1.0"; + break; +#ifdef TLS1_1_VERSION + case TLS1_1_VERSION: + verstr = "TLSv1.1"; + break; +#endif +#ifdef TLS1_2_VERSION + case TLS1_2_VERSION: + verstr = "TLSv1.2"; + break; +#endif + default: + snprintf(unknown, sizeof(unknown), "(%x)", ssl_ver); + verstr = unknown; + break; + } + + ssl_ver >>= 8; /* check the upper 8 bits only below */ /* SSLv2 doesn't seem to have TLS record-type headers, so OpenSSL * always pass-up content-type as 0. But the interesting message-type @@ -1323,8 +1433,8 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type, msg_type = *(char*)buf; msg_name = ssl_msg_type(ssl_ver, msg_type); - txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n", - ver, tls_rt_name, msg_name, msg_type); + txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "%s, %s%s (%d):\n", + verstr, tls_rt_name, msg_name, msg_type); Curl_debug(data, CURLINFO_TEXT, ssl_buf, (size_t)txt_len, NULL); Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT : @@ -1342,16 +1452,94 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type, # define use_sni(x) Curl_nop_stmt #endif -static CURLcode -ossl_connect_step1(struct connectdata *conn, - int sockindex) +#ifdef USE_NGHTTP2 + +/* Check for OpenSSL 1.0.2 which has ALPN support. */ +#undef HAS_ALPN +#if OPENSSL_VERSION_NUMBER >= 0x10002000L \ + && !defined(OPENSSL_NO_TLSEXT) +# define HAS_ALPN 1 +#endif + +/* Check for OpenSSL 1.0.1 which has NPN support. */ +#undef HAS_NPN +#if OPENSSL_VERSION_NUMBER >= 0x10001000L \ + && !defined(OPENSSL_NO_TLSEXT) \ + && !defined(OPENSSL_NO_NEXTPROTONEG) +# define HAS_NPN 1 +#endif + +#ifdef HAS_NPN + +/* + * in is a list of lenght prefixed strings. this function has to select + * the protocol we want to use from the list and write its string into out. + */ +static int +select_next_proto_cb(SSL *ssl, + unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + void *arg) +{ + struct connectdata *conn = (struct connectdata*) arg; + int retval = nghttp2_select_next_protocol(out, outlen, in, inlen); + + (void)ssl; + + if(retval == 1) { + infof(conn->data, "NPN, negotiated HTTP2 (%s)\n", + NGHTTP2_PROTO_VERSION_ID); + conn->negnpn = NPN_HTTP2; + } + else if(retval == 0) { + infof(conn->data, "NPN, negotiated HTTP1.1\n"); + conn->negnpn = NPN_HTTP1_1; + } + else { + infof(conn->data, "NPN, no overlap, use HTTP1.1\n", + NGHTTP2_PROTO_VERSION_ID); + *out = (unsigned char*)"http/1.1"; + *outlen = sizeof("http/1.1") - 1; + conn->negnpn = NPN_HTTP1_1; + } + + return SSL_TLSEXT_ERR_OK; +} +#endif /* HAS_NPN */ + +#endif /* USE_NGHTTP2 */ + +static const char * +get_ssl_version_txt(SSL_SESSION *session) { - CURLcode retcode = CURLE_OK; + if(!session) + return ""; + + switch(session->ssl_version) { +#if OPENSSL_VERSION_NUMBER >= 0x1000100FL + case TLS1_2_VERSION: + return "TLSv1.2"; + case TLS1_1_VERSION: + return "TLSv1.1"; +#endif + case TLS1_VERSION: + return "TLSv1.0"; + case SSL3_VERSION: + return "SSLv3"; + case SSL2_VERSION: + return "SSLv2"; + } + return "unknown"; +} +static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) +{ + CURLcode result = CURLE_OK; + char *ciphers; struct SessionHandle *data = conn->data; - SSL_METHOD_QUAL SSL_METHOD *req_method=NULL; - void *ssl_sessionid=NULL; - X509_LOOKUP *lookup=NULL; + SSL_METHOD_QUAL SSL_METHOD *req_method = NULL; + void *ssl_sessionid = NULL; + X509_LOOKUP *lookup = NULL; curl_socket_t sockfd = conn->sock[sockindex]; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; long ctx_options; @@ -1363,30 +1551,28 @@ ossl_connect_step1(struct connectdata *conn, struct in_addr addr; #endif #endif +#ifdef HAS_ALPN + unsigned char protocols[128]; +#endif DEBUGASSERT(ssl_connect_1 == connssl->connecting_state); /* Make funny stuff to get random input */ Curl_ossl_seed(data); + data->set.ssl.certverifyresult = !X509_V_OK; + /* check to see if we've been told to use an explicit SSL/TLS version */ switch(data->set.ssl.version) { default: case CURL_SSLVERSION_DEFAULT: -#ifdef USE_TLS_SRP - if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) { - infof(data, "Set version TLSv1 for SRP authorisation\n"); - req_method = TLSv1_client_method() ; - } - else -#endif - /* we try to figure out version */ - req_method = SSLv23_client_method(); - use_sni(TRUE); - break; case CURL_SSLVERSION_TLSv1: - req_method = TLSv1_client_method(); + case CURL_SSLVERSION_TLSv1_0: + case CURL_SSLVERSION_TLSv1_1: + case CURL_SSLVERSION_TLSv1_2: + /* it will be handled later with the context options */ + req_method = SSLv23_client_method(); use_sni(TRUE); break; case CURL_SSLVERSION_SSLv2: @@ -1499,12 +1685,103 @@ ossl_connect_step1(struct connectdata *conn, ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; #endif - /* disable SSLv2 in the default case (i.e. allow SSLv3 and TLSv1) */ - if(data->set.ssl.version == CURL_SSLVERSION_DEFAULT) + switch(data->set.ssl.version) { + case CURL_SSLVERSION_SSLv3: +#ifdef USE_TLS_SRP + if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) { + infof(data, "Set version TLSv1.x for SRP authorisation\n"); + } +#endif ctx_options |= SSL_OP_NO_SSLv2; + ctx_options |= SSL_OP_NO_TLSv1; +#if OPENSSL_VERSION_NUMBER >= 0x1000100FL + ctx_options |= SSL_OP_NO_TLSv1_1; + ctx_options |= SSL_OP_NO_TLSv1_2; +#endif + break; + + case CURL_SSLVERSION_DEFAULT: + case CURL_SSLVERSION_TLSv1: + ctx_options |= SSL_OP_NO_SSLv2; + ctx_options |= SSL_OP_NO_SSLv3; + break; + + case CURL_SSLVERSION_TLSv1_0: + ctx_options |= SSL_OP_NO_SSLv2; + ctx_options |= SSL_OP_NO_SSLv3; +#if OPENSSL_VERSION_NUMBER >= 0x1000100FL + ctx_options |= SSL_OP_NO_TLSv1_1; + ctx_options |= SSL_OP_NO_TLSv1_2; +#endif + break; + +#if OPENSSL_VERSION_NUMBER >= 0x1000100FL + case CURL_SSLVERSION_TLSv1_1: + ctx_options |= SSL_OP_NO_SSLv2; + ctx_options |= SSL_OP_NO_SSLv3; + ctx_options |= SSL_OP_NO_TLSv1; + ctx_options |= SSL_OP_NO_TLSv1_2; + break; + + case CURL_SSLVERSION_TLSv1_2: + ctx_options |= SSL_OP_NO_SSLv2; + ctx_options |= SSL_OP_NO_SSLv3; + ctx_options |= SSL_OP_NO_TLSv1; + ctx_options |= SSL_OP_NO_TLSv1_1; + break; +#endif + +#ifndef OPENSSL_NO_SSL2 + case CURL_SSLVERSION_SSLv2: + ctx_options |= SSL_OP_NO_SSLv3; + ctx_options |= SSL_OP_NO_TLSv1; +#if OPENSSL_VERSION_NUMBER >= 0x1000100FL + ctx_options |= SSL_OP_NO_TLSv1_1; + ctx_options |= SSL_OP_NO_TLSv1_2; +#endif + break; +#endif + + default: + failf(data, "Unsupported SSL protocol version"); + return CURLE_SSL_CONNECT_ERROR; + } SSL_CTX_set_options(connssl->ctx, ctx_options); +#ifdef USE_NGHTTP2 + if(data->set.httpversion == CURL_HTTP_VERSION_2_0) { +#ifdef HAS_NPN + if(data->set.ssl_enable_npn) { + SSL_CTX_set_next_proto_select_cb(connssl->ctx, select_next_proto_cb, + conn); + } +#endif + +#ifdef HAS_ALPN + if(data->set.ssl_enable_alpn) { + protocols[0] = NGHTTP2_PROTO_VERSION_ID_LEN; + memcpy(&protocols[1], NGHTTP2_PROTO_VERSION_ID, + NGHTTP2_PROTO_VERSION_ID_LEN); + + protocols[NGHTTP2_PROTO_VERSION_ID_LEN+1] = ALPN_HTTP_1_1_LENGTH; + memcpy(&protocols[NGHTTP2_PROTO_VERSION_ID_LEN+2], ALPN_HTTP_1_1, + ALPN_HTTP_1_1_LENGTH); + + /* expects length prefixed preference ordered list of protocols in wire + * format + */ + SSL_CTX_set_alpn_protos(connssl->ctx, protocols, + NGHTTP2_PROTO_VERSION_ID_LEN + ALPN_HTTP_1_1_LENGTH + 2); + + infof(data, "ALPN, offering %s, %s\n", NGHTTP2_PROTO_VERSION_ID, + ALPN_HTTP_1_1); + connssl->asked_for_h2 = TRUE; + } +#endif + } +#endif + if(data->set.str[STRING_CERT] || data->set.str[STRING_CERT_TYPE]) { if(!cert_stuff(conn, connssl->ctx, @@ -1517,12 +1794,12 @@ ossl_connect_step1(struct connectdata *conn, } } - if(data->set.str[STRING_SSL_CIPHER_LIST]) { - if(!SSL_CTX_set_cipher_list(connssl->ctx, - data->set.str[STRING_SSL_CIPHER_LIST])) { - failf(data, "failed setting cipher list"); - return CURLE_SSL_CIPHER; - } + ciphers = data->set.str[STRING_SSL_CIPHER_LIST]; + if(!ciphers) + ciphers = (char *)DEFAULT_CIPHER_SELECTION; + if(!SSL_CTX_set_cipher_list(connssl->ctx, ciphers)) { + failf(data, "failed setting cipher list: %s", ciphers); + return CURLE_SSL_CIPHER; } #ifdef USE_TLS_SRP @@ -1616,11 +1893,11 @@ ossl_connect_step1(struct connectdata *conn, /* give application a chance to interfere with SSL set up. */ if(data->set.ssl.fsslctx) { - retcode = (*data->set.ssl.fsslctx)(data, connssl->ctx, - data->set.ssl.fsslctxp); - if(retcode) { + result = (*data->set.ssl.fsslctx)(data, connssl->ctx, + data->set.ssl.fsslctxp); + if(result) { failf(data,"error signaled by ssl ctx callback"); - return retcode; + return result; } } @@ -1667,16 +1944,15 @@ ossl_connect_step1(struct connectdata *conn, } connssl->connecting_state = ssl_connect_2; + return CURLE_OK; } -static CURLcode -ossl_connect_step2(struct connectdata *conn, int sockindex) +static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex) { struct SessionHandle *data = conn->data; int err; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - DEBUGASSERT(ssl_connect_2 == connssl->connecting_state || ssl_connect_2_reading == connssl->connecting_state || ssl_connect_2_writing == connssl->connecting_state); @@ -1704,7 +1980,7 @@ ossl_connect_step2(struct connectdata *conn, int sockindex) unsigned long errdetail; char error_buffer[256]; /* OpenSSL documents that this must be at least 256 bytes long. */ - CURLcode rc; + CURLcode result; const char *cert_problem = NULL; long lerr; @@ -1728,7 +2004,7 @@ ossl_connect_step2(struct connectdata *conn, int sockindex) SSL routines: SSL3_GET_SERVER_CERTIFICATE: certificate verify failed */ - rc = CURLE_SSL_CACERT; + result = CURLE_SSL_CACERT; lerr = SSL_get_verify_result(connssl->handle); if(lerr != X509_V_OK) { @@ -1742,7 +2018,7 @@ ossl_connect_step2(struct connectdata *conn, int sockindex) break; default: - rc = CURLE_SSL_CONNECT_ERROR; + result = CURLE_SSL_CONNECT_ERROR; SSL_strerror(errdetail, error_buffer, sizeof(error_buffer)); break; } @@ -1753,15 +2029,16 @@ ossl_connect_step2(struct connectdata *conn, int sockindex) * (RST connection etc.), OpenSSL gives no explanation whatsoever and * the SO_ERROR is also lost. */ - if(CURLE_SSL_CONNECT_ERROR == rc && errdetail == 0) { + if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) { failf(data, "Unknown SSL protocol error in connection to %s:%ld ", - conn->host.name, conn->port); - return rc; + conn->host.name, conn->remote_port); + return result; } - /* Could be a CERT problem */ + /* Could be a CERT problem */ failf(data, "%s%s", cert_problem ? cert_problem : "", error_buffer); - return rc; + + return result; } } else { @@ -1769,8 +2046,36 @@ ossl_connect_step2(struct connectdata *conn, int sockindex) connssl->connecting_state = ssl_connect_3; /* Informational message */ - infof (data, "SSL connection using %s\n", - SSL_get_cipher(connssl->handle)); + infof(data, "SSL connection using %s / %s\n", + get_ssl_version_txt(SSL_get_session(connssl->handle)), + SSL_get_cipher(connssl->handle)); + +#ifdef HAS_ALPN + /* Sets data and len to negotiated protocol, len is 0 if no protocol was + * negotiated + */ + if(data->set.ssl_enable_alpn) { + const unsigned char* neg_protocol; + unsigned int len; + SSL_get0_alpn_selected(connssl->handle, &neg_protocol, &len); + if(len != 0) { + infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol); + + if(len == NGHTTP2_PROTO_VERSION_ID_LEN && + memcmp(NGHTTP2_PROTO_VERSION_ID, neg_protocol, len) == 0) { + conn->negnpn = NPN_HTTP2; + } + else if(len == + ALPN_HTTP_1_1_LENGTH && memcmp(ALPN_HTTP_1_1, + neg_protocol, + ALPN_HTTP_1_1_LENGTH) == 0) { + conn->negnpn = NPN_HTTP1_1; + } + } + else if(connssl->asked_for_h2) + infof(data, "ALPN, server did not agree to a protocol\n"); + } +#endif return CURLE_OK; } @@ -1821,7 +2126,7 @@ static void pubkey_show(struct SessionHandle *data, #define print_pubkey_BN(_type, _name, _num) \ do { \ - if(pubkey->pkey._type->_name != NULL) { \ + if(pubkey->pkey._type->_name) { \ int len = BN_num_bytes(pubkey->pkey._type->_name); \ if(len < CERTBUFFERSIZE) { \ BN_bn2bin(pubkey->pkey._type->_name, (unsigned char*)bufp); \ @@ -1875,7 +2180,7 @@ static int X509V3_ext(struct SessionHandle *data, sep=", "; j++; /* skip the newline */ }; - while((biomem->data[j] == ' ') && (j<(size_t)biomem->length)) + while((j<(size_t)biomem->length) && (biomem->data[j] == ' ')) j++; if(j<(size_t)biomem->length) ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep, @@ -1899,6 +2204,7 @@ static void X509_signature(struct SessionHandle *data, char buf[1024]; char *ptr = buf; int i; + for(i=0; ilength; i++) ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%02x:", sig->data[i]); @@ -1917,13 +2223,10 @@ static void dumpcert(struct SessionHandle *data, X509 *x, int numcert) BIO_get_mem_ptr(bio_out, &biomem); - infof(data, "%s\n", biomem->data); - Curl_ssl_push_certinfo_len(data, numcert, "Cert", biomem->data, biomem->length); BIO_free(bio_out); - } /* @@ -1937,6 +2240,7 @@ static CURLcode get_cert_chain(struct connectdata *conn, struct ssl_connect_data *connssl) { + CURLcode result; STACK_OF(X509) *sk; int i; char *bufp; @@ -1954,9 +2258,11 @@ static CURLcode get_cert_chain(struct connectdata *conn, } numcerts = sk_X509_num(sk); - if(Curl_ssl_init_certinfo(data, numcerts)) { + + result = Curl_ssl_init_certinfo(data, numcerts); + if(result) { free(bufp); - return CURLE_OUT_OF_MEMORY; + return result; } infof(data, "--- Certificate chain\n"); @@ -2098,6 +2404,65 @@ static CURLcode get_cert_chain(struct connectdata *conn, } /* + * Heavily modified from: + * https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#OpenSSL + */ +static CURLcode pkp_pin_peer_pubkey(X509* cert, const char *pinnedpubkey) +{ + /* Scratch */ + int len1 = 0, len2 = 0; + unsigned char *buff1 = NULL, *temp = NULL; + + /* Result is returned to caller */ + CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH; + + /* if a path wasn't specified, don't pin */ + if(!pinnedpubkey) + return CURLE_OK; + + if(!cert) + return result; + + do { + /* Begin Gyrations to get the subjectPublicKeyInfo */ + /* Thanks to Viktor Dukhovni on the OpenSSL mailing list */ + + /* http://groups.google.com/group/mailing.openssl.users/browse_thread + /thread/d61858dae102c6c7 */ + len1 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), NULL); + if(len1 < 1) + break; /* failed */ + + /* http://www.openssl.org/docs/crypto/buffer.html */ + buff1 = temp = OPENSSL_malloc(len1); + if(!buff1) + break; /* failed */ + + /* http://www.openssl.org/docs/crypto/d2i_X509.html */ + len2 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), &temp); + + /* + * These checks are verifying we got back the same values as when we + * sized the buffer.Its pretty weak since they should always be the + * same. But it gives us something to test. + */ + if((len1 != len2) || !temp || ((temp - buff1) != len1)) + break; /* failed */ + + /* End Gyrations */ + + /* The one good exit point */ + result = Curl_pin_peer_pubkey(pinnedpubkey, buff1, len1); + } while(0); + + /* http://www.openssl.org/docs/crypto/buffer.html */ + if(buff1) + OPENSSL_free(buff1); + + return result; +} + +/* * Get the server cert, verify it and show it etc, only call failf() if the * 'strict' argument is TRUE as otherwise all this is for informational * purposes only! @@ -2109,7 +2474,7 @@ static CURLcode servercert(struct connectdata *conn, struct ssl_connect_data *connssl, bool strict) { - CURLcode retcode = CURLE_OK; + CURLcode result = CURLE_OK; int rc; long lerr; ASN1_TIME *certdate; @@ -2117,20 +2482,20 @@ static CURLcode servercert(struct connectdata *conn, X509 *issuer; FILE *fp; char *buffer = data->state.buffer; + const char *ptr; if(data->set.ssl.certinfo) /* we've been asked to gather certificate info! */ (void)get_cert_chain(conn, connssl); - data->set.ssl.certverifyresult = !X509_V_OK; - connssl->server_cert = SSL_get_peer_certificate(connssl->handle); if(!connssl->server_cert) { if(strict) failf(data, "SSL: couldn't get peer certificate!"); return CURLE_PEER_FAILED_VERIFICATION; } - infof (data, "Server certificate:\n"); + + infof(data, "Server certificate:\n"); rc = x509_name_oneline(X509_get_subject_name(connssl->server_cert), buffer, BUFSIZE); @@ -2145,11 +2510,11 @@ static CURLcode servercert(struct connectdata *conn, infof(data, "\t expire date: %s\n", buffer); if(data->set.ssl.verifyhost) { - retcode = verifyhost(conn, connssl->server_cert); - if(retcode) { + result = verifyhost(conn, connssl->server_cert); + if(result) { X509_free(connssl->server_cert); connssl->server_cert = NULL; - return retcode; + return result; } } @@ -2158,7 +2523,7 @@ static CURLcode servercert(struct connectdata *conn, if(rc) { if(strict) failf(data, "SSL: couldn't get X509-issuer name!"); - retcode = CURLE_SSL_CONNECT_ERROR; + result = CURLE_SSL_CONNECT_ERROR; } else { infof(data, "\t issuer: %s\n", buffer); @@ -2168,7 +2533,7 @@ static CURLcode servercert(struct connectdata *conn, /* e.g. match issuer name with provided issuer certificate */ if(data->set.str[STRING_SSL_ISSUERCERT]) { - fp=fopen(data->set.str[STRING_SSL_ISSUERCERT],"r"); + fp = fopen(data->set.str[STRING_SSL_ISSUERCERT], "r"); if(!fp) { if(strict) failf(data, "SSL: Unable to open issuer cert (%s)", @@ -2177,7 +2542,8 @@ static CURLcode servercert(struct connectdata *conn, connssl->server_cert = NULL; return CURLE_SSL_ISSUER_ERROR; } - issuer = PEM_read_X509(fp,NULL,ZERO_NULL,NULL); + + issuer = PEM_read_X509(fp, NULL, ZERO_NULL, NULL); if(!issuer) { if(strict) failf(data, "SSL: Unable to read issuer cert (%s)", @@ -2187,7 +2553,9 @@ static CURLcode servercert(struct connectdata *conn, fclose(fp); return CURLE_SSL_ISSUER_ERROR; } + fclose(fp); + if(X509_check_issued(issuer,connssl->server_cert) != X509_V_OK) { if(strict) failf(data, "SSL: Certificate issuer check failed (%s)", @@ -2197,13 +2565,15 @@ static CURLcode servercert(struct connectdata *conn, connssl->server_cert = NULL; return CURLE_SSL_ISSUER_ERROR; } + infof(data, "\t SSL certificate issuer check ok (%s)\n", data->set.str[STRING_SSL_ISSUERCERT]); X509_free(issuer); } - lerr = data->set.ssl.certverifyresult= + lerr = data->set.ssl.certverifyresult = SSL_get_verify_result(connssl->handle); + if(data->set.ssl.certverifyresult != X509_V_OK) { if(data->set.ssl.verifypeer) { /* We probably never reach this, because SSL_connect() will fail @@ -2211,7 +2581,7 @@ static CURLcode servercert(struct connectdata *conn, if(strict) failf(data, "SSL certificate verify result: %s (%ld)", X509_verify_cert_error_string(lerr), lerr); - retcode = CURLE_PEER_FAILED_VERIFICATION; + result = CURLE_PEER_FAILED_VERIFICATION; } else infof(data, "\t SSL certificate verify result: %s (%ld)," @@ -2222,23 +2592,27 @@ static CURLcode servercert(struct connectdata *conn, infof(data, "\t SSL certificate verify ok.\n"); } + ptr = data->set.str[STRING_SSL_PINNEDPUBLICKEY]; + if(!result && ptr) { + result = pkp_pin_peer_pubkey(connssl->server_cert, ptr); + if(result) + failf(data, "SSL: public key does not match pinned public key!"); + } + X509_free(connssl->server_cert); connssl->server_cert = NULL; connssl->connecting_state = ssl_connect_done; - return retcode; + return result; } - -static CURLcode -ossl_connect_step3(struct connectdata *conn, - int sockindex) +static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex) { - CURLcode retcode = CURLE_OK; - void *old_ssl_sessionid=NULL; + CURLcode result = CURLE_OK; + void *old_ssl_sessionid = NULL; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; - int incache; + bool incache; SSL_SESSION *our_ssl_sessionid; DEBUGASSERT(ssl_connect_3 == connssl->connecting_state); @@ -2271,12 +2645,13 @@ ossl_connect_step3(struct connectdata *conn, incache = FALSE; } } + if(!incache) { - retcode = Curl_ssl_addsessionid(conn, our_ssl_sessionid, - 0 /* unknown size */); - if(retcode) { + result = Curl_ssl_addsessionid(conn, our_ssl_sessionid, + 0 /* unknown size */); + if(result) { failf(data, "failed to store ssl session"); - return retcode; + return result; } } #ifdef HAVE_SSL_GET1_SESSION @@ -2296,26 +2671,26 @@ ossl_connect_step3(struct connectdata *conn, * operations. */ - if(!data->set.ssl.verifypeer) + if(!data->set.ssl.verifypeer && !data->set.ssl.verifyhost) (void)servercert(conn, connssl, FALSE); else - retcode = servercert(conn, connssl, TRUE); + result = servercert(conn, connssl, TRUE); - if(CURLE_OK == retcode) + if(!result) connssl->connecting_state = ssl_connect_done; - return retcode; + + return result; } static Curl_recv ossl_recv; static Curl_send ossl_send; -static CURLcode -ossl_connect_common(struct connectdata *conn, - int sockindex, - bool nonblocking, - bool *done) +static CURLcode ossl_connect_common(struct connectdata *conn, + int sockindex, + bool nonblocking, + bool *done) { - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; curl_socket_t sockfd = conn->sock[sockindex]; @@ -2328,7 +2703,7 @@ ossl_connect_common(struct connectdata *conn, return CURLE_OK; } - if(ssl_connect_1==connssl->connecting_state) { + if(ssl_connect_1 == connssl->connecting_state) { /* Find out how much more time we're allowed */ timeout_ms = Curl_timeleft(data, NULL, TRUE); @@ -2337,9 +2712,10 @@ ossl_connect_common(struct connectdata *conn, failf(data, "SSL connection timeout"); return CURLE_OPERATION_TIMEDOUT; } - retcode = ossl_connect_step1(conn, sockindex); - if(retcode) - return retcode; + + result = ossl_connect_step1(conn, sockindex); + if(result) + return result; } while(ssl_connect_2 == connssl->connecting_state || @@ -2356,8 +2732,8 @@ ossl_connect_common(struct connectdata *conn, } /* if ssl is expecting something, check if it's available. */ - if(connssl->connecting_state == ssl_connect_2_reading - || connssl->connecting_state == ssl_connect_2_writing) { + if(connssl->connecting_state == ssl_connect_2_reading || + connssl->connecting_state == ssl_connect_2_writing) { curl_socket_t writefd = ssl_connect_2_writing== connssl->connecting_state?sockfd:CURL_SOCKET_BAD; @@ -2390,23 +2766,22 @@ ossl_connect_common(struct connectdata *conn, * before step2 has completed while ensuring that a client using select() * or epoll() will always have a valid fdset to wait on. */ - retcode = ossl_connect_step2(conn, sockindex); - if(retcode || (nonblocking && - (ssl_connect_2 == connssl->connecting_state || - ssl_connect_2_reading == connssl->connecting_state || - ssl_connect_2_writing == connssl->connecting_state))) - return retcode; + result = ossl_connect_step2(conn, sockindex); + if(result || (nonblocking && + (ssl_connect_2 == connssl->connecting_state || + ssl_connect_2_reading == connssl->connecting_state || + ssl_connect_2_writing == connssl->connecting_state))) + return result; } /* repeat step2 until all transactions are done. */ - - if(ssl_connect_3==connssl->connecting_state) { - retcode = ossl_connect_step3(conn, sockindex); - if(retcode) - return retcode; + if(ssl_connect_3 == connssl->connecting_state) { + result = ossl_connect_step3(conn, sockindex); + if(result) + return result; } - if(ssl_connect_done==connssl->connecting_state) { + if(ssl_connect_done == connssl->connecting_state) { connssl->state = ssl_connection_complete; conn->recv[sockindex] = ossl_recv; conn->send[sockindex] = ossl_send; @@ -2421,32 +2796,28 @@ ossl_connect_common(struct connectdata *conn, return CURLE_OK; } -CURLcode -Curl_ossl_connect_nonblocking(struct connectdata *conn, - int sockindex, - bool *done) +CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn, + int sockindex, + bool *done) { return ossl_connect_common(conn, sockindex, TRUE, done); } -CURLcode -Curl_ossl_connect(struct connectdata *conn, - int sockindex) +CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = ossl_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + result = ossl_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; DEBUGASSERT(done); return CURLE_OK; } -bool Curl_ossl_data_pending(const struct connectdata *conn, - int connindex) +bool Curl_ossl_data_pending(const struct connectdata *conn, int connindex) { if(conn->ssl[connindex].handle) /* SSL is in use */ @@ -2505,6 +2876,7 @@ static ssize_t ossl_send(struct connectdata *conn, *curlcode = CURLE_SEND_ERROR; return -1; } + *curlcode = CURLE_OK; return (ssize_t)rc; /* number of bytes */ } @@ -2566,8 +2938,9 @@ size_t Curl_ossl_version(char *buffer, size_t size) #if(SSLEAY_VERSION_NUMBER >= 0x905000) { - char sub[2]; + char sub[3]; unsigned long ssleay_value; + sub[2]='\0'; sub[1]='\0'; ssleay_value=SSLeay(); if(ssleay_value < 0x906000) { @@ -2576,14 +2949,31 @@ size_t Curl_ossl_version(char *buffer, size_t size) } else { if(ssleay_value&0xff0) { - sub[0]=(char)(((ssleay_value>>4)&0xff) + 'a' -1); + int minor_ver = (ssleay_value >> 4) & 0xff; + if(minor_ver > 26) { + /* handle extended version introduced for 0.9.8za */ + sub[1] = (char) ((minor_ver - 1) % 26 + 'a' + 1); + sub[0] = 'z'; + } + else { + sub[0]=(char)(((ssleay_value>>4)&0xff) + 'a' -1); + } } else sub[0]='\0'; } - return snprintf(buffer, size, "OpenSSL/%lx.%lx.%lx%s", - (ssleay_value>>28)&0xf, + return snprintf(buffer, size, "%s/%lx.%lx.%lx%s", +#ifdef OPENSSL_IS_BORINGSSL + "BoringSSL" +#else +#ifdef LIBRESSL_VERSION_NUMBER + "LibreSSL" +#else + "OpenSSL" +#endif +#endif + , (ssleay_value>>28)&0xf, (ssleay_value>>20)&0xff, (ssleay_value>>12)&0xff, sub); @@ -2618,11 +3008,14 @@ size_t Curl_ossl_version(char *buffer, size_t size) #endif /* YASSL_VERSION */ } -void Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy, - size_t length) +/* can be called with data == NULL */ +int Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy, + size_t length) { - Curl_ossl_seed(data); /* Initiate the seed if not already done */ + if(data) + Curl_ossl_seed(data); /* Initiate the seed if not already done */ RAND_bytes(entropy, curlx_uztosi(length)); + return 0; /* 0 as in no problem */ } void Curl_ossl_md5sum(unsigned char *tmp, /* input */ diff --git a/lib/ssluse.h b/lib/vtls/openssl.h similarity index 82% rename from lib/ssluse.h rename to lib/vtls/openssl.h index d6efcb2..9f5f3a2 100644 --- a/lib/ssluse.h +++ b/lib/vtls/openssl.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -26,7 +26,7 @@ #ifdef USE_SSLEAY /* - * This header should only be needed to get included by sslgen.c and ssluse.c + * This header should only be needed to get included by vtls.c and openssl.c */ #include "urldata.h" @@ -41,7 +41,7 @@ void Curl_ossl_close(struct connectdata *conn, int sockindex); /* tell OpenSSL to close down all open information regarding connections (and thus session ID caching etc) */ -int Curl_ossl_close_all(struct SessionHandle *data); +void Curl_ossl_close_all(struct SessionHandle *data); /* Sets an OpenSSL engine */ CURLcode Curl_ossl_set_engine(struct SessionHandle *data, const char *engine); @@ -61,21 +61,26 @@ void Curl_ossl_cleanup(void); size_t Curl_ossl_version(char *buffer, size_t size); int Curl_ossl_check_cxn(struct connectdata *cxn); -int Curl_ossl_seed(struct SessionHandle *data); - int Curl_ossl_shutdown(struct connectdata *conn, int sockindex); bool Curl_ossl_data_pending(const struct connectdata *conn, int connindex); -void Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy, - size_t length); + +/* return 0 if a find random is filled in */ +int Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy, + size_t length); void Curl_ossl_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum /* output */, size_t unused); -/* this backend provides these functions: */ -#define have_curlssl_random 1 -#define have_curlssl_md5sum 1 +/* this backend supports the CAPATH option */ +#define have_curlssl_ca_path 1 + +/* this backend supports CURLOPT_CERTINFO */ +#define have_curlssl_certinfo 1 + +/* this backend suppots CURLOPT_SSL_CTX_* */ +#define have_curlssl_ssl_ctx 1 /* API setup for OpenSSL */ #define curlssl_init Curl_ossl_init @@ -94,6 +99,9 @@ void Curl_ossl_md5sum(unsigned char *tmp, /* input */ #define curlssl_data_pending(x,y) Curl_ossl_data_pending(x,y) #define curlssl_random(x,y,z) Curl_ossl_random(x,y,z) #define curlssl_md5sum(a,b,c,d) Curl_ossl_md5sum(a,b,c,d) +#define CURL_SSL_BACKEND CURLSSLBACKEND_OPENSSL + +#define DEFAULT_CIPHER_SELECTION "ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4" #endif /* USE_SSLEAY */ #endif /* HEADER_CURL_SSLUSE_H */ diff --git a/lib/polarssl.c b/lib/vtls/polarssl.c similarity index 74% rename from lib/polarssl.c rename to lib/vtls/polarssl.c index 808f54c..05fcfc2 100644 --- a/lib/polarssl.c +++ b/lib/vtls/polarssl.c @@ -6,7 +6,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2010 - 2011, Hoi-Ho Chan, - * Copyright (C) 2012 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2014, 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 @@ -23,7 +23,7 @@ /* * Source file for all PolarSSL-specific code for the TLS/SSL layer. No code - * but sslgen.c should ever call or use these functions. + * but vtls.c should ever call or use these functions. * */ @@ -37,31 +37,19 @@ #include #include -#if POLARSSL_VERSION_NUMBER >= 0x01000000 -#include -#endif /* POLARSSL_VERSION_NUMBER >= 0x01000000 */ +#if POLARSSL_VERSION_NUMBER < 0x01030000 +#error too old PolarSSL +#endif -#if POLARSSL_VERSION_NUMBER>0x01010000 +#include #include #include -#else -#include -#endif /* POLARSSL_VERSION_NUMBER>0x01010000 */ - - -#if POLARSSL_VERSION_NUMBER<0x01000000 -/* - Earlier versions of polarssl had no WANT_READ or WANT_WRITE, only TRY_AGAIN -*/ -#define POLARSSL_ERR_NET_WANT_READ POLARSSL_ERR_NET_TRY_AGAIN -#define POLARSSL_ERR_NET_WANT_WRITE POLARSSL_ERR_NET_TRY_AGAIN -#endif #include "urldata.h" #include "sendf.h" #include "inet_pton.h" #include "polarssl.h" -#include "sslgen.h" +#include "vtls.h" #include "parsedate.h" #include "connect.h" /* for the connect timeout */ #include "select.h" @@ -79,7 +67,7 @@ #define THREADING_SUPPORT #endif -#if defined(THREADING_SUPPORT) && POLARSSL_VERSION_NUMBER>0x01010000 +#if defined(THREADING_SUPPORT) static entropy_context entropy; static int entropy_init_initialized = 0; @@ -110,13 +98,13 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len) } /* end of entropy_func_mutex() */ -#endif /* THREADING_SUPPORT && POLARSSL_VERSION_NUMBER>0x01010000 */ +#endif /* THREADING_SUPPORT */ /* Define this to enable lots of debugging for PolarSSL */ #undef POLARSSL_DEBUG #ifdef POLARSSL_DEBUG -static void polarssl_debug(void *context, int level, char *line) +static void polarssl_debug(void *context, int level, const char *line) { struct SessionHandle *data = NULL; @@ -125,11 +113,20 @@ static void polarssl_debug(void *context, int level, char *line) data = (struct SessionHandle *)context; - infof(data, "%s\n", line); + infof(data, "%s", line); + (void) level; } #else #endif +/* ALPN for http2? */ +#ifdef USE_NGHTTP2 +# undef HAS_ALPN +# ifdef POLARSSL_SSL_ALPN +# define HAS_ALPN +# endif +#endif + static Curl_recv polarssl_recv; static Curl_send polarssl_send; @@ -150,10 +147,8 @@ polarssl_connect_step1(struct connectdata *conn, #endif void *old_session = NULL; size_t old_session_size = 0; - char errorbuf[128]; - memset(errorbuf, 0, sizeof(errorbuf)); - + errorbuf[0]=0; /* PolarSSL only supports SSLv3 and TLSv1 */ if(data->set.ssl.version == CURL_SSLVERSION_SSLv2) { @@ -163,9 +158,6 @@ polarssl_connect_step1(struct connectdata *conn, else if(data->set.ssl.version == CURL_SSLVERSION_SSLv3) sni = FALSE; /* SSLv3 has no SNI */ -#if POLARSSL_VERSION_NUMBER<0x01010000 - havege_init(&connssl->hs); -#else #ifdef THREADING_SUPPORT entropy_init_mutex(&entropy); @@ -189,14 +181,13 @@ polarssl_connect_step1(struct connectdata *conn, -ret, errorbuf); } #endif /* THREADING_SUPPORT */ -#endif /* POLARSSL_VERSION_NUMBER<0x01010000 */ /* Load the trusted CA */ - memset(&connssl->cacert, 0, sizeof(x509_cert)); + memset(&connssl->cacert, 0, sizeof(x509_crt)); if(data->set.str[STRING_SSL_CAFILE]) { - ret = x509parse_crtfile(&connssl->cacert, - data->set.str[STRING_SSL_CAFILE]); + ret = x509_crt_parse_file(&connssl->cacert, + data->set.str[STRING_SSL_CAFILE]); if(ret<0) { #ifdef POLARSSL_ERROR_C @@ -210,12 +201,28 @@ polarssl_connect_step1(struct connectdata *conn, } } + if(data->set.str[STRING_SSL_CAPATH]) { + ret = x509_crt_parse_path(&connssl->cacert, + data->set.str[STRING_SSL_CAPATH]); + + if(ret<0) { +#ifdef POLARSSL_ERROR_C + error_strerror(ret, errorbuf, sizeof(errorbuf)); +#endif /* POLARSSL_ERROR_C */ + failf(data, "Error reading ca cert path %s - PolarSSL: (-0x%04X) %s", + data->set.str[STRING_SSL_CAPATH], -ret, errorbuf); + + if(data->set.ssl.verifypeer) + return CURLE_SSL_CACERT_BADFILE; + } + } + /* Load the client certificate */ - memset(&connssl->clicert, 0, sizeof(x509_cert)); + memset(&connssl->clicert, 0, sizeof(x509_crt)); if(data->set.str[STRING_CERT]) { - ret = x509parse_crtfile(&connssl->clicert, - data->set.str[STRING_CERT]); + ret = x509_crt_parse_file(&connssl->clicert, + data->set.str[STRING_CERT]); if(ret) { #ifdef POLARSSL_ERROR_C @@ -230,9 +237,17 @@ polarssl_connect_step1(struct connectdata *conn, /* Load the client private key */ if(data->set.str[STRING_KEY]) { - ret = x509parse_keyfile(&connssl->rsa, - data->set.str[STRING_KEY], - data->set.str[STRING_KEY_PASSWD]); + pk_context pk; + pk_init(&pk); + ret = pk_parse_keyfile(&pk, data->set.str[STRING_KEY], + data->set.str[STRING_KEY_PASSWD]); + if(ret == 0 && !pk_can_do(&pk, POLARSSL_PK_RSA)) + ret = POLARSSL_ERR_PK_TYPE_MISMATCH; + if(ret == 0) + rsa_copy(&connssl->rsa, pk_rsa(pk)); + else + rsa_free(&connssl->rsa); + pk_free(&pk); if(ret) { #ifdef POLARSSL_ERROR_C @@ -249,8 +264,8 @@ polarssl_connect_step1(struct connectdata *conn, memset(&connssl->crl, 0, sizeof(x509_crl)); if(data->set.str[STRING_SSL_CRLFILE]) { - ret = x509parse_crlfile(&connssl->crl, - data->set.str[STRING_SSL_CRLFILE]); + ret = x509_crl_parse_file(&connssl->crl, + data->set.str[STRING_SSL_CRLFILE]); if(ret) { #ifdef POLARSSL_ERROR_C @@ -271,48 +286,59 @@ polarssl_connect_step1(struct connectdata *conn, return CURLE_SSL_CONNECT_ERROR; } + switch(data->set.ssl.version) { + default: + case CURL_SSLVERSION_DEFAULT: + ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, + SSL_MINOR_VERSION_1); + break; + case CURL_SSLVERSION_SSLv3: + ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, + SSL_MINOR_VERSION_0); + infof(data, "PolarSSL: Forced min. SSL Version to be SSLv3\n"); + break; + case CURL_SSLVERSION_TLSv1_0: + ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, + SSL_MINOR_VERSION_1); + infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.0\n"); + break; + case CURL_SSLVERSION_TLSv1_1: + ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, + SSL_MINOR_VERSION_2); + infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.1\n"); + break; + case CURL_SSLVERSION_TLSv1_2: + ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, + SSL_MINOR_VERSION_3); + infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.2\n"); + break; + } + ssl_set_endpoint(&connssl->ssl, SSL_IS_CLIENT); ssl_set_authmode(&connssl->ssl, SSL_VERIFY_OPTIONAL); -#if POLARSSL_VERSION_NUMBER<0x01010000 - ssl_set_rng(&connssl->ssl, havege_rand, - &connssl->hs); -#else ssl_set_rng(&connssl->ssl, ctr_drbg_random, &connssl->ctr_drbg); -#endif /* POLARSSL_VERSION_NUMBER<0x01010000 */ ssl_set_bio(&connssl->ssl, net_recv, &conn->sock[sockindex], net_send, &conn->sock[sockindex]); - -#if POLARSSL_VERSION_NUMBER<0x01000000 - ssl_set_ciphers(&connssl->ssl, ssl_default_ciphers); -#else - ssl_set_ciphersuites(&connssl->ssl, ssl_default_ciphersuites); -#endif + ssl_set_ciphersuites(&connssl->ssl, ssl_list_ciphersuites()); if(!Curl_ssl_getsessionid(conn, &old_session, &old_session_size)) { memcpy(&connssl->ssn, old_session, old_session_size); infof(data, "PolarSSL re-using session\n"); } -/* PolarSSL SVN revision r1316 to r1317, matching <1.2.0 is to cover Ubuntu's - 1.1.4 version and the like */ -#if POLARSSL_VERSION_NUMBER<0x01020000 - ssl_set_session(&connssl->ssl, 1, 600, - &connssl->ssn); -#else ssl_set_session(&connssl->ssl, &connssl->ssn); -#endif ssl_set_ca_chain(&connssl->ssl, &connssl->cacert, &connssl->crl, conn->host.name); - ssl_set_own_cert(&connssl->ssl, - &connssl->clicert, &connssl->rsa); + ssl_set_own_cert_rsa(&connssl->ssl, + &connssl->clicert, &connssl->rsa); if(!Curl_inet_pton(AF_INET, conn->host.name, &addr) && #ifdef ENABLE_IPV6 @@ -323,6 +349,20 @@ polarssl_connect_step1(struct connectdata *conn, "server name indication (SNI) TLS extension\n"); } +#ifdef HAS_ALPN + if(data->set.httpversion == CURL_HTTP_VERSION_2_0) { + if(data->set.ssl_enable_alpn) { + static const char* protocols[] = { + NGHTTP2_PROTO_VERSION_ID, ALPN_HTTP_1_1, NULL + }; + ssl_set_alpn_protocols(&connssl->ssl, protocols); + infof(data, "ALPN, offering %s, %s\n", protocols[0], + protocols[1]); + connssl->asked_for_h2 = TRUE; + } + } +#endif + #ifdef POLARSSL_DEBUG ssl_set_dbg(&connssl->ssl, polarssl_debug, data); #endif @@ -341,8 +381,12 @@ polarssl_connect_step2(struct connectdata *conn, struct ssl_connect_data* connssl = &conn->ssl[sockindex]; char buffer[1024]; +#ifdef HAS_ALPN + const char* next_protocol; +#endif + char errorbuf[128]; - memset(errorbuf, 0, sizeof(errorbuf)); + errorbuf[0] = 0; conn->recv[sockindex] = polarssl_recv; conn->send[sockindex] = polarssl_send; @@ -376,13 +420,7 @@ polarssl_connect_step2(struct connectdata *conn, } infof(data, "PolarSSL: Handshake complete, cipher is %s\n", -#if POLARSSL_VERSION_NUMBER<0x01000000 - ssl_get_cipher(&conn->ssl[sockindex].ssl) -#elif POLARSSL_VERSION_NUMBER >= 0x01010000 ssl_get_ciphersuite(&conn->ssl[sockindex].ssl) -#else - ssl_get_ciphersuite_name(&conn->ssl[sockindex].ssl) -#endif ); ret = ssl_get_verify_result(&conn->ssl[sockindex].ssl); @@ -405,28 +443,36 @@ polarssl_connect_step2(struct connectdata *conn, return CURLE_PEER_FAILED_VERIFICATION; } -/* PolarSSL SVN revision r1316 to r1317, matching <1.2.0 is to cover Ubuntu's - 1.1.4 version and the like */ -#if POLARSSL_VERSION_NUMBER<0x01020000 - if(conn->ssl[sockindex].ssl.peer_cert) { -#else if(ssl_get_peer_cert(&(connssl->ssl))) { -#endif /* If the session was resumed, there will be no peer certs */ memset(buffer, 0, sizeof(buffer)); -/* PolarSSL SVN revision r1316 to r1317, matching <1.2.0 is to cover Ubuntu's - 1.1.4 version and the like */ -#if POLARSSL_VERSION_NUMBER<0x01020000 - if(x509parse_cert_info(buffer, sizeof(buffer), (char *)"* ", - conn->ssl[sockindex].ssl.peer_cert) != -1) -#else - if(x509parse_cert_info(buffer, sizeof(buffer), (char *)"* ", - ssl_get_peer_cert(&(connssl->ssl))) != -1) -#endif + if(x509_crt_info(buffer, sizeof(buffer), (char *)"* ", + ssl_get_peer_cert(&(connssl->ssl))) != -1) infof(data, "Dumping cert info:\n%s\n", buffer); } +#ifdef HAS_ALPN + if(data->set.ssl_enable_alpn) { + next_protocol = ssl_get_alpn_protocol(&connssl->ssl); + + if(next_protocol != NULL) { + infof(data, "ALPN, server accepted to use %s\n", next_protocol); + + if(strncmp(next_protocol, NGHTTP2_PROTO_VERSION_ID, + NGHTTP2_PROTO_VERSION_ID_LEN)) { + conn->negnpn = NPN_HTTP2; + } + else if(strncmp(next_protocol, ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH)) { + conn->negnpn = NPN_HTTP1_1; + } + } + else if(connssl->asked_for_h2) { + infof(data, "ALPN, server did not agree to a protocol\n"); + } + } +#endif + connssl->connecting_state = ssl_connect_3; infof(data, "SSL connected\n"); @@ -437,12 +483,12 @@ static CURLcode polarssl_connect_step3(struct connectdata *conn, int sockindex) { - CURLcode retcode = CURLE_OK; + CURLcode result = CURLE_OK; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; struct SessionHandle *data = conn->data; void *old_ssl_sessionid = NULL; ssl_session *our_ssl_sessionid = &conn->ssl[sockindex].ssn ; - int incache; + bool incache; DEBUGASSERT(ssl_connect_3 == connssl->connecting_state); @@ -455,23 +501,21 @@ polarssl_connect_step3(struct connectdata *conn, incache = FALSE; } } + if(!incache) { void *new_session = malloc(sizeof(ssl_session)); if(new_session) { - memcpy(new_session, our_ssl_sessionid, - sizeof(ssl_session)); + memcpy(new_session, our_ssl_sessionid, sizeof(ssl_session)); - retcode = Curl_ssl_addsessionid(conn, new_session, - sizeof(ssl_session)); - } - else { - retcode = CURLE_OUT_OF_MEMORY; + result = Curl_ssl_addsessionid(conn, new_session, sizeof(ssl_session)); } + else + result = CURLE_OUT_OF_MEMORY; - if(retcode) { + if(result) { failf(data, "failed to store ssl session"); - return retcode; + return result; } } @@ -508,8 +552,8 @@ void Curl_polarssl_close_all(struct SessionHandle *data) void Curl_polarssl_close(struct connectdata *conn, int sockindex) { rsa_free(&conn->ssl[sockindex].rsa); - x509_free(&conn->ssl[sockindex].clicert); - x509_free(&conn->ssl[sockindex].cacert); + x509_crt_free(&conn->ssl[sockindex].clicert); + x509_crt_free(&conn->ssl[sockindex].cacert); x509_crl_free(&conn->ssl[sockindex].crl); ssl_free(&conn->ssl[sockindex].ssl); } @@ -558,7 +602,7 @@ polarssl_connect_common(struct connectdata *conn, bool nonblocking, bool *done) { - CURLcode retcode; + CURLcode result; struct SessionHandle *data = conn->data; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; curl_socket_t sockfd = conn->sock[sockindex]; @@ -571,7 +615,7 @@ polarssl_connect_common(struct connectdata *conn, return CURLE_OK; } - if(ssl_connect_1==connssl->connecting_state) { + if(ssl_connect_1 == connssl->connecting_state) { /* Find out how much more time we're allowed */ timeout_ms = Curl_timeleft(data, NULL, TRUE); @@ -580,9 +624,10 @@ polarssl_connect_common(struct connectdata *conn, failf(data, "SSL connection timeout"); return CURLE_OPERATION_TIMEDOUT; } - retcode = polarssl_connect_step1(conn, sockindex); - if(retcode) - return retcode; + + result = polarssl_connect_step1(conn, sockindex); + if(result) + return result; } while(ssl_connect_2 == connssl->connecting_state || @@ -599,8 +644,8 @@ polarssl_connect_common(struct connectdata *conn, } /* if ssl is expecting something, check if it's available. */ - if(connssl->connecting_state == ssl_connect_2_reading - || connssl->connecting_state == ssl_connect_2_writing) { + if(connssl->connecting_state == ssl_connect_2_reading || + connssl->connecting_state == ssl_connect_2_writing) { curl_socket_t writefd = ssl_connect_2_writing== connssl->connecting_state?sockfd:CURL_SOCKET_BAD; @@ -634,22 +679,22 @@ polarssl_connect_common(struct connectdata *conn, * ensuring that a client using select() or epoll() will always * have a valid fdset to wait on. */ - retcode = polarssl_connect_step2(conn, sockindex); - if(retcode || (nonblocking && - (ssl_connect_2 == connssl->connecting_state || - ssl_connect_2_reading == connssl->connecting_state || - ssl_connect_2_writing == connssl->connecting_state))) - return retcode; + result = polarssl_connect_step2(conn, sockindex); + if(result || (nonblocking && + (ssl_connect_2 == connssl->connecting_state || + ssl_connect_2_reading == connssl->connecting_state || + ssl_connect_2_writing == connssl->connecting_state))) + return result; } /* repeat step2 until all transactions are done. */ - if(ssl_connect_3==connssl->connecting_state) { - retcode = polarssl_connect_step3(conn, sockindex); - if(retcode) - return retcode; + if(ssl_connect_3 == connssl->connecting_state) { + result = polarssl_connect_step3(conn, sockindex); + if(result) + return result; } - if(ssl_connect_done==connssl->connecting_state) { + if(ssl_connect_done == connssl->connecting_state) { connssl->state = ssl_connection_complete; conn->recv[sockindex] = polarssl_recv; conn->send[sockindex] = polarssl_send; @@ -677,12 +722,12 @@ CURLcode Curl_polarssl_connect(struct connectdata *conn, int sockindex) { - CURLcode retcode; + CURLcode result; bool done = FALSE; - retcode = polarssl_connect_common(conn, sockindex, FALSE, &done); - if(retcode) - return retcode; + result = polarssl_connect_common(conn, sockindex, FALSE, &done); + if(result) + return result; DEBUGASSERT(done); diff --git a/lib/polarssl.h b/lib/vtls/polarssl.h similarity index 77% rename from lib/polarssl.h rename to lib/vtls/polarssl.h index af3b28b..57dfb67 100644 --- a/lib/polarssl.h +++ b/lib/vtls/polarssl.h @@ -8,6 +8,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2010, Hoi-Ho Chan, + * Copyright (C) 2012 - 2014, 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 @@ -47,6 +48,9 @@ void Curl_polarssl_session_free(void *ptr); size_t Curl_polarssl_version(char *buffer, size_t size); int Curl_polarssl_shutdown(struct connectdata *conn, int sockindex); +/* this backend supports the CAPATH option */ +#define have_curlssl_ca_path 1 + /* API setup for PolarSSL */ #define curlssl_init() polarssl_init() #define curlssl_cleanup() polarssl_cleanup() @@ -56,12 +60,18 @@ int Curl_polarssl_shutdown(struct connectdata *conn, int sockindex); #define curlssl_close_all Curl_polarssl_close_all #define curlssl_close Curl_polarssl_close #define curlssl_shutdown(x,y) 0 -#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN) -#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN) -#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL) +#define curlssl_set_engine(x,y) ((void)x, (void)y, CURLE_NOT_BUILT_IN) +#define curlssl_set_engine_default(x) ((void)x, CURLE_NOT_BUILT_IN) +#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL) #define curlssl_version Curl_polarssl_version -#define curlssl_check_cxn(x) (x=x, -1) -#define curlssl_data_pending(x,y) (x=x, y=y, 0) +#define curlssl_check_cxn(x) ((void)x, -1) +#define curlssl_data_pending(x,y) ((void)x, (void)y, 0) +#define CURL_SSL_BACKEND CURLSSLBACKEND_POLARSSL + +/* This might cause libcurl to use a weeker random! + TODO: implement proper use of Polarssl's CTR-DRBG or HMAC-DRBG and use that +*/ +#define curlssl_random(x,y,z) ((void)x, (void)y, (void)z, CURLE_NOT_BUILT_IN) #endif /* USE_POLARSSL */ #endif /* HEADER_CURL_POLARSSL_H */ diff --git a/lib/polarssl_threadlock.c b/lib/vtls/polarssl_threadlock.c similarity index 100% rename from lib/polarssl_threadlock.c rename to lib/vtls/polarssl_threadlock.c diff --git a/lib/polarssl_threadlock.h b/lib/vtls/polarssl_threadlock.h similarity index 100% rename from lib/polarssl_threadlock.h rename to lib/vtls/polarssl_threadlock.h diff --git a/lib/sslgen.c b/lib/vtls/vtls.c similarity index 73% rename from lib/sslgen.c rename to lib/vtls/vtls.c index d2d0e30..a53ff4a 100644 --- a/lib/sslgen.c +++ b/lib/vtls/vtls.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,7 +31,6 @@ Curl_ossl_ - prefix for OpenSSL ones Curl_gtls_ - prefix for GnuTLS ones Curl_nss_ - prefix for NSS ones - Curl_qssl_ - prefix for QsoSSL ones Curl_gskit_ - prefix for GSKit ones Curl_polarssl_ - prefix for PolarSSL ones Curl_cyassl_ - prefix for CyaSSL ones @@ -58,18 +57,8 @@ #endif #include "urldata.h" -#define SSLGEN_C -#include "sslgen.h" /* generic SSL protos etc */ -#include "ssluse.h" /* OpenSSL versions */ -#include "gtls.h" /* GnuTLS versions */ -#include "nssg.h" /* NSS versions */ -#include "qssl.h" /* QSOSSL versions */ -#include "gskit.h" /* Global Secure ToolKit versions */ -#include "polarssl.h" /* PolarSSL versions */ -#include "axtls.h" /* axTLS versions */ -#include "cyassl.h" /* CyaSSL versions */ -#include "curl_schannel.h" /* Schannel SSPI version */ -#include "curl_darwinssl.h" /* SecureTransport (Darwin) version */ + +#include "vtls.h" /* generic SSL protos etc */ #include "slist.h" #include "sendf.h" #include "rawstr.h" @@ -78,6 +67,9 @@ #include "progress.h" #include "share.h" #include "timeval.h" +#include "curl_md5.h" +#include "warnless.h" +#include "curl_base64.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -193,19 +185,33 @@ void Curl_free_ssl_config(struct ssl_config_data* sslc) unsigned int Curl_rand(struct SessionHandle *data) { - unsigned int r; + unsigned int r = 0; static unsigned int randseed; static bool seeded = FALSE; -#ifndef have_curlssl_random - (void)data; -#else - if(data) { - Curl_ssl_random(data, (unsigned char *)&r, sizeof(r)); - return r; +#ifdef CURLDEBUG + char *force_entropy = getenv("CURL_ENTROPY"); + if(force_entropy) { + if(!seeded) { + size_t elen = strlen(force_entropy); + size_t clen = sizeof(randseed); + size_t min = elen < clen ? elen : clen; + memcpy((char *)&randseed, force_entropy, min); + seeded = TRUE; + } + else + randseed++; + return randseed; } #endif + /* data may be NULL! */ + if(!Curl_ssl_random(data, (unsigned char *)&r, sizeof(r))) + return r; + + /* If Curl_ssl_random() returns non-zero it couldn't offer randomness and we + instead perform a "best effort" */ + #ifdef RANDOM_FILE if(!seeded) { /* if there's a random file to read a seed from, use it */ @@ -222,6 +228,7 @@ unsigned int Curl_rand(struct SessionHandle *data) if(!seeded) { struct timeval now = curlx_tvnow(); + infof(data, "WARNING: Using weak random seed\n"); randseed += (unsigned int)now.tv_usec + (unsigned int)now.tv_sec; randseed = randseed * 1103515245 + 12345; randseed = randseed * 1103515245 + 12345; @@ -234,6 +241,11 @@ unsigned int Curl_rand(struct SessionHandle *data) return (r << 16) | ((r >> 16) & 0xFFFF); } +int Curl_ssl_backend(void) +{ + return (int)CURL_SSL_BACKEND; +} + #ifdef USE_SSL /* "global" init done? */ @@ -269,44 +281,44 @@ void Curl_ssl_cleanup(void) CURLcode Curl_ssl_connect(struct connectdata *conn, int sockindex) { - CURLcode res; + CURLcode result; /* mark this is being ssl-enabled from here on. */ conn->ssl[sockindex].use = TRUE; conn->ssl[sockindex].state = ssl_connection_negotiating; - res = curlssl_connect(conn, sockindex); + result = curlssl_connect(conn, sockindex); - if(!res) + if(!result) Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSL is connected */ - return res; + return result; } CURLcode Curl_ssl_connect_nonblocking(struct connectdata *conn, int sockindex, bool *done) { - CURLcode res; + CURLcode result; /* mark this is being ssl requested from here on. */ conn->ssl[sockindex].use = TRUE; #ifdef curlssl_connect_nonblocking - res = curlssl_connect_nonblocking(conn, sockindex, done); + result = curlssl_connect_nonblocking(conn, sockindex, done); #else *done = TRUE; /* fallback to BLOCKING */ - res = curlssl_connect(conn, sockindex); + result = curlssl_connect(conn, sockindex); #endif /* non-blocking connect support */ - if(!res && *done) + if(!result && *done) Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSL is connected */ - return res; + return result; } /* * Check if there's a session ID for the given connection in the cache, and if * there's one suitable, it is provided. Returns TRUE when no entry matched. */ -int Curl_ssl_getsessionid(struct connectdata *conn, - void **ssl_sessionid, - size_t *idsize) /* set 0 if unknown */ +bool Curl_ssl_getsessionid(struct connectdata *conn, + void **ssl_sessionid, + size_t *idsize) /* set 0 if unknown */ { struct curl_ssl_session *check; struct SessionHandle *data = conn->data; @@ -581,36 +593,42 @@ void Curl_ssl_free_certinfo(struct SessionHandle *data) { int i; struct curl_certinfo *ci = &data->info.certs; + if(ci->num_of_certs) { /* free all individual lists used */ for(i=0; inum_of_certs; i++) { curl_slist_free_all(ci->certinfo[i]); ci->certinfo[i] = NULL; } + free(ci->certinfo); /* free the actual array too */ ci->certinfo = NULL; ci->num_of_certs = 0; } } -int Curl_ssl_init_certinfo(struct SessionHandle * data, - int num) +CURLcode Curl_ssl_init_certinfo(struct SessionHandle *data, int num) { - struct curl_certinfo * ci = &data->info.certs; - struct curl_slist * * table; + struct curl_certinfo *ci = &data->info.certs; + struct curl_slist **table; - /* Initialize the certificate information structures. Return 0 if OK, else 1. - */ + /* Free any previous certificate information structures */ Curl_ssl_free_certinfo(data); - ci->num_of_certs = num; + + /* Allocate the required certificate information structures */ table = calloc((size_t) num, sizeof(struct curl_slist *)); if(!table) - return 1; + return CURLE_OUT_OF_MEMORY; + ci->num_of_certs = num; ci->certinfo = table; - return 0; + + return CURLE_OK; } +/* + * 'value' is NOT a zero terminated string + */ CURLcode Curl_ssl_push_certinfo_len(struct SessionHandle *data, int certnum, const char *label, @@ -620,22 +638,32 @@ CURLcode Curl_ssl_push_certinfo_len(struct SessionHandle *data, struct curl_certinfo * ci = &data->info.certs; char * output; struct curl_slist * nl; - CURLcode res = CURLE_OK; + CURLcode result = CURLE_OK; + size_t labellen = strlen(label); + size_t outlen = labellen + 1 + valuelen + 1; /* label:value\0 */ - /* Add an information record for a particular certificate. */ - output = curl_maprintf("%s:%.*s", label, valuelen, value); + output = malloc(outlen); if(!output) return CURLE_OUT_OF_MEMORY; + /* sprintf the label and colon */ + snprintf(output, outlen, "%s:", label); + + /* memcpy the value (it might not be zero terminated) */ + memcpy(&output[labellen+1], value, valuelen); + + /* zero terminate the output */ + output[labellen + 1 + valuelen] = 0; + nl = Curl_slist_append_nodup(ci->certinfo[certnum], output); if(!nl) { free(output); curl_slist_free_all(ci->certinfo[certnum]); - res = CURLE_OUT_OF_MEMORY; + result = CURLE_OUT_OF_MEMORY; } ci->certinfo[certnum] = nl; - return res; + return result; } /* @@ -652,25 +680,172 @@ CURLcode Curl_ssl_push_certinfo(struct SessionHandle *data, return Curl_ssl_push_certinfo_len(data, certnum, label, value, valuelen); } -/* these functions are only provided by some SSL backends */ - -#ifdef have_curlssl_random -void Curl_ssl_random(struct SessionHandle *data, +int Curl_ssl_random(struct SessionHandle *data, unsigned char *entropy, size_t length) { - curlssl_random(data, entropy, length); + return curlssl_random(data, entropy, length); +} + +/* + * Public key pem to der conversion + */ + +static CURLcode pubkey_pem_to_der(const char *pem, + unsigned char **der, size_t *der_len) +{ + char *stripped_pem, *begin_pos, *end_pos; + size_t pem_count, stripped_pem_count = 0, pem_len; + CURLcode result; + + /* if no pem, exit. */ + if(!pem) + return CURLE_BAD_CONTENT_ENCODING; + + begin_pos = strstr(pem, "-----BEGIN PUBLIC KEY-----"); + if(!begin_pos) + return CURLE_BAD_CONTENT_ENCODING; + + pem_count = begin_pos - pem; + /* Invalid if not at beginning AND not directly following \n */ + if(0 != pem_count && '\n' != pem[pem_count - 1]) + return CURLE_BAD_CONTENT_ENCODING; + + /* 26 is length of "-----BEGIN PUBLIC KEY-----" */ + pem_count += 26; + + /* Invalid if not directly following \n */ + end_pos = strstr(pem + pem_count, "\n-----END PUBLIC KEY-----"); + if(!end_pos) + return CURLE_BAD_CONTENT_ENCODING; + + pem_len = end_pos - pem; + + stripped_pem = malloc(pem_len - pem_count + 1); + if(!stripped_pem) + return CURLE_OUT_OF_MEMORY; + + /* + * Here we loop through the pem array one character at a time between the + * correct indices, and place each character that is not '\n' or '\r' + * into the stripped_pem array, which should represent the raw base64 string + */ + while(pem_count < pem_len) { + if('\n' != pem[pem_count] && '\r' != pem[pem_count]) + stripped_pem[stripped_pem_count++] = pem[pem_count]; + ++pem_count; + } + /* Place the null terminator in the correct place */ + stripped_pem[stripped_pem_count] = '\0'; + + result = Curl_base64_decode(stripped_pem, der, der_len); + + Curl_safefree(stripped_pem); + + return result; +} + +/* + * Generic pinned public key check. + */ + +CURLcode Curl_pin_peer_pubkey(const char *pinnedpubkey, + const unsigned char *pubkey, size_t pubkeylen) +{ + FILE *fp; + unsigned char *buf = NULL, *pem_ptr = NULL; + long filesize; + size_t size, pem_len; + CURLcode pem_read; + CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH; + + /* if a path wasn't specified, don't pin */ + if(!pinnedpubkey) + return CURLE_OK; + if(!pubkey || !pubkeylen) + return result; + fp = fopen(pinnedpubkey, "rb"); + if(!fp) + return result; + + do { + /* Determine the file's size */ + if(fseek(fp, 0, SEEK_END)) + break; + filesize = ftell(fp); + if(fseek(fp, 0, SEEK_SET)) + break; + if(filesize < 0 || filesize > MAX_PINNED_PUBKEY_SIZE) + break; + + /* + * if the size of our certificate is bigger than the file + * size then it can't match + */ + size = curlx_sotouz((curl_off_t) filesize); + if(pubkeylen > size) + break; + + /* + * Allocate buffer for the pinned key + * With 1 additional byte for null terminator in case of PEM key + */ + buf = malloc(size + 1); + if(!buf) + break; + + /* Returns number of elements read, which should be 1 */ + if((int) fread(buf, size, 1, fp) != 1) + break; + + /* If the sizes are the same, it can't be base64 encoded, must be der */ + if(pubkeylen == size) { + if(!memcmp(pubkey, buf, pubkeylen)) + result = CURLE_OK; + break; + } + + /* + * Otherwise we will assume it's PEM and try to decode it + * after placing null terminator + */ + buf[size] = '\0'; + pem_read = pubkey_pem_to_der((const char *)buf, &pem_ptr, &pem_len); + /* if it wasn't read successfully, exit */ + if(pem_read) + break; + + /* + * if the size of our certificate doesn't match the size of + * the decoded file, they can't be the same, otherwise compare + */ + if(pubkeylen == pem_len && !memcmp(pubkey, pem_ptr, pubkeylen)) + result = CURLE_OK; + } while(0); + + Curl_safefree(buf); + Curl_safefree(pem_ptr); + fclose(fp); + + return result; } -#endif -#ifdef have_curlssl_md5sum void Curl_ssl_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum, /* output */ size_t md5len) { +#ifdef curlssl_md5sum curlssl_md5sum(tmp, tmplen, md5sum, md5len); -} +#else + MD5_context *MD5pw; + + (void) md5len; + + MD5pw = Curl_MD5_init(Curl_DIGEST_MD5); + Curl_MD5_update(MD5pw, tmp, curlx_uztoui(tmplen)); + Curl_MD5_final(MD5pw, md5sum); #endif +} #endif /* USE_SSL */ diff --git a/lib/sslgen.h b/lib/vtls/vtls.h similarity index 74% rename from lib/sslgen.h rename to lib/vtls/vtls.h index c7f5f00..19ef1cd 100644 --- a/lib/sslgen.h +++ b/lib/vtls/vtls.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_SSLGEN_H -#define HEADER_CURL_SSLGEN_H +#ifndef HEADER_CURL_VTLS_H +#define HEADER_CURL_VTLS_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,10 +23,28 @@ ***************************************************************************/ #include "curl_setup.h" +#include "openssl.h" /* OpenSSL versions */ +#include "gtls.h" /* GnuTLS versions */ +#include "nssg.h" /* NSS versions */ +#include "gskit.h" /* Global Secure ToolKit versions */ +#include "polarssl.h" /* PolarSSL versions */ +#include "axtls.h" /* axTLS versions */ +#include "cyassl.h" /* CyaSSL versions */ +#include "curl_schannel.h" /* Schannel SSPI version */ +#include "curl_darwinssl.h" /* SecureTransport (Darwin) version */ + +#ifndef MAX_PINNED_PUBKEY_SIZE +#define MAX_PINNED_PUBKEY_SIZE 1048576 /* 1MB */ +#endif + #ifndef MD5_DIGEST_LENGTH #define MD5_DIGEST_LENGTH 16 /* fixed size */ #endif +/* see http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg-04 */ +#define ALPN_HTTP_1_1_LENGTH 8 +#define ALPN_HTTP_1_1 "http/1.1" + bool Curl_ssl_config_matches(struct ssl_config_data* data, struct ssl_config_data* needle); bool Curl_clone_ssl_config(struct ssl_config_data* source, @@ -35,6 +53,8 @@ void Curl_free_ssl_config(struct ssl_config_data* sslc); unsigned int Curl_rand(struct SessionHandle *); +int Curl_ssl_backend(void); + #ifdef USE_SSL int Curl_ssl_init(void); void Curl_ssl_cleanup(void); @@ -62,7 +82,7 @@ int Curl_ssl_check_cxn(struct connectdata *conn); /* Certificate information list handling. */ void Curl_ssl_free_certinfo(struct SessionHandle *data); -int Curl_ssl_init_certinfo(struct SessionHandle * data, int num); +CURLcode Curl_ssl_init_certinfo(struct SessionHandle * data, int num); CURLcode Curl_ssl_push_certinfo_len(struct SessionHandle * data, int certnum, const char * label, const char * value, size_t valuelen); @@ -72,9 +92,9 @@ CURLcode Curl_ssl_push_certinfo(struct SessionHandle * data, int certnum, /* Functions to be used by SSL library adaptation functions */ /* extract a session ID */ -int Curl_ssl_getsessionid(struct connectdata *conn, - void **ssl_sessionid, - size_t *idsize) /* set 0 if unknown */; +bool Curl_ssl_getsessionid(struct connectdata *conn, + void **ssl_sessionid, + size_t *idsize) /* set 0 if unknown */; /* add a new session ID */ CURLcode Curl_ssl_addsessionid(struct connectdata *conn, void *ssl_sessionid, @@ -84,23 +104,20 @@ void Curl_ssl_kill_session(struct curl_ssl_session *session); /* delete a session from the cache */ void Curl_ssl_delsessionid(struct connectdata *conn, void *ssl_sessionid); -/* get N random bytes into the buffer */ -void Curl_ssl_random(struct SessionHandle *data, unsigned char *buffer, - size_t length); +/* get N random bytes into the buffer, return 0 if a find random is filled + in */ +int Curl_ssl_random(struct SessionHandle *data, unsigned char *buffer, + size_t length); void Curl_ssl_md5sum(unsigned char *tmp, /* input */ size_t tmplen, unsigned char *md5sum, /* output */ size_t md5len); +/* Check pinned public key. */ +CURLcode Curl_pin_peer_pubkey(const char *pinnedpubkey, + const unsigned char *pubkey, size_t pubkeylen); #define SSL_SHUTDOWN_TIMEOUT 10000 /* ms */ -#ifdef have_curlssl_random -#define HAVE_CURL_SSL_RANDOM -#endif -#ifdef have_curlssl_md5sum -#define HAVE_CURL_SSL_MD5SUM -#endif - #else /* When SSL support is not present, just define away these function calls */ #define Curl_ssl_init() 1 @@ -121,6 +138,8 @@ void Curl_ssl_md5sum(unsigned char *tmp, /* input */ #define Curl_ssl_free_certinfo(x) Curl_nop_stmt #define Curl_ssl_connect_nonblocking(x,y,z) CURLE_NOT_BUILT_IN #define Curl_ssl_kill_session(x) Curl_nop_stmt +#define Curl_ssl_random(x,y,z) ((void)x, CURLE_NOT_BUILT_IN) +#define CURL_SSL_BACKEND CURLSSLBACKEND_NONE #endif -#endif /* HEADER_CURL_SSLGEN_H */ +#endif /* HEADER_CURL_VTLS_H */ diff --git a/lib/warnless.c b/lib/warnless.c index 7a4b01e..8c130d3 100644 --- a/lib/warnless.c +++ b/lib/warnless.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -175,6 +175,25 @@ int curlx_ultosi(unsigned long ulnum) } /* +** unsigned size_t to signed curl_off_t +*/ + +curl_off_t curlx_uztoso(size_t uznum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT); + return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} + +/* ** unsigned size_t to signed int */ @@ -400,6 +419,20 @@ curl_socket_t curlx_sitosk(int i) #endif /* USE_WINSOCK */ +#if defined(WIN32) || defined(_WIN32) + +ssize_t curlx_read(int fd, void *buf, size_t count) +{ + return (ssize_t)read(fd, buf, curlx_uztoui(count)); +} + +ssize_t curlx_write(int fd, const void *buf, size_t count) +{ + return (ssize_t)write(fd, buf, curlx_uztoui(count)); +} + +#endif /* WIN32 || _WIN32 */ + #if defined(__INTEL_COMPILER) && defined(__unix__) int curlx_FD_ISSET(int fd, fd_set *fdset) diff --git a/lib/warnless.h b/lib/warnless.h index f22f0ba..ad77d3c 100644 --- a/lib/warnless.h +++ b/lib/warnless.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -34,6 +34,8 @@ int curlx_ultosi(unsigned long ulnum); int curlx_uztosi(size_t uznum); +curl_off_t curlx_uztoso(size_t uznum); + unsigned long curlx_uztoul(size_t uznum); unsigned int curlx_uztoui(size_t uznum); @@ -60,6 +62,21 @@ curl_socket_t curlx_sitosk(int i); #endif /* USE_WINSOCK */ +#if defined(WIN32) || defined(_WIN32) + +ssize_t curlx_read(int fd, void *buf, size_t count); + +ssize_t curlx_write(int fd, const void *buf, size_t count); + +#ifndef BUILDING_WARNLESS_C +# undef read +# define read(fd, buf, count) curlx_read(fd, buf, count) +# undef write +# define write(fd, buf, count) curlx_write(fd, buf, count) +#endif + +#endif /* WIN32 || _WIN32 */ + #if defined(__INTEL_COMPILER) && defined(__unix__) int curlx_FD_ISSET(int fd, fd_set *fdset); diff --git a/lib/x509asn1.c b/lib/x509asn1.c index 94b89b2..af08cee 100644 --- a/lib/x509asn1.c +++ b/lib/x509asn1.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,13 +22,13 @@ #include "curl_setup.h" -#if defined(USE_QSOSSL) || defined(USE_GSKIT) +#if defined(USE_GSKIT) || defined(USE_NSS) #include #include "urldata.h" #include "strequal.h" #include "hostcheck.h" -#include "sslgen.h" +#include "vtls/vtls.h" #include "sendf.h" #include "inet_pton.h" #include "curl_base64.h" @@ -122,6 +122,7 @@ const char * Curl_getASN1Element(curl_asn1Element * elem, return (const char *) NULL; /* Process header byte. */ + elem->header = beg; b = (unsigned char) *beg++; elem->constructed = (b & 0x20) != 0; elem->class = (b >> 6) & 3; @@ -252,7 +253,7 @@ utf8asn1str(char * * to, int type, const char * from, const char * end) size_t inlength = end - from; int size = 1; size_t outlength; - int chsize; + int charsize; unsigned int wc; char * buf; @@ -305,7 +306,7 @@ utf8asn1str(char * * to, int type, const char * from, const char * end) default: /* case 1: */ wc = (wc << 8) | *(const unsigned char *) from++; } - chsize = 1; + charsize = 1; if(wc >= 0x00000080) { if(wc >= 0x00000800) { if(wc >= 0x00010000) { @@ -315,18 +316,18 @@ utf8asn1str(char * * to, int type, const char * from, const char * end) } buf[outlength + 3] = (char) (0x80 | (wc & 0x3F)); wc = (wc >> 6) | 0x00010000; - chsize++; + charsize++; } buf[outlength + 2] = (char) (0x80 | (wc & 0x3F)); wc = (wc >> 6) | 0x00000800; - chsize++; + charsize++; } buf[outlength + 1] = (char) (0x80 | (wc & 0x3F)); wc = (wc >> 6) | 0x000000C0; - chsize++; + charsize++; } buf[outlength] = (char) wc; - outlength += chsize; + outlength += charsize; } } buf[outlength] = '\0'; @@ -666,31 +667,6 @@ const char * Curl_DNtostr(curl_asn1Element * dn) return (const char *) buf; } -static const char * checkOID(const char * beg, const char * end, - const char * oid) -{ - curl_asn1Element e; - const char * ccp; - const char * p; - bool matched; - - /* Check if first ASN.1 element at `beg' is the given OID. - Return a pointer in the source after the OID if found, else NULL. */ - - ccp = Curl_getASN1Element(&e, beg, end); - if(!ccp || e.tag != CURL_ASN1_OBJECT_IDENTIFIER) - return (const char *) NULL; - - p = OID2str(e.beg, e.end, FALSE); - if(!p) - return (const char *) NULL; - - matched = !strcmp(p, oid); - free((char *) p); - return matched? ccp: (const char *) NULL; -} - - /* * X509 parser. */ @@ -707,6 +683,7 @@ void Curl_parseX509(curl_X509certificate * cert, Syntax is assumed to have already been checked by the SSL backend. See RFC 5280. */ + cert->certificate.header = NULL; cert->certificate.beg = beg; cert->certificate.end = end; @@ -726,6 +703,7 @@ void Curl_parseX509(curl_X509certificate * cert, beg = tbsCertificate.beg; end = tbsCertificate.end; /* Get optional version, get serialNumber. */ + cert->version.header = NULL; cert->version.beg = &defaultVersion; cert->version.end = &defaultVersion + sizeof defaultVersion;; beg = Curl_getASN1Element(&elem, beg, end); @@ -745,15 +723,19 @@ void Curl_parseX509(curl_X509certificate * cert, /* Get subject. */ beg = Curl_getASN1Element(&cert->subject, beg, end); /* Get subjectPublicKeyAlgorithm and subjectPublicKey. */ - beg = Curl_getASN1Element(&elem, beg, end); + beg = Curl_getASN1Element(&cert->subjectPublicKeyInfo, beg, end); ccp = Curl_getASN1Element(&cert->subjectPublicKeyAlgorithm, - elem.beg, elem.end); - Curl_getASN1Element(&cert->subjectPublicKey, ccp, elem.end); + cert->subjectPublicKeyInfo.beg, + cert->subjectPublicKeyInfo.end); + Curl_getASN1Element(&cert->subjectPublicKey, ccp, + cert->subjectPublicKeyInfo.end); /* Get optional issuerUiqueID, subjectUniqueID and extensions. */ cert->issuerUniqueID.tag = cert->subjectUniqueID.tag = 0; cert->extensions.tag = elem.tag = 0; + cert->issuerUniqueID.header = cert->subjectUniqueID.header = NULL; cert->issuerUniqueID.beg = cert->issuerUniqueID.end = ""; cert->subjectUniqueID.beg = cert->subjectUniqueID.end = ""; + cert->extensions.header = NULL; cert->extensions.beg = cert->extensions.end = ""; if(beg < end) beg = Curl_getASN1Element(&elem, beg, end); @@ -796,6 +778,7 @@ static const char * dumpAlgo(curl_asn1Element * param, /* Get algorithm parameters and return algorithm name. */ beg = Curl_getASN1Element(&oid, beg, end); + param->header = NULL; param->tag = 0; param->beg = param->end = end; if(beg < end) @@ -803,7 +786,7 @@ static const char * dumpAlgo(curl_asn1Element * param, return OID2str(oid.beg, oid.end, TRUE); } -static void do_pubkey_field(struct SessionHandle *data, int certnum, +static void do_pubkey_field(struct SessionHandle * data, int certnum, const char * label, curl_asn1Element * elem) { const char * output; @@ -812,8 +795,10 @@ static void do_pubkey_field(struct SessionHandle *data, int certnum, output = Curl_ASN1tostr(elem, 0); if(output) { - Curl_ssl_push_certinfo(data, certnum, label, output); - infof(data, " %s: %s\n", label, output); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, label, output); + if(!certnum) + infof(data, " %s: %s\n", label, output); free((char *) output); } } @@ -845,11 +830,14 @@ static void do_pubkey(struct SessionHandle * data, int certnum, len--; if(len > 32) elem.beg = q; /* Strip leading zero bytes. */ - infof(data, " RSA Public Key (%lu bits)\n", len); - q = curl_maprintf("%lu", len); - if(q) { - Curl_ssl_push_certinfo(data, certnum, "RSA Public Key", q); - free((char *) q); + if(!certnum) + infof(data, " RSA Public Key (%lu bits)\n", len); + if(data->set.ssl.certinfo) { + q = curl_maprintf("%lu", len); + if(q) { + Curl_ssl_push_certinfo(data, certnum, "RSA Public Key", q); + free((char *) q); + } } /* Generate coefficients. */ do_pubkey_field(data, certnum, "rsa(n)", &elem); @@ -891,11 +879,15 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, char * cp1; size_t cl1; char * cp2; - CURLcode cc; + CURLcode result; unsigned long version; size_t i; size_t j; + if(!data->set.ssl.certinfo) + if(certnum) + return CURLE_OK; + /* Prepare the certificate information for curl_easy_getinfo(). */ /* Extract the certificate ASN.1 elements. */ @@ -905,35 +897,44 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, ccp = Curl_DNtostr(&cert.subject); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Subject", ccp); - infof(data, "%2d Subject: %s\n", certnum, ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Subject", ccp); + if(!certnum) + infof(data, "%2d Subject: %s\n", certnum, ccp); free((char *) ccp); /* Issuer. */ ccp = Curl_DNtostr(&cert.issuer); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Issuer", ccp); - infof(data, " Issuer: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Issuer", ccp); + if(!certnum) + infof(data, " Issuer: %s\n", ccp); free((char *) ccp); /* Version (always fits in less than 32 bits). */ version = 0; for(ccp = cert.version.beg; ccp < cert.version.end; ccp++) version = (version << 8) | *(const unsigned char *) ccp; - ccp = curl_maprintf("%lx", version); - if(!ccp) - return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Version", ccp); - free((char *) ccp); - infof(data, " Version: %lu (0x%lx)\n", version + 1, version); + if(data->set.ssl.certinfo) { + ccp = curl_maprintf("%lx", version); + if(!ccp) + return CURLE_OUT_OF_MEMORY; + Curl_ssl_push_certinfo(data, certnum, "Version", ccp); + free((char *) ccp); + } + if(!certnum) + infof(data, " Version: %lu (0x%lx)\n", version + 1, version); /* Serial number. */ ccp = Curl_ASN1tostr(&cert.serialNumber, 0); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Serial Number", ccp); - infof(data, " Serial Number: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Serial Number", ccp); + if(!certnum) + infof(data, " Serial Number: %s\n", ccp); free((char *) ccp); /* Signature algorithm .*/ @@ -941,24 +942,30 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, cert.signatureAlgorithm.end); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Signature Algorithm", ccp); - infof(data, " Signature Algorithm: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Signature Algorithm", ccp); + if(!certnum) + infof(data, " Signature Algorithm: %s\n", ccp); free((char *) ccp); /* Start Date. */ ccp = Curl_ASN1tostr(&cert.notBefore, 0); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Start Date", ccp); - infof(data, " Start Date: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Start Date", ccp); + if(!certnum) + infof(data, " Start Date: %s\n", ccp); free((char *) ccp); /* Expire Date. */ ccp = Curl_ASN1tostr(&cert.notAfter, 0); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Expire Date", ccp); - infof(data, " Expire Date: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Expire Date", ccp); + if(!certnum) + infof(data, " Expire Date: %s\n", ccp); free((char *) ccp); /* Public Key Algorithm. */ @@ -966,8 +973,10 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, cert.subjectPublicKeyAlgorithm.end); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Public Key Algorithm", ccp); - infof(data, " Public Key Algorithm: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Public Key Algorithm", ccp); + if(!certnum) + infof(data, " Public Key Algorithm: %s\n", ccp); do_pubkey(data, certnum, ccp, ¶m, &cert.subjectPublicKey); free((char *) ccp); @@ -977,17 +986,19 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, ccp = Curl_ASN1tostr(&cert.signature, 0); if(!ccp) return CURLE_OUT_OF_MEMORY; - Curl_ssl_push_certinfo(data, certnum, "Signature", ccp); - infof(data, " Signature: %s\n", ccp); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Signature", ccp); + if(!certnum) + infof(data, " Signature: %s\n", ccp); free((char *) ccp); /* Generate PEM certificate. */ - cc = Curl_base64_encode(data, cert.certificate.beg, - cert.certificate.end - cert.certificate.beg, - &cp1, &cl1); - if(cc != CURLE_OK) - return cc; - /* Compute the number of charaters in final certificate string. Format is: + result = Curl_base64_encode(data, cert.certificate.beg, + cert.certificate.end - cert.certificate.beg, + &cp1, &cl1); + if(result) + return result; + /* Compute the number of characters in final certificate string. Format is: -----BEGIN CERTIFICATE-----\n \n . @@ -1008,12 +1019,41 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, i += copySubstring(cp2 + i, "-----END CERTIFICATE-----"); cp2[i] = '\0'; free(cp1); - Curl_ssl_push_certinfo(data, certnum, "Cert", cp2); - infof(data, "%s\n", cp2); + if(data->set.ssl.certinfo) + Curl_ssl_push_certinfo(data, certnum, "Cert", cp2); + if(!certnum) + infof(data, "%s\n", cp2); free(cp2); return CURLE_OK; } +#endif /* USE_GSKIT or USE_NSS */ + +#if defined(USE_GSKIT) + +static const char * checkOID(const char * beg, const char * end, + const char * oid) +{ + curl_asn1Element e; + const char * ccp; + const char * p; + bool matched; + + /* Check if first ASN.1 element at `beg' is the given OID. + Return a pointer in the source after the OID if found, else NULL. */ + + ccp = Curl_getASN1Element(&e, beg, end); + if(!ccp || e.tag != CURL_ASN1_OBJECT_IDENTIFIER) + return (const char *) NULL; + + p = OID2str(e.beg, e.end, FALSE); + if(!p) + return (const char *) NULL; + + matched = !strcmp(p, oid); + free((char *) p); + return matched? ccp: (const char *) NULL; +} CURLcode Curl_verifyhost(struct connectdata * conn, const char * beg, const char * end) @@ -1108,6 +1148,7 @@ CURLcode Curl_verifyhost(struct connectdata * conn, } /* Process subject. */ + name.header = NULL; name.beg = name.end = ""; q = cert.subject.beg; /* we have to look to the last occurrence of a commonName in the @@ -1148,4 +1189,4 @@ CURLcode Curl_verifyhost(struct connectdata * conn, return CURLE_PEER_FAILED_VERIFICATION; } -#endif /* USE_QSOSSL or USE_GSKIT */ +#endif /* USE_GSKIT */ diff --git a/lib/x509asn1.h b/lib/x509asn1.h index 2276b5b..075c424 100644 --- a/lib/x509asn1.h +++ b/lib/x509asn1.h @@ -8,7 +8,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -25,7 +25,7 @@ #include "curl_setup.h" -#if defined(USE_QSOSSL) || defined(USE_GSKIT) +#if defined(USE_GSKIT) || defined(USE_NSS) #include "urldata.h" @@ -76,8 +76,9 @@ /* ASN.1 parsed element. */ typedef struct { + const char * header; /* Pointer to header byte. */ const char * beg; /* Pointer to element data. */ - const char * end; /* Pointer to 1st byte after element data. */ + const char * end; /* Pointer to 1st byte after element. */ unsigned char class; /* ASN.1 element class. */ unsigned char tag; /* ASN.1 element tag. */ bool constructed; /* Element is constructed. */ @@ -102,6 +103,7 @@ typedef struct { curl_asn1Element notBefore; curl_asn1Element notAfter; curl_asn1Element subject; + curl_asn1Element subjectPublicKeyInfo; curl_asn1Element subjectPublicKeyAlgorithm; curl_asn1Element subjectPublicKey; curl_asn1Element issuerUniqueID; @@ -125,5 +127,5 @@ CURLcode Curl_extract_certinfo(struct connectdata * conn, int certnum, CURLcode Curl_verifyhost(struct connectdata * conn, const char * beg, const char * end); -#endif /* USE_QSOSSL or USE_GSKIT */ +#endif /* USE_GSKIT or USE_NSS */ #endif /* HEADER_CURL_X509ASN1_H */ diff --git a/ltmain.sh b/ltmain.sh index 68c6d96..bffda54 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -70,7 +70,7 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.3 +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11 # automake: $automake_version # autoconf: $autoconf_version # @@ -80,7 +80,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.2 Debian-2.4.2-1.3" +VERSION="2.4.2 Debian-2.4.2-1.11" TIMESTAMP="" package_revision=1.3337 diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4 index 2467128..f1a634b 100644 --- a/m4/curl-compilers.m4 +++ b/m4/curl-compilers.m4 @@ -615,12 +615,12 @@ AC_DEFUN([CURL_SET_COMPILER_BASIC_OPTS], [ dnl #147: declaration is incompatible with 'previous one' dnl #165: too few arguments in function call dnl #266: function declared implicitly - tmp_CPPFLAGS="$tmp_CPPFLAGS -we 140,147,165,266" + tmp_CPPFLAGS="$tmp_CPPFLAGS -we140,147,165,266" dnl Disable some remarks dnl #279: controlling expression is constant dnl #981: operands are evaluated in unspecified order dnl #1469: "cc" clobber ignored - tmp_CPPFLAGS="$tmp_CPPFLAGS -wd 279,981,1469" + tmp_CPPFLAGS="$tmp_CPPFLAGS -wd279,981,1469" ;; # INTEL_WINDOWS_C) @@ -1479,7 +1479,7 @@ AC_DEFUN([CURL_CHECK_COMPILER_PROTOTYPE_MISMATCH], [ return n; } ]],[[ - int i[2]; + int i[2]={0,0}; int j = rand(i[0]); if(j) return j; diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4 index fdf004b..0d65421 100644 --- a/m4/curl-functions.m4 +++ b/m4/curl-functions.m4 @@ -4729,7 +4729,7 @@ AC_DEFUN([CURL_CHECK_FUNC_POLL], [ tst_allow_poll="unknown" # case $host_os in - darwin*|interix*) + darwin[[123456789]].*|darwin10.*|darwin11.*|darwin12.*|interix*) dnl poll() does not work on these platforms dnl Interix: "does provide poll(), but the implementing developer must dnl have been in a bad mood, because poll() only works on the /proc diff --git a/m4/libtool.m4 b/m4/libtool.m4 index a849b9d..2930a7d 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -1312,7 +1312,7 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext @@ -1333,7 +1333,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1352,7 +1355,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) diff --git a/maketgz b/maketgz index 38d2b63..5aba1a3 100755 --- a/maketgz +++ b/maketgz @@ -9,7 +9,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -123,6 +123,10 @@ make -s html echo "make pdf" make -s pdf +# And the IDE files +echo "make vc-ide" +make -s vc-ide + echo "produce CHANGES" git log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./log2changes.pl > CHANGES.dist diff --git a/mkinstalldirs b/mkinstalldirs index 4191a45..55d537f 100755 --- a/mkinstalldirs +++ b/mkinstalldirs @@ -81,9 +81,9 @@ case $dirmode in echo "mkdir -p -- $*" exec mkdir -p -- "$@" else - # On NextStep and OpenStep, the `mkdir' command does not + # On NextStep and OpenStep, the 'mkdir' command does not # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already + # directories to create, and then abort because '.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version diff --git a/packages/AIX/Makefile.in b/packages/AIX/Makefile.in index 7a42640..b898d16 100644 --- a/packages/AIX/Makefile.in +++ b/packages/AIX/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -218,6 +218,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -242,7 +243,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -251,7 +251,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -272,6 +271,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -307,11 +307,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/AIX/RPM/Makefile.in b/packages/AIX/RPM/Makefile.in index e2e7721..a8d5ba5 100644 --- a/packages/AIX/RPM/Makefile.in +++ b/packages/AIX/RPM/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -158,6 +158,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -182,7 +183,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -191,7 +191,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -212,6 +211,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -247,11 +247,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/Android/Android.mk b/packages/Android/Android.mk index 3e94b80..301ab9e 100644 --- a/packages/Android/Android.mk +++ b/packages/Android/Android.mk @@ -104,7 +104,7 @@ LOCAL_SYSTEM_SHARED_LIBRARIES := libc LOCAL_C_INCLUDES += $(LOCAL_PATH)/include $(LOCAL_PATH)/lib -# This may also need to include $(CURLX_ONES) in order to correctly link +# This may also need to include $(CURLX_CFILES) in order to correctly link # if libcurl is changed to be built as a dynamic library LOCAL_CFLAGS += $(common_CFLAGS) diff --git a/packages/DOS/common.dj b/packages/DOS/common.dj index 1b3e757..85b611c 100644 --- a/packages/DOS/common.dj +++ b/packages/DOS/common.dj @@ -13,7 +13,7 @@ MAKEFILE = Makefile.dj OBJ_DIR = djgpp # -# Find out if using a UNIX-like shell or a DOS command interpreter +# Find out if using a Unix-like shell or a DOS command interpreter # ifneq ($(findstring COMMAND.COM,$(SHELL)),COMMAND.COM) ifneq ($(findstring CMD.EXE,$(SHELL)),CMD.EXE) diff --git a/packages/EPM/Makefile.in b/packages/EPM/Makefile.in index 6e401a1..489dd95 100644 --- a/packages/EPM/Makefile.in +++ b/packages/EPM/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -158,6 +158,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -182,7 +183,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -191,7 +191,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -212,6 +211,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -247,11 +247,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/EPM/README b/packages/EPM/README index 3529dbf..0b031e8 100644 --- a/packages/EPM/README +++ b/packages/EPM/README @@ -1,4 +1,4 @@ -EPM is a free UNIX software/file packaging program that generates distribution +EPM is a free Unix software/file packaging program that generates distribution archives from a list of files. EPM Can: * Generate portable script-based distribution packages complete with diff --git a/packages/Linux/Makefile.in b/packages/Linux/Makefile.in index e576c3d..1ddd000 100644 --- a/packages/Linux/Makefile.in +++ b/packages/Linux/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -218,6 +218,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -242,7 +243,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -251,7 +251,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -272,6 +271,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -307,11 +307,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/Linux/RPM/Makefile.in b/packages/Linux/RPM/Makefile.in index dd2f19b..164e0e0 100644 --- a/packages/Linux/RPM/Makefile.in +++ b/packages/Linux/RPM/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -159,6 +159,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -183,7 +184,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -192,7 +192,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -213,6 +212,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -248,11 +248,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/Makefile.in b/packages/Makefile.in index 4edbf13..7bbde3d 100644 --- a/packages/Makefile.in +++ b/packages/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -218,6 +218,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -242,7 +243,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -251,7 +251,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -272,6 +271,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -307,11 +307,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/OS400/README.OS400 b/packages/OS400/README.OS400 index 73e81f8..99b606c 100644 --- a/packages/OS400/README.OS400 +++ b/packages/OS400/README.OS400 @@ -39,12 +39,9 @@ header files are thus altered during build process to use this pragma, in order to force libcurl enums of being type int (the pragma disposition in use before inclusion is restored before resuming the including unit compilation). - Two SSL implementations are available to libcurl on OS/400: QsoSSL which is -obsolescent, does not support asynchronous I/O and only allows a single SSL -context within a job, and GSKit that does not suffer from these limitations -and is able to provide some information about the server certificate. - Both implementations of SSL are working on "certificate stores" or keyrings, -rather than individual certificate/key files. Certificate stores, as weel as + Secure socket layer is provided by the IBM GSKit API: unlike other SSL +implementations, GSKit is based on "certificate stores" or keyrings +rather than individual certificate/key files. Certificate stores, as well as "certificate labels" are managed by external IBM-defined applications. There are two ways to specify an SSL context: - By an application identifier. @@ -85,11 +82,13 @@ options: CURLOPT_ISSUERCERT CURLOPT_KEYPASSWD CURLOPT_KRBLEVEL + CURLOPT_LOGIN_OPTIONS CURLOPT_MAIL_FROM CURLOPT_MAIL_AUTH CURLOPT_NETRC_FILE CURLOPT_NOPROXY CURLOPT_PASSWORD + CURLOPT_PINNEDPUBLICKEY CURLOPT_PROXY CURLOPT_PROXYPASSWORD CURLOPT_PROXYUSERNAME @@ -114,10 +113,12 @@ options: CURLOPT_TLSAUTH_PASSWORD CURLOPT_TLSAUTH_TYPE CURLOPT_TLSAUTH_USERNAME + CURLOPT_UNIX_SOCKET_PATH CURLOPT_URL CURLOPT_USERAGENT CURLOPT_USERNAME CURLOPT_USERPWD + CURLOPT_XOAUTH2_BEARER Else it is the same as for curl_easy_setopt(). Note that CURLOPT_ERRORBUFFER is not in the list above, since it gives the address of an (empty) character buffer, not the address of a string. @@ -210,8 +211,6 @@ _ As a prerequisite, QADRT development environment must be installed. _ Install the curl source directory in IFS. _ Enter shell (QSH) _ Change current directory to the curl installation directory -- If the SSL backend has to be changed, edit file lib/config-os400.h - accordingly. _ Change current directory to ./packages/OS400 _ Edit file iniscript.sh. You may want to change tunable configuration parameters, like debug info generation, optimisation level, listing option, diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c index a37f790..d0e6827 100644 --- a/packages/OS400/ccsidcurl.c +++ b/packages/OS400/ccsidcurl.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -77,7 +77,8 @@ makeOS400IconvCode(char buf[ICONV_ID_SIZE], unsigned int ccsid) static iconv_t -iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin, unsigned int cstr) +iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin, + unsigned int cstr) { char fromcode[ICONV_ID_SIZE]; @@ -166,7 +167,6 @@ dynconvert(int dccsid, const char * s, int slen, int sccsid) char * cp; size_t dlen; int l; - int l2; static const char nullbyte = 0; /* Like convert, but the destination is allocated and returned. */ @@ -190,7 +190,7 @@ dynconvert(int dccsid, const char * s, int slen, int sccsid) Since destination code size is unknown, use a conversion to generate terminator. */ - l2 = convert(d + l, dlen - l, dccsid, &nullbyte, -1, ASCII_CCSID); + int l2 = convert(d + l, dlen - l, dccsid, &nullbyte, -1, ASCII_CCSID); if(l2 < 0) { free(d); @@ -216,10 +216,11 @@ slist_convert(int dccsid, struct curl_slist * from, int sccsid) { struct curl_slist * to = (struct curl_slist *) NULL; - char * cp; - for (; from; from = from->next) { - if(!(cp = dynconvert(dccsid, from->data, -1, sccsid))) { + for(; from; from = from->next) { + char * cp = dynconvert(dccsid, from->data, -1, sccsid); + + if(!cp) { curl_slist_free_all(to); return (struct curl_slist *) NULL; } @@ -268,7 +269,7 @@ curl_easy_escape_ccsid(CURL * handle, const char * string, int length, return (char *) NULL; } - s = dynconvert(ASCII_CCSID, s, length? length: -1, sccsid); + s = dynconvert(ASCII_CCSID, string, length? length: -1, sccsid); if(!s) return (char *) NULL; @@ -299,7 +300,7 @@ curl_easy_unescape_ccsid(CURL * handle, const char * string, int length, return (char *) NULL; } - s = dynconvert(ASCII_CCSID, s, length? length: -1, sccsid); + s = dynconvert(ASCII_CCSID, string, length? length: -1, sccsid); if(!s) return (char *) NULL; @@ -369,15 +370,13 @@ convert_version_info_string(const char * * stringp, char * * bufp, int * left, unsigned int ccsid) { - int l; - /* Helper for curl_version_info_ccsid(): convert a string if defined. Result is stored in the `*left'-byte buffer at `*bufp'. `*bufp' and `*left' are updated accordingly. Return 0 if ok, else -1. */ if(*stringp) { - l = convert(*bufp, *left, ccsid, *stringp, -1, ASCII_CCSID); + int l = convert(*bufp, *left, ccsid, *stringp, -1, ASCII_CCSID); if(l <= 0) return -1; @@ -399,7 +398,6 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid) char * cp; int n; int nproto; - int i; curl_version_info_data * id; /* The assertion below is possible, because although the second operand @@ -407,7 +405,7 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid) compiler seems to compare string values after substitution. */ #if CURLVERSION_NOW != CURLVERSION_FOURTH -#error curl_version_info_data structure has changed: upgrade this procedure too. +#error curl_version_info_data structure has changed: upgrade this procedure. #endif /* If caller has been compiled with a new version, error. */ @@ -426,7 +424,7 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid) nproto = 0; if(p->protocols) { - while (p->protocols[nproto]) + while(p->protocols[nproto]) n += strlen(p->protocols[nproto++]); n += nproto++; @@ -472,13 +470,14 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid) memcpy((char *) id, (char *) p, sizeof *p); if(id->protocols) { + int i = nproto * sizeof id->protocols[0]; + id->protocols = (const char * const *) cp; - i = nproto * sizeof id->protocols[0]; memcpy(cp, (char *) p->protocols, i); cp += i; n -= i; - for (i = 0; id->protocols[i]; i++) + for(i = 0; id->protocols[i]; i++) if(convert_version_info_string(((const char * *) id->protocols) + i, &cp, &n, ccsid)) return (curl_version_info_data *) NULL; @@ -588,12 +587,12 @@ void curl_certinfo_free_all(struct curl_certinfo *info) { - int i; - /* Free all memory used by certificate info. */ if(info) { if(info->certinfo) { - for (i = 0; i < info->num_of_certs; i++) + int i; + + for(i = 0; i < info->num_of_certs; i++) curl_slist_free_all(info->certinfo[i]); free((char *) info->certinfo); } @@ -611,13 +610,10 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...) CURLcode ret; unsigned int ccsid; char * * cpp; - char * s; - char * d; struct SessionHandle * data; struct curl_slist * * slp; struct curl_certinfo * cipf; struct curl_certinfo * cipt; - int i; /* WARNING: unlike curl_easy_get_info(), the strings returned by this procedure have to be free'ed. */ @@ -633,13 +629,11 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...) case CURLINFO_STRING: ccsid = va_arg(arg, unsigned int); cpp = (char * *) paramp; - s = *cpp; - if(s) { - d = dynconvert(ccsid, s, -1, ASCII_CCSID); - *cpp = d; + if(*cpp) { + *cpp = dynconvert(ccsid, *cpp, -1, ASCII_CCSID); - if(!d) + if(!*cpp) ret = CURLE_OUT_OF_MEMORY; } @@ -647,19 +641,23 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...) case CURLINFO_SLIST: ccsid = va_arg(arg, unsigned int); - if(info == CURLINFO_CERTINFO) { + switch (info) { + case CURLINFO_CERTINFO: cipf = *(struct curl_certinfo * *) paramp; if(cipf) { if(!(cipt = (struct curl_certinfo *) malloc(sizeof *cipt))) ret = CURLE_OUT_OF_MEMORY; else { - cipt->certinfo = (struct curl_slist * *) calloc(cipf->num_of_certs + - 1, sizeof(struct curl_slist *)); + cipt->certinfo = (struct curl_slist * *) + calloc(cipf->num_of_certs + + 1, sizeof(struct curl_slist *)); if(!cipt->certinfo) ret = CURLE_OUT_OF_MEMORY; else { + int i; + cipt->num_of_certs = cipf->num_of_certs; - for (i = 0; i < cipf->num_of_certs; i++) + for(i = 0; i < cipf->num_of_certs; i++) if(cipf->certinfo[i]) if(!(cipt->certinfo[i] = slist_convert(ccsid, cipf->certinfo[i], @@ -677,12 +675,18 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...) *(struct curl_certinfo * *) paramp = cipt; } - } - else { + + break; + + case CURLINFO_TLS_SESSION: + break; + + default: slp = (struct curl_slist * *) paramp; if(*slp) if(!(*slp = slist_convert(ccsid, *slp, ASCII_CCSID))) ret = CURLE_OUT_OF_MEMORY; + break; } } @@ -715,7 +719,7 @@ static void Curl_formadd_release_local(struct curl_forms * forms, int nargs, int skip) { - while (nargs--) + while(nargs--) if(nargs != skip) if(Curl_is_formadd_string(forms[nargs].option)) if(forms[nargs].value) @@ -755,7 +759,7 @@ Curl_formadd_convert(struct curl_forms * forms, return -1; } - cp2 = realloc(cp, l); /* Shorten buffer to the string size. */ + cp2 = realloc(cp, l); /* Shorten buffer to the string size. */ if(cp2) cp = cp2; @@ -763,7 +767,7 @@ Curl_formadd_convert(struct curl_forms * forms, forms[formx].value = cp; if(lengthx >= 0) - forms[lengthx].value = (char *) l; /* Update to length after conversion. */ + forms[lengthx].value = (char *) l; /* Update length after conversion. */ return l; } @@ -826,7 +830,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost, forms = (struct curl_forms *) NULL; va_start(arg, last_post); - for (;;) { + for(;;) { /* Make sure there is still room for an item in local array. */ if(nargs >= lformlen) { @@ -1098,7 +1102,6 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...) char * s; char * cp; unsigned int ccsid; - size_t len; curl_off_t pfsize; static char testwarn = 1; @@ -1111,11 +1114,8 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...) if(testwarn) { testwarn = 0; -#ifdef USE_TLS_SRP - if((int) STRING_LAST != (int) STRING_TLSAUTH_PASSWORD + 1) -#else - if((int) STRING_LAST != (int) STRING_MAIL_AUTH + 1) -#endif + if((int) STRING_LASTZEROTERMINATED != (int) STRING_UNIX_SOCKET_PATH + 1 || + (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1) curl_mfprintf(stderr, "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n"); } @@ -1143,11 +1143,13 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...) case CURLOPT_ISSUERCERT: case CURLOPT_KEYPASSWD: case CURLOPT_KRBLEVEL: + case CURLOPT_LOGIN_OPTIONS: case CURLOPT_MAIL_FROM: case CURLOPT_MAIL_AUTH: case CURLOPT_NETRC_FILE: case CURLOPT_NOPROXY: case CURLOPT_PASSWORD: + case CURLOPT_PINNEDPUBLICKEY: case CURLOPT_PROXY: case CURLOPT_PROXYPASSWORD: case CURLOPT_PROXYUSERNAME: @@ -1172,10 +1174,12 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...) case CURLOPT_TLSAUTH_PASSWORD: case CURLOPT_TLSAUTH_TYPE: case CURLOPT_TLSAUTH_USERNAME: + case CURLOPT_UNIX_SOCKET_PATH: case CURLOPT_URL: case CURLOPT_USERAGENT: case CURLOPT_USERNAME: case CURLOPT_USERPWD: + case CURLOPT_XOAUTH2_BEARER: s = va_arg(arg, char *); ccsid = va_arg(arg, unsigned int); @@ -1220,6 +1224,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...) } else { /* Data length specified. */ + size_t len; if(pfsize < 0 || pfsize > SIZE_MAX) { result = CURLE_OUT_OF_MEMORY; diff --git a/packages/OS400/ccsidcurl.h b/packages/OS400/ccsidcurl.h index eaa591f..3d1fe79 100644 --- a/packages/OS400/ccsidcurl.h +++ b/packages/OS400/ccsidcurl.h @@ -38,13 +38,13 @@ CURL_EXTERN char * curl_easy_unescape_ccsid(CURL * handle, const char * string, int length, int * outlength, unsigned int sccsid, unsigned int dccsid); -CURL_EXTERN struct curl_slist * curl_slist_append_ccsid(struct curl_slist * lst, +CURL_EXTERN struct curl_slist * curl_slist_append_ccsid(struct curl_slist * l, const char * data, unsigned int ccsid); CURL_EXTERN time_t curl_getdate_ccsid(const char * p, const time_t * unused, unsigned int ccsid); CURL_EXTERN curl_version_info_data * curl_version_info_ccsid(CURLversion stamp, - unsigned int csid); + unsigned int cid); CURL_EXTERN const char * curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid); CURL_EXTERN const char * curl_share_strerror_ccsid(CURLSHcode error, diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in index 1015843..fcbf7c7 100644 --- a/packages/OS400/curl.inc.in +++ b/packages/OS400/curl.inc.in @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -94,7 +94,7 @@ d CURL_VERSION_NTLM... d c X'00000010' d CURL_VERSION_GSSNEGOTIATE... - d c X'00000020' + d c X'00000020' Deprecated d CURL_VERSION_DEBUG... d c X'00000040' d CURL_VERSION_ASYNCHDNS... @@ -115,6 +115,14 @@ d c X'00004000' d CURL_VERSION_NTLM_WB... d c X'00008000' + d CURL_VERSION_HTTP2... + d c X'00010000' + d CURL_VERSION_GSSAPI... + d c X'00020000' + d CURL_VERSION_KERBEROS5... + d c X'00040000' + d CURL_VERSION_UNIX_SOCKETS... + d c X'00080000' * d HTTPPOST_FILENAME... d c X'00000001' @@ -150,7 +158,7 @@ d CURLAUTH_BASIC c X'00000001' d CURLAUTH_DIGEST... d c X'00000002' - d CURLAUTH_GSSNEGOTIATE... + d CURLAUTH_NEGOTIATE... d c X'00000004' d CURLAUTH_NTLM c X'00000008' d CURLAUTH_DIGEST_IE... @@ -212,6 +220,8 @@ d c 1 d CURL_HTTP_VERSION_1_1... d c 2 + d CURL_HTTP_VERSION_2_0... + d c 3 * d CURL_NETRC_IGNORED... d c 0 @@ -228,6 +238,12 @@ d c 2 d CURL_SSLVERSION_SSLv3... d c 3 + d CURL_SSLVERSION_TLSv1_0... + d c 4 + d CURL_SSLVERSION_TLSv1_1... + d c 5 + d CURL_SSLVERSION_TLSv1_2... + d c 6 * d CURL_TLSAUTH_NONE... d c 0 @@ -352,8 +368,7 @@ d c 14 d CURLE_FTP_CANT_GET_HOST... d c 15 - d CURLE_OBSOLETE16... - d c 16 + d CURLE_HTTP2 c 16 d CURLE_FTP_COULDNT_SET_TYPE... d c 17 d CURLE_PARTIAL_FILE... @@ -500,6 +515,8 @@ d c 88 d CURLE_NO_CONNECTION_AVAILABLE... d c 89 + d CURLE_SSL_PINNEDPUBKEYNOTMATCH... + d c 90 * /if not defined(CURL_NO_OLDIES) d CURLE_URL_MALFORMAT_USER... @@ -707,6 +724,11 @@ d CURLFTPMETHOD_SINGLECWD... d c 3 * + d CURLHEADER_UNIFIED... + d c X'00000000' + d CURLHEADER_SEPARATE... + d c X'00000001' + * d CURLPROTO_HTTP... d c X'00000001' d CURLPROTO_HTTPS... @@ -759,9 +781,12 @@ d c X'01000000' d CURLPROTO_GOPHER... d c X'02000000' + d CURLPROTO_SMB... + d c X'04000000' + d CURLPROTO_SMBS... + d c X'08000000' * d CURLoption s 10i 0 based(######ptr######) Enum - d CURLOPT_FILE c 10001 d CURLOPT_WRITEDATA... d c 10001 d CURLOPT_URL c 10002 @@ -772,8 +797,6 @@ d CURLOPT_PROXYUSERPWD... d c 10006 d CURLOPT_RANGE c 10007 - d CURLOPT_INFILE... - d c 10009 d CURLOPT_READDATA... d c 10009 d CURLOPT_ERRORBUFFER... @@ -814,8 +837,6 @@ d c 10026 d CURLOPT_CRLF c 00027 d CURLOPT_QUOTE c 10028 - d CURLOPT_WRITEHEADER... - d c 10029 d CURLOPT_HEADERDATA... d c 10029 d CURLOPT_COOKIEFILE... @@ -832,8 +853,6 @@ d c 10037 d CURLOPT_POSTQUOTE... d c 10039 - d CURLOPT_WRITEINFO... - d c 10040 d CURLOPT_VERBOSE... d c 00041 d CURLOPT_HEADER... @@ -887,8 +906,6 @@ d c 10070 d CURLOPT_MAXCONNECTS... d c 00071 - d CURLOPT_CLOSEPOLICY... - d c 00072 d CURLOPT_FRESH_CONNECT... d c 00074 d CURLOPT_FORBID_REUSE... @@ -1162,16 +1179,49 @@ d c 00218 d CURLOPT_XFERINFOFUNCTION... d c 20219 + d CURLOPT_XOAUTH2_BEARER... + d c 10220 + d CURLOPT_DNS_INTERFACE... + d c 10221 + d CURLOPT_DNS_LOCAL_IP4... + d c 10222 + d CURLOPT_DNS_LOCAL_IP6... + d c 10223 + d CURLOPT_LOGIN_OPTIONS... + d c 10224 + d CURLOPT_SSL_ENABLE_NPN... + d c 00225 + d CURLOPT_SSL_ENABLE_ALPN... + d c 00226 + d CURLOPT_EXPECT_100_TIMEOUT_MS... + d c 00227 + d CURLOPT_PROXYHEADER... + d c 10228 + d CURLOPT_HEADEROPT... + d c 00229 + d CURLOPT_PINNEDPUBLICKEY... + d c 10230 + d CURLOPT_UNIX_SOCKET_PATH... + d c 10231 * /if not defined(CURL_NO_OLDIES) + d CURLOPT_FILE c 10001 + d CURLOPT_INFILE... + d c 10009 d CURLOPT_SSLKEYPASSWD... d c 10026 d CURLOPT_SSLCERTPASSWD... d c 10026 + d CURLOPT_WRITEHEADER... + d c 10029 + d CURLOPT_WRITEINFO... + d c 10040 d CURLOPT_FTPLISTONLY... d c 00048 d CURLOPT_FTPAPPEND... d c 00050 + d CURLOPT_CLOSEPOLICY... + d c 00072 d CURLOPT_KRB4LEVEL... d c 10063 d CURLOPT_ENCODING... @@ -1329,10 +1379,35 @@ d c X'00100029' d CURLINFO_LOCAL_PORT... CURLINFO_LONG + 42 d c X'0020002A' + d CURLINFO_TLS_SESSION... CURLINFO_SLIST + 43 + d c X'0040002B' * d CURLINFO_HTTP_CODE... Old ...RESPONSE_CODE d c X'00200002' * + d curl_sslbackend... + d s 10i 0 based(######ptr######) Enum + d CURLSSLBACKEND_NONE... + d c 0 + d CURLSSLBACKEND_OPENSSL... + d c 1 + d CURLSSLBACKEND_GNUTLS... + d c 2 + d CURLSSLBACKEND_NSS... + d c 3 + d CURLSSLBACKEND_OBSOLETE4... + d c 4 + d CURLSSLBACKEND_GSKIT... + d c 5 + d CURLSSLBACKEND_POLARSSL... + d c 6 + d CURLSSLBACKEND_CYASSL... + d c 7 + d CURLSSLBACKEND_SCHANNEL... + d c 8 + d CURLSSLBACKEND_DARWINSSL... + d c 9 + * d curl_closepolicy... d s 10i 0 based(######ptr######) Enum d CURLCLOSEPOLICY_OLDEST... @@ -1451,7 +1526,9 @@ d c 5 d CURLM_UNKNOWN_OPTION... d c 6 - d CURLM_LAST c 7 + d CURLM_ADDED_ALREADY... + d c 7 + d CURLM_LAST c 8 * d CURLMSG s 10i 0 based(######ptr######) Enum d CURLMSG_NONE c 0 @@ -1560,12 +1637,7 @@ d addrlen 10u 0 d addr 16 struct sockaddr * - d curl_khkey ds based(######ptr######) - d qualified - d key * const char * - d len 10u 0 - d keytype 10i 0 - * + d curl_khtype s 10i 0 based(######ptr######) enum d CURLKHTYPE_UNKNOWN... d c 0 d CURLKHTYPE_RSA1... @@ -1575,6 +1647,12 @@ d CURLKHTYPE_DSS... d c 3 * + d curl_khkey ds based(######ptr######) + d qualified + d key * const char * + d len 10u 0 + d keytype like(curl_khtype) + * d curl_forms ds based(######ptr######) d qualified d option like(CURLformoption) @@ -1622,6 +1700,12 @@ d group * char * d target * char * * + d curl_tlssessioninfo... + d ds based(######ptr######) + d qualified + d backend like(curl_sslbackend) + d internals * void * + * d curl_fileinfo ds based(######ptr######) d qualified d filename * char * diff --git a/packages/OS400/initscript.sh b/packages/OS400/initscript.sh index c07355f..0105f5a 100644 --- a/packages/OS400/initscript.sh +++ b/packages/OS400/initscript.sh @@ -1,6 +1,16 @@ #!/bin/sh +setenv() + +{ + # Define and export. + + eval ${1}="${2}" + export ${1} +} + + case "${SCRIPTDIR}" in /*) ;; *) SCRIPTDIR="`pwd`/${SCRIPTDIR}" @@ -32,18 +42,23 @@ export SONAME # ################################################################################ -TARGETLIB='CURL' # Target OS/400 program library -STATBNDDIR='CURL_A' # Static binding directory. -DYNBNDDIR='CURL' # Dynamic binding directory. -SRVPGM="CURL.${SONAME}" # Service program. -TGTCCSID='500' # Target CCSID of objects -DEBUG='*ALL' # Debug level -OPTIMIZE='10' # Optimisation level -OUTPUT='*NONE' # Compilation output option. -TGTRLS='V5R3M0' # Target OS release +setenv TARGETLIB 'CURL' # Target OS/400 program library. +setenv STATBNDDIR 'CURL_A' # Static binding directory. +setenv DYNBNDDIR 'CURL' # Dynamic binding directory. +setenv SRVPGM "CURL.${SONAME}" # Service program. +setenv TGTCCSID '500' # Target CCSID of objects. +setenv DEBUG '*ALL' # Debug level. +setenv OPTIMIZE '10' # Optimisation level +setenv OUTPUT '*NONE' # Compilation output option. +setenv TGTRLS 'V5R3M0' # Target OS release. +setenv IFSDIR '/curl' # Installation IFS directory. -export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM TGTCCSID DEBUG OPTIMIZE OUTPUT -export TGTRLS +# Define ZLIB availability and locations. + +setenv WITH_ZLIB 0 # Define to 1 to enable. +setenv ZLIB_INCLUDE '/zlib/include' # ZLIB include IFS directory. +setenv ZLIB_LIB 'ZLIB' # ZLIB library. +setenv ZLIB_BNDDIR 'ZLIB_A' # ZLIB binding directory. ################################################################################ @@ -104,6 +119,41 @@ action_needed() } +# canonicalize_path path +# +# Return canonicalized path as: +# - Absolute +# - No . or .. component. + +canonicalize_path() + +{ + if expr "${1}" : '^/' > /dev/null + then P="${1}" + else P="`pwd`/${1}" + fi + + R= + IFSSAVE="${IFS}" + IFS="/" + + for C in ${P} + do IFS="${IFSSAVE}" + case "${C}" in + .) ;; + ..) R=`expr "${R}" : '^\(.*/\)..*'` + ;; + ?*) R="${R}${C}/" + ;; + *) ;; + esac + done + + IFS="${IFSSAVE}" + echo "/`expr "${R}" : '^\(.*\)/'`" +} + + # make_module module_name source_name [additional_definitions] # # Compile source name into ASCII module if needed. @@ -116,6 +166,7 @@ make_module() MODULES="${MODULES} ${1}" MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" action_needed "${MODIFSNAME}" "${2}" || return 0; + SRCDIR=`dirname \`canonicalize_path "${2}"\`` # #pragma convert has to be in the source file itself, i.e. # putting it in an include file makes it only active @@ -132,15 +183,27 @@ make_module() CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)" CMD="${CMD} LOCALETYPE(*LOCALE)" CMD="${CMD} INCDIR('/qibm/proddata/qadrt/include'" - CMD="${CMD} '${TOPDIR}/include/curl' '${TOPDIR}/include'" - CMD="${CMD} '${TOPDIR}/packages/OS400' ${INCLUDES})" + CMD="${CMD} '${TOPDIR}/include/curl' '${TOPDIR}/include' '${SRCDIR}'" + CMD="${CMD} '${TOPDIR}/packages/OS400'" + + if [ "${WITH_ZLIB}" != "0" ] + then CMD="${CMD} '${ZLIB_INCLUDE}'" + fi + + CMD="${CMD} ${INCLUDES})" CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})" CMD="${CMD} OUTPUT(${OUTPUT})" CMD="${CMD} OPTIMIZE(${OPTIMIZE})" CMD="${CMD} DBGVIEW(${DEBUG})" - if [ "${3}" ] - then CMD="${CMD} DEFINE(${3})" + DEFINES="${3}" + + if [ "${WITH_ZLIB}" != "0" ] + then DEFINES="${DEFINES} HAVE_LIBZ HAVE_ZLIB_H" + fi + + if [ "${DEFINES}" ] + then CMD="${CMD} DEFINE(${DEFINES})" fi system "${CMD}" @@ -154,11 +217,17 @@ make_module() db2_name() { - basename "${1}" | - tr 'a-z-' 'A-Z_' | - sed -e 's/\..*//' \ - -e 's/^CURL_*/C/' \ - -e 's/^\(.\).*\(.........\)$/\1\2/' + if [ "${2}" = 'nomangle' ] + then basename "${1}" | + tr 'a-z-' 'A-Z_' | + sed -e 's/\..*//' \ + -e 's/^\(.\).*\(.........\)$/\1\2/' + else basename "${1}" | + tr 'a-z-' 'A-Z_' | + sed -e 's/\..*//' \ + -e 's/^CURL_*/C/' \ + -e 's/^\(.\).*\(.........\)$/\1\2/' + fi } diff --git a/packages/OS400/make-include.sh b/packages/OS400/make-include.sh index 834ee2f..ad72cf4 100644 --- a/packages/OS400/make-include.sh +++ b/packages/OS400/make-include.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# Installation of the include files in the OS/400 library. +# Installation of the header files in the OS/400 library. # SCRIPTDIR=`dirname "${0}"` @@ -8,16 +8,16 @@ SCRIPTDIR=`dirname "${0}"` cd "${TOPDIR}/include" -# Produce the curlbuild.h include file if not yet in distribution (CVS). +# Produce the curlbuild.h header file if not yet in distribution (CVS). if action_needed curl/curlbuild.h -then if action_needed curl/curlbuild.h curl/curlbuild.h.dist - then cp -p curl/curlbuild.h.dist curl/curlbuild.h - fi +then if action_needed curl/curlbuild.h curl/curlbuild.h.dist + then cp -p curl/curlbuild.h.dist curl/curlbuild.h + fi fi -# Create the OS/400 source program file for the include files. +# Create the OS/400 source program file for the header files. SRCPF="${LIBIFSNAME}/H.FILE" @@ -28,16 +28,25 @@ then CMD="CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)" fi +# Create the IFS directory for the header files. + +IFSINCLUDE="${IFSDIR}/include/curl" + +if action_needed "${IFSINCLUDE}" +then mkdir -p "${IFSINCLUDE}" +fi + + # Enumeration values are used as va_arg tagfields, so they MUST be # integers. copy_hfile() { - destfile="${1}" - srcfile="${2}" - shift - shift + destfile="${1}" + srcfile="${2}" + shift + shift sed -e '1i\ #pragma enum(int)\ ' "${@}" -e '$a\ @@ -48,23 +57,34 @@ copy_hfile() # Copy the header files. for HFILE in curl/*.h ${SCRIPTDIR}/ccsidcurl.h -do DEST="${SRCPF}/`db2_name \"${HFILE}\"`.MBR" +do case "`basename \"${HFILE}\" .h`" in + stdcheaders|typecheck-gcc) + continue;; + esac + + DEST="${SRCPF}/`db2_name \"${HFILE}\" nomangle`.MBR" + if action_needed "${DEST}" "${HFILE}" then copy_hfile "${DEST}" "${HFILE}" + IFSDEST="${IFSINCLUDE}/`basename \"${HFILE}\"`" + rm -f "${IFSDEST}" + ln -s "${DEST}" "${IFSDEST}" fi done -# Copy the ILE/RPG include file, setting-up version number. +# Copy the ILE/RPG header file, setting-up version number. - versioned_copy "${SCRIPTDIR}/curl.inc.in" "${SRCPF}/CURL.INC.MBR" +versioned_copy "${SCRIPTDIR}/curl.inc.in" "${SRCPF}/CURL.INC.MBR" +rm -f "${IFSINCLUDE}/curl.inc.rpgle" +ln -s "${SRCPF}/CURL.INC.MBR" "${IFSINCLUDE}/curl.inc.rpgle" -# Duplicate file H as CURL to support more include path forms. +# Duplicate file H as CURL to support more include path forms. if action_needed "${LIBIFSNAME}/CURL.FILE" -then : -else system "DLTF FILE(${TARGETLIB}/CURL)" +then : +else system "DLTF FILE(${TARGETLIB}/CURL)" fi CMD="CRTDUPOBJ OBJ(H) FROMLIB(${TARGETLIB}) OBJTYPE(*FILE) TOLIB(*FROMLIB)" diff --git a/packages/OS400/make-lib.sh b/packages/OS400/make-lib.sh index e2a8708..a4e5059 100644 --- a/packages/OS400/make-lib.sh +++ b/packages/OS400/make-lib.sh @@ -7,13 +7,20 @@ SCRIPTDIR=`dirname "${0}"` . "${SCRIPTDIR}/initscript.sh" cd "${TOPDIR}/lib" +# Need to have IFS access to the mih/cipher header file. + +if action_needed cipher.mih '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/CIPHER.MBR' +then rm -f cipher.mih + ln -s '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/CIPHER.MBR' cipher.mih +fi + # Create and compile the identification source file. echo '#pragma comment(user, "libcurl version '"${LIBCURL_VERSION}"'")' > os400.c echo '#pragma comment(user, __DATE__)' >> os400.c echo '#pragma comment(user, __TIME__)' >> os400.c -echo '#pragma comment(copyright, "Copyright (C) 1998-2013 Daniel Stenberg et al. OS/400 version by P. Monnerat")' >> os400.c +echo '#pragma comment(copyright, "Copyright (C) 1998-2014 Daniel Stenberg et al. OS/400 version by P. Monnerat")' >> os400.c make_module OS400 os400.c LINK= # No need to rebuild service program yet. MODULES= @@ -21,21 +28,18 @@ MODULES= # Get source list. -CSOURCES() - -{ - shift # Drop the equal sign. - CSOURCES="$*" # Get the file names. -} - -HHEADERS() - -{ - shift # Drop the equal sign. - HHEADERS="$*" # Get the file names. -} - -. Makefile.inc +sed -e ':begin' \ + -e '/\\$/{' \ + -e 's/\\$/ /' \ + -e 'N' \ + -e 'bbegin' \ + -e '}' \ + -e 's/\n//g' \ + -e 's/[[:space:]]*$//' \ + -e 's/^\([A-Za-z][A-Za-z0-9_]*\)[[:space:]]*=[[:space:]]*\(.*\)/\1="\2"/' \ + -e 's/\$(\([A-Za-z][A-Za-z0-9_]*\))/${\1}/g' \ + < Makefile.inc > tmpscript.sh +. ./tmpscript.sh # Compile the sources into modules. @@ -83,12 +87,12 @@ fi # Gather the list of symbols to export. -EXPORTS=`grep '^CURL_EXTERN[ ]' \ +EXPORTS=`grep '^CURL_EXTERN[[:space:]]' \ "${TOPDIR}"/include/curl/*.h \ "${SCRIPTDIR}/ccsidcurl.h" | - sed -e 's/^.*CURL_EXTERN[ ]\(.*\)(.*$/\1/' \ - -e 's/[ ]*$//' \ - -e 's/^.*[ ][ ]*//' \ + sed -e 's/^.*CURL_EXTERN[[:space:]]\(.*\)(.*$/\1/' \ + -e 's/[[:space:]]*$//' \ + -e 's/^.*[[:space:]][[:space:]]*//' \ -e 's/^\*//' \ -e 's/(\(.*\))/\1/'` @@ -121,7 +125,11 @@ if [ "${LINK}" ] then CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})" CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)" CMD="${CMD} MODULE(${TARGETLIB}/OS400)" - CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR})" + CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR}" + if [ "${WITH_ZLIB}" != 0 ] + then CMD="${CMD} ${ZLIB_LIB}/${ZLIB_BNDDIR}" + fi + CMD="${CMD})" CMD="${CMD} BNDSRVPGM(QADRTTS QGLDCLNT QGLDBRDR)" CMD="${CMD} TEXT('curl API library')" CMD="${CMD} TGTRLS(${TGTRLS})" @@ -160,7 +168,7 @@ then MODULES= # formdata.c. However, there are some unsatisfied # external references leading in the following # modules to be (recursively) needed. - MODULES="${MODULES} EASY STRDUP SSLGEN QSSL HOSTIP HOSTIP4 HOSTIP6" + MODULES="${MODULES} EASY STRDUP SSLGEN GSKIT HOSTIP HOSTIP4 HOSTIP6" MODULES="${MODULES} URL HASH TRANSFER GETINFO COOKIE SENDF SELECT" MODULES="${MODULES} INET_NTOP SHARE HOSTTHRE MULTI LLIST FTP HTTP" MODULES="${MODULES} HTTP_DIGES HTTP_CHUNK HTTP_NEGOT TIMEVAL HOSTSYN" diff --git a/packages/OS400/make-tests.sh b/packages/OS400/make-tests.sh index cee3ed9..9240b7f 100644 --- a/packages/OS400/make-tests.sh +++ b/packages/OS400/make-tests.sh @@ -28,11 +28,11 @@ eval "`sed -e ': begin' \ -e 's/\\\\\\n/ /' \ -e 'b begin' \ -e '}' \ - -e '/^[A-Za-z_][A-Za-z0-9_]*[ ]*[=]/b keep' \ + -e '/^[A-Za-z_][A-Za-z0-9_]*[[:space:]]*[=]/b keep' \ -e 'd' \ -e ': keep' \ - -e 's/[ ]*=[ ]*/=/' \ - -e 's/=\\(.*[^ ]\\)[ ]*$/=\\"\\1\\"/' \ + -e 's/[[:space:]]*=[[:space:]]*/=/' \ + -e 's/=\\(.*[^[:space:]]\\)[[:space:]]*$/=\\"\\1\\"/' \ -e 's/\\$(\\([^)]*\\))/${\\1}/g' \ < Makefile.inc`" diff --git a/packages/OS400/os400sys.c b/packages/OS400/os400sys.c index ab0c4fb..caeaa95 100644 --- a/packages/OS400/os400sys.c +++ b/packages/OS400/os400sys.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -38,8 +38,8 @@ #include #include -#ifdef USE_QSOSSL -#include +#ifdef HAVE_ZLIB_H +#include #endif #ifdef USE_GSKIT @@ -94,14 +94,12 @@ static void thdbufdestroy(void * private) { - localkey_t i; - buffer_t * p; + if(private) { + buffer_t * p = (buffer_t *) private; + localkey_t i; - if (private) { - p = (buffer_t *) private; - - for (i = (localkey_t) 0; i < LK_LAST; i++) { - if (p->buf) + for(i = (localkey_t) 0; i < LK_LAST; i++) { + if(p->buf) free(p->buf); p++; @@ -116,13 +114,13 @@ static void terminate(void) { - if (Curl_thread_buffer == buffer_threaded) { + if(Curl_thread_buffer == buffer_threaded) { locbufs = pthread_getspecific(thdkey); pthread_setspecific(thdkey, (void *) NULL); pthread_key_delete(thdkey); } - if (Curl_thread_buffer != buffer_undef) { + if(Curl_thread_buffer != buffer_undef) { thdbufdestroy((void *) locbufs); locbufs = (buffer_t *) NULL; } @@ -140,31 +138,31 @@ get_buffer(buffer_t * buf, long size) /* If `size' >= 0, make sure buffer at `buf' is at least `size'-byte long. Return the buffer address. */ - if (size < 0) + if(size < 0) return buf->buf; - if (!buf->buf) { - if ((buf->buf = malloc(size))) + if(!buf->buf) { + if((buf->buf = malloc(size))) buf->size = size; return buf->buf; } - if ((unsigned long) size <= buf->size) { + if((unsigned long) size <= buf->size) { /* Shorten the buffer only if it frees a significant byte count. This avoids some realloc() overhead. */ - if (buf->size - size < MIN_BYTE_GAIN) + if(buf->size - size < MIN_BYTE_GAIN) return buf->buf; } /* Resize the buffer. */ - if ((cp = realloc(buf->buf, size))) { + if((cp = realloc(buf->buf, size))) { buf->buf = cp; buf->size = size; } - else if (size <= buf->size) + else if(size <= buf->size) cp = buf->buf; return cp; @@ -191,16 +189,16 @@ buffer_threaded(localkey_t key, long size) bufs = (buffer_t *) pthread_getspecific(thdkey); - if (!bufs) { - if (size < 0) + if(!bufs) { + if(size < 0) return (char *) NULL; /* No buffer yet. */ /* Allocate buffer descriptors for the current thread. */ - if (!(bufs = calloc((size_t) LK_LAST, sizeof *bufs))) + if(!(bufs = calloc((size_t) LK_LAST, sizeof *bufs))) return (char *) NULL; - if (pthread_setspecific(thdkey, (void *) bufs)) { + if(pthread_setspecific(thdkey, (void *) bufs)) { free(bufs); return (char *) NULL; } @@ -222,11 +220,10 @@ buffer_undef(localkey_t key, long size) /* Determine if we can use pthread-specific data. */ - if (Curl_thread_buffer == buffer_undef) { /* If unchanged during lock. */ - if (!pthread_key_create(&thdkey, thdbufdestroy)) + if(Curl_thread_buffer == buffer_undef) { /* If unchanged during lock. */ + if(!pthread_key_create(&thdkey, thdbufdestroy)) Curl_thread_buffer = buffer_threaded; - else if (!(locbufs = calloc((size_t) LK_LAST, - sizeof *locbufs))) { + else if(!(locbufs = calloc((size_t) LK_LAST, sizeof *locbufs))) { pthread_mutex_unlock(&mutex); return (char *) NULL; } @@ -241,6 +238,28 @@ buffer_undef(localkey_t key, long size) } +static char * +set_thread_string(localkey_t key, const char * s) + +{ + int i; + char * cp; + + if(!s) + return (char *) NULL; + + i = strlen(s) + 1; + cp = Curl_thread_buffer(key, MAX_CONV_EXPANSION * i + 1); + + if(cp) { + i = QadrtConvertE2A(cp, s, MAX_CONV_EXPANSION * i, i); + cp[i] = '\0'; + } + + return cp; +} + + int Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen, char * nodename, curl_socklen_t nodenamelen, @@ -256,13 +275,13 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen, enodename = (char *) NULL; eservname = (char *) NULL; - if (nodename && nodenamelen) - if (!(enodename = malloc(nodenamelen))) + if(nodename && nodenamelen) + if(!(enodename = malloc(nodenamelen))) return EAI_MEMORY; - if (servname && servnamelen) - if (!(eservname = malloc(servnamelen))) { - if (enodename) + if(servname && servnamelen) + if(!(eservname = malloc(servnamelen))) { + if(enodename) free(enodename); return EAI_MEMORY; @@ -271,24 +290,24 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen, status = getnameinfo(sa, salen, enodename, nodenamelen, eservname, servnamelen, flags); - if (!status) { - if (enodename) { + if(!status) { + if(enodename) { i = QadrtConvertE2A(nodename, enodename, nodenamelen - 1, strlen(enodename)); nodename[i] = '\0'; } - if (eservname) { + if(eservname) { i = QadrtConvertE2A(servname, eservname, servnamelen - 1, strlen(eservname)); servname[i] = '\0'; } } - if (enodename) + if(enodename) free(enodename); - if (eservname) + if(eservname) free(eservname); return status; @@ -309,21 +328,21 @@ Curl_getaddrinfo_a(const char * nodename, const char * servname, enodename = (char *) NULL; eservname = (char *) NULL; - if (nodename) { + if(nodename) { i = strlen(nodename); - if (!(enodename = malloc(i + 1))) + if(!(enodename = malloc(i + 1))) return EAI_MEMORY; i = QadrtConvertA2E(enodename, nodename, i, i); enodename[i] = '\0'; } - if (servname) { + if(servname) { i = strlen(servname); - if (!(eservname = malloc(i + 1))) { - if (enodename) + if(!(eservname = malloc(i + 1))) { + if(enodename) free(enodename); return EAI_MEMORY; @@ -335,127 +354,16 @@ Curl_getaddrinfo_a(const char * nodename, const char * servname, status = getaddrinfo(enodename, eservname, hints, res); - if (enodename) + if(enodename) free(enodename); - if (eservname) + if(eservname) free(eservname); return status; } -#ifdef USE_QSOSSL - -/* ASCII wrappers for the SSL procedures. */ - -int -Curl_SSL_Init_Application_a(SSLInitApp * init_app) - -{ - int rc; - unsigned int i; - SSLInitApp ia; - - if (!init_app || !init_app->applicationID || !init_app->applicationIDLen) - return SSL_Init_Application(init_app); - - memcpy((char *) &ia, (char *) init_app, sizeof ia); - i = ia.applicationIDLen; - - if (!(ia.applicationID = malloc(i + 1))) { - errno = ENOMEM; - return SSL_ERROR_IO; - } - - QadrtConvertA2E(ia.applicationID, init_app->applicationID, i, i); - ia.applicationID[i] = '\0'; - rc = SSL_Init_Application(&ia); - free(ia.applicationID); - init_app->localCertificateLen = ia.localCertificateLen; - init_app->sessionType = ia.sessionType; - return rc; -} - - -int -Curl_SSL_Init_a(SSLInit * init) - -{ - int rc; - unsigned int i; - SSLInit ia; - - if (!init || (!init->keyringFileName && !init->keyringPassword)) - return SSL_Init(init); - - memcpy((char *) &ia, (char *) init, sizeof ia); - - if (ia.keyringFileName) { - i = strlen(ia.keyringFileName); - - if (!(ia.keyringFileName = malloc(i + 1))) { - errno = ENOMEM; - return SSL_ERROR_IO; - } - - QadrtConvertA2E(ia.keyringFileName, init->keyringFileName, i, i); - ia.keyringFileName[i] = '\0'; - } - - if (ia.keyringPassword) { - i = strlen(ia.keyringPassword); - - if (!(ia.keyringPassword = malloc(i + 1))) { - if (ia.keyringFileName) - free(ia.keyringFileName); - - errno = ENOMEM; - return SSL_ERROR_IO; - } - - QadrtConvertA2E(ia.keyringPassword, init->keyringPassword, i, i); - ia.keyringPassword[i] = '\0'; - } - - rc = SSL_Init(&ia); - - if (ia.keyringFileName) - free(ia.keyringFileName); - - if (ia.keyringPassword) - free(ia.keyringPassword); - - return rc; -} - - -char * -Curl_SSL_Strerror_a(int sslreturnvalue, SSLErrorMsg * serrmsgp) - -{ - int i; - char * cp; - char * cp2; - - cp = SSL_Strerror(sslreturnvalue, serrmsgp); - - if (!cp) - return cp; - - i = strlen(cp); - - if (!(cp2 = Curl_thread_buffer(LK_SSL_ERROR, MAX_CONV_EXPANSION * i + 1))) - return cp2; - - i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i); - cp2[i] = '\0'; - return cp2; -} - -#endif /* USE_QSOSSL */ - - #ifdef USE_GSKIT /* ASCII wrappers for the GSKit procedures. */ @@ -534,7 +442,7 @@ gsk_free_handle(struct Curl_gsk_descriptor * p) { struct gskstrlist * q; - while ((q = p->strlist)) { + while((q = p->strlist)) { p->strlist = q; free((void *) q->asciistr); free(q); @@ -555,7 +463,7 @@ Curl_gsk_environment_close(gsk_handle * my_env_handle) if(!*my_env_handle) return GSK_INVALID_HANDLE; p = (struct Curl_gsk_descriptor *) *my_env_handle; - if ((rc = gsk_environment_close(&p->h)) == GSK_OK) { + if((rc = gsk_environment_close(&p->h)) == GSK_OK) { gsk_free_handle(p); *my_env_handle = (gsk_handle) NULL; } @@ -575,7 +483,7 @@ Curl_gsk_secure_soc_close(gsk_handle * my_session_handle) if(!*my_session_handle) return GSK_INVALID_HANDLE; p = (struct Curl_gsk_descriptor *) *my_session_handle; - if ((rc = gsk_secure_soc_close(&p->h)) == GSK_OK) { + if((rc = gsk_secure_soc_close(&p->h)) == GSK_OK) { gsk_free_handle(p); *my_session_handle = (gsk_handle) NULL; } @@ -627,7 +535,7 @@ Curl_gsk_attribute_set_buffer_a(gsk_handle my_gsk_handle, GSK_BUF_ID bufID, p = (struct Curl_gsk_descriptor *) my_gsk_handle; if(!bufSize) bufSize = strlen(buffer); - if (!(ebcdicbuf = malloc(bufSize + 1))) + if(!(ebcdicbuf = malloc(bufSize + 1))) return GSK_INSUFFICIENT_STORAGE; QadrtConvertA2E(ebcdicbuf, buffer, bufSize, bufSize); ebcdicbuf[bufSize] = '\0'; @@ -689,7 +597,7 @@ cachestring(struct Curl_gsk_descriptor * p, char * asciibuf; struct gskstrlist * sp; - for (sp = p->strlist; sp; sp = sp->next) + for(sp = p->strlist; sp; sp = sp->next) if(sp->ebcdicstr == ebcdicbuf) break; if(!sp) { @@ -726,7 +634,7 @@ Curl_gsk_attribute_get_buffer_a(gsk_handle my_gsk_handle, GSK_BUF_ID bufID, if(!buffer || !bufSize) return GSK_OS400_ERROR_INVALID_POINTER; p = (struct Curl_gsk_descriptor *) my_gsk_handle; - if ((rc = gsk_attribute_get_buffer(p->h, bufID, &mybuf, &mylen)) != GSK_OK) + if((rc = gsk_attribute_get_buffer(p->h, bufID, &mybuf, &mylen)) != GSK_OK) return rc; if((rc = cachestring(p, mybuf, mylen, buffer)) == GSK_OK) *bufSize = mylen; @@ -825,23 +733,7 @@ const char * Curl_gsk_strerror_a(int gsk_return_value) { - int i; - const char * cp; - char * cp2; - - cp = gsk_strerror(gsk_return_value); - - if (!cp) - return cp; - - i = strlen(cp); - - if (!(cp2 = Curl_thread_buffer(LK_GSK_ERROR, MAX_CONV_EXPANSION * i + 1))) - return cp2; - - i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i); - cp2[i] = '\0'; - return cp2; + return set_thread_string(LK_GSK_ERROR, gsk_strerror(gsk_return_value)); } int @@ -878,11 +770,11 @@ Curl_gss_convert_in_place(OM_uint32 * minor_status, gss_buffer_t buf) i = buf->length; - if (i) { - if (!(t = malloc(i))) { + if(i) { + if(!(t = malloc(i))) { gss_release_buffer(minor_status, buf); - if (minor_status) + if(minor_status) *minor_status = ENOMEM; return -1; @@ -906,14 +798,14 @@ Curl_gss_import_name_a(OM_uint32 * minor_status, gss_buffer_t in_name, unsigned int i; gss_buffer_desc in; - if (!in_name || !in_name->value || !in_name->length) + if(!in_name || !in_name->value || !in_name->length) return gss_import_name(minor_status, in_name, in_name_type, out_name); memcpy((char *) &in, (char *) in_name, sizeof in); i = in.length; - if (!(in.value = malloc(i + 1))) { - if (minor_status) + if(!(in.value = malloc(i + 1))) { + if(minor_status) *minor_status = ENOMEM; return GSS_S_FAILURE; @@ -938,15 +830,15 @@ Curl_gss_display_status_a(OM_uint32 * minor_status, OM_uint32 status_value, rc = gss_display_status(minor_status, status_value, status_type, mech_type, message_context, status_string); - if (rc != GSS_S_COMPLETE || !status_string || - !status_string->length || !status_string->value) + if(rc != GSS_S_COMPLETE || !status_string || + !status_string->length || !status_string->value) return rc; /* No way to allocate a buffer here, because it will be released by gss_release_buffer(). The solution is to overwrite the EBCDIC buffer with ASCII to return it. */ - if (Curl_gss_convert_in_place(minor_status, status_string)) + if(Curl_gss_convert_in_place(minor_status, status_string)) return GSS_S_FAILURE; return rc; @@ -954,7 +846,8 @@ Curl_gss_display_status_a(OM_uint32 * minor_status, OM_uint32 status_value, OM_uint32 -Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle, +Curl_gss_init_sec_context_a(OM_uint32 * minor_status, + gss_cred_id_t cred_handle, gss_ctx_id_t * context_handle, gss_name_t target_name, gss_OID mech_type, gss_flags_t req_flags, OM_uint32 time_req, @@ -972,12 +865,12 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle, in.value = NULL; - if ((inp = input_token)) - if (inp->length && inp->value) { + if((inp = input_token)) + if(inp->length && inp->value) { i = inp->length; - if (!(in.value = malloc(i + 1))) { - if (minor_status) + if(!(in.value = malloc(i + 1))) { + if(minor_status) *minor_status = ENOMEM; return GSS_S_FAILURE; @@ -994,10 +887,10 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle, input_chan_bindings, inp, actual_mech_type, output_token, ret_flags, time_rec); - if (in.value) + if(in.value) free(in.value); - if (rc != GSS_S_COMPLETE || !output_token || + if(rc != GSS_S_COMPLETE || !output_token || !output_token->length || !output_token->value) return rc; @@ -1005,7 +898,7 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle, gss_release_buffer(). The solution is to overwrite the EBCDIC buffer with ASCII to return it. */ - if (Curl_gss_convert_in_place(minor_status, output_token)) + if(Curl_gss_convert_in_place(minor_status, output_token)) return GSS_S_FAILURE; return rc; @@ -1022,7 +915,7 @@ Curl_gss_delete_sec_context_a(OM_uint32 * minor_status, rc = gss_delete_sec_context(minor_status, context_handle, output_token); - if (rc != GSS_S_COMPLETE || !output_token || + if(rc != GSS_S_COMPLETE || !output_token || !output_token->length || !output_token->value) return rc; @@ -1030,7 +923,7 @@ Curl_gss_delete_sec_context_a(OM_uint32 * minor_status, gss_release_buffer(). The solution is to overwrite the EBCDIC buffer with ASCII to return it. */ - if (Curl_gss_convert_in_place(minor_status, output_token)) + if(Curl_gss_convert_in_place(minor_status, output_token)) return GSS_S_FAILURE; return rc; @@ -1051,12 +944,12 @@ Curl_ldap_init_a(char * host, int port) char * ehost; void * result; - if (!host) + if(!host) return (void *) ldap_init(host, port); i = strlen(host); - if (!(ehost = malloc(i + 1))) + if(!(ehost = malloc(i + 1))) return (void *) NULL; QadrtConvertA2E(ehost, host, i, i); @@ -1078,21 +971,21 @@ Curl_ldap_simple_bind_s_a(void * ld, char * dn, char * passwd) edn = (char *) NULL; epasswd = (char *) NULL; - if (dn) { + if(dn) { i = strlen(dn); - if (!(edn = malloc(i + 1))) + if(!(edn = malloc(i + 1))) return LDAP_NO_MEMORY; QadrtConvertA2E(edn, dn, i, i); edn[i] = '\0'; } - if (passwd) { + if(passwd) { i = strlen(passwd); - if (!(epasswd = malloc(i + 1))) { - if (edn) + if(!(epasswd = malloc(i + 1))) { + if(edn) free(edn); return LDAP_NO_MEMORY; @@ -1104,10 +997,10 @@ Curl_ldap_simple_bind_s_a(void * ld, char * dn, char * passwd) i = ldap_simple_bind_s(ld, edn, epasswd); - if (epasswd) + if(epasswd) free(epasswd); - if (edn) + if(edn) free(edn); return i; @@ -1131,10 +1024,10 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter, eattrs = (char * *) NULL; status = LDAP_SUCCESS; - if (base) { + if(base) { i = strlen(base); - if (!(ebase = malloc(i + 1))) + if(!(ebase = malloc(i + 1))) status = LDAP_NO_MEMORY; else { QadrtConvertA2E(ebase, base, i, i); @@ -1142,10 +1035,10 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter, } } - if (filter && status == LDAP_SUCCESS) { + if(filter && status == LDAP_SUCCESS) { i = strlen(filter); - if (!(efilter = malloc(i + 1))) + if(!(efilter = malloc(i + 1))) status = LDAP_NO_MEMORY; else { QadrtConvertA2E(efilter, filter, i, i); @@ -1153,17 +1046,17 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter, } } - if (attrs && status == LDAP_SUCCESS) { - for (i = 0; attrs[i++];) + if(attrs && status == LDAP_SUCCESS) { + for(i = 0; attrs[i++];) ; - if (!(eattrs = calloc(i, sizeof *eattrs))) + if(!(eattrs = calloc(i, sizeof *eattrs))) status = LDAP_NO_MEMORY; else { - for (j = 0; attrs[j]; j++) { + for(j = 0; attrs[j]; j++) { i = strlen(attrs[j]); - if (!(eattrs[j] = malloc(i + 1))) { + if(!(eattrs[j] = malloc(i + 1))) { status = LDAP_NO_MEMORY; break; } @@ -1174,22 +1067,22 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter, } } - if (status == LDAP_SUCCESS) + if(status == LDAP_SUCCESS) status = ldap_search_s(ld, ebase? ebase: "", scope, efilter? efilter: "(objectclass=*)", eattrs, attrsonly, res); - if (eattrs) { - for (j = 0; eattrs[j]; j++) + if(eattrs) { + for(j = 0; eattrs[j]; j++) free(eattrs[j]); free(eattrs); } - if (efilter) + if(efilter) free(efilter); - if (ebase) + if(ebase) free(ebase); return status; @@ -1200,16 +1093,15 @@ struct berval * * Curl_ldap_get_values_len_a(void * ld, LDAPMessage * entry, const char * attr) { - int i; char * cp; struct berval * * result; cp = (char *) NULL; - if (attr) { - i = strlen(attr); + if(attr) { + int i = strlen(attr); - if (!(cp = malloc(i + 1))) { + if(!(cp = malloc(i + 1))) { ldap_set_lderrno(ld, LDAP_NO_MEMORY, NULL, ldap_err2string(LDAP_NO_MEMORY)); return (struct berval * *) NULL; @@ -1221,11 +1113,11 @@ Curl_ldap_get_values_len_a(void * ld, LDAPMessage * entry, const char * attr) result = ldap_get_values_len(ld, entry, cp); - if (cp) + if(cp) free(cp); - /* Result data are binary in nature, so they haven't been converted to EBCDIC. - Therefore do not convert. */ + /* Result data are binary in nature, so they haven't been + converted to EBCDIC. Therefore do not convert. */ return result; } @@ -1235,23 +1127,7 @@ char * Curl_ldap_err2string_a(int error) { - int i; - char * cp; - char * cp2; - - cp = ldap_err2string(error); - - if (!cp) - return cp; - - i = strlen(cp); - - if (!(cp2 = Curl_thread_buffer(LK_LDAP_ERROR, MAX_CONV_EXPANSION * i + 1))) - return cp2; - - i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i); - cp2[i] = '\0'; - return cp2; + return set_thread_string(LK_LDAP_ERROR, ldap_err2string(error)); } @@ -1265,12 +1141,12 @@ Curl_ldap_get_dn_a(void * ld, LDAPMessage * entry) cp = ldap_get_dn(ld, entry); - if (!cp) + if(!cp) return cp; i = strlen(cp); - if (!(cp2 = malloc(i + 1))) + if(!(cp2 = malloc(i + 1))) return cp2; QadrtConvertE2A(cp2, cp, i, i); @@ -1297,12 +1173,12 @@ Curl_ldap_first_attribute_a(void * ld, cp = ldap_first_attribute(ld, entry, berptr); - if (!cp) + if(!cp) return cp; i = strlen(cp); - if (!(cp2 = malloc(i + 1))) + if(!(cp2 = malloc(i + 1))) return cp2; QadrtConvertE2A(cp2, cp, i, i); @@ -1329,12 +1205,12 @@ Curl_ldap_next_attribute_a(void * ld, cp = ldap_next_attribute(ld, entry, berptr); - if (!cp) + if(!cp) return cp; i = strlen(cp); - if (!(cp2 = malloc(i + 1))) + if(!(cp2 = malloc(i + 1))) return cp2; QadrtConvertE2A(cp2, cp, i, i); @@ -1364,8 +1240,8 @@ convert_sockaddr(struct sockaddr_storage * dstaddr, /* Convert a socket address into job CCSID, if needed. */ - if (!srcaddr || srclen < offsetof(struct sockaddr, sa_family) + - sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) { + if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) + + sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) { errno = EINVAL; return -1; } @@ -1398,7 +1274,7 @@ Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen) i = convert_sockaddr(&laddr, destaddr, addrlen); - if (i < 0) + if(i < 0) return -1; return connect(sd, (struct sockaddr *) &laddr, i); @@ -1414,7 +1290,7 @@ Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen) i = convert_sockaddr(&laddr, localaddr, addrlen); - if (i < 0) + if(i < 0) return -1; return bind(sd, (struct sockaddr *) &laddr, i); @@ -1431,7 +1307,7 @@ Curl_os400_sendto(int sd, char * buffer, int buflen, int flags, i = convert_sockaddr(&laddr, dstaddr, addrlen); - if (i < 0) + if(i < 0) return -1; return sendto(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, i); @@ -1450,7 +1326,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, struct sockaddr_un * dstu; struct sockaddr_storage laddr; - if (!fromaddr || !addrlen || *addrlen <= 0) + if(!fromaddr || !addrlen || *addrlen <= 0) return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen); laddrlen = sizeof laddr; @@ -1458,7 +1334,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, rcvlen = recvfrom(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, &laddrlen); - if (rcvlen < 0) + if(rcvlen < 0) return rcvlen; switch (laddr.ss_family) { @@ -1471,7 +1347,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen); laddrlen = i + offsetof(struct sockaddr_un, sun_path); - if (laddrlen < *addrlen) + if(laddrlen < *addrlen) dstu->sun_path[i] = '\0'; break; @@ -1480,10 +1356,10 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, break; default: - if (laddrlen > *addrlen) + if(laddrlen > *addrlen) laddrlen = *addrlen; - if (laddrlen) + if(laddrlen) memcpy((char *) fromaddr, (char *) &laddr, laddrlen); break; @@ -1492,3 +1368,79 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags, *addrlen = laddrlen; return rcvlen; } + + +#ifdef HAVE_LIBZ +const char * +Curl_os400_zlibVersion(void) + +{ + return set_thread_string(LK_ZLIB_VERSION, zlibVersion()); +} + + +int +Curl_os400_inflateInit_(z_streamp strm, const char * version, int stream_size) + +{ + z_const char * msgb4 = strm->msg; + int ret; + + ret = inflateInit(strm); + + if(strm->msg != msgb4) + strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg); + + return ret; +} + + +int +Curl_os400_inflateInit2_(z_streamp strm, int windowBits, + const char * version, int stream_size) + +{ + z_const char * msgb4 = strm->msg; + int ret; + + ret = inflateInit2(strm, windowBits); + + if(strm->msg != msgb4) + strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg); + + return ret; +} + + +int +Curl_os400_inflate(z_streamp strm, int flush) + +{ + z_const char * msgb4 = strm->msg; + int ret; + + ret = inflate(strm, flush); + + if(strm->msg != msgb4) + strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg); + + return ret; +} + + +int +Curl_os400_inflateEnd(z_streamp strm) + +{ + z_const char * msgb4 = strm->msg; + int ret; + + ret = inflateEnd(strm); + + if(strm->msg != msgb4) + strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg); + + return ret; +} + +#endif diff --git a/packages/OS400/os400sys.h b/packages/OS400/os400sys.h index 234bf5e..1144692 100644 --- a/packages/OS400/os400sys.h +++ b/packages/OS400/os400sys.h @@ -39,6 +39,8 @@ typedef enum { LK_EASY_STRERROR, LK_SHARE_STRERROR, LK_MULTI_STRERROR, + LK_ZLIB_VERSION, + LK_ZLIB_MSG, LK_LAST } localkey_t; diff --git a/packages/Solaris/Makefile.in b/packages/Solaris/Makefile.in index aca3530..60a005a 100644 --- a/packages/Solaris/Makefile.in +++ b/packages/Solaris/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -161,6 +161,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -185,7 +186,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -194,7 +194,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -215,6 +214,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -250,11 +250,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/Symbian/group/curl.pkg b/packages/Symbian/group/curl.pkg index dfc994f..17c64f1 100644 --- a/packages/Symbian/group/curl.pkg +++ b/packages/Symbian/group/curl.pkg @@ -1,4 +1,4 @@ -; curl package defintion file +; curl package definition file ; Use with makesis to create a Symbian .sis package ;Language - standard language definitions diff --git a/packages/Symbian/group/libcurl.mmp b/packages/Symbian/group/libcurl.mmp index 933994f..2419c20 100644 --- a/packages/Symbian/group/libcurl.mmp +++ b/packages/Symbian/group/libcurl.mmp @@ -21,24 +21,26 @@ MACRO USE_SSLEAY SOURCEPATH ../../../lib SOURCE \ - file.c timeval.c base64.c hostip.c progress.c formdata.c \ - cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ - ldap.c ssluse.c version.c getenv.c escape.c mprintf.c telnet.c \ - netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \ - curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \ - memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ - content_encoding.c share.c http_digest.c md4.c md5.c curl_rand.c \ - http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \ - hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \ - select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c \ - qssl.c rawstr.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \ - curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \ - pingpong.c rtsp.c curl_threads.c warnless.c hmac.c polarssl.c \ - curl_rtmp.c openldap.c curl_gethostname.c gopher.c axtls.c \ - idn_win32.c http_negotiate_sspi.c cyassl.c http_proxy.c non-ascii.c \ - asyn-ares.c asyn-thread.c curl_gssapi.c curl_ntlm.c curl_ntlm_wb.c \ - curl_ntlm_core.c curl_ntlm_msgs.c curl_sasl.c curl_schannel.c \ - curl_multibyte.c curl_darwinssl.c bundles.c conncache.c + file.c timeval.c base64.c hostip.c progress.c formdata.c \ + cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \ + ldap.c vtls/openssl.c version.c getenv.c escape.c mprintf.c telnet.c \ + netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \ + curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \ + memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ + content_encoding.c share.c http_digest.c md4.c md5.c curl_rand.c \ + http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \ + hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \ + select.c vtls/gtls.c vtls/vtls.c tftp.c splay.c strdup.c socks.c \ + ssh.c vtls/nss.c rawstr.c curl_addrinfo.c socks_gssapi.c \ + socks_sspi.c curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c \ + pop3.c smtp.c pingpong.c rtsp.c curl_threads.c warnless.c hmac.c \ + vtls/polarssl.c curl_rtmp.c openldap.c curl_gethostname.c gopher.c \ + vtls/axtls.c idn_win32.c http_negotiate_sspi.c vtls/cyassl.c \ + http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \ + curl_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_ntlm_msgs.c \ + curl_sasl.c vtls/curl_schannel.c curl_multibyte.c \ + vtls/curl_darwinssl.c bundles.c conncache.c curl_sasl_sspi.c smb.c \ + curl_sasl_gssapi.c curl_endian.c USERINCLUDE ../../../lib ../../../include/curl #ifdef ENABLE_SSL diff --git a/packages/Symbian/group/libcurl.pkg b/packages/Symbian/group/libcurl.pkg index 1460a59..6b04797 100644 --- a/packages/Symbian/group/libcurl.pkg +++ b/packages/Symbian/group/libcurl.pkg @@ -1,4 +1,4 @@ -; libcurl package defintion file +; libcurl package definition file ; Use with makesis to create a Symbian .sis package ;Language - standard language definitions diff --git a/packages/Win32/Makefile.in b/packages/Win32/Makefile.in index 7be4932..9c81836 100644 --- a/packages/Win32/Makefile.in +++ b/packages/Win32/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -218,6 +218,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -242,7 +243,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -251,7 +251,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -272,6 +271,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -307,11 +307,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/Win32/cygwin/Makefile.in b/packages/Win32/cygwin/Makefile.in index 4e7f754..eedce11 100644 --- a/packages/Win32/cygwin/Makefile.in +++ b/packages/Win32/cygwin/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -158,6 +158,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -182,7 +183,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -191,7 +191,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -212,6 +211,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -247,11 +247,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/vms/Makefile.in b/packages/vms/Makefile.in index 3013639..99e6313 100644 --- a/packages/vms/Makefile.in +++ b/packages/vms/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -158,6 +158,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -182,7 +183,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -191,7 +191,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -212,6 +211,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -247,11 +247,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/packages/vms/backup_gnv_curl_src.com b/packages/vms/backup_gnv_curl_src.com index 9a7905b..3857571 100644 --- a/packages/vms/backup_gnv_curl_src.com +++ b/packages/vms/backup_gnv_curl_src.com @@ -52,19 +52,19 @@ $! $ kit_name = f$trnlnm("GNV_PCSI_KITNAME") $ if kit_name .eqs. "" $ then -$ write sys$output "@MAKE_PCSI_BASH_KIT_NAME.COM has not been run." +$ write sys$output "@MAKE_PCSI_CURL_KIT_NAME.COM has not been run." $ goto all_exit $ endif $ producer = f$trnlnm("GNV_PCSI_PRODUCER") $ if producer .eqs. "" $ then -$ write sys$output "@MAKE_PCSI_BASH_KIT_NAME.COM has not been run." +$ write sys$output "@MAKE_PCSI_CURL_KIT_NAME.COM has not been run." $ goto all_exit $ endif $ filename_base = f$trnlnm("GNV_PCSI_FILENAME_BASE") $ if filename_base .eqs. "" $ then -$ write sys$output "@MAKE_PCSI_BASH_KIT_NAME.COM has not been run." +$ write sys$output "@MAKE_PCSI_CURL_KIT_NAME.COM has not been run." $ goto all_exit $ endif $! diff --git a/packages/vms/build_curl-config_script.com b/packages/vms/build_curl-config_script.com index ae9d181..ea1881d 100644 --- a/packages/vms/build_curl-config_script.com +++ b/packages/vms/build_curl-config_script.com @@ -1,10 +1,8 @@ -$! File: build_libcurl_pc.com +$! build_curl-config_script.com $! -$! $Id:$ +$! This generates the curl-config. script from the curl-config.in file. $! -$! Build the curl-config file from the config_curl.in file -$! -$! Copyright 2013, John Malmberg +$! Copyright 2014, John Malmberg $! $! Permission to use, copy, modify, and/or distribute this software for any $! purpose with or without fee is hereby granted, provided that the above @@ -19,44 +17,13 @@ $! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT $! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. $! $! -$! 15-Jun-2013 J. Malmberg +$! 16-Dec-2014 J. Malmberg $! $!=========================================================================== $! $! Skip this if the curl-config. already exists. $ if f$search("[--]curl-config.") .nes. "" then goto all_exit $! -$! Need to know the kit type. -$ kit_name = f$trnlnm("GNV_PCSI_KITNAME") -$ if kit_name .eqs. "" -$ then -$ write sys$output "@MAKE_PCSI_CURL_KIT_NAME.COM has not been run." -$ goto all_exit -$ endif -$! -$! -$! Parse the kit name into components. -$!--------------------------------------- -$ producer = f$element(0, "-", kit_name) -$ base = f$element(1, "-", kit_name) -$ product = f$element(2, "-", kit_name) -$ mmversion = f$element(3, "-", kit_name) -$ majorver = f$extract(0, 3, mmversion) -$ minorver = f$extract(3, 2, mmversion) -$ updatepatch = f$element(4, "-", kit_name) -$ if updatepatch .eqs. "-" then updatepatch = "" -$! -$! kit type of "D" means a daily build -$ kit_type = f$edit(f$extract(0, 1, majorver), "upcase") -$! -$ cfg_file_in = "[--]curl-config.in" -$! -$ if f$search(cfg_file_in) .eqs. "" -$ then -$ write sys$output "Can not find curl-config.in." -$ goto all_exit -$ endif -$! $ if (f$getsyi("HW_MODEL") .lt. 1024) $ then $ arch_name = "VAX" @@ -66,223 +33,122 @@ $ arch_name = arch_name + f$edit(f$getsyi("ARCH_NAME"), "UPCASE") $ if (arch_name .eqs. "") then arch_name = "UNK" $ endif $! +$ x_prefix = "/usr" +$ x_exec_prefix = "/usr" +$ x_includedir = "${prefix}/include" +$ x_cppflag_curl_staticlib = "-DCURL_STATICLIB" +$ x_enabled_shared = "no" +$ x_curl_ca_bundle = "" +$ x_cc = "cc" +$ x_support_features = "SSL IPv6 libz NTLM" +$ x_support_protocols1 = "DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP" +$ x_support_protocols2 = " LDAPS POP3 POP3S RTSP SMTP SMTPS TELNET TFTP" +$ x_support_protocols = x_support_protocols1 + x_support_protocols2 +$ x_curlversion = "0.0.0.0" +$ x_versionnum = "" +$ x_libdir = "${prefix}/lib" +$ x_require_lib_deps = "" +$ x_enable_static = "" +$ x_ldflags = "" +$ part1 = "-L/usr/lib -L/SSL_LIB -lssl -lcrypto -lz" +$ if arch_name .eqs. "VAX" +$ then +$ x_libcurl_libs = part1 +$ else +$ x_libcurl_libs = part1 + " -lgssapi" +$ endif +$ x_libext = "a" $! -$ curl_version = "0.0.0" -$ open/read vf [--.include.curl]curlver.h -$version_loop: -$ read vf/end=version_loop_end line_in +$! Get the version number +$!----------------------- +$ i = 0 +$ open/read/error=version_loop_end vhf [--.include.curl]curlver.h +$ version_loop: +$ read/end=version_loop_end vhf line_in $ if line_in .eqs. "" then goto version_loop -$ key = f$element(0, " ", line_in) -$ if key .nes. "#define" then goto version_loop -$ name = f$element(1, " ", line_in) -$ if name .eqs. "LIBCURL_VERSION" +$ if f$locate("#define LIBCURL_VERSION ", line_in) .eq. 0 $ then -$ curl_version = f$element(2, " ", line_in) - """" - """" -$ goto version_loop +$ x_curlversion = f$element(2," ", line_in) - """" - """" +$ i = i + 1 $ endif -$ if name .eqs. "LIBCURL_VERSION_NUM" +$ if f$locate("#define LIBCURL_VERSION_NUM ", line_in) .eq. 0 $ then -$ version_num_hex = f$element(2, " ", line_in) -$ version_num = version_num_hex - "0x" -$ goto version_loop +$ x_versionnum = f$element(2," ", line_in) - """" - """" +$ i = i + 1 $ endif -$version_loop_end: -$ close vf +$ if i .lt 2 then goto version_loop +$ version_loop_end: +$ close vhf $! -$! -$ create [--]curl-config. -$ open/append pco [--]curl-config. -$ open/read pci 'cfg_file_in' -$cfg_file_loop: -$ read pci/end=cfg_file_loop_end line_in -$! -$! blank lines -$ if line_in .eqs. "" +$ kit_type = "V" +$ if f$locate("-", x_curlversion) .lt. f$length(x_curlversion) $ then -$ write pco "" -$ goto cfg_file_loop +$ kit_type = "D" +$ x_prefix = "/beta" +$ x_exec_prefix = "/beta" $ endif $! -$! comment lines -$ key = f$extract(0, 1, line_in) -$ if key .eqs. "#" -$ then -$ write pco line_in -$ goto cfg_file_loop -$ endif -$! -$! No substitution line -$ line_in_len = f$length(line_in) -$ if f$locate("@", line_in) .ge. line_in_len -$ then -$ write pco line_in -$ goto cfg_file_loop -$ endif -$! -$ if f$locate("@prefix@", line_in) .lt line_in_len -$ then -$ if kit_type .nes. "D" -$ then -$ write pco "prefix=/usr" -$ else -$ write pco "prefix=/beta" -$ endif -$ goto cfg_file_loop -$ endif -$ if f$locate("@exec_prefix@", line_in) .lt line_in_len -$ then -$ if kit_type .nes. "D" -$ then -$ write pco "exec_prefix=/usr" -$ else -$ write pco "exec_prefix=/beta" -$ endif -$ goto cfg_file_loop -$ endif -$ if f$locate("=@includedir@", line_in) .lt line_in_len -$ then -$ write pco "includedir=$(prefix}/include" -$ goto cfg_file_loop -$ endif -$ if f$locate("X@includedir@", line_in) .lt line_in_len -$ then -$ write pco " if test ""X$(prefix}/include""; then" -$ goto cfg_file_loop -$ endif -$ if f$locate("I@includedir@", line_in) .lt line_in_len -$ then -$ write pco " echo "${CPPFLAG_CURL_STATICLIB}-I$(prefix}/include" -$ goto cfg_file_loop -$ endif -$ if f$locate("@CPPFLAG_CURL_STATICLIB@", line_in) .lt line_in_len -$ then -$ write pco "cppflag_curl_staticlib=-DCURL_STATICLIB" -$ goto cfg_file_loop -$ endif -$ if f$locate("@ENABLE_SHARED@", line_in) .lt line_in_len +$ if kit_type .nes. "D" $ then -$ write pco " echo no" -$ goto cfg_file_loop -$ endif -$ if f$locate("@CURL_CA_BUNDLE@", line_in) .lt line_in_len -$ then -$ write pco " echo """"" -$ goto cfg_file_loop -$ endif -$ if f$locate("@CC@", line_in) .lt line_in_len -$ then -$ write pco " echo ""cc""" -$ goto cfg_file_loop -$ endif -$ if f$locate("@SUPPORT_FEATURES@", line_in) .lt line_in_len -$ then -$ if arch_name .eqs. "VAX" -$ then -$ write pco " for feature in SSL libz NTLM ""; do" -$ else -$ write pco " for feature in SSL IPv6 libz NTLM ""; do" -$ endif -$ goto cfg_file_loop -$ endif -$ if f$locate("@SUPPORT_PROTOCOLS@", line_in) .lt line_in_len -$ then -$ proto1 = "DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS" -$ proto2 = " LDAP LDAPS POP3 POP3S RTSP SMTP SMTPS TELNET TFTP" -$ proto = proto1 + proto2 -$ write pco " for protocol in " + proto + "; do" -$ goto cfg_file_loop -$ endif -$ if f$locate("libcurl @CURLVERSION@", line_in) .lt line_in_len -$ then -$ write pco " echo libcurl ''curl_version'" -$ goto cfg_file_loop -$ endif -$ if f$locate("existing @CURLVERSION@", line_in) .lt line_in_len -$ then -$ line_start = - - " echo ""requested version $checkfor is newer than existing" -$ write pco "''line_start' ''curl_version'""" -$ goto cfg_file_loop -$ endif -$ if f$locate("`echo @versionnum@", line_in) .lt line_in_len -$ then -$ write pco " numuppercase=`echo ''version_num' | tr 'a-f' 'A-F'`" -$ goto cfg_file_loop -$ endif -$ if f$locate(" echo @versionnum@", line_in) .lt line_in_len -$ then -$ write pco " echo ''version_num'" -$ goto cfg_file_loop -$ endif -$ if f$locate("X@libdir@", line_in) .lt line_in_len -$ then -$ part1 = " if test ""$(exec_prefix}/lib"" != ""X/usr/lib""" -$ part2 = "-a ""X$(exec_prefix}/lib"" != ""X/usr/lib64""; then" -$ write pco part1,part2 -$ goto cfg_file_loop -$ endif -$ if f$locate("L@libdir@", line_in) .lt line_in_len -$ then -$ write pco " CURLLIBDIR=""$(exec_prefix}/lib """ -$ goto cfg_file_loop -$ endif -$ if f$locate("@REQUIRE_LIB_DEPS@", line_in) .lt line_in_len -$ then -$ write pco " if test "Xyes" = "Xyes"; then" -$ goto cfg_file_loop -$ endif -$ if f$locate("@LIBCURL_LIBS@", line_in) .lt line_in_len -$ then -$ if arch_name .eqs. "VAX" -$ then -$ write pco " echo ${CURLLIBDIR}-lssl -lcrypto -lz" -$ else -$ write pco " echo ${CURLLIBDIR}-lssl -lcrypto -lgssapi -lz" -$ endif -$ goto cfg_file_loop -$ endif -$ if f$locate("@ENABLE_STATIC@", line_in) .lt line_in_len -$ then -$ write pco " if test "Xyes" != "Xno" ; then" -$ goto cfg_file_loop +$ part1 = " echo "" '--prefix=/usr' '--exec-prefix=/usr' " +$ else +$ part1 = " echo "" '--prefix=/beta' '--exec_prefix=/beta' " $ endif -$ if f$locate("@LIBCURL_LIBS@", line_in) .lt line_in_len +$ if arch_name .eqs. "VAX" $ then -$ part1 = " echo ${exec_prefix}/lib/libcurl.a" -$ part2 = "-L/usr/lib -L/SSL_LIB" -$ if arch_name .eqs. "VAX" -$ then -$ write pco "''part1' ''part2' -lssl -lcrypto -lz" -$ else -$ write pco "''part1' ''part2' -lssl -lcrypto -lgssapi -lz" -$ endif -$ goto cfg_file_loop +$ part3 = "" +$ else +$ part3 = "'--with-gssapi' " $ endif -$ if f$locate("@CONFIGURE_OPTIONS@", line_in) .lt line_in_len -$ then -$ if kit_type .nes. "D" -$ then -$ part1 = " echo "" '--prefix=/usr' '--exec-prefix=/usr' " -$ else -$ part1 = " echo "" '--prefix=/beta' '--exec_prefix=/beta' " -$ endif -$ if arch_name .eqs. "VAX" -$ then -$ part3 = "" -$ else -$ part3 = "'--with-gssapi' " -$ endif -$ part2 = "'--disable-dependency-tracking' '--disable-libtool-lock' " -$ part4 = "'--disable-ntlm-wb' '--with-ca-path=gnv$curl_ca_path'""" +$ part2 = "'--disable-dependency-tracking' '--disable-libtool-lock' " +$ part4 = "'--disable-ntlm-wb' '--with-ca-path=gnv$curl_ca_path'""" $! -$ write pco part1,part2,part3,part4 +$ x_configure_options = part1 + part2 + part3 + part4 $! -$ goto cfg_file_loop -$ endif -$! -$pc_file_loop_end: -$ close pco -$ close pci $! -$all_exit: -$ exit +$ open/read/error=read_loop_end c_c_in sys$disk:[--]curl-config.in +$ create sys$disk:[--]curl-config. +$ open/append c_c_out sys$disk:[--]curl-config. +$read_loop: +$ read/end=read_loop_end c_c_in line_in +$ line_in_len = f$length(line_in) +$ if f$locate("@", line_in) .ge. line_in_len +$ then +$ write c_c_out line_in +$ goto read_loop +$ endif +$ i = 0 +$ line_out = "" +$sub_loop: +$ ! Replace between pairs of @ by alternating the elements. +$ ! If mis-matched pairs, do not substitute anything. +$ section1 = f$element(i, "@", line_in) +$ if section1 .eqs. "@" +$ then +$ goto sub_loop_end +$ endif +$ i = i + 1 +$ section2 = f$element(i, "@", line_in) +$ if section2 .eqs. "@" +$ then +$ goto sub_loop_end +$ endif +$ i = i + 1 +$ section3 = f$element(i, "@", line_in) +$ if section3 .eqs. "@" +$ then +$ if line_out .eqs. "" then line_out = line_in +$ goto sub_loop_end +$ endif +$ line_out = line_out + section1 +$ if f$type(x_'section2') .eqs. "STRING" +$ then +$ line_out = line_out + x_'section2' +$ endif +$ goto sub_loop +$sub_loop_end: +$ write c_c_out line_out +$ goto read_loop +$read_loop_end: +$ close c_c_in +$ close c_c_out diff --git a/packages/vms/build_gnv_curl_release_notes.com b/packages/vms/build_gnv_curl_release_notes.com index dbe43d9..da0276f 100644 --- a/packages/vms/build_gnv_curl_release_notes.com +++ b/packages/vms/build_gnv_curl_release_notes.com @@ -70,6 +70,17 @@ $ write sys$output "Can not find VMS specific Curl readme file." $ goto all_exit $ endif $! +$ curl_release_notes = f$search("sys$disk:[--]release-notes.") +$ if curl_release_notes .eqs. "" +$ then +$ curl_release_notes = f$search("sys$disk:[--]$RELEASE-NOTES.") +$ endif +$ if curl_release_notes .eqs. "" +$ then +$ write sys$output "Can not find Curl release-notes file." +$ goto all_exit +$ endif +$! $ if f$search("sys$disk:[]hp_ssl_release_info.txt") .eqs. "" $ then $ write sys$output "GNV_LINK_CURL.COM has not been run!" @@ -77,6 +88,7 @@ $ goto all_exit $ endif $! $ type/noheader 'curl_readme', 'vms_readme', - + 'curl_release_notes', - sys$disk:[]curl_release_note_start.txt, - sys$disk:[]hp_ssl_release_info.txt, - 'curl_copying', - diff --git a/packages/vms/build_libcurl_pc.com b/packages/vms/build_libcurl_pc.com index 251b345..97e6ae6 100644 --- a/packages/vms/build_libcurl_pc.com +++ b/packages/vms/build_libcurl_pc.com @@ -76,7 +76,7 @@ $ endif $! $! $ curl_version = "0.0.0" -$ open/read vf [--.src]version.h +$ open/read vf [--.src]tool_version.h $version_loop: $ read vf/end=version_loop_end line_in $ if line_in .eqs. "" then goto version_loop diff --git a/packages/vms/build_vms.com b/packages/vms/build_vms.com index 4ec7635..d7edc46 100644 --- a/packages/vms/build_vms.com +++ b/packages/vms/build_vms.com @@ -148,6 +148,9 @@ $! * 3 spaces after $ for second level. Line start + 4. $! * 7 spaces after $ for third level. Line start + 8. $! * Each level after that indents 4 characters. $! * then/else/endif same indentation as if statement. +$! 17-Nov-2014, Michael Steve +$! Modified build to handle new location of the VTLS lib +$! source within zip archive. Not a pretty fix. $! $!=========================================================================== $! @@ -375,14 +378,24 @@ $ if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;* $ if f$search("''file'.opt") .nes. "" then delete/log 'file'.opt;* $ file = "[...]curl-*_original_src.bck" $ if f$search(file) .nes. "" then delete/log 'file';* +$ file = "[...]curl_d-*_original_src.bck" +$ if f$search(file) .nes. "" then delete/log 'file';* $ file = "[...]curl-*_vms_src.bck" $ if f$search(file) .nes. "" then delete/log 'file';* +$ file = "[...]curl_d-*_vms_src.bck" +$ if f$search(file) .nes. "" then delete/log 'file';* $ file = "[...]curl-*.release_notes" $ if f$search(file) .nes. "" then delete/log 'file';* +$ file = "[...]curl_d-*.release_notes" +$ if f$search(file) .nes. "" then delete/log 'file';* $ file = "[...]*curl*.pcsi$desc" $ if f$search(file) .nes. "" then delete/log 'file';* +$ file = "[...]*curl_d*.pcsi$desc" +$ if f$search(file) .nes. "" then delete/log 'file';* $ file = "[...]*curl*.pcsi$text" $ if f$search(file) .nes. "" then delete/log 'file';* +$ file = "[...]*curl_d*.pcsi$text" +$ if f$search(file) .nes. "" then delete/log 'file';* $! $ if clean_all .eq. 0 then goto Common_Exit $ endif @@ -667,8 +680,6 @@ $! Form CC qualifiers. $! $ cc_defs = "/define = (''cc_defs')" $ cc_qual2 = cc_qual2 + " /object = ''objdir'" -$ cc_qual2 = cc_qual2 + " /include = ([-.lib], [-.src]," -$ cc_qual2 = cc_qual2 + " [-.packages.vms], [-.packages.vms.''arch_name'])" $ cc_qual2 = cc_qual2 + "/nested_include_directory=none" $! $ 'vo_c' "CC opts:", - @@ -796,7 +807,6 @@ $! set nover $ endif $! $! -$! $ on control_y then goto Common_Exit $! $ set default 'proc_dev_dir' @@ -809,10 +819,21 @@ $ if curl_sys_zlibinc .nes. "" $ then $ sys_inc = sys_inc + ",''curl_sys_zlibinc'" $ endif +$! Build LIB +$ cc_include = "/include=([-.lib],[-.lib.vtls],[-.packages.vms]" +$ cc_include = cc_include + ",[-.packages.vms.''arch_name'])" $ call build "[--.lib]" "*.c" "''objdir'CURLLIB.OLB" "amigaos, nwlib, nwos" $ if ($status .eq. ctrl_y) then goto Common_Exit +$! Build VTLS +$ cc_include = "/include=([--.lib.vtls],[--.lib],[--.src]" +$ cc_include = cc_include + ",[--.packages.vms],[--.packages.vms.''arch_name'])" +$ call build "[--.lib.vtls]" "*.c" "''objdir'CURLLIB.OLB" "amigaos, nwlib, nwos" +$! Build SRC +$ cc_include = "/include=([-.src],[-.lib],[-.lib.vtls]" +$ cc_include = cc_include + ",[-.packages.vms],[-.packages.vms.''arch_name'])" $ call build "[--.src]" "*.c" "''objdir'CURLSRC.OLB" $ if ($status .eq. ctrl_y) then goto Common_Exit +$! Build MSG $ call build "[]" "*.msg" "''objdir'CURLSRC.OLB" $ if ($status .eq. ctrl_y) then goto Common_Exit $! @@ -910,7 +931,7 @@ $ on control_y then goto EndLoop ! SS$_CONTROLY $ sts = 1 ! SS$_NORMAL. $! set noon $ set default 'p1' -$ search = p2 +$ search = "sys$disk:" + p2 $ reset = f$search("reset") $ if f$search( p3) .eqs. "" $ then @@ -984,6 +1005,7 @@ $ define/user decc$system_include 'sys_inc' $ CC 'cc_defs' - 'cc_qual1' - 'cc_qual2' - + 'cc_include' - 'file' $ else $ cmd_msg = "MESSAGE " + msg_qual diff --git a/packages/vms/clean_gnv_curl.com b/packages/vms/clean_gnv_curl.com index 0bef42c..24ecb11 100644 --- a/packages/vms/clean_gnv_curl.com +++ b/packages/vms/clean_gnv_curl.com @@ -108,15 +108,36 @@ $! $ file = "lcl_root:[.include.curl]curlbuild.h_old" $ if f$search(file) .nes. "" then delete 'file';* $! +$ file = "lcl_root:[.packages.vms]curl-*_original_src.bck" +$ if f$search(file) .nes. "" then delete 'file';* +$! +$ file = "lcl_root:[.packages.vms]curl_d-*_original_src.bck" +$ if f$search(file) .nes. "" then delete 'file';* +$! +$ file = "lcl_root:[.packages.vms]curl-*_vms_src.bck" +$ if f$search(file) .nes. "" then delete 'file';* +$! +$ file = "lcl_root:[.packages.vms]curl_d-*_vms_src.bck" +$ if f$search(file) .nes. "" then delete 'file';* +$! $ file = "lcl_root:[.packages.vms]curl-*.release_notes" $ if f$search(file) .nes. "" then delete 'file';* $! +$ file = "lcl_root:[.packages.vms]curl_d-*.release_notes" +$ if f$search(file) .nes. "" then delete 'file';* +$! $ file = "lcl_root:[.packages.vms]*-curl-*.pcsi$desc" $ if f$search(file) .nes. "" then delete 'file';* $! +$ file = "lcl_root:[.packages.vms]*-curl_d-*.pcsi$desc" +$ if f$search(file) .nes. "" then delete 'file';* +$! $ file = "lcl_root:[.packages.vms]*-curl-*.pcsi$text" $ if f$search(file) .nes. "" then delete 'file';* $! +$ file = "lcl_root:[.packages.vms]*-curl_d-*.pcsi$text" +$ if f$search(file) .nes. "" then delete 'file';* +$! $!====================================================================== $! $ if p1 .nes. "REALCLEAN" then goto all_exit diff --git a/packages/vms/config_h.com b/packages/vms/config_h.com index 6ec27ea..2a5503f 100644 --- a/packages/vms/config_h.com +++ b/packages/vms/config_h.com @@ -1382,7 +1382,7 @@ $! search/out 'tfile1' "$_''keyterm'" $ severity = '$severity' $ endif $! -$! UNIX compatability routines +$! Unix compatability routines $!--------------------------------------------- $ if severity .ne. 1 $ then diff --git a/packages/vms/curl_crtl_init.c b/packages/vms/curl_crtl_init.c index 98c70ec..01a34e5 100644 --- a/packages/vms/curl_crtl_init.c +++ b/packages/vms/curl_crtl_init.c @@ -232,7 +232,7 @@ static void set_features(void) /* POSIX requires that open files be able to be removed */ set_feature_default ("DECC$ALLOW_REMOVE_OPEN_FILES", ENABLE); - /* Default to outputting UNIX filesnames in VMS routines */ + /* Default to outputting Unix filenames in VMS routines */ set_feature_default ("DECC$FILENAME_UNIX_ONLY", ENABLE); /* FILENAME_UNIX_ONLY Implicitly sets */ /* decc$disable_to_vms_logname_translation */ @@ -248,7 +248,7 @@ static void set_features(void) set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE); } - /* When reporting UNIX filenames, glob the same way */ + /* When reporting Unix filenames, glob the same way */ set_feature_default ("DECC$GLOB_UNIX_STYLE", ENABLE); /* The VMS version numbers on Unix filenames is incompatible with most */ diff --git a/packages/vms/curl_gnv_build_steps.txt b/packages/vms/curl_gnv_build_steps.txt index e21b37d..6a87fef 100644 --- a/packages/vms/curl_gnv_build_steps.txt +++ b/packages/vms/curl_gnv_build_steps.txt @@ -58,7 +58,7 @@ LCL_ROOT:,VMS_ROOT:,SRC_ROOT: For the make install process to work, it must have write access to the directories referenced by the GNU: logical name. -In future releases of GNV, and with GNV Bash 4.2.45 installed, this name +In future releases of GNV, and with GNV Bash 4.3.30 installed, this name should be GNV$GNU: As directly updating those directories would probably be disruptive to other @@ -99,10 +99,6 @@ Note to builders: GNV currently has a bug where configure scripts take a long time to run. Some of the configure steps take a while to complete, and on a 600 Mhz DS10 with IDE disks, taking an hour to run the CURL configure is normal. -The bug appears to be in the SED for GNV 2.1.3 and GNV 3.0.1 where it -is taking far longer than it should to do I/O. In addition, there are -reports that the SED in GNV 3.0.1 is broken so the SED from GNV 2.1.3 -should be used instead. The following messages can be ignored and may get fixed in a future version of GNV. The GNV$*.OPT files are used to find the libraries as many have @@ -119,12 +115,50 @@ u unimplemented switch - ignored With these search lists set up and the properly, curl can be built by -setting your default to PRJ_ROOT:[curl.packages.vms] where the * is -replaced by the actual version of curl, and then issuing the command: +setting your default to PRJ_ROOT:[curl.packages.vms] and then issuing +either the command: + + $ @pcsi_product_gnv_curl.com + +or $ @build_gnv_curl.com. -This command procedure does the following: +The GNV configure procedure takes considerably longer than the DCL build +procecure takes. It is of use for testing the GNV build environment, and +may not have been kept up to date. + +The pcsi_product_gnv_curl.com needs the following logical names which +are described in the section below: + + gnv_pcsi_producer + gnv_pcsi_producer_full_name + stage_root + vms_root1 (Optional if vms_root is on a NFS volume) + src_root1 (Optional if src_root is on a NFS volume) + +The pcsi_product_gnv_curl.com is described in more detail below. It does +the following steps. The build steps are only done if they are needed to +allow using either DCL or GNV based building procedures. + + $ @build_vms list + + $ @gnv_link_curl.com + + $ @build_gnv_curl_release_notes.com + + $ @backup_gnv_curl_src.com + + $ @build_gnv_curl_pcsi_desc.com + + $ @build_gnv_curl_pcsi_text.com + + $ @stage_curl_install remove + $ @stage_curl_install + + Then builds the kit. + +The build_gnv_curl.com command procedure does the following: $ @setup_gnv_curl_build.com @@ -140,7 +174,8 @@ This command procedure does the following: $ purge new_gnu:[*...]/log -To clean up after a build to start over, the following commands are used: +To clean up after a GNV based build to start over, the following commands are +used: $ bash bash$ cd ../.. diff --git a/packages/vms/generate_config_vms_h_curl.com b/packages/vms/generate_config_vms_h_curl.com index 8024a92..90a83d5 100644 --- a/packages/vms/generate_config_vms_h_curl.com +++ b/packages/vms/generate_config_vms_h_curl.com @@ -277,6 +277,18 @@ $endif $write cvh "#ifdef CURL_DISABLE_LIBCURL_OPTION" $write cvh "#undef CURL_DISABLE_LIBCURL_OPTION" $write cvh "#endif" +$write cvh "#ifndef __VAX" +$write cvh "#ifdef CURL_DISABLE_NTLM" +$write cvh "#undef CURL_DISABLE_NTLM" +$write cvh "#endif" +$write cvh "#else" +$! NTLM needs long long or int64 support, missing from DECC C. +$write cvh "#ifdef __DECC +$write cvh "#ifndef CURL_DISABLE_NTLM" +$write cvh "#define CURL_DISABLE_NTLM 1" +$write cvh "#endif" +$write cvh "#endif" +$write cvh "#endif" $write cvh "#ifdef CURL_DISABLE_POP3" $write cvh "#undef CURL_DISABLE_POP3" $write cvh "#endif" @@ -334,6 +346,9 @@ $write cvh "#endif" $write cvh "#ifdef USE_MANUAL" $write cvh "#undef USE_MANUAL" $write cvh "#endif" +$write cvh "#ifdef USE_NGHTTP2" +$write cvh "#undef USE_NGHTTP2" +$write cvh "#endif" $write cvh "#ifdef USE_NSS" $write cvh "#undef USE_NSS" $write cvh "#endif" @@ -352,10 +367,17 @@ $write cvh "#endif" $write cvh "#ifdef USE_TLS_SRP" $write cvh "#undef USE_TLS_SRP" $write cvh "#endif" +$write cvh "#ifdef USE_UNIX_SOCKETS" +$write cvh "#undef USE_UNIX_SOCKETS" +$write cvh "#endif" $write cvh "#ifdef USE_WINDOWS_SSPI" $write cvh "#undef USE_WINDOWS_SSPI" $write cvh "#endif" $! +$write cvh "#ifndef HAVE_OLD_GSSMIT" +$write cvh "#define gss_nt_service_name GSS_C_NT_HOSTBASED_SERVICE" +$write cvh "#endif" +$! $! $! Note: $! The CURL_EXTERN_SYMBOL is used for platforms that need the compiler @@ -388,6 +410,18 @@ $ write cvh "#endif" $ write cvh "#ifndef USE_SSLEAY" $ write cvh "#define USE_SSLEAY 1" $ write cvh "#endif" +$ if arch_name .eqs. "VAX" +$ then +$ old_mes = f$enviroment("message") +$ set message/notext/nofaci/noseve/noident +$ search/output=nla0: ssl$include:*.h CONF_MFLAGS_IGNORE_MISSING_FILE +$ status = $severity +$ set message'old_mes' +$ if status .nes. "1" +$ then +$ write cvh "#define VMS_OLD_SSL 1" +$ endif +$ endif $endif $! $! @@ -406,6 +440,7 @@ $ write cvh "#undef HAVE_LIBIDN" $ write cvh "#endif" $endif $! +$! $! LibSSH2 not ported to VMS at this time. $! Allow explicit experimentation. $if libssh2 @@ -428,6 +463,7 @@ $ write cvh "#endif" $endif $! $! +$! $if .not. nozlib $then $ write cvh "#define HAVE_LIBZ 1" @@ -435,6 +471,9 @@ $ write cvh "#define HAVE_ZLIB_H 1" $endif $! $! +$! Suppress a message in curl_gssapi.c compile. +$write cvh "#pragma message disable notconstqual" +$! $! Close out the file $! $write cvh "" diff --git a/packages/vms/gnv_curl_configure.sh b/packages/vms/gnv_curl_configure.sh index f714210..2eeb209 100644 --- a/packages/vms/gnv_curl_configure.sh +++ b/packages/vms/gnv_curl_configure.sh @@ -23,7 +23,7 @@ # 28-Dec-2012 J. Malmberg Update for Bash 4.2.39 #========================================================================== # -# POSIX exit mode is needed for UNIX shells. +# POSIX exit mode is needed for Unix shells. export GNV_CC_MAIN_POSIX_EXIT=1 # # Where to look for the helper files. diff --git a/packages/vms/gnv_link_curl.com b/packages/vms/gnv_link_curl.com index fadbbcc..960c243 100644 --- a/packages/vms/gnv_link_curl.com +++ b/packages/vms/gnv_link_curl.com @@ -354,7 +354,6 @@ $ endif $! $gnv_libcurl_share = "''default_dir'gnv$libcurl.exe" $! -$set ver $ if f$search(gnv_libcurl_share) .eqs. "" $ then $ if arch_name .nes. "VAX" @@ -420,19 +419,17 @@ $ curl_dsf = "[.src]curl.dsf" $ curl_main = "[.packages.vms.''arch_name']tool_main.obj" $ curl_src = "[.packages.vms.''arch_name']curlsrc.olb" $ curl_lib = "[.packages.vms.''arch_name']curllib.olb" -$ strtoofft = "strtoofft" -$ strdup = "strdup" $ rawstr = "rawstr" $ nonblock = "nonblock" +$ warnless = "warnless" $! $! Extended parse style requires special quoting $! $ if (arch_name .nes. "VAX") .and. (parse_style .eqs. "EXTENDED") $ then -$ strtoofft = """strtoofft""" -$ strdup = """strdup""" $ rawstr = """rawstr""" $ nonblock = """nonblock""" +$ warnless = """warnless""" $ endif $ if f$search(curl_exe) .eqs. "" $ then @@ -440,7 +437,7 @@ $ define/user gnv$libcurl 'gnv_libcurl_share' $ link'ldebug'/exe='curl_exe'/dsf='curl_dsf' - 'curl_main','curl_src'/lib, - 'curl_lib'/library/include=- - ('strtoofft', 'strdup', 'rawstr', 'nonblock'),- + ('rawstr','nonblock','warnless'),- gnv_packages_vms:curlmsg.obj,- sys$input:/opt gnv$libcurl/share @@ -448,7 +445,7 @@ gnv_packages_vms:curl_crtl_init.obj $ endif $ endif $! -$set nover +$! $! $! in6addr_missing so skip building: $! [.server]sws.o diff --git a/packages/vms/make_gnv_curl_install.sh b/packages/vms/make_gnv_curl_install.sh index d2150e6..5099fe4 100644 --- a/packages/vms/make_gnv_curl_install.sh +++ b/packages/vms/make_gnv_curl_install.sh @@ -33,7 +33,7 @@ export GNV_CXX_QUALIFIERS=/DEBUG/OPTIMIZE/float=ieee/ieee_mode=denorm_results export GNV_CC_NO_INC_PRIMARY=1 # # -# POSIX exit mode is needed for UNIX shells. +# POSIX exit mode is needed for Unix shells. export GNV_CC_MAIN_POSIX_EXIT=1 make cd ../.. diff --git a/packages/vms/pcsi_product_gnv_curl.com b/packages/vms/pcsi_product_gnv_curl.com index 38a1a99..747cbd6 100644 --- a/packages/vms/pcsi_product_gnv_curl.com +++ b/packages/vms/pcsi_product_gnv_curl.com @@ -61,6 +61,32 @@ $! Make sure that the kit name is up to date for this build $!---------------------------------------------------------- $ @MAKE_PCSI_CURL_KIT_NAME.COM $! +$! +$! Make sure that the image is built +$!---------------------------------- +$ arch_name = f$edit(f$getsyi("arch_name"),"UPCASE") +$ if f$search("[--.src]curl.exe") .eqs. "" +$ then +$ build_it = 1 +$ libfile = "[.packages.vms.''arch_name']curllib.olb" +$ if f$search(libfile) .nes. "" +$ then +$ build_it = 0 +$ else +$ ! GNV based build +$ libfile = "[.lib.^.libs]libcurl.a" +$ if f$search(libfile) .nes. "" +$ then +$ build_it = 0; +$ endif +$ endif +$ if build_it .eq. 1 +$ then +$ @build_vms list +$ endif +$ @gnv_link_curl.com +$ endif +$! $! Make sure that the release note file name is up to date $!--------------------------------------------------------- $ @BUILD_GNV_CURL_RELEASE_NOTES.COM @@ -107,6 +133,8 @@ $ else $ version = "''mmversion'" $ endif $! +$ @stage_curl_install remove +$ @stage_curl_install $! $! Move to the base directories $ set def [--] @@ -114,6 +142,7 @@ $ current_default = f$environment("DEFAULT") $ my_dir = f$parse(current_default,,,"DIRECTORY") - "[" - "<" - ">" - "]" $! $! +$! $ source = "''default_dir'" $ src1 = "new_gnu:[usr.bin]," $ src2 = "new_gnu:[usr.include.curl]," @@ -128,7 +157,6 @@ $ gnu_src = src1 + src2 + src3 + src4 + src5 + src6 + src7 + src8 + src9 $! $! $ base = "" -$ arch_name = f$edit(f$getsyi("arch_name"),"UPCASE") $ if arch_name .eqs. "ALPHA" then base = "AXPVMS" $ if arch_name .eqs. "IA64" then base = "I64VMS" $ if arch_name .eqs. "VAX" then base = "VAXVMS" diff --git a/projects/README b/projects/README new file mode 100644 index 0000000..b45d783 --- /dev/null +++ b/projects/README @@ -0,0 +1,125 @@ +Building via IDE Project Files +============================== + + This document describes how to compile, build and install curl and libcurl + from sources using an IDE based development tool such as Visual Studio. + + Project files are currently available for Visual C++ v6.0 to v12.0. The + following directory structure has been used to cater for this: + + somedirectory\ + |_curl + |_projects + |_ + |_ + |_lib + |_src + + This structure allows for side-by-side compilation of curl on the same + machine using different versions of a given compiler (for example VC8, VC9 + and VC10) and allows for your own application or product to be compiled + against those variants of libcurl for example. + + Note: Typically this side-by-side compilation is generally only required + when a library is being compiled against dynamic runtime libraries. + +Dependencies +============ + + The projects files also support build configurations that require third + party dependencies such as OpenSSL and SSH2. If you wish to support these, + you will also need to download and compile those libraries as well. + + To support compilation of these libraries using different versions of + compilers, the following directory structure has been used for both the + output of curl and libcurl as well as these dependencies. + + somedirectory\ + |_curl + | |_ build + | |_ + | |_ + | |_ + | |_lib + | |_src + | + |_openssl + | |_ build + | |_ + | |_VC + | |_ + | + |_libssh2 + |_ build + |_ + |_VC + |_ + + As OpenSSL doesn't support side-by-side compilation when using different + versions of Visual Studio a build helper batch file has been provided to + assist with this. Please run "build-openssl -help" for usage details. + +Building with Visual C++ +======================== + + To build with VC++, you will of course have to first install VC++ which is + part of Visual Studio. + + If you are building with VC6 then you will also need the February 2003 + Edition of the Windows Platform SDK which can be downloaded from: + + http://www.microsoft.com/en-us/download/details.aspx?id=12261 + + If you require support for Internationalized Domain Names via Windows IDN + then you will need either: + + * Microsoft Internationalized Domain Name (IDN) Mitigation APIs: + http://www.microsoft.com/en-us/download/details.aspx?id=734 + + * Microsoft Windows SDK Update for Windows Vista: + http://www.microsoft.com/en-us/download/details.aspx?id=23719 + + * Microsoft Visual Studio 2010 or above + + Once you have VC++ installed you should launch the application and open one + of the solution or workspace files. + + Whilst files are provided for both libcurl and the curl command line tool as + well as a configuration that includes both, it is recommend that you use the + all-in-one configuration. + +Notes +===== + + The following keywords have been used in the directory hierarchy: + + - The platform (For example: Windows) + - The IDE (For example: VC6, VC10, BCC5) + - The platform architecture (For example: Win32, Win64) + - The target configuration (For example: DLL Debug, + LIB Release - LIB OpenSSL) + + If you are using the source code from the git repository, rather than a + release archive or nightly build, you will need to generate the project + files. Please run "generate -help" for usage details. + + Should you wish to help out with some of the items on the TODO list, or + find bugs in the project files that need correcting, and would like to + submit updated files back then please note that, whilst the solution files + can be edited directly, the templates for the project files (which are + stored in the git repositoty) will need to be modified rather than the + generated project files that Visual Studio uses. + +TODO +==== + + These project files are a recent addition to the curl source code and as such + are not 100% complete. This is a list of things that are still todo: + + * Support zlib + * Use of static runtime libraries + * Generate *.vcxproj.filters files for VC10, VC11 and VC12 + * Add the Test Suite components + * Support for other development IDEs + + Any additional help would be appreciated ;-) \ No newline at end of file diff --git a/projects/Windows/VC10/curl.sln b/projects/Windows/VC10/curl.sln new file mode 100644 index 0000000..4501272 --- /dev/null +++ b/projects/Windows/VC10/curl.sln @@ -0,0 +1,258 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC10/lib/libcurl.sln b/projects/Windows/VC10/lib/libcurl.sln new file mode 100644 index 0000000..f29eccd --- /dev/null +++ b/projects/Windows/VC10/lib/libcurl.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj new file mode 100644 index 0000000..5023bf7 --- /dev/null +++ b/projects/Windows/VC10/lib/libcurl.vcxproj @@ -0,0 +1,2588 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + libcurl + + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + StaticLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)lib\ + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC10/src/curlsrc.sln b/projects/Windows/VC10/src/curlsrc.sln new file mode 100644 index 0000000..13fc1d3 --- /dev/null +++ b/projects/Windows/VC10/src/curlsrc.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC10/src/curlsrc.vcxproj b/projects/Windows/VC10/src/curlsrc.vcxproj new file mode 100644 index 0000000..d259465 --- /dev/null +++ b/projects/Windows/VC10/src/curlsrc.vcxproj @@ -0,0 +1,2782 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {5228E9CE-A216-422F-A5E6-58E95E2DD71D} + curlsrc + + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + ..\..\..\..\build\Win32\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + ..\..\..\..\build\Win64\VC10\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\LIB Debug;..\..\..\..\..\libssh2\build\Win32\VC10\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\LIB Debug;..\..\..\..\..\libssh2\build\Win64\VC10\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\LIB Release;..\..\..\..\..\libssh2\build\Win32\VC10\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\LIB Release;..\..\..\..\..\libssh2\build\Win64\VC10\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC10\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC11/curl.sln b/projects/Windows/VC11/curl.sln new file mode 100644 index 0000000..c9085a9 --- /dev/null +++ b/projects/Windows/VC11/curl.sln @@ -0,0 +1,258 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC11/lib/libcurl.sln b/projects/Windows/VC11/lib/libcurl.sln new file mode 100644 index 0000000..9e3b9ed --- /dev/null +++ b/projects/Windows/VC11/lib/libcurl.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC11/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj new file mode 100644 index 0000000..6a13105 --- /dev/null +++ b/projects/Windows/VC11/lib/libcurl.vcxproj @@ -0,0 +1,2636 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + libcurl + + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + StaticLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + DynamicLibrary + false + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)lib\ + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC11/src/curlsrc.sln b/projects/Windows/VC11/src/curlsrc.sln new file mode 100644 index 0000000..88b4f7e --- /dev/null +++ b/projects/Windows/VC11/src/curlsrc.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC11/src/curlsrc.vcxproj b/projects/Windows/VC11/src/curlsrc.vcxproj new file mode 100644 index 0000000..297262d --- /dev/null +++ b/projects/Windows/VC11/src/curlsrc.vcxproj @@ -0,0 +1,2830 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {5228E9CE-A216-422F-A5E6-58E95E2DD71D} + curlsrc + + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + Application + false + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + ..\..\..\..\build\Win32\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + ..\..\..\..\build\Win64\VC11\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\LIB Debug;..\..\..\..\..\libssh2\build\Win32\VC11\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\LIB Debug;..\..\..\..\..\libssh2\build\Win64\VC11\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\LIB Release;..\..\..\..\..\libssh2\build\Win32\VC11\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\LIB Release;..\..\..\..\..\libssh2\build\Win64\VC11\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC11\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC12/curl.sln b/projects/Windows/VC12/curl.sln new file mode 100644 index 0000000..57064c4 --- /dev/null +++ b/projects/Windows/VC12/curl.sln @@ -0,0 +1,258 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC12/lib/libcurl.sln b/projects/Windows/VC12/lib/libcurl.sln new file mode 100644 index 0000000..6fe2772 --- /dev/null +++ b/projects/Windows/VC12/lib/libcurl.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC12/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj new file mode 100644 index 0000000..739efa2 --- /dev/null +++ b/projects/Windows/VC12/lib/libcurl.vcxproj @@ -0,0 +1,2636 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + libcurl + + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + StaticLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + false + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)lib\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)lib\ + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;normaliz.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + %(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories) + $(IntDir)$(TargetFileName).intermediate.manifest + false + + + $(TargetDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)$(ProjectName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories) + false + + + $(TargetDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + _DEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories) + NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;USE_LIBSSH2;HAVE_LIBSSH2_H;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + true + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC12/src/curlsrc.sln b/projects/Windows/VC12/src/curlsrc.sln new file mode 100644 index 0000000..292699c --- /dev/null +++ b/projects/Windows/VC12/src/curlsrc.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC12/src/curlsrc.vcxproj b/projects/Windows/VC12/src/curlsrc.vcxproj new file mode 100644 index 0000000..7fc0c29 --- /dev/null +++ b/projects/Windows/VC12/src/curlsrc.vcxproj @@ -0,0 +1,2830 @@ + + + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Debug - DLL OpenSSL + Win32 + + + DLL Debug - DLL OpenSSL + x64 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Debug - DLL Windows SSPI + Win32 + + + DLL Debug - DLL Windows SSPI + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + DLL Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + DLL Release - DLL OpenSSL + Win32 + + + DLL Release - DLL OpenSSL + x64 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + DLL Release - DLL Windows SSPI - DLL WinIDN + x64 + + + DLL Release - DLL Windows SSPI + Win32 + + + DLL Release - DLL Windows SSPI + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Debug - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Debug - DLL OpenSSL + Win32 + + + LIB Debug - DLL OpenSSL + x64 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Debug - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Debug - DLL Windows SSPI + Win32 + + + LIB Debug - DLL Windows SSPI + x64 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Debug - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Debug - LIB OpenSSL + Win32 + + + LIB Debug - LIB OpenSSL + x64 + + + LIB Debug + Win32 + + + LIB Debug + x64 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + Win32 + + + LIB Release - DLL OpenSSL - DLL LibSSH2 + x64 + + + LIB Release - DLL OpenSSL + Win32 + + + LIB Release - DLL OpenSSL + x64 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + Win32 + + + LIB Release - DLL Windows SSPI - DLL WinIDN + x64 + + + LIB Release - DLL Windows SSPI + Win32 + + + LIB Release - DLL Windows SSPI + x64 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + Win32 + + + LIB Release - LIB OpenSSL - LIB LibSSH2 + x64 + + + LIB Release - LIB OpenSSL + Win32 + + + LIB Release - LIB OpenSSL + x64 + + + LIB Release + Win32 + + + LIB Release + x64 + + + + {5228E9CE-A216-422F-A5E6-58E95E2DD71D} + curlsrc + + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + Application + false + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + ..\..\..\..\build\Win32\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + ..\..\..\..\build\Win64\VC12\$(Configuration)\ + $(OutDir)src\ + $(OutDir)src\ + false + false + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curld + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + curl + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\LIB Debug;..\..\..\..\..\libssh2\build\Win32\VC12\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\LIB Debug;..\..\..\..\..\libssh2\build\Win64\VC12\LIB Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\LIB Release;..\..\..\..\..\libssh2\build\Win32\VC12\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\LIB Release;..\..\..\..\..\libssh2\build\Win64\VC12\LIB Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + Disabled + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + _DEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurld.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win32\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX86 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + X64 + $(TargetDir)$(TargetName).tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories) + NDEBUG;_CONSOLE;CURL_STATICLIB;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + ..\..\..\..\include;%(AdditionalIncludeDirectories) + + + ws2_32.lib;wldap32.lib;normaliz.lib;libcurl.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\..\build\Win64\VC12\$(Configuration);%(AdditionalLibraryDirectories) + Console + false + + + MachineX64 + + + true + $(TargetDir)$(TargetName).bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs/vc6/vc6curl.dsw b/projects/Windows/VC6/curl.dsw similarity index 79% rename from vs/vc6/vc6curl.dsw rename to projects/Windows/VC6/curl.dsw index 859edd5..0d368d6 100644 --- a/vs/vc6/vc6curl.dsw +++ b/projects/Windows/VC6/curl.dsw @@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 6.00 ############################################################################### -Project: "libcurl"=".\lib\vc6libcurl.dsp" - Package Owner=<4> +Project: "libcurl"=".\lib\libcurl.dsp" - Package Owner=<4> Package=<5> {{{ @@ -15,7 +15,7 @@ Package=<4> ############################################################################### -Project: "curltool"=".\src\vc6curltool.dsp" - Package Owner=<4> +Project: "curlsrc"=".\src\curlsrc.dsp" - Package Owner=<4> Package=<5> {{{ diff --git a/projects/Windows/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp new file mode 100644 index 0000000..2c0f531 --- /dev/null +++ b/projects/Windows/VC6/lib/libcurl.dsp @@ -0,0 +1,1645 @@ +# Microsoft Developer Studio Project File - Name="libcurl" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libcurl - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libcurl.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libcurl.mak" CFG="libcurl - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libcurl - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Debug DLL OpenSSL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Debug DLL Windows SSPI" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Release DLL OpenSSL" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Release DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Release DLL Windows SSPI" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 DLL Release DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libcurl - Win32 LIB Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug DLL OpenSSL" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug DLL Windows SSPI" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug LIB OpenSSL" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release DLL OpenSSL" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release DLL Windows SSPI" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release LIB OpenSSL" (based on "Win32 (x86) Static Library") +!MESSAGE "libcurl - Win32 LIB Release LIB OpenSSL LIB LibSSH2" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "libcurl - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /GZ /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug\libcurld.dll" /pdbtype:con /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug\libcurld.dll" /pdbtype:con /fixed:no + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /FD /EHsc /GZ /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\libcurld.dll" /pdbtype:con /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\libcurld.dll" /pdbtype:con /fixed:no + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /GZ /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\libcurld.dll" /pdbtype:con /fixed:no +# ADD LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\libcurld.dll" /pdbtype:con /fixed:no + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no /release + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /FD /EHsc /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release + +!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\lib" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\lib" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /c +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release +# ADD LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug LIB OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /GZ /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\libcurld.lib" /machine:I386 +# ADD LIB32 /nologo /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\libcurld.lib" /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release LIB OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release LIB OpenSSL LIB LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\lib" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\lib" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\..\openssl\inc32" /I "..\..\..\..\..\libssh2\include" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /D "USE_SSLEAY" /D "USE_OPENSSL" /D "USE_LIBSSH2" /D "HAVE_LIBSSH2_H" /FD /EHsc /c +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /machine:I386 +# ADD LIB32 /nologo /machine:I386 + +!ENDIF + +# Begin Target + +# Name "libcurl - Win32 DLL Debug" +# Name "libcurl - Win32 DLL Debug DLL OpenSSL" +# Name "libcurl - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" +# Name "libcurl - Win32 DLL Debug DLL Windows SSPI" +# Name "libcurl - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" +# Name "libcurl - Win32 DLL Release" +# Name "libcurl - Win32 DLL Release DLL OpenSSL" +# Name "libcurl - Win32 DLL Release DLL OpenSSL DLL LibSSH2" +# Name "libcurl - Win32 DLL Release DLL Windows SSPI" +# Name "libcurl - Win32 DLL Release DLL Windows SSPI DLL WinIDN" +# Name "libcurl - Win32 LIB Debug" +# Name "libcurl - Win32 LIB Debug DLL OpenSSL" +# Name "libcurl - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" +# Name "libcurl - Win32 LIB Debug DLL Windows SSPI" +# Name "libcurl - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" +# Name "libcurl - Win32 LIB Debug LIB OpenSSL" +# Name "libcurl - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" +# Name "libcurl - Win32 LIB Release" +# Name "libcurl - Win32 LIB Release DLL OpenSSL" +# Name "libcurl - Win32 LIB Release DLL OpenSSL DLL LibSSH2" +# Name "libcurl - Win32 LIB Release DLL Windows SSPI" +# Name "libcurl - Win32 LIB Release DLL Windows SSPI DLL WinIDN" +# Name "libcurl - Win32 LIB Release LIB OpenSSL" +# Name "libcurl - Win32 LIB Release LIB OpenSSL LIB LibSSH2" +# Begin Group "Source Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\lib\amigaos.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\asyn-ares.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\asyn-thread.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\base64.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\bundles.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\conncache.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\connect.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\content_encoding.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\cookie.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_addrinfo.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_endian.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_fnmatch.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_gethostname.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_gssapi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_memrchr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_multibyte.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_core.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_msgs.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_wb.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_rtmp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sasl.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sasl_gssapi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sasl_sspi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sspi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_threads.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\dict.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\dotdot.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\easy.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\escape.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\file.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\fileinfo.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\formdata.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ftp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ftplistparser.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\getenv.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\getinfo.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\gopher.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hash.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hmac.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostasyn.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostcheck.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostip4.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostip6.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostip.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostsyn.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http2.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_chunks.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_digest.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_negotiate.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_negotiate_sspi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_proxy.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\idn_win32.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\if2ip.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\imap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\inet_ntop.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\inet_pton.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\krb5.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ldap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\llist.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\md4.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\md5.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\memdebug.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\mprintf.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\multi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\netrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\non-ascii.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\nonblock.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\openldap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\parsedate.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pingpong.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pipeline.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pop3.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\progress.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rawstr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rtsp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\security.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\select.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\sendf.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\share.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\slist.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\smb.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\smtp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\socks.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\socks_gssapi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\socks_sspi.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\speedcheck.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\splay.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ssh.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strdup.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strequal.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strerror.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtok.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtoofft.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\telnet.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\tftp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\timeval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\transfer.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\url.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\version.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\warnless.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\wildcard.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\x509asn1.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\axtls.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\curl_darwinssl.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\curl_schannel.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\cyassl.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\gskit.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\gtls.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\nss.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\openssl.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\polarssl.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\vtls.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\lib\amigaos.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\arpa_telnet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\asyn.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\bundles.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\config-win32.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\conncache.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\connect.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\content_encoding.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\cookie.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_addrinfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_base64.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_endian.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_fnmatch.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_gethostname.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_gssapi.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_hmac.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ldap.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_md4.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_md5.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_memory.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_memrchr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_multibyte.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_core.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_msgs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_ntlm_wb.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_rtmp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sasl.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sec.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_setup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_setup_once.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_sspi.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_threads.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curlx.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\dict.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\dotdot.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\easyif.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\escape.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\file.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\fileinfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\formdata.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ftp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ftplistparser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\getinfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\gopher.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hash.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostcheck.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\hostip.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http2.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_chunks.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_digest.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_negotiate.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\http_proxy.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\if2ip.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\imap.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\inet_ntop.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\inet_pton.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\llist.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\memdebug.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\multihandle.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\multiif.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\netrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\non-ascii.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\nonblock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\parsedate.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pingpong.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pipeline.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\pop3.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\progress.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rawstr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rtsp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\select.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\sendf.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\setup-vms.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\share.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\sigpipe.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\slist.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\smb.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\smtp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\sockaddr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\socks.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\speedcheck.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\splay.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\ssh.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strdup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strequal.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strerror.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtok.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtoofft.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\telnet.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\tftp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\timeval.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\transfer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\urldata.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\url.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\warnless.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\wildcard.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\x509asn1.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\axtls.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\curl_darwinssl.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\curl_schannel.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\cyassl.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\gskit.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\gtls.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\nssg.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\openssl.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\polarssl.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\vtls\vtls.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\lib\libcurl.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/vs/vc6/lib/vc6libcurl.dsw b/projects/Windows/VC6/lib/libcurl.dsw similarity index 83% rename from vs/vc6/lib/vc6libcurl.dsw rename to projects/Windows/VC6/lib/libcurl.dsw index 1fa8814..e07624d 100644 --- a/vs/vc6/lib/vc6libcurl.dsw +++ b/projects/Windows/VC6/lib/libcurl.dsw @@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 6.00 ############################################################################### -Project: "libcurl"=".\vc6libcurl.dsp" - Package Owner=<4> +Project: "libcurl"=".\libcurl.dsp" - Package Owner=<4> Package=<5> {{{ diff --git a/projects/Windows/VC6/src/curlsrc.dsp b/projects/Windows/VC6/src/curlsrc.dsp new file mode 100644 index 0000000..e13674c --- /dev/null +++ b/projects/Windows/VC6/src/curlsrc.dsp @@ -0,0 +1,1058 @@ +# Microsoft Developer Studio Project File - Name="curlsrc" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=curlsrc - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "curlsrc.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "curlsrc.mak" CFG="curlsrc - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "curlsrc - Win32 DLL Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Debug DLL OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Debug DLL Windows SSPI" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Release" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Release DLL OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Release DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Release DLL Windows SSPI" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 DLL Release DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug DLL OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug DLL Windows SSPI" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug LIB OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release DLL OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release DLL OpenSSL DLL LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release DLL Windows SSPI" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release DLL Windows SSPI DLL WinIDN" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release LIB OpenSSL" (based on "Win32 (x86) Console Application") +!MESSAGE "curlsrc - Win32 LIB Release LIB OpenSSL LIB LibSSH2" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "curlsrc - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug\src" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_CONSOLE" /D "_DEBUG" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Debug DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Debug DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL Windows SSPI - DLL WinIDN" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release\src" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_CONSOLE" /D "NDEBUG" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Release DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Release DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL OpenSSL" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Release DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 DLL Release DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" /fixed:no +# ADD LINK32 wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\DLL Release - DLL Windows SSPI - DLL WinIDN" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug\src" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_CONSOLE" /D "_DEBUG" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug\curl.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" /fixed:no +# ADD LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib libcurld.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL Windows SSPI - DLL WinIDN" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug LIB OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" /fixed:no +# ADD LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /GZ /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\LIB Debug" /fixed:no +# ADD LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL - LIB LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\LIB Debug" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release\src" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "_CONSOLE" /D "NDEBUG" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release DLL OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release DLL OpenSSL DLL LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release DLL Windows SSPI" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" /fixed:no +# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release DLL Windows SSPI DLL WinIDN" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" /fixed:no +# ADD LINK32 advapi32.lib normaliz.lib wldap32.lib ws2_32.lib libcurl.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL Windows SSPI - DLL WinIDN" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release LIB OpenSSL" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" /fixed:no +# ADD LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Release" /fixed:no + +!ELSEIF "$(CFG)" == "curlsrc - Win32 LIB Release LIB OpenSSL LIB LibSSH2" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2" +# PROP BASE Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\src" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2" +# PROP Intermediate_Dir "..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\src" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD CPP /nologo /MD /W3 /O2 /I "$(ProgramFiles)\Microsoft Platform SDK\Include" /I "..\..\..\..\include" /I "..\..\..\..\lib" /I "..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /EHsc /c +# ADD BASE RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\..\..\..\include" /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\LIB Release" /fixed:no +# ADD LINK32 advapi32.lib crypt32.lib gdi32.lib user32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL - LIB LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - LIB OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\LIB Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\LIB Release" /fixed:no + +!ENDIF + +# Begin Target + +# Name "curlsrc - Win32 DLL Debug" +# Name "curlsrc - Win32 DLL Debug DLL OpenSSL" +# Name "curlsrc - Win32 DLL Debug DLL OpenSSL DLL LibSSH2" +# Name "curlsrc - Win32 DLL Debug DLL Windows SSPI" +# Name "curlsrc - Win32 DLL Debug DLL Windows SSPI DLL WinIDN" +# Name "curlsrc - Win32 DLL Release" +# Name "curlsrc - Win32 DLL Release DLL OpenSSL" +# Name "curlsrc - Win32 DLL Release DLL OpenSSL DLL LibSSH2" +# Name "curlsrc - Win32 DLL Release DLL Windows SSPI" +# Name "curlsrc - Win32 DLL Release DLL Windows SSPI DLL WinIDN" +# Name "curlsrc - Win32 LIB Debug" +# Name "curlsrc - Win32 LIB Debug DLL OpenSSL" +# Name "curlsrc - Win32 LIB Debug DLL OpenSSL DLL LibSSH2" +# Name "curlsrc - Win32 LIB Debug DLL Windows SSPI" +# Name "curlsrc - Win32 LIB Debug DLL Windows SSPI DLL WinIDN" +# Name "curlsrc - Win32 LIB Debug LIB OpenSSL" +# Name "curlsrc - Win32 LIB Debug LIB OpenSSL LIB LibSSH2" +# Name "curlsrc - Win32 LIB Release" +# Name "curlsrc - Win32 LIB Release DLL OpenSSL" +# Name "curlsrc - Win32 LIB Release DLL OpenSSL DLL LibSSH2" +# Name "curlsrc - Win32 LIB Release DLL Windows SSPI" +# Name "curlsrc - Win32 LIB Release DLL Windows SSPI DLL WinIDN" +# Name "curlsrc - Win32 LIB Release LIB OpenSSL" +# Name "curlsrc - Win32 LIB Release LIB OpenSSL LIB LibSSH2" +# Begin Group "Source Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\lib\nonblock.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rawstr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtoofft.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\warnless.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_binmode.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_bname.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_dbg.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_hdr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_prg.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_rea.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_see.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_wrt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cfgable.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_convert.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_dirhie.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_doswin.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_easysrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_formparse.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_getparam.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_getpass.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_help.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_helpers.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_homedir.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_hugehelp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_libinfo.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_main.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_metalink.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_mfiles.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_msgs.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_operate.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_operhlp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_panykey.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_paramhlp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_parsecfg.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_setopt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_sleep.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_strdup.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_urlglob.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_util.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_vms.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_writeenv.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_writeout.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_xattr.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\lib\config-win32.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\curl_setup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\nonblock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\rawstr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\strtoofft.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\lib\warnless.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_binmode.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_bname.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_dbg.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_hdr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_prg.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_rea.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_see.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cb_wrt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_cfgable.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_convert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_dirhie.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_doswin.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_easysrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_formparse.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_getparam.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_getpass.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_helpers.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_help.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_homedir.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_hugehelp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_libinfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_main.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_metalink.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_mfiles.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_msgs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_operate.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_operhlp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_panykey.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_paramhlp.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_parsecfg.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_sdecls.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_setopt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_setup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_sleep.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_strdup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_urlglob.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_util.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_version.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_vms.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_writeenv.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_writeout.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\src\tool_xattr.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\src\curl.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/vs/vc6/src/vc6curltool.dsw b/projects/Windows/VC6/src/curlsrc.dsw similarity index 83% rename from vs/vc6/src/vc6curltool.dsw rename to projects/Windows/VC6/src/curlsrc.dsw index b92638a..2aec010 100644 --- a/vs/vc6/src/vc6curltool.dsw +++ b/projects/Windows/VC6/src/curlsrc.dsw @@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 6.00 ############################################################################### -Project: "curltool"=".\vc6curltool.dsp" - Package Owner=<4> +Project: "curlsrc"=".\curlsrc.dsp" - Package Owner=<4> Package=<5> {{{ diff --git a/projects/Windows/VC7.1/curl.sln b/projects/Windows/VC7.1/curl.sln new file mode 100644 index 0000000..4475c77 --- /dev/null +++ b/projects/Windows/VC7.1/curl.sln @@ -0,0 +1,140 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + DLL Debug = DLL Debug + DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL + DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI + DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN + DLL Release = DLL Release + DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL + DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2 + DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI + DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN + LIB Debug = LIB Debug + LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL + LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI + LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN + LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL + LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + LIB Release = LIB Release + LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL + LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2 + LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI + LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN + LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL + LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7.1/lib/libcurl.sln b/projects/Windows/VC7.1/lib/libcurl.sln new file mode 100644 index 0000000..7513d35 --- /dev/null +++ b/projects/Windows/VC7.1/lib/libcurl.sln @@ -0,0 +1,87 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + DLL Debug = DLL Debug + DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL + DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI + DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN + DLL Release = DLL Release + DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL + DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2 + DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI + DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN + LIB Debug = LIB Debug + LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL + LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI + LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN + LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL + LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + LIB Release = LIB Release + LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL + LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2 + LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI + LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN + LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL + LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj new file mode 100644 index 0000000..a7d5bf3 --- /dev/null +++ b/projects/Windows/VC7.1/lib/libcurl.vcproj @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC7.1/src/curlsrc.sln b/projects/Windows/VC7.1/src/curlsrc.sln new file mode 100644 index 0000000..cba3b60 --- /dev/null +++ b/projects/Windows/VC7.1/src/curlsrc.sln @@ -0,0 +1,87 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + DLL Debug = DLL Debug + DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL + DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI + DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN + DLL Release = DLL Release + DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL + DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2 + DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI + DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN + LIB Debug = LIB Debug + LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL + LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI + LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN + LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL + LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + LIB Release = LIB Release + LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL + LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2 + LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI + LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN + LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL + LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7.1/src/curlsrc.vcproj b/projects/Windows/VC7.1/src/curlsrc.vcproj new file mode 100644 index 0000000..024e9d7 --- /dev/null +++ b/projects/Windows/VC7.1/src/curlsrc.vcproj @@ -0,0 +1,1652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC7/curl.sln b/projects/Windows/VC7/curl.sln new file mode 100644 index 0000000..fb7b89a --- /dev/null +++ b/projects/Windows/VC7/curl.sln @@ -0,0 +1,138 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = DLL Debug + ConfigName.1 = DLL Debug - DLL OpenSSL + ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.3 = DLL Debug - DLL Windows SSPI + ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.5 = DLL Release + ConfigName.6 = DLL Release - DLL OpenSSL + ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.8 = DLL Release - DLL Windows SSPI + ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN + ConfigName.10 = LIB Debug + ConfigName.11 = LIB Debug - DLL OpenSSL + ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.13 = LIB Debug - DLL Windows SSPI + ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.15 = LIB Debug - LIB OpenSSL + ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + ConfigName.17 = LIB Release + ConfigName.18 = LIB Release - DLL OpenSSL + ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.20 = LIB Release - DLL Windows SSPI + ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN + ConfigName.22 = LIB Release - LIB OpenSSL + ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.0 = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7/lib/libcurl.sln b/projects/Windows/VC7/lib/libcurl.sln new file mode 100644 index 0000000..f092661 --- /dev/null +++ b/projects/Windows/VC7/lib/libcurl.sln @@ -0,0 +1,87 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = DLL Debug + ConfigName.1 = DLL Debug - DLL OpenSSL + ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.3 = DLL Debug - DLL Windows SSPI + ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.5 = DLL Release + ConfigName.6 = DLL Release - DLL OpenSSL + ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.8 = DLL Release - DLL Windows SSPI + ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN + ConfigName.10 = LIB Debug + ConfigName.11 = LIB Debug - DLL OpenSSL + ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.13 = LIB Debug - DLL Windows SSPI + ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.15 = LIB Debug - LIB OpenSSL + ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + ConfigName.17 = LIB Release + ConfigName.18 = LIB Release - DLL OpenSSL + ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.20 = LIB Release - DLL Windows SSPI + ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN + ConfigName.22 = LIB Release - LIB OpenSSL + ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj new file mode 100644 index 0000000..e3cbba1 --- /dev/null +++ b/projects/Windows/VC7/lib/libcurl.vcproj @@ -0,0 +1,1814 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC7/src/curlsrc.sln b/projects/Windows/VC7/src/curlsrc.sln new file mode 100644 index 0000000..651c9b2 --- /dev/null +++ b/projects/Windows/VC7/src/curlsrc.sln @@ -0,0 +1,87 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = DLL Debug + ConfigName.1 = DLL Debug - DLL OpenSSL + ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.3 = DLL Debug - DLL Windows SSPI + ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.5 = DLL Release + ConfigName.6 = DLL Release - DLL OpenSSL + ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.8 = DLL Release - DLL Windows SSPI + ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN + ConfigName.10 = LIB Debug + ConfigName.11 = LIB Debug - DLL OpenSSL + ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2 + ConfigName.13 = LIB Debug - DLL Windows SSPI + ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN + ConfigName.15 = LIB Debug - LIB OpenSSL + ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2 + ConfigName.17 = LIB Release + ConfigName.18 = LIB Release - DLL OpenSSL + ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2 + ConfigName.20 = LIB Release - DLL Windows SSPI + ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN + ConfigName.22 = LIB Release - LIB OpenSSL + ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2 + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC7/src/curlsrc.vcproj b/projects/Windows/VC7/src/curlsrc.vcproj new file mode 100644 index 0000000..bab5237 --- /dev/null +++ b/projects/Windows/VC7/src/curlsrc.vcproj @@ -0,0 +1,1506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC8/curl.sln b/projects/Windows/VC8/curl.sln new file mode 100644 index 0000000..0dfbd1a --- /dev/null +++ b/projects/Windows/VC8/curl.sln @@ -0,0 +1,258 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC8/lib/libcurl.sln b/projects/Windows/VC8/lib/libcurl.sln new file mode 100644 index 0000000..e0cd36c --- /dev/null +++ b/projects/Windows/VC8/lib/libcurl.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj new file mode 100644 index 0000000..06ace96 --- /dev/null +++ b/projects/Windows/VC8/lib/libcurl.vcproj @@ -0,0 +1,4759 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC8/src/curlsrc.sln b/projects/Windows/VC8/src/curlsrc.sln new file mode 100644 index 0000000..2e8ad07 --- /dev/null +++ b/projects/Windows/VC8/src/curlsrc.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC8/src/curlsrc.vcproj b/projects/Windows/VC8/src/curlsrc.vcproj new file mode 100644 index 0000000..627bf97 --- /dev/null +++ b/projects/Windows/VC8/src/curlsrc.vcproj @@ -0,0 +1,4655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC9/curl.sln b/projects/Windows/VC9/curl.sln new file mode 100644 index 0000000..4415186 --- /dev/null +++ b/projects/Windows/VC9/curl.sln @@ -0,0 +1,258 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "src\curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" + ProjectSection(ProjectDependencies) = postProject + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC9/lib/libcurl.sln b/projects/Windows/VC9/lib/libcurl.sln new file mode 100644 index 0000000..acfbaca --- /dev/null +++ b/projects/Windows/VC9/lib/libcurl.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj new file mode 100644 index 0000000..d609a54 --- /dev/null +++ b/projects/Windows/VC9/lib/libcurl.vcproj @@ -0,0 +1,4740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/Windows/VC9/src/curlsrc.sln b/projects/Windows/VC9/src/curlsrc.sln new file mode 100644 index 0000000..d673349 --- /dev/null +++ b/projects/Windows/VC9/src/curlsrc.sln @@ -0,0 +1,157 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curlsrc", "curlsrc.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32 + DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64 + DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32 + DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32 + DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64 + DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32 + DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32 + LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64 + LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32 + LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64 + LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32 + LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Debug|x64 = LIB Debug|x64 + LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32 + LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64 + LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32 + LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64 + LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32 + LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64 + LIB Release|Win32 = LIB Release|Win32 + LIB Release|x64 = LIB Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64 + {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/projects/Windows/VC9/src/curlsrc.vcproj b/projects/Windows/VC9/src/curlsrc.vcproj new file mode 100644 index 0000000..d074b79 --- /dev/null +++ b/projects/Windows/VC9/src/curlsrc.vcproj @@ -0,0 +1,4608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/build-openssl.bat b/projects/build-openssl.bat new file mode 100644 index 0000000..3703a3f --- /dev/null +++ b/projects/build-openssl.bat @@ -0,0 +1,328 @@ +@echo off +rem *************************************************************************** +rem * _ _ ____ _ +rem * Project ___| | | | _ \| | +rem * / __| | | | |_) | | +rem * | (__| |_| | _ <| |___ +rem * \___|\___/|_| \_\_____| +rem * +rem * Copyright (C) 2012 - 2014, Steve Holme, . +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 http://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 *************************************************************************** + +:begin + rem Check we are running on a Windows NT derived OS + if not "%OS%" == "Windows_NT" goto nodos + setlocal + + rem Display the help + if /i "%~1" == "" goto syntax + if /i "%~1" == "-?" goto syntax + if /i "%~1" == "-h" goto syntax + if /i "%~1" == "-help" goto syntax + +:parseArgs + if "%~1" == "" goto prerequisites + + if /i "%~1" == "vc6" ( + set VC_VER=6.0 + set VC_DESC=VC6 + set "VC_PATH=Microsoft Visual Studio\VC98" + ) else if /i "%~1" == "vc7" ( + set VC_VER=7.0 + set VC_DESC=VC7 + set "VC_PATH=Microsoft Visual Studio .NET\Vc7" + ) else if /i "%~1" == "vc7.1" ( + set VC_VER=7.1 + set VC_DESC=VC7.1 + set "VC_PATH=Microsoft Visual Studio .NET 2003\Vc7" + ) else if /i "%~1" == "vc8" ( + set VC_VER=8.0 + set VC_DESC=VC8 + set "VC_PATH=Microsoft Visual Studio 8\VC" + ) else if /i "%~1" == "vc9" ( + set VC_VER=9.0 + set VC_DESC=VC9 + set "VC_PATH=Microsoft Visual Studio 9.0\VC" + ) else if /i "%~1" == "vc10" ( + set VC_VER=10.0 + set VC_DESC=VC10 + set "VC_PATH=Microsoft Visual Studio 10.0\VC" + ) else if /i "%~1" == "vc11" ( + set VC_VER=11.0 + set VC_DESC=VC11 + set "VC_PATH=Microsoft Visual Studio 11.0\VC" + ) else if /i "%~1" == "vc12" ( + set VC_VER=12.0 + set VC_DESC=VC12 + set "VC_PATH=Microsoft Visual Studio 12.0\VC" + ) else if /i "%~1%" == "x86" ( + set BUILD_PLATFORM=x86 + ) else if /i "%~1%" == "x64" ( + set BUILD_PLATFORM=x64 + ) else if /i "%~1%" == "debug" ( + set BUILD_CONFIG=debug + ) else if /i "%~1%" == "release" ( + set BUILD_CONFIG=release + ) else ( + if not defined START_DIR ( + set START_DIR=%~1% + ) else ( + goto unknown + ) + ) + + shift & goto parseArgs + +:prerequisites + rem Default the start directory if one isn't specified + if not defined START_DIR set START_DIR=..\..\openssl + + rem Calculate the program files directory + if defined PROGRAMFILES ( + set "PF=%PROGRAMFILES%" + set OS_PLATFORM=x86 + ) + if defined PROGRAMFILES(x86) ( + set "PF=%PROGRAMFILES(x86)%" + set OS_PLATFORM=x64 + ) + + rem Check we have a program files directory + if not defined PF goto nopf + + rem Check we have Visual Studio installed + if not exist "%PF%\%VC_PATH%" goto novc + + rem Check the start directory exists + if not exist "%START_DIR%" goto noopenssl + +:configure + if "%BUILD_PLATFORM%" == "" ( + if "%VC_VER%" == "6.0" ( + set BUILD_PLATFORM=x86 + ) else if "%VC_VER%" == "7.0" ( + set BUILD_PLATFORM=x86 + ) else if "%VC_VER%" == "7.1" ( + set BUILD_PLATFORM=x86 + ) else ( + set BUILD_PLATFORM=%OS_PLATFORM% + ) + ) + + if "%BUILD_PLATFORM%" == "x86" ( + set VCVARS_PLATFORM=x86 + ) else if "%BUILD_PLATFORM%" == "x64" ( + if "%VC_VER%" == "6.0" goto nox64 + if "%VC_VER%" == "7.0" goto nox64 + if "%VC_VER%" == "7.1" goto nox64 + if "%VC_VER%" == "8.0" set VCVARS_PLATFORM=x86_amd64 + if "%VC_VER%" == "9.0" set VCVARS_PLATFORM=%BUILD_PLATFORM% + if "%VC_VER%" == "10.0" set VCVARS_PLATFORM=%BUILD_PLATFORM% + if "%VC_VER%" == "11.0" set VCVARS_PLATFORM=amd64 + if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64 + ) + +:start + echo. + if "%VC_VER%" == "6.0" ( + call "%PF%\%VC_PATH%\bin\vcvars32" + ) else if "%VC_VER%" == "7.0" ( + call "%PF%\%VC_PATH%\bin\vcvars32" + ) else if "%VC_VER%" == "7.1" ( + call "%PF%\%VC_PATH%\bin\vcvars32" + ) else ( + call "%PF%\%VC_PATH%\vcvarsall" %VCVARS_PLATFORM% + ) + + echo. + set SAVED_PATH=%CD% + if defined START_DIR CD %START_DIR% + goto %BUILD_PLATFORM% + +:x64 + rem Calculate our output directory + set OUTDIR=build\Win64\%VC_DESC% + if not exist %OUTDIR% md %OUTDIR% + + if "%BUILD_CONFIG%" == "release" goto x64release + +:x64debug + rem Configuring 64-bit Debug Build + perl Configure debug-VC-WIN64A --prefix=%CD% + + rem Perform the build + call ms\do_win64a + nmake -f ms\nt.mak + nmake -f ms\ntdll.mak + + rem Move the output directories + move out32.dbg "%OUTDIR%\LIB Debug" + move out32dll.dbg "%OUTDIR%\DLL Debug" + + rem Move the PDB files + move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" + move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" + + rem Remove the intermediate directories + rd tmp32.dbg /s /q + rd tmp32dll.dbg /s /q + + if "%BUILD_CONFIG%" == "debug" goto success + +:x64release + rem Configuring 64-bit Release Build + perl Configure VC-WIN64A --prefix=%CD% + + rem Perform the build + call ms\do_win64a + nmake -f ms\nt.mak + nmake -f ms\ntdll.mak + + rem Move the output directories + move out32 "%OUTDIR%\LIB Release" + move out32dll "%OUTDIR%\DLL Release" + + rem Move the PDB files + move tmp32\lib.pdb "%OUTDIR%\LIB Release" + move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" + + rem Remove the intermediate directories + rd tmp32 /s /q + rd tmp32dll /s /q + + goto success + +:x86 + rem Calculate our output directory + set OUTDIR=build\Win32\%VC_DESC% + if not exist %OUTDIR% md %OUTDIR% + + if "%BUILD_CONFIG%" == "release" goto x86release + +:x86debug + rem Configuring 32-bit Debug Build + perl Configure debug-VC-WIN32 no-asm --prefix=%CD% + + rem Perform the build + call ms\do_ms + nmake -f ms\nt.mak + nmake -f ms\ntdll.mak + + rem Move the output directories + move out32.dbg "%OUTDIR%\LIB Debug" + move out32dll.dbg "%OUTDIR%\DLL Debug" + + rem Move the PDB files + move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" + move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" + + rem Remove the intermediate directories + rd tmp32.dbg /s /q + rd tmp32dll.dbg /s /q + + if "%BUILD_CONFIG%" == "debug" goto success + +:x86release + rem Configuring 32-bit Release Build + perl Configure VC-WIN32 no-asm --prefix=%CD% + + rem Perform the build + call ms\do_ms + nmake -f ms\nt.mak + nmake -f ms\ntdll.mak + + rem Move the output directories + move out32 "%OUTDIR%\LIB Release" + move out32dll "%OUTDIR%\DLL Release" + + rem Move the PDB files + move tmp32\lib.pdb "%OUTDIR%\LIB Release" + move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" + + rem Remove the intermediate directories + rd tmp32 /s /q + rd tmp32dll /s /q + + goto success + +:syntax + rem Display the help + echo. + echo Usage: build-openssl ^ ^ [configuration] [directory] + echo. + echo Compiler: + echo. + echo vc6 - Use Visual Studio 6 + echo vc7 - Use Visual Studio .NET + echo vc7.1 - Use Visual Studio .NET 2003 + echo vc8 - Use Visual Studio 2005 + echo vc9 - Use Visual Studio 2008 + echo vc10 - Use Visual Studio 2010 + echo vc11 - Use Visual Studio 2012 + echo vc12 - Use Visual Studio 2013 + echo. + echo Platform: + echo. + echo x86 - Perform a 32-bit build + echo x64 - Perform a 64-bit build + echo. + echo Configuration: + echo. + echo debug - Perform a debug build + echo release - Perform a release build + echo. + echo Other: + echo. + echo directory - Specifies the OpenSSL source directory + goto error + +:unknown + echo. + echo Error: Unknown argument '%1' + goto error + +:nodos + echo. + echo Error: Only a Windows NT based Operating System is supported + goto error + +:nopf + echo. + echo Error: Cannot obtain the directory for Program Files + goto error + +:novc + echo. + echo Error: %VC_DESC% is not installed + goto error + +:nox64 + echo. + echo Error: %VC_DESC% does not support 64-bit builds + goto error + +:noopenssl + echo. + echo Error: Cannot locate OpenSSL source directory + goto error + +:error + if "%OS%" == "Windows_NT" endlocal + exit /B 1 + +:success + cd %SAVED_PATH% + endlocal + exit /B 0 diff --git a/projects/checksrc.bat b/projects/checksrc.bat new file mode 100644 index 0000000..139914d --- /dev/null +++ b/projects/checksrc.bat @@ -0,0 +1,81 @@ +@echo off +rem *************************************************************************** +rem * _ _ ____ _ +rem * Project ___| | | | _ \| | +rem * / __| | | | |_) | | +rem * | (__| |_| | _ <| |___ +rem * \___|\___/|_| \_\_____| +rem * +rem * Copyright (C) 2014, Steve Holme, . +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 http://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 *************************************************************************** + +:begin + rem Check we are running on a Windows NT derived OS + if not "%OS%" == "Windows_NT" goto nodos + setlocal + + rem Display the help + if /i "%~1" == "-?" goto syntax + if /i "%~1" == "-h" goto syntax + if /i "%~1" == "-help" goto syntax + +:prerequisites + rem Check we have Perl installed + if not exist "C:\Perl" ( + if not exist "C:\Perl64" goto noperl + ) + +:configure + if "%1" == "" set SRC_DIR=.. + if not "%1" == "" set SRC_DIR=%~1% + if not exist "%SRC_DIR%" goto nosrc + +:start + for /f "delims=" %%i in ('dir %SRC_DIR%\src\*.c.* /b') do @perl %SRC_DIR%\lib\checksrc.pl -D%SRC_DIR%\src "%%i" + for /f "delims=" %%i in ('dir %SRC_DIR%\src\*.h.* /b') do @perl %SRC_DIR%\lib\checksrc.pl -D%SRC_DIR%\src "%%i" + for /f "delims=" %%i in ('dir %SRC_DIR%\lib\*.c.* /b') do @perl %SRC_DIR%\lib\checksrc.pl -D%SRC_DIR%\lib "%%i" + for /f "delims=" %%i in ('dir %SRC_DIR%\lib\*.h.* /b') do @perl %SRC_DIR%\lib\checksrc.pl -D%SRC_DIR%\lib -Wcurl_config.h.cmake "%%i" + goto success + +:syntax + rem Display the help + echo. + echo Usage: checksrc [directory] + echo. + echo directory - Specifies the curl source directory + goto success + +:nodos + echo. + echo Error: Only a Windows NT based Operating System is supported + goto error + +:noperl + echo. + echo Error: Perl is not installed + goto error + +:nosrc + echo. + echo Error: "%SRC_DIR%" does not exist + goto error + +:error + if "%OS%" == "Windows_NT" endlocal + exit /B 1 + +:success + endlocal + exit /B 0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0b4556f..9c1fd54 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,38 @@ set(EXE_NAME curl) -# First try to locate tool_hugehelp.c to see if it has already been created -# TODO Find the file WITHOUT adding a cache entry!!! Or else the user can delete the file after the script was first run, and the script won't notice it has gone. -find_file(HUGEHELP_C_FILE tool_hugehelp.c PATHS . NO_DEFAULT_PATH) -if (NOT HUGEHELP_C_FILE) - message(STATUS "Warning: tool_hugehelp.c file was not generated before. Generating an 'empty' file...") - file(WRITE tool_hugehelp.c "/* built-in manual is disabled, blank function */\n#include \"tool_hugehelp.h\"\nvoid hugehelp(void) {}\n\n") +if(USE_MANUAL) + find_package(Perl REQUIRED) + # Use the C locale to ensure that only ASCII characters appear in the + # embedded text. NROFF and MANOPT are set in the parent CMakeLists.txt + add_custom_command( + OUTPUT tool_hugehelp.c + COMMAND echo "#include \"tool_setup.h\"" > tool_hugehelp.c + COMMAND echo "#ifndef HAVE_LIBZ" >> tool_hugehelp.c + COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT} + "${CURL_SOURCE_DIR}/docs/curl.1" | + "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" + "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c + COMMAND echo "#else" >> tool_hugehelp.c + COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT} + "${CURL_SOURCE_DIR}/docs/curl.1" | + "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c + "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c + COMMAND echo "#endif /* HAVE_LIBZ */" >> tool_hugehelp.c + DEPENDS + "${CURL_SOURCE_DIR}/docs/MANUAL" + "${CURL_SOURCE_DIR}/docs/curl.1" + "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" + "${CMAKE_CURRENT_SOURCE_DIR}/tool_hugehelp.h" + VERBATIM) +else() + add_custom_command( + OUTPUT tool_hugehelp.c + COMMAND echo "/* built-in manual is disabled, blank function */" > tool_hugehelp.c + COMMAND echo "#include \"tool_hugehelp.h\"" >> tool_hugehelp.c + COMMAND echo "void hugehelp(void) {}" >> tool_hugehelp.c + DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/tool_hugehelp.h" + VERBATIM) endif() transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") @@ -20,7 +47,7 @@ add_executable( ${curl_SOURCES} ) -source_group("cURLX source files" FILES ${CURLX_ONES}) +source_group("cURLX source files" FILES ${CURLX_CFILES}) source_group("cURL source files" FILES ${CURL_CFILES}) source_group("cURL header files" FILES ${CURL_HFILES}) @@ -28,13 +55,12 @@ include_directories( ${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h" ${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h" ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h" + # This is needed as tool_hugehelp.c is generated in the binary dir + ${CURL_SOURCE_DIR}/src # To be able to reach "tool_hugehelp.h" ) - -# Setup dependencies -setup_curl_dependencies(${EXE_NAME}) -target_link_libraries( ${EXE_NAME} libcurl ) - +#Build cURL executable +target_link_libraries( ${EXE_NAME} libcurl ${CURL_LIBS}) ################################################################################ diff --git a/src/Makefile.Watcom b/src/Makefile.Watcom index 6b3103a..c485665 100644 --- a/src/Makefile.Watcom +++ b/src/Makefile.Watcom @@ -3,16 +3,32 @@ # G. Vanem # +.ERASE + +!if $(__VERSION__) < 1280 +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!message ! This Open Watcom version is too old and is no longer supported ! +!message ! Please download latest version from www.openwatcom.org ! +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!error Unsupported version of Open Watcom +!endif + !ifndef %watcom !error WATCOM environment variable not set! !endif +# In order to process Makefile.inc wmake must be called with -u switch! +!ifndef %MAKEFLAGS +!error You MUST call wmake with the -u switch! +!endif + !ifdef %libname LIBNAME = $(%libname) !else LIBNAME = libcurl !endif -TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib + +TARGETS = curl.exe CC = wcc386 LD = wlink @@ -23,37 +39,29 @@ RC = wrc ! loaddll wcc386 wccd386 ! loaddll wpp386 wppd386 ! loaddll wlib wlibd -! if $(__VERSION__) > 1270 -! loaddll wlink wlinkd -! else -! loaddll wlink wlink -! endif +! loaddll wlink wlinkd !endif -!ifdef __LINUX__ -DS = / +!ifdef __UNIX__ CP = cp MD = mkdir -p -RD = rmdir -p -RM = rm -f !else -DS = $(X)\$(X) CP = copy 2>NUL MD = mkdir -RD = rmdir /q /s 2>NUL -!if $(__VERSION__) < 1250 -RM = del /q /f 2>NUL -!else -RM = rm -f !endif +!if $(__VERSION__) > 1290 +RD = rm -rf +!else ifdef __UNIX__ +RD = rm -rf +!else +RD = rmdir /q /s 2>NUL !endif -SYS_INCL = -I$(%watcom)$(DS)h$(DS)nt -I$(%watcom)$(DS)h -SYS_LIBS = $(%watcom)$(DS)lib386$(DS)nt;$(%watcom)$(DS)lib386 +SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h" CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm & -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL & - -I..$(DS)include -I..$(DS)lib $(SYS_INCL) + -I"../include" -I"../lib" $(SYS_INCL) !ifdef %debug DEBUG = -dDEBUG=1 -dDEBUGBUILD @@ -66,82 +74,75 @@ CFLAGS += -d0 CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6 !endif +!ifdef %use_ssl +CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I"$(OPENSSL_ROOT)/inc32" +!endif + +!ifdef %curl_static +CFLAGS += -DCURL_STATICLIB +!else +CFLAGS += -br +!endif + # # Change to suite. # !ifdef %zlib_root ZLIB_ROOT = $(%zlib_root) !else -ZLIB_ROOT = ..$(DS)..$(DS)zlib-1.2.8 +ZLIB_ROOT = ../../zlib-1.2.8 !endif !ifdef %libssh2_root LIBSSH2_ROOT = $(%libssh2_root) !else -LIBSSH2_ROOT = ..$(DS)..$(DS)libssh2-1.4.3 +LIBSSH2_ROOT = ../../libssh2-1.4.3 !endif !ifdef %librtmp_root LIBRTMP_ROOT = $(%librtmp_root) !else -LIBRTMP_ROOT = ..$(DS)..$(DS)rtmpdump-2.3 +LIBRTMP_ROOT = ../../rtmpdump-2.3 !endif !ifdef %openssl_root OPENSSL_ROOT = $(%openssl_root) !else -OPENSSL_ROOT = ..$(DS)..$(DS)openssl-0.9.8y +OPENSSL_ROOT = ../../openssl-0.9.8zc !endif !ifdef %ares_root ARES_ROOT = $(%ares_root) !else -ARES_ROOT = ..$(DS)ares -!endif - -!ifdef %use_ssl -CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)$(DS)inc32 +ARES_ROOT = ../ares !endif OBJ_DIR = WC_Win32.obj -LINK_ARG = $(OBJ_DIR)$(DS)wlink.arg +LINK_ARG = $(OBJ_DIR)/wlink.arg -# In order to process Makefile.inc wmake must be called with -u switch! -!ifndef %MAKEFLAGS -!error You MUST call wmake with the -u switch! -!else !include Makefile.inc -!endif -# For now we still define the CURLX_ONES sources here unless we know how -# to split off the prefixed path. -CURLX_SOURCES = rawstr.c nonblock.c -OBJS = $(CURL_CFILES:.c=.obj) -!ifdef %curl_static -CFLAGS += -DCURL_STATICLIB -!else -CFLAGS += -br -OBJS += $(CURLX_SOURCES:.c=.obj) +OBJS1 = $(OBJ_DIR)/$(CURL_CFILES) +!ifndef %curl_static +OBJS1 += $(CURLX_CFILES:../lib/=) !endif -!ifdef __LINUX__ -OBJS = $OBJ_DIR/$(OBJS: = $OBJ_DIR/) +OBJS2 = $(OBJS1: = $(OBJ_DIR)/) +OBJS = $(OBJS2:.c=.obj) -!else -OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\) -!endif +RESOURCE = $(OBJ_DIR)/curl.res -RESOURCE = $(OBJ_DIR)$(DS)curl.res +DIRS = $(OBJ_DIR) -all: tool_hugehelp.c $(OBJ_DIR) curl.exe .SYMBOLIC +all: tool_hugehelp.c $(DIRS) $(TARGETS) .SYMBOLIC @echo Welcome to cURL clean: .SYMBOLIC - -$(RM) $(OBJS) - -$(RM) $(RESOURCE) $(LINK_ARG) + -rm -f $(OBJS) + -rm -f $(RESOURCE) $(LINK_ARG) vclean distclean: clean .SYMBOLIC -$(RD) $(OBJ_DIR) - -$(RM) curl.exe curl.map curl.sym tool_hugehelp.c + -rm -f curl.exe curl.sym tool_hugehelp.c tool_hugehelp.c: tool_hugehelp.c.cvs $(CP) $[@ $^@ @@ -149,64 +150,63 @@ tool_hugehelp.c: tool_hugehelp.c.cvs tool_hugehelp.c.cvs: .EXISTSONLY $(CP) tool_hugehelp.c $^@ -$(OBJ_DIR): +$(DIRS): -$(MD) $^@ -curl.exe: $(OBJS) $(RESOURCE) $(LINK_ARG) - $(LD) name $^@ @$]@ - -$(RESOURCE): curl.rc - $(RC) $(DEBUG) -q -r -zm -bt=nt -I..$(DS)include $(SYS_INCL) $[@ -fo=$^@ - -# suffix search path - vpath-like hack -.c: ..$(DS)lib - -.ERASE -.c{$(OBJ_DIR)}.obj: - $(CC) $(CFLAGS) $[@ -fo=$^@ - -$(LINK_ARG): $(__MAKEFILES__) - %create $^@ - @%append $^@ system nt - @%append $^@ file { $(OBJS) } +curl.exe: $(OBJS) $(RESOURCE) + %create $(LINK_ARG) + @%append $(LINK_ARG) system nt !ifdef %debug - @%append $^@ debug all - @%append $^@ option symfile -!endif - @%append $^@ option quiet, map, caseexact, eliminate, - @%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS) -!ifdef %curl_static - @%append $^@ library wldap32.lib - @%append $^@ library ..$(DS)lib$(DS)$(LIBNAME).lib -!ifdef %use_zlib - @%append $^@ library $(ZLIB_ROOT)$(DS)zlib.lib -!endif -!ifdef %use_rtmp - @%append $^@ library $(LIBRTMP_ROOT)$(DS)librtmp$(DS)librtmp.lib, winmm.lib -!endif -!ifdef %use_ssh2 - @%append $^@ library $(LIBSSH2_ROOT)$(DS)win32$(DS)libssh2.lib -!endif -!ifdef %use_ssl - @%append $^@ library $(OPENSSL_ROOT)$(DS)out32$(DS)libeay32.lib, $(OPENSSL_ROOT)$(DS)out32$(DS)ssleay32.lib -!endif -!ifdef %use_ares - @%append $^@ library $(ARES_ROOT)$(DS)cares.lib -!endif -!ifdef %use_winidn + @%append $(LINK_ARG) debug all + @%append $(LINK_ARG) option symfile +!endif + @%append $(LINK_ARG) option quiet, caseexact, eliminate + @%append $(LINK_ARG) option map=$(OBJ_DIR)/$^&.map + @%append $(LINK_ARG) option res=$(RESOURCE) + @%append $(LINK_ARG) file { $(OBJS) } +!ifndef %curl_static + @%append $(LINK_ARG) library ../lib/$(LIBNAME)_imp.lib +!else + @%append $(LINK_ARG) library ../lib/$(LIBNAME).lib + @%append $(LINK_ARG) library wldap32.lib +! ifdef %use_zlib + @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib' +! endif +! ifdef %use_rtmp + @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib' + @%append $(LINK_ARG) library winmm.lib +! endif +! ifdef %use_ssh2 + @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib' +! endif +! ifdef %use_ssl + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib' + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib' +! endif +! ifdef %use_ares + @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib' +! endif +! ifdef %use_winidn ! if $(__VERSION__) > 1290 - @%append $^@ library normaliz.lib + @%append $(LINK_ARG) library normaliz.lib ! else - @%append $^@ import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' - @%append $^@ import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' + @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' + @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' ! endif -!endif -!else - @%append $^@ library ..$(DS)lib$(DS)$(LIBNAME)_imp.lib +! endif !endif !ifeq USE_WATT32 1 - @%append $^@ library $(%watt_root)$(DS)lib$(DS)wattcpw_imp.lib + @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib' !else - @%append $^@ library ws2_32.lib + @%append $(LINK_ARG) library ws2_32.lib !endif + $(LD) name $^@ @$(LINK_ARG) + +$(RESOURCE): curl.rc + $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@ +# suffix search path - vpath-like hack +.c: ../lib + +.c{$(OBJ_DIR)}.obj: + $(CC) $(CFLAGS) $[@ -fo=$^@ diff --git a/src/Makefile.am b/src/Makefile.am index 72e6772..f96618e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,9 @@ ########################################################################### AUTOMAKE_OPTIONS = foreign nostdinc +# remove targets if the command fails +.DELETE_ON_ERROR: + # Specify our include paths here, and do it relative to $(top_srcdir) and # $(top_builddir), to ensure that these paths which belong to the library # being currently built and tested are searched before the library which @@ -59,7 +62,7 @@ LIBS = $(BLANK_AT_MAKETIME) if USE_EXPLICIT_LIB_DEPS curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @LIBCURL_LIBS@ else -curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@ +curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @NSS_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@ endif curl_LDFLAGS = @LIBMETALINK_LDFLAGS@ diff --git a/src/Makefile.b32 b/src/Makefile.b32 index b0ee5b6..6638a01 100644 --- a/src/Makefile.b32 +++ b/src/Makefile.b32 @@ -27,7 +27,7 @@ ZLIB_PATH = ..\..\zlib-1.2.8 # Edit the path below to point to the base of your OpenSSL package. !ifndef OPENSSL_PATH -OPENSSL_PATH = ..\..\openssl-0.9.8y +OPENSSL_PATH = ..\..\openssl-0.9.8zc !endif # Set program's name @@ -81,7 +81,7 @@ LINKLIB = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\l # Makefile.inc provides the CSOURCES and HHEADERS defines !include Makefile.inc -CSOURCES = $(CURL_CFILES) $(CURLX_ONES:../lib/=) +CSOURCES = $(CURL_CFILES) $(CURLX_CFILES:../lib/=) OBJECTS = $(CSOURCES:.c=.obj) PREPROCESSED = $(CSOURCES:.c=.int) diff --git a/src/Makefile.in b/src/Makefile.in index 6c0f250..ed6cc0d 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -129,20 +129,21 @@ am__libcurltool_la_SOURCES_DIST = tool_binmode.c tool_bname.c \ tool_homedir.c tool_hugehelp.c tool_libinfo.c tool_main.c \ tool_metalink.c tool_mfiles.c tool_msgs.c tool_operate.c \ tool_operhlp.c tool_panykey.c tool_paramhlp.c tool_parsecfg.c \ - tool_setopt.c tool_sleep.c tool_urlglob.c tool_util.c \ - tool_vms.c tool_writeenv.c tool_writeout.c tool_xattr.c \ - ../lib/strtoofft.c ../lib/strdup.c ../lib/rawstr.c \ - ../lib/nonblock.c tool_binmode.h tool_bname.h tool_cb_dbg.h \ - tool_cb_hdr.h tool_cb_prg.h tool_cb_rea.h tool_cb_see.h \ - tool_cb_wrt.h tool_cfgable.h tool_convert.h tool_dirhie.h \ - tool_doswin.h tool_easysrc.h tool_formparse.h tool_getparam.h \ - tool_getpass.h tool_help.h tool_helpers.h tool_homedir.h \ - tool_hugehelp.h tool_libinfo.h tool_main.h tool_metalink.h \ - tool_mfiles.h tool_msgs.h tool_operate.h tool_operhlp.h \ - tool_panykey.h tool_paramhlp.h tool_parsecfg.h tool_sdecls.h \ - tool_setopt.h tool_setup.h tool_sleep.h tool_urlglob.h \ - tool_util.h tool_version.h tool_vms.h tool_writeenv.h \ - tool_writeout.h tool_xattr.h + tool_strdup.c tool_setopt.c tool_sleep.c tool_urlglob.c \ + tool_util.c tool_vms.c tool_writeenv.c tool_writeout.c \ + tool_xattr.c ../lib/strtoofft.c ../lib/rawstr.c \ + ../lib/nonblock.c ../lib/warnless.c tool_binmode.h \ + tool_bname.h tool_cb_dbg.h tool_cb_hdr.h tool_cb_prg.h \ + tool_cb_rea.h tool_cb_see.h tool_cb_wrt.h tool_cfgable.h \ + tool_convert.h tool_dirhie.h tool_doswin.h tool_easysrc.h \ + tool_formparse.h tool_getparam.h tool_getpass.h tool_help.h \ + tool_helpers.h tool_homedir.h tool_hugehelp.h tool_libinfo.h \ + tool_main.h tool_metalink.h tool_mfiles.h tool_msgs.h \ + tool_operate.h tool_operhlp.h tool_panykey.h tool_paramhlp.h \ + tool_parsecfg.h tool_sdecls.h tool_setopt.h tool_setup.h \ + tool_sleep.h tool_strdup.h tool_urlglob.h tool_util.h \ + tool_version.h tool_vms.h tool_writeenv.h tool_writeout.h \ + tool_xattr.h am__objects_1 = libcurltool_la-tool_binmode.lo \ libcurltool_la-tool_bname.lo libcurltool_la-tool_cb_dbg.lo \ libcurltool_la-tool_cb_hdr.lo libcurltool_la-tool_cb_prg.lo \ @@ -159,13 +160,16 @@ am__objects_1 = libcurltool_la-tool_binmode.lo \ libcurltool_la-tool_msgs.lo libcurltool_la-tool_operate.lo \ libcurltool_la-tool_operhlp.lo libcurltool_la-tool_panykey.lo \ libcurltool_la-tool_paramhlp.lo \ - libcurltool_la-tool_parsecfg.lo libcurltool_la-tool_setopt.lo \ - libcurltool_la-tool_sleep.lo libcurltool_la-tool_urlglob.lo \ - libcurltool_la-tool_util.lo libcurltool_la-tool_vms.lo \ - libcurltool_la-tool_writeenv.lo \ + libcurltool_la-tool_parsecfg.lo libcurltool_la-tool_strdup.lo \ + libcurltool_la-tool_setopt.lo libcurltool_la-tool_sleep.lo \ + libcurltool_la-tool_urlglob.lo libcurltool_la-tool_util.lo \ + libcurltool_la-tool_vms.lo libcurltool_la-tool_writeenv.lo \ libcurltool_la-tool_writeout.lo libcurltool_la-tool_xattr.lo -am__objects_2 = libcurltool_la-strtoofft.lo libcurltool_la-strdup.lo \ - libcurltool_la-rawstr.lo libcurltool_la-nonblock.lo +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_2 = ../lib/libcurltool_la-strtoofft.lo \ + ../lib/libcurltool_la-rawstr.lo \ + ../lib/libcurltool_la-nonblock.lo \ + ../lib/libcurltool_la-warnless.lo am__objects_3 = am__objects_4 = $(am__objects_1) $(am__objects_2) $(am__objects_3) @BUILD_UNITTESTS_TRUE@am_libcurltool_la_OBJECTS = $(am__objects_4) @@ -196,12 +200,14 @@ am__objects_5 = curl-tool_binmode.$(OBJEXT) curl-tool_bname.$(OBJEXT) \ curl-tool_msgs.$(OBJEXT) curl-tool_operate.$(OBJEXT) \ curl-tool_operhlp.$(OBJEXT) curl-tool_panykey.$(OBJEXT) \ curl-tool_paramhlp.$(OBJEXT) curl-tool_parsecfg.$(OBJEXT) \ - curl-tool_setopt.$(OBJEXT) curl-tool_sleep.$(OBJEXT) \ - curl-tool_urlglob.$(OBJEXT) curl-tool_util.$(OBJEXT) \ - curl-tool_vms.$(OBJEXT) curl-tool_writeenv.$(OBJEXT) \ - curl-tool_writeout.$(OBJEXT) curl-tool_xattr.$(OBJEXT) -am__objects_6 = curl-strtoofft.$(OBJEXT) curl-strdup.$(OBJEXT) \ - curl-rawstr.$(OBJEXT) curl-nonblock.$(OBJEXT) + curl-tool_strdup.$(OBJEXT) curl-tool_setopt.$(OBJEXT) \ + curl-tool_sleep.$(OBJEXT) curl-tool_urlglob.$(OBJEXT) \ + curl-tool_util.$(OBJEXT) curl-tool_vms.$(OBJEXT) \ + curl-tool_writeenv.$(OBJEXT) curl-tool_writeout.$(OBJEXT) \ + curl-tool_xattr.$(OBJEXT) +am__objects_6 = ../lib/curl-strtoofft.$(OBJEXT) \ + ../lib/curl-rawstr.$(OBJEXT) ../lib/curl-nonblock.$(OBJEXT) \ + ../lib/curl-warnless.$(OBJEXT) am_curl_OBJECTS = $(am__objects_5) $(am__objects_6) $(am__objects_3) curl_OBJECTS = $(am_curl_OBJECTS) curl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ @@ -302,6 +308,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -326,7 +333,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -335,7 +341,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -360,6 +365,7 @@ NMEDIT = @NMEDIT@ # Use the C locale to ensure that only ASCII characters appear in the # embedded text. NROFF = env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -395,11 +401,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -501,11 +509,18 @@ AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \ # libcurl has sources that provide functions named curlx_* that aren't part of # the official API, but we re-use the code here to avoid duplication. -CURLX_ONES = \ +CURLX_CFILES = \ ../lib/strtoofft.c \ - ../lib/strdup.c \ ../lib/rawstr.c \ - ../lib/nonblock.c + ../lib/nonblock.c \ + ../lib/warnless.c + +CURLX_HFILES = \ + ../lib/curl_setup.h \ + ../lib/strtoofft.h \ + ../lib/rawstr.h \ + ../lib/nonblock.h \ + ../lib/warnless.h CURL_CFILES = \ tool_binmode.c \ @@ -538,6 +553,7 @@ CURL_CFILES = \ tool_panykey.c \ tool_paramhlp.c \ tool_parsecfg.c \ + tool_strdup.c \ tool_setopt.c \ tool_sleep.c \ tool_urlglob.c \ @@ -582,6 +598,7 @@ CURL_HFILES = \ tool_setopt.h \ tool_setup.h \ tool_sleep.h \ + tool_strdup.h \ tool_urlglob.h \ tool_util.h \ tool_version.h \ @@ -590,8 +607,9 @@ CURL_HFILES = \ tool_writeout.h \ tool_xattr.h -curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES) -@USE_EXPLICIT_LIB_DEPS_FALSE@curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@ +CURL_RCFILES = curl.rc +curl_SOURCES = $(CURL_CFILES) $(CURLX_CFILES) $(CURL_HFILES) +@USE_EXPLICIT_LIB_DEPS_FALSE@curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @NSS_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@ @USE_EXPLICIT_LIB_DEPS_TRUE@curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @LIBCURL_LIBS@ curl_LDFLAGS = @LIBMETALINK_LDFLAGS@ curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS) @@ -662,6 +680,20 @@ clean-noinstLTLIBRARIES: echo rm -f $${locs}; \ rm -f $${locs}; \ } +../lib/$(am__dirstamp): + @$(MKDIR_P) ../lib + @: > ../lib/$(am__dirstamp) +../lib/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ../lib/$(DEPDIR) + @: > ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/libcurltool_la-strtoofft.lo: ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/libcurltool_la-rawstr.lo: ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/libcurltool_la-nonblock.lo: ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/libcurltool_la-warnless.lo: ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) libcurltool.la: $(libcurltool_la_OBJECTS) $(libcurltool_la_DEPENDENCIES) $(EXTRA_libcurltool_la_DEPENDENCIES) $(AM_V_CCLD)$(libcurltool_la_LINK) $(am_libcurltool_la_rpath) $(libcurltool_la_OBJECTS) $(libcurltool_la_LIBADD) $(LIBS) @@ -714,6 +746,14 @@ clean-binPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list +../lib/curl-strtoofft.$(OBJEXT): ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/curl-rawstr.$(OBJEXT): ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/curl-nonblock.$(OBJEXT): ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) +../lib/curl-warnless.$(OBJEXT): ../lib/$(am__dirstamp) \ + ../lib/$(DEPDIR)/$(am__dirstamp) curl$(EXEEXT): $(curl_OBJECTS) $(curl_DEPENDENCIES) $(EXTRA_curl_DEPENDENCIES) @rm -f curl$(EXEEXT) @@ -721,14 +761,20 @@ curl$(EXEEXT): $(curl_OBJECTS) $(curl_DEPENDENCIES) $(EXTRA_curl_DEPENDENCIES) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f ../lib/*.$(OBJEXT) + -rm -f ../lib/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-rawstr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-strdup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/curl-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/curl-rawstr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/curl-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/curl-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/libcurltool_la-nonblock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/libcurltool_la-rawstr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/libcurltool_la-strtoofft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/libcurltool_la-warnless.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_binmode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_bname.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_cb_dbg.Po@am__quote@ @@ -761,16 +807,13 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_parsecfg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_setopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_sleep.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_strdup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_urlglob.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_vms.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeenv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_xattr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-nonblock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-rawstr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-strdup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-strtoofft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_binmode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_bname.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_cb_dbg.Plo@am__quote@ @@ -803,6 +846,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_setopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_sleep.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_vms.Plo@am__quote@ @@ -811,22 +855,25 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_xattr.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< @@ -1041,6 +1088,13 @@ libcurltool_la-tool_parsecfg.lo: tool_parsecfg.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c +libcurltool_la-tool_strdup.lo: tool_strdup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_strdup.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_strdup.Tpo -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_strdup.Tpo $(DEPDIR)/libcurltool_la-tool_strdup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_strdup.c' object='libcurltool_la-tool_strdup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c + libcurltool_la-tool_setopt.lo: tool_setopt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_setopt.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_setopt.Tpo -c -o libcurltool_la-tool_setopt.lo `test -f 'tool_setopt.c' || echo '$(srcdir)/'`tool_setopt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_setopt.Tpo $(DEPDIR)/libcurltool_la-tool_setopt.Plo @@ -1097,33 +1151,33 @@ libcurltool_la-tool_xattr.lo: tool_xattr.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_xattr.lo `test -f 'tool_xattr.c' || echo '$(srcdir)/'`tool_xattr.c -libcurltool_la-strtoofft.lo: ../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-strtoofft.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-strtoofft.Tpo -c -o libcurltool_la-strtoofft.lo `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-strtoofft.Tpo $(DEPDIR)/libcurltool_la-strtoofft.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='libcurltool_la-strtoofft.lo' libtool=yes @AMDEPBACKSLASH@ +../lib/libcurltool_la-strtoofft.lo: ../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT ../lib/libcurltool_la-strtoofft.lo -MD -MP -MF ../lib/$(DEPDIR)/libcurltool_la-strtoofft.Tpo -c -o ../lib/libcurltool_la-strtoofft.lo `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/libcurltool_la-strtoofft.Tpo ../lib/$(DEPDIR)/libcurltool_la-strtoofft.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='../lib/libcurltool_la-strtoofft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-strtoofft.lo `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o ../lib/libcurltool_la-strtoofft.lo `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c -libcurltool_la-strdup.lo: ../lib/strdup.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-strdup.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-strdup.Tpo -c -o libcurltool_la-strdup.lo `test -f '../lib/strdup.c' || echo '$(srcdir)/'`../lib/strdup.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-strdup.Tpo $(DEPDIR)/libcurltool_la-strdup.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strdup.c' object='libcurltool_la-strdup.lo' libtool=yes @AMDEPBACKSLASH@ +../lib/libcurltool_la-rawstr.lo: ../lib/rawstr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT ../lib/libcurltool_la-rawstr.lo -MD -MP -MF ../lib/$(DEPDIR)/libcurltool_la-rawstr.Tpo -c -o ../lib/libcurltool_la-rawstr.lo `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/libcurltool_la-rawstr.Tpo ../lib/$(DEPDIR)/libcurltool_la-rawstr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='../lib/libcurltool_la-rawstr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-strdup.lo `test -f '../lib/strdup.c' || echo '$(srcdir)/'`../lib/strdup.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o ../lib/libcurltool_la-rawstr.lo `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c -libcurltool_la-rawstr.lo: ../lib/rawstr.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-rawstr.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-rawstr.Tpo -c -o libcurltool_la-rawstr.lo `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-rawstr.Tpo $(DEPDIR)/libcurltool_la-rawstr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='libcurltool_la-rawstr.lo' libtool=yes @AMDEPBACKSLASH@ +../lib/libcurltool_la-nonblock.lo: ../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT ../lib/libcurltool_la-nonblock.lo -MD -MP -MF ../lib/$(DEPDIR)/libcurltool_la-nonblock.Tpo -c -o ../lib/libcurltool_la-nonblock.lo `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/libcurltool_la-nonblock.Tpo ../lib/$(DEPDIR)/libcurltool_la-nonblock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='../lib/libcurltool_la-nonblock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-rawstr.lo `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o ../lib/libcurltool_la-nonblock.lo `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c -libcurltool_la-nonblock.lo: ../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-nonblock.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-nonblock.Tpo -c -o libcurltool_la-nonblock.lo `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-nonblock.Tpo $(DEPDIR)/libcurltool_la-nonblock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='libcurltool_la-nonblock.lo' libtool=yes @AMDEPBACKSLASH@ +../lib/libcurltool_la-warnless.lo: ../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT ../lib/libcurltool_la-warnless.lo -MD -MP -MF ../lib/$(DEPDIR)/libcurltool_la-warnless.Tpo -c -o ../lib/libcurltool_la-warnless.lo `test -f '../lib/warnless.c' || echo '$(srcdir)/'`../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/libcurltool_la-warnless.Tpo ../lib/$(DEPDIR)/libcurltool_la-warnless.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/warnless.c' object='../lib/libcurltool_la-warnless.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-nonblock.lo `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o ../lib/libcurltool_la-warnless.lo `test -f '../lib/warnless.c' || echo '$(srcdir)/'`../lib/warnless.c curl-tool_binmode.o: tool_binmode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_binmode.o -MD -MP -MF $(DEPDIR)/curl-tool_binmode.Tpo -c -o curl-tool_binmode.o `test -f 'tool_binmode.c' || echo '$(srcdir)/'`tool_binmode.c @@ -1545,6 +1599,20 @@ curl-tool_parsecfg.obj: tool_parsecfg.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi` +curl-tool_strdup.o: tool_strdup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_strdup.o -MD -MP -MF $(DEPDIR)/curl-tool_strdup.Tpo -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_strdup.Tpo $(DEPDIR)/curl-tool_strdup.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_strdup.c' object='curl-tool_strdup.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c + +curl-tool_strdup.obj: tool_strdup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_strdup.obj -MD -MP -MF $(DEPDIR)/curl-tool_strdup.Tpo -c -o curl-tool_strdup.obj `if test -f 'tool_strdup.c'; then $(CYGPATH_W) 'tool_strdup.c'; else $(CYGPATH_W) '$(srcdir)/tool_strdup.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_strdup.Tpo $(DEPDIR)/curl-tool_strdup.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_strdup.c' object='curl-tool_strdup.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_strdup.obj `if test -f 'tool_strdup.c'; then $(CYGPATH_W) 'tool_strdup.c'; else $(CYGPATH_W) '$(srcdir)/tool_strdup.c'; fi` + curl-tool_setopt.o: tool_setopt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_setopt.o -MD -MP -MF $(DEPDIR)/curl-tool_setopt.Tpo -c -o curl-tool_setopt.o `test -f 'tool_setopt.c' || echo '$(srcdir)/'`tool_setopt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_setopt.Tpo $(DEPDIR)/curl-tool_setopt.Po @@ -1657,67 +1725,68 @@ curl-tool_xattr.obj: tool_xattr.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_xattr.obj `if test -f 'tool_xattr.c'; then $(CYGPATH_W) 'tool_xattr.c'; else $(CYGPATH_W) '$(srcdir)/tool_xattr.c'; fi` -curl-strtoofft.o: ../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-strtoofft.o -MD -MP -MF $(DEPDIR)/curl-strtoofft.Tpo -c -o curl-strtoofft.o `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-strtoofft.Tpo $(DEPDIR)/curl-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='curl-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../lib/curl-strtoofft.o: ../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-strtoofft.o -MD -MP -MF ../lib/$(DEPDIR)/curl-strtoofft.Tpo -c -o ../lib/curl-strtoofft.o `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-strtoofft.Tpo ../lib/$(DEPDIR)/curl-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='../lib/curl-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-strtoofft.o `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-strtoofft.o `test -f '../lib/strtoofft.c' || echo '$(srcdir)/'`../lib/strtoofft.c -curl-strtoofft.obj: ../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-strtoofft.obj -MD -MP -MF $(DEPDIR)/curl-strtoofft.Tpo -c -o curl-strtoofft.obj `if test -f '../lib/strtoofft.c'; then $(CYGPATH_W) '../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-strtoofft.Tpo $(DEPDIR)/curl-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='curl-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../lib/curl-strtoofft.obj: ../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-strtoofft.obj -MD -MP -MF ../lib/$(DEPDIR)/curl-strtoofft.Tpo -c -o ../lib/curl-strtoofft.obj `if test -f '../lib/strtoofft.c'; then $(CYGPATH_W) '../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-strtoofft.Tpo ../lib/$(DEPDIR)/curl-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strtoofft.c' object='../lib/curl-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-strtoofft.obj `if test -f '../lib/strtoofft.c'; then $(CYGPATH_W) '../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-strtoofft.obj `if test -f '../lib/strtoofft.c'; then $(CYGPATH_W) '../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strtoofft.c'; fi` -curl-strdup.o: ../lib/strdup.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-strdup.o -MD -MP -MF $(DEPDIR)/curl-strdup.Tpo -c -o curl-strdup.o `test -f '../lib/strdup.c' || echo '$(srcdir)/'`../lib/strdup.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-strdup.Tpo $(DEPDIR)/curl-strdup.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strdup.c' object='curl-strdup.o' libtool=no @AMDEPBACKSLASH@ +../lib/curl-rawstr.o: ../lib/rawstr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-rawstr.o -MD -MP -MF ../lib/$(DEPDIR)/curl-rawstr.Tpo -c -o ../lib/curl-rawstr.o `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-rawstr.Tpo ../lib/$(DEPDIR)/curl-rawstr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='../lib/curl-rawstr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-strdup.o `test -f '../lib/strdup.c' || echo '$(srcdir)/'`../lib/strdup.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-rawstr.o `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c -curl-strdup.obj: ../lib/strdup.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-strdup.obj -MD -MP -MF $(DEPDIR)/curl-strdup.Tpo -c -o curl-strdup.obj `if test -f '../lib/strdup.c'; then $(CYGPATH_W) '../lib/strdup.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strdup.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-strdup.Tpo $(DEPDIR)/curl-strdup.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/strdup.c' object='curl-strdup.obj' libtool=no @AMDEPBACKSLASH@ +../lib/curl-rawstr.obj: ../lib/rawstr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-rawstr.obj -MD -MP -MF ../lib/$(DEPDIR)/curl-rawstr.Tpo -c -o ../lib/curl-rawstr.obj `if test -f '../lib/rawstr.c'; then $(CYGPATH_W) '../lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/../lib/rawstr.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-rawstr.Tpo ../lib/$(DEPDIR)/curl-rawstr.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='../lib/curl-rawstr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-strdup.obj `if test -f '../lib/strdup.c'; then $(CYGPATH_W) '../lib/strdup.c'; else $(CYGPATH_W) '$(srcdir)/../lib/strdup.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-rawstr.obj `if test -f '../lib/rawstr.c'; then $(CYGPATH_W) '../lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/../lib/rawstr.c'; fi` -curl-rawstr.o: ../lib/rawstr.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-rawstr.o -MD -MP -MF $(DEPDIR)/curl-rawstr.Tpo -c -o curl-rawstr.o `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-rawstr.Tpo $(DEPDIR)/curl-rawstr.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='curl-rawstr.o' libtool=no @AMDEPBACKSLASH@ +../lib/curl-nonblock.o: ../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-nonblock.o -MD -MP -MF ../lib/$(DEPDIR)/curl-nonblock.Tpo -c -o ../lib/curl-nonblock.o `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-nonblock.Tpo ../lib/$(DEPDIR)/curl-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='../lib/curl-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-rawstr.o `test -f '../lib/rawstr.c' || echo '$(srcdir)/'`../lib/rawstr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-nonblock.o `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c -curl-rawstr.obj: ../lib/rawstr.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-rawstr.obj -MD -MP -MF $(DEPDIR)/curl-rawstr.Tpo -c -o curl-rawstr.obj `if test -f '../lib/rawstr.c'; then $(CYGPATH_W) '../lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/../lib/rawstr.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-rawstr.Tpo $(DEPDIR)/curl-rawstr.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/rawstr.c' object='curl-rawstr.obj' libtool=no @AMDEPBACKSLASH@ +../lib/curl-nonblock.obj: ../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-nonblock.obj -MD -MP -MF ../lib/$(DEPDIR)/curl-nonblock.Tpo -c -o ../lib/curl-nonblock.obj `if test -f '../lib/nonblock.c'; then $(CYGPATH_W) '../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-nonblock.Tpo ../lib/$(DEPDIR)/curl-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='../lib/curl-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-rawstr.obj `if test -f '../lib/rawstr.c'; then $(CYGPATH_W) '../lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/../lib/rawstr.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-nonblock.obj `if test -f '../lib/nonblock.c'; then $(CYGPATH_W) '../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../lib/nonblock.c'; fi` -curl-nonblock.o: ../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-nonblock.o -MD -MP -MF $(DEPDIR)/curl-nonblock.Tpo -c -o curl-nonblock.o `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-nonblock.Tpo $(DEPDIR)/curl-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='curl-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../lib/curl-warnless.o: ../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-warnless.o -MD -MP -MF ../lib/$(DEPDIR)/curl-warnless.Tpo -c -o ../lib/curl-warnless.o `test -f '../lib/warnless.c' || echo '$(srcdir)/'`../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-warnless.Tpo ../lib/$(DEPDIR)/curl-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/warnless.c' object='../lib/curl-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-nonblock.o `test -f '../lib/nonblock.c' || echo '$(srcdir)/'`../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-warnless.o `test -f '../lib/warnless.c' || echo '$(srcdir)/'`../lib/warnless.c -curl-nonblock.obj: ../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-nonblock.obj -MD -MP -MF $(DEPDIR)/curl-nonblock.Tpo -c -o curl-nonblock.obj `if test -f '../lib/nonblock.c'; then $(CYGPATH_W) '../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-nonblock.Tpo $(DEPDIR)/curl-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/nonblock.c' object='curl-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../lib/curl-warnless.obj: ../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../lib/curl-warnless.obj -MD -MP -MF ../lib/$(DEPDIR)/curl-warnless.Tpo -c -o ../lib/curl-warnless.obj `if test -f '../lib/warnless.c'; then $(CYGPATH_W) '../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/curl-warnless.Tpo ../lib/$(DEPDIR)/curl-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/warnless.c' object='../lib/curl-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-nonblock.obj `if test -f '../lib/nonblock.c'; then $(CYGPATH_W) '../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../lib/curl-warnless.obj `if test -f '../lib/warnless.c'; then $(CYGPATH_W) '../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../lib/warnless.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf ../lib/.libs ../lib/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique @@ -1838,6 +1907,8 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f ../lib/$(DEPDIR)/$(am__dirstamp) + -rm -f ../lib/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1849,7 +1920,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../lib/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1895,7 +1966,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../lib/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1932,6 +2003,9 @@ uninstall-am: uninstall-binPROGRAMS tags tags-am uninstall uninstall-am uninstall-binPROGRAMS +# remove targets if the command fails +.DELETE_ON_ERROR: + # Here are the stuff to create a built-in manual # This generates the tool_hugehelp.c file in both uncompressed and diff --git a/src/Makefile.inc b/src/Makefile.inc index cd890ac..401a635 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -9,11 +9,18 @@ # libcurl has sources that provide functions named curlx_* that aren't part of # the official API, but we re-use the code here to avoid duplication. -CURLX_ONES = \ +CURLX_CFILES = \ ../lib/strtoofft.c \ - ../lib/strdup.c \ ../lib/rawstr.c \ - ../lib/nonblock.c + ../lib/nonblock.c \ + ../lib/warnless.c + +CURLX_HFILES = \ + ../lib/curl_setup.h \ + ../lib/strtoofft.h \ + ../lib/rawstr.h \ + ../lib/nonblock.h \ + ../lib/warnless.h CURL_CFILES = \ tool_binmode.c \ @@ -46,6 +53,7 @@ CURL_CFILES = \ tool_panykey.c \ tool_paramhlp.c \ tool_parsecfg.c \ + tool_strdup.c \ tool_setopt.c \ tool_sleep.c \ tool_urlglob.c \ @@ -90,6 +98,7 @@ CURL_HFILES = \ tool_setopt.h \ tool_setup.h \ tool_sleep.h \ + tool_strdup.h \ tool_urlglob.h \ tool_util.h \ tool_version.h \ @@ -98,5 +107,7 @@ CURL_HFILES = \ tool_writeout.h \ tool_xattr.h -curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES) +CURL_RCFILES = curl.rc + +curl_SOURCES = $(CURL_CFILES) $(CURLX_CFILES) $(CURL_HFILES) diff --git a/src/Makefile.m32 b/src/Makefile.m32 index b4b1b0b..e54175c 100644 --- a/src/Makefile.m32 +++ b/src/Makefile.m32 @@ -18,7 +18,7 @@ ZLIB_PATH = ../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. ifndef LIBSSH2_PATH @@ -54,6 +54,10 @@ endif ifndef LDAP_SDK LDAP_SDK = c:/novell/ndk/cldapsdk/win32 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-0.6.7 +endif PROOT = .. @@ -62,27 +66,37 @@ ifndef LIBCARES_PATH LIBCARES_PATH = $(PROOT)/ares endif -# Edit the var below to set to your architecture or set environment var. -ifndef ARCH -ARCH = w32 -endif - CC = $(CROSSPREFIX)gcc CFLAGS = -g -O2 -Wall CFLAGS += -fno-strict-aliasing -ifeq ($(ARCH),w64) -CFLAGS += -D_AMD64_ -endif # comment LDFLAGS below to keep debug info LDFLAGS = -s AR = $(CROSSPREFIX)ar RC = $(CROSSPREFIX)windres -RCFLAGS = --include-dir=$(PROOT)/include -O COFF -i +RCFLAGS = --include-dir=$(PROOT)/include -O COFF +STRIP = $(CROSSPREFIX)strip -g # We may need these someday # PERL = perl # NROFF = nroff +# Set environment var ARCH to your architecture to override autodetection. +ifndef ARCH +ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64) +ARCH = w64 +else +ARCH = w32 +endif +endif + +ifeq ($(ARCH),w64) +CFLAGS += -D_AMD64_ +RCFLAGS += -F pe-x86-64 +else +CFLAGS += -m32 +RCFLAGS += -F pe-i386 +endif + # Platform-dependent helper tool macros ifeq ($(findstring /sh,$(SHELL)),/sh) DEL = rm -f $1 @@ -148,9 +162,6 @@ endif ifeq ($(findstring -sspi,$(CFG)),-sspi) SSPI = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -SPNEGO = 1 -endif ifeq ($(findstring -ldaps,$(CFG)),-ldaps) LDAPS = 1 endif @@ -164,6 +175,9 @@ ifeq ($(findstring -winssl,$(CFG)),-winssl) WINSSL = 1 SSPI = 1 endif +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +NGHTTP2 = 1 +endif INCLUDES = -I. -I../include -I../lib @@ -191,6 +205,10 @@ ifdef RTMP CFLAGS += -DUSE_LIBRTMP curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm endif +ifdef NGHTTP2 + CFLAGS += -DUSE_NGHTTP2 + curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2 +endif ifdef SSH2 CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2 @@ -258,9 +276,6 @@ ifdef SSPI CFLAGS += -DUSE_SCHANNEL endif endif -ifdef SPNEGO - CFLAGS += -DHAVE_SPNEGO -endif ifdef IPV6 CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501 endif @@ -287,7 +302,7 @@ include Makefile.inc curl_PROGRAMS = curl.exe curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES))) -curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_ONES)))) +curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES)))) ifdef DYN curl_OBJECTS += $(curlx_OBJECTS) vpath %.c $(PROOT)/lib @@ -315,7 +330,7 @@ tool_hugehelp.c: $(CC) $(INCLUDES) $(CFLAGS) -c $< %.res: %.rc - $(RC) $(RCFLAGS) $< -o $@ + $(RC) $(RCFLAGS) -i $< -o $@ clean: ifeq "$(wildcard tool_hugehelp.c.cvs)" "tool_hugehelp.c.cvs" diff --git a/src/Makefile.netware b/src/Makefile.netware index 0ecc753..b6b4861 100644 --- a/src/Makefile.netware +++ b/src/Makefile.netware @@ -19,7 +19,7 @@ endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc endif # Edit the path below to point to the base of your LibSSH2 package. @@ -42,6 +42,11 @@ ifndef LIBRTMP_PATH LIBRTMP_PATH = ../../librtmp-2.3 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-0.6.7 +endif + # Edit the path below to point to the base of your fbopenssl package. ifndef FBOPENSSL_PATH FBOPENSSL_PATH = ../../fbopenssl-0.4 @@ -226,14 +231,13 @@ endif ifeq ($(findstring -idn,$(CFG)),-idn) WITH_IDN = 1 endif -ifeq ($(findstring -spnego,$(CFG)),-spnego) -WITH_SPNEGO = 1 -WITH_SSL = 1 -endif ifeq ($(findstring -metalink,$(CFG)),-metalink) WITH_METALINK = 1 WITH_SSL = 1 endif +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +WITH_NGHTTP2 = 1 +endif ifeq ($(findstring -ipv6,$(CFG)),-ipv6) ENABLE_IPV6 = 1 endif @@ -267,10 +271,6 @@ ifdef WITH_SSL LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT) IMPORTS += GetProcessSwitchCount RunningProcess -ifdef WITH_SPNEGO - # INCLUDES += -I$(FBOPENSSL_PATH)/include - LDLIBS += $(FBOPENSSL_PATH)/nw/fbopenssl.$(LIBEXT) -endif else ifdef WITH_AXTLS # INCLUDES += -I$(AXTLS_PATH)/inc @@ -295,6 +295,10 @@ ifdef WITH_IDN # INCLUDES += -I$(LIBIDN_PATH)/include LDLIBS += $(LIBIDN_PATH)/lib/libidn.$(LIBEXT) endif +ifdef WITH_NGHTTP2 + INCLUDES += -I$(NGHTTP2_PATH)/include + LDLIBS += $(NGHTTP2_PATH)/lib/libnghttp2.$(LIBEXT) +endif ifdef WITH_METALINK CFLAGS += -DUSE_METALINK INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L) @@ -353,7 +357,7 @@ endif # Makefile.inc provides the CSOURCES and HHEADERS defines include Makefile.inc -OBJX := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(strip $(CURLX_ONES)))) +OBJX := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(strip $(CURLX_CFILES)))) OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CURL_CFILES))) ifndef LINK_STATIC OBJS += $(OBJX) diff --git a/src/Makefile.vc10 b/src/Makefile.vc10 index 54c100c..348a763 100644 --- a/src/Makefile.vc10 +++ b/src/Makefile.vc10 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -56,7 +56,7 @@ PROGRAM_NAME = curl.exe !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF ZLIB_PATH @@ -90,19 +90,24 @@ WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK" ######################################################## ## Nothing more to do below this line! -ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" -ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" -ZLIB_LIBS = zlib.lib -ZLIB_IMP_LIBS = zdll.lib +ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" +ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" +ZLIB_LIBS = zlib.lib +ZLIB_IMP_LIBS = zdll.lib SSL_CFLAGS = /DUSE_SSLEAY SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32" SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll" SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib +WINLIBS = ws2_32.lib wldap32.lib advapi32.lib WINSSL_CFLAGS = /DUSE_SCHANNEL #WINSSL_LIBS = gdi32.lib user32.lib +!IFDEF USE_IDN +WINLIBS = $(WINLIBS) normaliz.lib +!ENDIF + # Runtime library configuration RTLIB = /MD RTLIBD = /MDd @@ -139,6 +144,7 @@ RELEASE_OBJS= \ nonblockr.obj \ rawstrr.obj \ strtoofftr.obj \ + warnless.obj \ tool_binmoder.obj \ tool_bnamer.obj \ tool_cb_dbgr.obj \ @@ -183,6 +189,7 @@ DEBUG_OBJS= \ nonblockd.obj \ rawstrd.obj \ strtoofftd.obj \ + warnlessd.obj \ tool_binmoded.obj \ tool_bnamed.obj \ tool_cb_dbgd.obj \ @@ -338,9 +345,8 @@ LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS) LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS) !ENDIF - -LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib advapi32.lib -LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib advapi32.lib +LINKLIBS = $(LINKLIBS) $(WINLIBS) +LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS) all : release @@ -359,6 +365,8 @@ rawstrr.obj: ../lib/rawstr.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftr.obj: ../lib/strtoofft.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnless.obj: ../lib/warnless.c + $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoder.obj: tool_binmode.c $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamer.obj: tool_bname.c @@ -445,6 +453,8 @@ rawstrd.obj: ../lib/rawstr.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftd.obj: ../lib/strtoofft.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnlessd.obj: ../lib/warnless.c + $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoded.obj: tool_binmode.c $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamed.obj: tool_bname.c diff --git a/src/Makefile.vc6 b/src/Makefile.vc6 index 48331de..c8693af 100644 --- a/src/Makefile.vc6 +++ b/src/Makefile.vc6 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -56,7 +56,7 @@ PROGRAM_NAME = curl.exe !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF ZLIB_PATH @@ -90,19 +90,24 @@ WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK" ######################################################## ## Nothing more to do below this line! -ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" -ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" -ZLIB_LIBS = zlib.lib -ZLIB_IMP_LIBS = zdll.lib +ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" +ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" +ZLIB_LIBS = zlib.lib +ZLIB_IMP_LIBS = zdll.lib SSL_CFLAGS = /DUSE_SSLEAY SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32" SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll" SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib +WINLIBS = ws2_32.lib wldap32.lib advapi32.lib WINSSL_CFLAGS = /DUSE_SCHANNEL #WINSSL_LIBS = gdi32.lib user32.lib +!IFDEF USE_IDN +WINLIBS = $(WINLIBS) normaliz.lib +!ENDIF + # Runtime library configuration RTLIB = /MD RTLIBD = /MDd @@ -139,6 +144,7 @@ RELEASE_OBJS= \ nonblockr.obj \ rawstrr.obj \ strtoofftr.obj \ + warnless.obj \ tool_binmoder.obj \ tool_bnamer.obj \ tool_cb_dbgr.obj \ @@ -183,6 +189,7 @@ DEBUG_OBJS= \ nonblockd.obj \ rawstrd.obj \ strtoofftd.obj \ + warnlessd.obj \ tool_binmoded.obj \ tool_bnamed.obj \ tool_cb_dbgd.obj \ @@ -338,9 +345,8 @@ LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS) LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS) !ENDIF - -LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib advapi32.lib -LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib advapi32.lib +LINKLIBS = $(LINKLIBS) $(WINLIBS) +LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS) all : release @@ -359,6 +365,8 @@ rawstrr.obj: ../lib/rawstr.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftr.obj: ../lib/strtoofft.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnless.obj: ../lib/warnless.c + $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoder.obj: tool_binmode.c $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamer.obj: tool_bname.c @@ -445,6 +453,8 @@ rawstrd.obj: ../lib/rawstr.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftd.obj: ../lib/strtoofft.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnlessd.obj: ../lib/warnless.c + $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoded.obj: tool_binmode.c $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamed.obj: tool_bname.c diff --git a/src/Makefile.vc8 b/src/Makefile.vc8 index c8f1587..7243799 100644 --- a/src/Makefile.vc8 +++ b/src/Makefile.vc8 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -56,7 +56,7 @@ PROGRAM_NAME = curl.exe !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF ZLIB_PATH @@ -90,19 +90,24 @@ WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK" ######################################################## ## Nothing more to do below this line! -ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" -ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" -ZLIB_LIBS = zlib.lib -ZLIB_IMP_LIBS = zdll.lib +ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" +ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" +ZLIB_LIBS = zlib.lib +ZLIB_IMP_LIBS = zdll.lib SSL_CFLAGS = /DUSE_SSLEAY SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32" SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll" SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib +WINLIBS = ws2_32.lib bufferoverflowu.lib wldap32.lib advapi32.lib WINSSL_CFLAGS = /DUSE_SCHANNEL #WINSSL_LIBS = gdi32.lib user32.lib +!IFDEF USE_IDN +WINLIBS = $(WINLIBS) normaliz.lib +!ENDIF + # Runtime library configuration RTLIB = /MD RTLIBD = /MDd @@ -139,6 +144,7 @@ RELEASE_OBJS= \ nonblockr.obj \ rawstrr.obj \ strtoofftr.obj \ + warnless.obj \ tool_binmoder.obj \ tool_bnamer.obj \ tool_cb_dbgr.obj \ @@ -183,6 +189,7 @@ DEBUG_OBJS= \ nonblockd.obj \ rawstrd.obj \ strtoofftd.obj \ + warnlessd.obj \ tool_binmoded.obj \ tool_bnamed.obj \ tool_cb_dbgd.obj \ @@ -338,9 +345,8 @@ LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS) LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS) !ENDIF - -LINKLIBS = $(LINKLIBS) ws2_32.lib bufferoverflowu.lib wldap32.lib advapi32.lib -LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib bufferoverflowu.lib wldap32.lib advapi32.lib +LINKLIBS = $(LINKLIBS) $(WINLIBS) +LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS) all : release @@ -359,6 +365,8 @@ rawstrr.obj: ../lib/rawstr.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftr.obj: ../lib/strtoofft.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnless.obj: ../lib/warnless.c + $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoder.obj: tool_binmode.c $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamer.obj: tool_bname.c @@ -445,6 +453,8 @@ rawstrd.obj: ../lib/rawstr.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftd.obj: ../lib/strtoofft.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnlessd.obj: ../lib/warnless.c + $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoded.obj: tool_binmode.c $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamed.obj: tool_bname.c diff --git a/src/Makefile.vc9 b/src/Makefile.vc9 index 4c312e8..9d60e63 100644 --- a/src/Makefile.vc9 +++ b/src/Makefile.vc9 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -56,7 +56,7 @@ PROGRAM_NAME = curl.exe !IFNDEF OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8y +OPENSSL_PATH = ../../openssl-0.9.8zc !ENDIF !IFNDEF ZLIB_PATH @@ -90,19 +90,24 @@ WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK" ######################################################## ## Nothing more to do below this line! -ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" -ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" -ZLIB_LIBS = zlib.lib -ZLIB_IMP_LIBS = zdll.lib +ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" +ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)" +ZLIB_LIBS = zlib.lib +ZLIB_IMP_LIBS = zdll.lib SSL_CFLAGS = /DUSE_SSLEAY SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32" SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll" SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib +WINLIBS = ws2_32.lib wldap32.lib advapi32.lib WINSSL_CFLAGS = /DUSE_SCHANNEL #WINSSL_LIBS = gdi32.lib user32.lib +!IFDEF USE_IDN +WINLIBS = $(WINLIBS) normaliz.lib +!ENDIF + # Runtime library configuration RTLIB = /MD RTLIBD = /MDd @@ -139,6 +144,7 @@ RELEASE_OBJS= \ nonblockr.obj \ rawstrr.obj \ strtoofftr.obj \ + warnless.obj \ tool_binmoder.obj \ tool_bnamer.obj \ tool_cb_dbgr.obj \ @@ -183,6 +189,7 @@ DEBUG_OBJS= \ nonblockd.obj \ rawstrd.obj \ strtoofftd.obj \ + warnlessd.obj \ tool_binmoded.obj \ tool_bnamed.obj \ tool_cb_dbgd.obj \ @@ -338,9 +345,8 @@ LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS) LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS) !ENDIF - -LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib advapi32.lib -LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib advapi32.lib +LINKLIBS = $(LINKLIBS) $(WINLIBS) +LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS) all : release @@ -359,6 +365,8 @@ rawstrr.obj: ../lib/rawstr.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftr.obj: ../lib/strtoofft.c $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnless.obj: ../lib/warnless.c + $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoder.obj: tool_binmode.c $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamer.obj: tool_bname.c @@ -445,6 +453,8 @@ rawstrd.obj: ../lib/rawstr.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c strtoofftd.obj: ../lib/strtoofft.c $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c +warnlessd.obj: ../lib/warnless.c + $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c tool_binmoded.obj: tool_binmode.c $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c tool_bnamed.obj: tool_bname.c diff --git a/src/macos/MACINSTALL.TXT b/src/macos/MACINSTALL.TXT index 7dffa9d..1839ef2 100644 --- a/src/macos/MACINSTALL.TXT +++ b/src/macos/MACINSTALL.TXT @@ -1 +1 @@ -MACOS (not MACOS X) =================== This is the first attempt at porting cURL to MacOS. http, ftp, dict and telnet seems to work fine, other protocols and advanced features have not been all tested. This port is heavily based on the GUSI library from Matthias Neeracher. GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library bringing some of the comforts of UNIX 98 to traditional MacOS. The latest GUSI release can be downloaded from sourceforge at I have also write a few functions to help port UNIX applications to MacOS. These functions are part of the GUSI Extra library that can be downloaded at OpenSSL support is still experimental but I hope to deliver a version including SSL soon. cURL for MacOS requires using the CodeWarrior compiler from Metrowerks. First download GUSI, GUSI Extra and cURL. Access paths have been setup so that GUSI, GUSI Extra and cURL directories should have the same parent directory. Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to SIOUX and GUSI patches. If you do not apply these patches curl will not behave correctly. In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a stuffit binhexed file) From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access paths if required. Then you should be able to build: - the libcurl libraries for PPC and 68K. - the curl application (also available for PPC and 68K) which is the command line version of cURL. If the file "tool_hugehelp.c" is missing rename "curl/src/tool_hugehelp.c.cvs" to "tool_hugehelp.c" and make sure its file type is 'TEXT' +MACOS (not MACOS X) =================== This is the first attempt at porting cURL to MacOS. http, ftp, dict and telnet seems to work fine, other protocols and advanced features have not been all tested. This port is heavily based on the GUSI library from Matthias Neeracher. GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library bringing some of the comforts of UNIX 98 to traditional MacOS. The latest GUSI release can be downloaded from sourceforge at I have also written a few functions to help port Unix applications to MacOS. These functions are part of the GUSI Extra library that can be downloaded at OpenSSL support is still experimental but I hope to deliver a version including SSL soon. cURL for MacOS requires using the CodeWarrior compiler from Metrowerks. First download GUSI, GUSI Extra and cURL. Access paths have been setup so that GUSI, GUSI Extra and cURL directories should have the same parent directory. Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to SIOUX and GUSI patches. If you do not apply these patches curl will not behave correctly. In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a stuffit binhexed file) From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access paths if required. Then you should be able to build: - the libcurl libraries for PPC and 68K. - the curl application (also available for PPC and 68K) which is the command line version of cURL. If the file "tool_hugehelp.c" is missing rename "curl/src/tool_hugehelp.c.cvs" to "tool_hugehelp.c" and make sure its file type is 'TEXT' diff --git a/src/makefile.amiga b/src/makefile.amiga index 7b9b1c0..25449a6 100644 --- a/src/makefile.amiga +++ b/src/makefile.amiga @@ -16,7 +16,7 @@ MKHELP = ../src/mkhelp.pl include Makefile.inc -OBJS = $(CURL_CFILES:.c=.o) $(CURLX_ONES:.c=.o) +OBJS = $(CURL_CFILES:.c=.o) $(CURLX_CFILES:.c=.o) all: tool_hugehelp.c $(OBJS) $(CC) $(CFLAGS) -o cURL $(OBJS) $(LIBS) -Wl,-Map,cURL.map,--cref diff --git a/src/mkhelp.pl b/src/mkhelp.pl index 444b669..7ed86f7 100644 --- a/src/mkhelp.pl +++ b/src/mkhelp.pl @@ -6,7 +6,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -256,6 +256,10 @@ foot(); sub foot { print <, et al. + * Copyright (C) 1998 - 2014, 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 @@ -41,7 +41,7 @@ void set_binmode(FILE *stream) # ifdef __HIGHC__ _setmode(stream, O_BINARY); # else - setmode(fileno(stream), O_BINARY); + (void)setmode(fileno(stream), O_BINARY); # endif #else (void)stream; diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c index 1850ba0..4add67c 100644 --- a/src/tool_cb_dbg.c +++ b/src/tool_cb_dbg.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -44,7 +44,8 @@ int tool_debug_cb(CURL *handle, curl_infotype type, unsigned char *data, size_t size, void *userdata) { - struct Configurable *config = userdata; + struct OperationConfig *operation = userdata; + struct GlobalConfig *config = operation->global; FILE *output = config->errors; const char *text; struct timeval tv; @@ -87,7 +88,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, output = config->trace_stream; if(!output) { - warnf(config, "Failed to create/open output"); + warnf(operation, "Failed to create/open output"); return 0; } @@ -141,11 +142,10 @@ int tool_debug_cb(CURL *handle, curl_infotype type, to stderr or stdout, we don't display the alert about the data not being shown as the data _is_ shown then just not via this function */ - if(!config->isatty || - ((output != stderr) && (output != stdout))) { + if(!config->isatty || ((output != stderr) && (output != stdout))) { if(!newl) fprintf(output, "%s%s ", timebuf, s_infotype[type]); - fprintf(output, "[data not shown]\n"); + fprintf(output, "[%zd bytes data]\n", size); newl = FALSE; traced_data = TRUE; } diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c index b049377..9e3c5fb 100644 --- a/src/tool_cb_prg.c +++ b/src/tool_cb_prg.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -32,14 +32,14 @@ #include "memdebug.h" /* keep this as LAST include */ /* -** callback for CURLOPT_PROGRESSFUNCTION +** callback for CURLOPT_XFERINFOFUNCTION */ #define MAX_BARLENGTH 256 int tool_progress_cb(void *clientp, - double dltotal, double dlnow, - double ultotal, double ulnow) + curl_off_t dltotal, curl_off_t dlnow, + curl_off_t ultotal, curl_off_t ulnow) { /* The original progress-bar source code was written for curl by Lars Aas, and this new edition inherits some of his concepts. */ @@ -55,15 +55,16 @@ int tool_progress_cb(void *clientp, curl_off_t total; curl_off_t point; - if(bar->calls && (tvdiff(now, bar->prevtime) < 200L)) - /* after first call, limit progress-bar updating to 5 Hz */ - return 0; - /* expected transfer size */ - total = (curl_off_t)dltotal + (curl_off_t)ultotal + bar->initial_size; + total = dltotal + ultotal + bar->initial_size; /* we've come this far */ - point = (curl_off_t)dlnow + (curl_off_t)ulnow + bar->initial_size; + point = dlnow + ulnow + bar->initial_size; + + if(bar->calls && (tvdiff(now, bar->prevtime) < 100L) && point < total) + /* after first call, limit progress-bar updating to 10 Hz */ + /* update when we're at 100% even if last update is less than 200ms ago */ + return 0; if(point > total) /* we have got more than the expected total! */ @@ -100,7 +101,7 @@ int tool_progress_cb(void *clientp, } void progressbarinit(struct ProgressData *bar, - struct Configurable *config) + struct OperationConfig *config) { #ifdef __EMX__ /* 20000318 mgs */ @@ -145,6 +146,5 @@ void progressbarinit(struct ProgressData *bar, bar->width = scr_size[0] - 1; #endif - bar->out = config->errors; + bar->out = config->global->errors; } - diff --git a/src/tool_cb_prg.h b/src/tool_cb_prg.h index a20645e..c635be8 100644 --- a/src/tool_cb_prg.h +++ b/src/tool_cb_prg.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -36,15 +36,15 @@ struct ProgressData { }; void progressbarinit(struct ProgressData *bar, - struct Configurable *config); + struct OperationConfig *config); /* ** callback for CURLOPT_PROGRESSFUNCTION */ int tool_progress_cb(void *clientp, - double dltotal, double dlnow, - double ultotal, double ulnow); + curl_off_t dltotal, curl_off_t dlnow, + curl_off_t ultotal, curl_off_t ulnow); #endif /* HEADER_CURL_TOOL_CB_PRG_H */ diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c index d668811..dfbf95c 100644 --- a/src/tool_cb_wrt.c +++ b/src/tool_cb_wrt.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -39,7 +39,7 @@ size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata) { size_t rc; struct OutStruct *outs = userdata; - struct Configurable *config = outs->config; + struct OperationConfig *config = outs->config; /* * Once that libcurl has called back tool_write_cb() the returned value diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c index da11f4a..c9ee417 100644 --- a/src/tool_cfgable.c +++ b/src/tool_cfgable.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -22,17 +22,29 @@ #include "tool_setup.h" #include "tool_cfgable.h" +#include "tool_main.h" #include "memdebug.h" /* keep this as LAST include */ -void free_config_fields(struct Configurable *config) +void config_init(struct OperationConfig* config) { - struct getout *urlnode; + memset(config, 0, sizeof(struct OperationConfig)); + + config->postfieldsize = -1; + config->use_httpget = FALSE; + config->create_dirs = FALSE; + config->maxredirs = DEFAULT_MAXREDIRS; + config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */ + config->proto_present = FALSE; + config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */ + ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB | + CURLPROTO_SMBS); + config->proto_redir_present = FALSE; +} - if(config->easy) { - curl_easy_cleanup(config->easy); - config->easy = NULL; - } +static void free_config_fields(struct OperationConfig *config) +{ + struct getout *urlnode; Curl_safefree(config->random_file); Curl_safefree(config->egd_file); @@ -57,6 +69,11 @@ void free_config_fields(struct Configurable *config) Curl_safefree(config->proxyuserpwd); Curl_safefree(config->proxy); + Curl_safefree(config->dns_ipv6_addr); + Curl_safefree(config->dns_ipv4_addr); + Curl_safefree(config->dns_interface); + Curl_safefree(config->dns_servers); + Curl_safefree(config->noproxy); Curl_safefree(config->mail_from); @@ -85,6 +102,7 @@ void free_config_fields(struct Configurable *config) Curl_safefree(config->cacert); Curl_safefree(config->capath); Curl_safefree(config->crlfile); + Curl_safefree(config->pinnedpubkey); Curl_safefree(config->key); Curl_safefree(config->key_type); Curl_safefree(config->key_passwd); @@ -94,19 +112,18 @@ void free_config_fields(struct Configurable *config) Curl_safefree(config->customrequest); Curl_safefree(config->krblevel); - Curl_safefree(config->trace_dump); - config->trace_stream = NULL; /* closed elsewhere when appropriate */ + Curl_safefree(config->xoauth2_bearer); + Curl_safefree(config->unix_socket_path); Curl_safefree(config->writeout); - config->errors = NULL; /* closed elsewhere when appropriate */ - curl_slist_free_all(config->quote); curl_slist_free_all(config->postquote); curl_slist_free_all(config->prequote); curl_slist_free_all(config->headers); + curl_slist_free_all(config->proxyheaders); if(config->httppost) { curl_formfree(config->httppost); @@ -122,7 +139,19 @@ void free_config_fields(struct Configurable *config) Curl_safefree(config->ftp_account); Curl_safefree(config->ftp_alternative_to_user); - - Curl_safefree(config->libcurl); } +void config_free(struct OperationConfig *config) +{ + struct OperationConfig *last = config; + + /* Free each of the structures in reverse order */ + while(last) { + struct OperationConfig *prev = last->prev; + + free_config_fields(last); + free(last); + + last = prev; + } +} diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index 9a9b6d8..cf8d563 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -27,8 +27,10 @@ #include "tool_metalink.h" -struct Configurable { - CURL *easy; /* once we have one, we keep it here */ +struct GlobalConfig; + +struct OperationConfig { + CURL *easy; /* A copy of the handle from GlobalConfig */ bool remote_time; char *random_file; char *egd_file; @@ -66,10 +68,12 @@ struct Configurable { char *range; long low_speed_limit; long low_speed_time; - int showerror; /* -1 == unset, default => show errors - 0 => -s is used to NOT show errors - 1 => -S has been used to show errors */ + char *dns_servers; /* dot notation: 1.1.1.1;2.2.2.2 */ + char *dns_interface; /* interface name */ + char *dns_ipv4_addr; /* dot notation */ + char *dns_ipv6_addr; /* dot notation */ char *userpwd; + char *login_options; char *tls_username; char *tls_password; char *tls_authtype; @@ -83,7 +87,6 @@ struct Configurable { bool sasl_ir; /* Enable/disable SASL initial response */ bool proxytunnel; bool ftp_append; /* APPE on ftp */ - bool mute; /* don't show messages, --silent given */ bool use_ascii; /* select ascii or text transfer */ bool autoreferer; /* automatically set referer */ bool failonerror; /* fail on (HTTP) errors */ @@ -97,8 +100,6 @@ struct Configurable { bool netrc_opt; bool netrc; char *netrc_file; - bool noprogress; /* don't show progress meter, --silent given */ - bool isatty; /* updated internally only if output is a tty */ struct getout *url_list; /* point to the first node */ struct getout *url_last; /* point to the last/current node */ struct getout *url_get; /* point to the node to fill in URL */ @@ -109,23 +110,17 @@ struct Configurable { char *cacert; char *capath; char *crlfile; + char *pinnedpubkey; char *key; char *key_type; char *key_passwd; char *pubkey; char *hostpubmd5; char *engine; - bool list_engines; bool crlf; char *customrequest; char *krblevel; - char *trace_dump; /* file to dump the network trace to, or NULL */ - FILE *trace_stream; - bool trace_fopened; - trace tracetype; - bool tracetime; /* include timestamp? */ long httpversion; - int progressmode; /* CURL_PROGRESS_BAR or CURL_PROGRESS_STATS */ bool nobuffer; bool readbusy; /* set when reading input returns EAGAIN */ bool globoff; @@ -141,8 +136,6 @@ struct Configurable { bool proxyanyauth; char *writeout; /* %-styled format string to output */ bool writeenv; /* write results to environment, if available */ - FILE *errors; /* errors stream, defaults to stderr */ - bool errors_fopened; /* whether errors stream isn't stderr */ struct curl_slist *quote; struct curl_slist *postquote; struct curl_slist *prequote; @@ -151,6 +144,7 @@ struct Configurable { curl_TimeCond timecond; time_t condtime; struct curl_slist *headers; + struct curl_slist *proxyheaders; struct curl_httppost *httppost; struct curl_httppost *last_post; struct curl_slist *telnet_options; @@ -186,7 +180,6 @@ struct Configurable { bool ignorecl; /* --ignore-content-length */ bool disable_sessionid; - char *libcurl; /* output libcurl code to this file name */ bool raw; bool post301; bool post302; @@ -205,9 +198,43 @@ struct Configurable { bool use_metalink; /* process given URLs as metalink XML file */ metalinkfile *metalinkfile_list; /* point to the first node */ metalinkfile *metalinkfile_last; /* point to the last/current node */ -}; /* struct Configurable */ +#ifdef CURLDEBUG + bool test_event_based; +#endif + char *xoauth2_bearer; /* XOAUTH2 bearer token */ + bool nonpn; /* enable/disable TLS NPN extension */ + bool noalpn; /* enable/disable TLS ALPN extension */ + char *unix_socket_path; /* path to Unix domain socket */ -void free_config_fields(struct Configurable *config); + struct GlobalConfig *global; + struct OperationConfig *prev; + struct OperationConfig *next; /* Always last in the struct */ +}; -#endif /* HEADER_CURL_TOOL_CFGABLE_H */ +struct GlobalConfig { + CURL *easy; /* Once we have one, we keep it here */ + int showerror; /* -1 == unset, default => show errors + 0 => -s is used to NOT show errors + 1 => -S has been used to show errors */ + bool mute; /* don't show messages, --silent given */ + bool noprogress; /* don't show progress bar --silent given */ + bool isatty; /* Updated internally if output is a tty */ + FILE *errors; /* Error stream, defaults to stderr */ + bool errors_fopened; /* Whether error stream isn't stderr */ + char *trace_dump; /* file to dump the network trace to */ + FILE *trace_stream; + bool trace_fopened; + trace tracetype; + bool tracetime; /* include timestamp? */ + int progressmode; /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */ + char *libcurl; /* Output libcurl code to this file name */ + + struct OperationConfig *first; + struct OperationConfig *current; + struct OperationConfig *last; /* Always last in the struct */ +}; +void config_init(struct OperationConfig *config); +void config_free(struct OperationConfig *config); + +#endif /* HEADER_CURL_TOOL_CFGABLE_H */ diff --git a/src/tool_doswin.c b/src/tool_doswin.c index 4fae91d..dd6e8bb 100644 --- a/src/tool_doswin.c +++ b/src/tool_doswin.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -262,7 +262,8 @@ char **__crt0_glob_function(char *arg) * HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SafeProcessSearchMode */ -CURLcode FindWin32CACert(struct Configurable *config, const char *bundle_file) +CURLcode FindWin32CACert(struct OperationConfig *config, + const char *bundle_file) { CURLcode result = CURLE_OK; @@ -296,4 +297,3 @@ CURLcode FindWin32CACert(struct Configurable *config, const char *bundle_file) #endif /* WIN32 */ #endif /* MSDOS || WIN32 */ - diff --git a/src/tool_doswin.h b/src/tool_doswin.h index 955ce8d..cd216db 100644 --- a/src/tool_doswin.h +++ b/src/tool_doswin.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -35,7 +35,8 @@ char **__crt0_glob_function(char *arg); #ifdef WIN32 -CURLcode FindWin32CACert(struct Configurable *config, const char *bundle_file); +CURLcode FindWin32CACert(struct OperationConfig *config, + const char *bundle_file); #endif /* WIN32 */ diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c index 339dde5..3db27bb 100644 --- a/src/tool_easysrc.c +++ b/src/tool_easysrc.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -154,18 +154,20 @@ CURLcode easysrc_perform(void) CHKRET(easysrc_add(&easysrc_code, "")); CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);")); + CHKRET(easysrc_add(&easysrc_code, "")); + return CURLE_OK; } CURLcode easysrc_cleanup(void) { - CHKRET(easysrc_add(&easysrc_code, "")); CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);")); CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;")); + return CURLE_OK; } -void dumpeasysrc(struct Configurable *config) +void dumpeasysrc(struct GlobalConfig *config) { struct curl_slist *ptr; char *o = config->libcurl; @@ -180,7 +182,7 @@ void dumpeasysrc(struct Configurable *config) else out = stdout; if(!out) - warnf(config, "Failed to open %s to write libcurl code!\n", o); + warnf(config->current, "Failed to open %s to write libcurl code!\n", o); else { int i; const char *c; diff --git a/src/tool_easysrc.h b/src/tool_easysrc.h index fa97cdc..07a4b78 100644 --- a/src/tool_easysrc.h +++ b/src/tool_easysrc.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -40,7 +40,8 @@ extern CURLcode easysrc_add(struct curl_slist **plist, const char *bupf); extern CURLcode easysrc_addf(struct curl_slist **plist, const char *fmt, ...); extern CURLcode easysrc_perform(void); extern CURLcode easysrc_cleanup(void); -void dumpeasysrc(struct Configurable *config); + +void dumpeasysrc(struct GlobalConfig *config); #endif /* CURL_DISABLE_LIBCURL_OPTION */ diff --git a/src/tool_formparse.c b/src/tool_formparse.c index fe357f5..1dcd897 100644 --- a/src/tool_formparse.c +++ b/src/tool_formparse.c @@ -140,7 +140,7 @@ static char *get_param_word(char **str, char **end_pos) * ***************************************************************************/ -int formparse(struct Configurable *config, +int formparse(struct OperationConfig *config, const char *input, struct curl_httppost **httppost, struct curl_httppost **last_post, @@ -150,8 +150,8 @@ int formparse(struct Configurable *config, build a linked list with the info */ char name[256]; char *contents = NULL; - char type_major[128]; - char type_minor[128]; + char type_major[128] = ""; + char type_minor[128] = ""; char *contp; const char *type = NULL; char *sep; @@ -163,7 +163,7 @@ int formparse(struct Configurable *config, /* Allocate the contents */ contents = strdup(contp+1); if(!contents) { - fprintf(config->errors, "out of memory\n"); + fprintf(config->global->errors, "out of memory\n"); return 1; } contp = contents; @@ -277,7 +277,7 @@ int formparse(struct Configurable *config, } forms = malloc((count+1)*sizeof(struct curl_forms)); if(!forms) { - fprintf(config->errors, "Error building form post!\n"); + fprintf(config->global->errors, "Error building form post!\n"); Curl_safefree(contents); FreeMultiInfo(&multi_start, &multi_current); return 4; diff --git a/src/tool_formparse.h b/src/tool_formparse.h index 3cd915f..f773626 100644 --- a/src/tool_formparse.h +++ b/src/tool_formparse.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,7 +23,7 @@ ***************************************************************************/ #include "tool_setup.h" -int formparse(struct Configurable *config, +int formparse(struct OperationConfig *config, const char *input, struct curl_httppost **httppost, struct curl_httppost **last_post, diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 5eb2c9f..3932ccb 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -27,23 +27,17 @@ /* use our own printf() functions */ #include "curlx.h" -#ifdef USE_MANUAL -# include "tool_hugehelp.h" -#endif - #include "tool_binmode.h" #include "tool_cfgable.h" #include "tool_cb_prg.h" #include "tool_formparse.h" #include "tool_getparam.h" -#include "tool_help.h" #include "tool_helpers.h" #include "tool_libinfo.h" #include "tool_metalink.h" #include "tool_msgs.h" #include "tool_paramhlp.h" #include "tool_parsecfg.h" -#include "tool_version.h" #include "memdebug.h" /* keep this as LAST include */ @@ -73,10 +67,14 @@ static const struct LongShort aliases[]= { /* all these ones, starting with "*" or "$" as a short-option have *no* short option to mention. */ {"*", "url", TRUE}, + {"*4", "dns-ipv4-addr", TRUE}, + {"*6", "dns-ipv6-addr", TRUE}, {"*a", "random-file", TRUE}, {"*b", "egd-file", TRUE}, + {"*B", "oauth2-bearer", TRUE}, {"*c", "connect-timeout", TRUE}, {"*d", "ciphers", TRUE}, + {"*D", "dns-interface", TRUE}, {"*e", "disable-epsv", FALSE}, {"*E", "epsv", FALSE}, /* 'epsv' made like this to make --no-epsv and --epsv to work @@ -84,8 +82,11 @@ static const struct LongShort aliases[]= { #ifdef USE_ENVIRONMENT {"*f", "environment", FALSE}, #endif + {"*F", "dns-servers", TRUE}, {"*g", "trace", TRUE}, + {"*G", "npn", FALSE}, {"*h", "trace-ascii", TRUE}, + {"*H", "alpn", FALSE}, {"*i", "limit-rate", TRUE}, {"*j", "compressed", FALSE}, {"*J", "tr-encoding", FALSE}, @@ -174,8 +175,15 @@ static const struct LongShort aliases[]= { {"$I", "post303", FALSE}, {"$J", "metalink", FALSE}, {"$K", "sasl-ir", FALSE}, - {"0", "http1.0", FALSE}, + {"$L", "test-event", FALSE}, + {"$M", "unix-socket", TRUE}, + {"0", "http1.0", FALSE}, + {"01", "http1.1", FALSE}, + {"02", "http2", FALSE}, {"1", "tlsv1", FALSE}, + {"10", "tlsv1.0", FALSE}, + {"11", "tlsv1.1", FALSE}, + {"12", "tlsv1.2", FALSE}, {"2", "sslv2", FALSE}, {"3", "sslv3", FALSE}, {"4", "ipv4", FALSE}, @@ -207,6 +215,8 @@ static const struct LongShort aliases[]= { {"El", "tlspassword", TRUE}, {"Em", "tlsauthtype", TRUE}, {"En", "ssl-allow-beast", FALSE}, + {"Eo", "login-options", TRUE}, + {"Ep", "pinnedpubkey", TRUE}, {"f", "fail", FALSE}, {"F", "form", TRUE}, {"Fs", "form-string", TRUE}, @@ -214,6 +224,7 @@ static const struct LongShort aliases[]= { {"G", "get", FALSE}, {"h", "help", FALSE}, {"H", "header", TRUE}, + {"Hp", "proxy-header", TRUE}, {"i", "include", FALSE}, {"I", "head", FALSE}, {"j", "junk-session-cookies", FALSE}, @@ -259,33 +270,10 @@ static const struct LongShort aliases[]= { {"y", "speed-time", TRUE}, {"z", "time-cond", TRUE}, {"#", "progress-bar", FALSE}, + {":", "next", FALSE}, {"~", "xattr", FALSE}, }; -struct feat { - const char *name; - int bitmask; -}; - -static const struct feat feats[] = { - {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, - {"Debug", CURL_VERSION_DEBUG}, - {"TrackMemory", CURL_VERSION_CURLDEBUG}, - {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, - {"IDN", CURL_VERSION_IDN}, - {"IPv6", CURL_VERSION_IPV6}, - {"Largefile", CURL_VERSION_LARGEFILE}, - {"NTLM", CURL_VERSION_NTLM}, - {"NTLM_WB", CURL_VERSION_NTLM_WB}, - {"SPNEGO", CURL_VERSION_SPNEGO}, - {"SSL", CURL_VERSION_SSL}, - {"SSPI", CURL_VERSION_SSPI}, - {"krb4", CURL_VERSION_KERBEROS4}, - {"libz", CURL_VERSION_LIBZ}, - {"CharConv", CURL_VERSION_CONV}, - {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP} -}; - /* Split the argument of -E to 'certname' and 'passphrase' separated by colon. * We allow ':' and '\' to be escaped by '\' so that we can use certificate * nicknames containing ':'. See @@ -389,7 +377,8 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ char *nextarg, /* NULL if unset */ bool *usedarg, /* set to TRUE if the arg has been used */ - struct Configurable *config) + struct GlobalConfig *global, + struct OperationConfig *config) { char letter; char subletter = '\0'; /* subletters can only occur on long options */ @@ -450,12 +439,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ /* we can loop here if we have multiple single-letters */ if(!longopt) { - if(NULL != parse) { - letter = (char)*parse; - } - else { - letter = '\0'; - } + letter = (char)*parse; subletter='\0'; } else { @@ -491,12 +475,23 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ switch(letter) { case '*': /* options without a short option */ switch(subletter) { + case '4': /* --dns-ipv4-addr */ + /* addr in dot notation */ + GetStr(&config->dns_ipv4_addr, nextarg); + break; + case '6': /* --dns-ipv6-addr */ + /* addr in dot notation */ + GetStr(&config->dns_ipv6_addr, nextarg); + break; case 'a': /* random-file */ GetStr(&config->random_file, nextarg); break; case 'b': /* egd-file */ GetStr(&config->egd_file, nextarg); break; + case 'B': /* XOAUTH2 Bearer */ + GetStr(&config->xoauth2_bearer, nextarg); + break; case 'c': /* connect-timeout */ err = str2udouble(&config->connecttimeout, nextarg); if(err) @@ -505,6 +500,10 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'd': /* ciphers */ GetStr(&config->cipher_list, nextarg); break; + case 'D': /* --dns-interface */ + /* interface name */ + GetStr(&config->dns_interface, nextarg); + break; case 'e': /* --disable-epsv */ config->disable_epsv = toggle; break; @@ -516,18 +515,28 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ config->writeenv = toggle; break; #endif + case 'F': /* --dns-servers */ + /* IP addrs of DNS servers */ + GetStr(&config->dns_servers, nextarg); + break; case 'g': /* --trace */ - GetStr(&config->trace_dump, nextarg); - if(config->tracetype && (config->tracetype != TRACE_BIN)) + GetStr(&global->trace_dump, nextarg); + if(global->tracetype && (global->tracetype != TRACE_BIN)) warnf(config, "--trace overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_BIN; + global->tracetype = TRACE_BIN; + break; + case 'G': /* --npn */ + config->nonpn = (!toggle)?TRUE:FALSE; break; case 'h': /* --trace-ascii */ - GetStr(&config->trace_dump, nextarg); - if(config->tracetype && (config->tracetype != TRACE_ASCII)) + GetStr(&global->trace_dump, nextarg); + if(global->tracetype && (global->tracetype != TRACE_ASCII)) warnf(config, "--trace-ascii overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_ASCII; + global->tracetype = TRACE_ASCII; + break; + case 'H': /* --alpn */ + config->noalpn = (!toggle)?TRUE:FALSE; break; case 'i': /* --limit-rate */ { @@ -585,13 +594,13 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'l': /* --negotiate */ if(toggle) { - if(curlinfo->features & CURL_VERSION_GSSNEGOTIATE) - config->authtype |= CURLAUTH_GSSNEGOTIATE; + if(curlinfo->features & CURL_VERSION_SPNEGO) + config->authtype |= CURLAUTH_NEGOTIATE; else return PARAM_LIBCURL_DOESNT_SUPPORT; } else - config->authtype &= ~CURLAUTH_GSSNEGOTIATE; + config->authtype &= ~CURLAUTH_NEGOTIATE; break; case 'm': /* --ntlm */ @@ -639,7 +648,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ break; case 'r': /* --create-dirs */ - config->create_dirs = TRUE; + config->create_dirs = toggle; break; case 's': /* --max-redirs */ @@ -661,7 +670,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'u': /* --crlf */ /* LF -> CRLF conversion? */ - config->crlf = TRUE; + config->crlf = toggle; break; case 'v': /* --stderr */ @@ -670,14 +679,14 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ if(!newfile) warnf(config, "Failed to open %s!\n", nextarg); else { - if(config->errors_fopened) - fclose(config->errors); - config->errors = newfile; - config->errors_fopened = TRUE; + if(global->errors_fopened) + fclose(global->errors); + global->errors = newfile; + global->errors_fopened = TRUE; } } else - config->errors = stdout; + global->errors = stdout; break; case 'w': /* --interface */ /* interface */ @@ -685,8 +694,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ break; case 'x': /* --krb */ /* kerberos level string */ - if(curlinfo->features & (CURL_VERSION_KERBEROS4 | - CURL_VERSION_GSSNEGOTIATE)) + if(curlinfo->features & CURL_VERSION_KERBEROS4) GetStr(&config->krblevel, nextarg); else return PARAM_LIBCURL_DOESNT_SUPPORT; @@ -786,11 +794,12 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ break; case 'k': /* --proxy-negotiate */ - if(curlinfo->features & CURL_VERSION_GSSNEGOTIATE) + if(curlinfo->features & CURL_VERSION_SPNEGO) config->proxynegotiate = toggle; else return PARAM_LIBCURL_DOESNT_SUPPORT; break; + case 'm': /* --ftp-account */ GetStr(&config->ftp_account, nextarg); break; @@ -798,7 +807,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ config->proxyanyauth = toggle; break; case 'o': /* --trace-time */ - config->tracetime = toggle; + global->tracetime = toggle; break; case 'p': /* --ignore-content-length */ config->ignorecl = toggle; @@ -856,7 +865,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ "--libcurl option was disabled at build-time!\n"); return PARAM_OPTION_UNKNOWN; #else - GetStr(&config->libcurl, nextarg); + GetStr(&global->libcurl, nextarg); break; #endif case '#': /* --raw */ @@ -888,7 +897,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ GetStr(&config->socks5_gssapi_service, nextarg); break; case '7': /* --socks5-gssapi-nec*/ - config->socks5_gssapi_nec = TRUE; + config->socks5_gssapi_nec = toggle; break; #endif case '8': /* --proxy1.0 */ @@ -959,26 +968,66 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ break; } case 'K': /* --sasl-ir */ - config->sasl_ir = TRUE; + config->sasl_ir = toggle; + break; + case 'L': /* --test-event */ +#ifdef CURLDEBUG + config->test_event_based = toggle; +#else + warnf(config, "--test-event is ignored unless a debug build!\n"); +#endif + break; + case 'M': /* --unix-socket */ + GetStr(&config->unix_socket_path, nextarg); break; } break; case '#': /* --progress-bar */ if(toggle) - config->progressmode = CURL_PROGRESS_BAR; + global->progressmode = CURL_PROGRESS_BAR; else - config->progressmode = CURL_PROGRESS_STATS; + global->progressmode = CURL_PROGRESS_STATS; break; + case ':': /* --next */ + return PARAM_NEXT_OPERATION; case '~': /* --xattr */ config->xattr = toggle; break; - case '0': - /* HTTP version 1.0 */ - config->httpversion = CURL_HTTP_VERSION_1_0; + case '0': /* --http* options */ + switch(subletter) { + case '\0': + /* HTTP version 1.0 */ + config->httpversion = CURL_HTTP_VERSION_1_0; + break; + case '1': + /* HTTP version 1.1 */ + config->httpversion = CURL_HTTP_VERSION_1_1; + break; + case '2': + /* HTTP version 2.0 */ + config->httpversion = CURL_HTTP_VERSION_2_0; + break; + } break; - case '1': - /* TLS version 1 */ - config->ssl_version = CURL_SSLVERSION_TLSv1; + case '1': /* --tlsv1* options */ + switch(subletter) { + case '\0': + /* TLS version 1.x */ + config->ssl_version = CURL_SSLVERSION_TLSv1; + break; + case '0': + /* TLS version 1.0 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_0; + break; + case '1': + /* TLS version 1.1 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_1; + break; + case '2': + /* TLS version 1.2 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_2; + break; + } break; case '2': /* SSL version 2 */ @@ -1190,7 +1239,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ &-letter */ char *oldpost = config->postfields; curl_off_t oldlen = config->postfieldsize; - curl_off_t newlen = oldlen + size + 2; + curl_off_t newlen = oldlen + curlx_uztoso(size) + 2; config->postfields = malloc((size_t)newlen); if(!config->postfields) { Curl_safefree(oldpost); @@ -1208,7 +1257,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ } else { config->postfields = postdata; - config->postfieldsize = size; + config->postfieldsize = curlx_uztoso(size); } } /* @@ -1261,7 +1310,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'f': /* crypto engine */ GetStr(&config->engine, nextarg); if(config->engine && curlx_raw_equal(config->engine,"list")) - config->list_engines = TRUE; + return PARAM_ENGINES_REQUESTED; break; case 'g': /* CA info PEM file */ /* CA cert directory */ @@ -1300,10 +1349,20 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ else return PARAM_LIBCURL_DOESNT_SUPPORT; break; - case 'n': /* no empty SSL fragments */ + case 'n': /* no empty SSL fragments, --ssl-allow-beast */ if(curlinfo->features & CURL_VERSION_SSL) config->ssl_allow_beast = toggle; break; + + case 'o': /* --login-options */ + GetStr(&config->login_options, nextarg); + break; + + case 'p': /* Pinned public key DER file */ + /* Pinned public key DER file */ + GetStr(&config->pinnedpubkey, nextarg); + break; + default: /* certificate file */ { char *certname, *passphrase; @@ -1345,14 +1404,16 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'h': /* h for help */ if(toggle) { - tool_help(); return PARAM_HELP_REQUESTED; } /* we now actually support --no-help too! */ break; case 'H': /* A custom header to append to a list */ - err = add2list(&config->headers, nextarg); + if(subletter == 'p') /* --proxy-header */ + err = add2list(&config->proxyheaders, nextarg); + else + err = add2list(&config->headers, nextarg); if(err) return err; break; @@ -1385,7 +1446,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ config->insecure_ok = toggle; break; case 'K': /* parse config file */ - if(parseconfig(nextarg, config)) + if(parseconfig(nextarg, global)) warnf(config, "error trying read config from the '%s' file\n", nextarg); break; @@ -1411,8 +1472,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'M': /* M for manual, huge help */ if(toggle) { /* --no-manual shows no manual... */ #ifdef USE_MANUAL - hugehelp(); - return PARAM_HELP_REQUESTED; + return PARAM_MANUAL_REQUESTED; #else warnf(config, "built-in manual was disabled at build-time!\n"); @@ -1568,18 +1628,18 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 's': /* don't show progress meter, don't show errors : */ if(toggle) - config->mute = config->noprogress = TRUE; + global->mute = global->noprogress = TRUE; else - config->mute = config->noprogress = FALSE; - if(config->showerror < 0) + global->mute = global->noprogress = FALSE; + if(global->showerror < 0) /* if still on the default value, set showerror to the reverse of toggle. This is to allow -S and -s to be used in an independent order but still have the same effect. */ - config->showerror = (!toggle)?TRUE:FALSE; /* toggle off */ + global->showerror = (!toggle)?TRUE:FALSE; /* toggle off */ break; case 'S': /* show errors */ - config->showerror = toggle?1:0; /* toggle on if used with -s */ + global->showerror = toggle?1:0; /* toggle on if used with -s */ break; case 't': /* Telnet options */ @@ -1624,64 +1684,33 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ /* user:password */ GetStr(&config->userpwd, nextarg); cleanarg(nextarg); - err = checkpasswd("host", &config->userpwd); - if(err) - return err; break; case 'U': /* Proxy user:password */ GetStr(&config->proxyuserpwd, nextarg); cleanarg(nextarg); - err = checkpasswd("proxy", &config->proxyuserpwd); - if(err) - return err; break; case 'v': if(toggle) { /* the '%' thing here will cause the trace get sent to stderr */ - Curl_safefree(config->trace_dump); - config->trace_dump = strdup("%"); - if(!config->trace_dump) + Curl_safefree(global->trace_dump); + global->trace_dump = strdup("%"); + if(!global->trace_dump) return PARAM_NO_MEM; - if(config->tracetype && (config->tracetype != TRACE_PLAIN)) + if(global->tracetype && (global->tracetype != TRACE_PLAIN)) warnf(config, "-v, --verbose overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_PLAIN; + global->tracetype = TRACE_PLAIN; } else /* verbose is disabled here */ - config->tracetype = TRACE_NONE; + global->tracetype = TRACE_NONE; break; case 'V': - { - const char *const *proto; - - if(!toggle) - /* --no-version yields no output! */ - break; + if(toggle) /* --no-version yields no output! */ + return PARAM_VERSION_INFO_REQUESTED; + break; - printf(CURL_ID "%s\n", curl_version()); - if(curlinfo->protocols) { - printf("Protocols: "); - for(proto = curlinfo->protocols; *proto; ++proto) { - printf("%s ", *proto); - } - puts(""); /* newline */ - } - if(curlinfo->features) { - unsigned int i; - printf("Features: "); - for(i = 0; i < sizeof(feats)/sizeof(feats[0]); i++) { - if(curlinfo->features & feats[i].bitmask) - printf("%s ", feats[i].name); - } -#ifdef USE_METALINK - printf("Metalink "); -#endif - puts(""); /* newline */ - } - } - return PARAM_HELP_REQUESTED; case 'w': /* get the output string */ if('@' == *nextarg) { @@ -1738,6 +1767,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ switch(*nextarg) { case '+': nextarg++; + /* FALLTHROUGH */ default: /* If-Modified-Since: (section 14.28 in RFC2068) */ config->timecond = CURL_TIMECOND_IFMODSINCE; @@ -1782,3 +1812,84 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ return PARAM_OK; } +ParameterError parse_args(struct GlobalConfig *config, int argc, + argv_item_t argv[]) +{ + int i; + bool stillflags; + char *orig_opt = NULL; + ParameterError result = PARAM_OK; + struct OperationConfig *operation = config->first; + + for(i = 1, stillflags = TRUE; i < argc && !result; i++) { + orig_opt = argv[i]; + + if(stillflags && ('-' == argv[i][0])) { + char *nextarg; + bool passarg; + char *flag = argv[i]; + + if(curlx_strequal("--", argv[i])) + /* This indicates the end of the flags and thus enables the + following (URL) argument to start with -. */ + stillflags = FALSE; + else { + nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL; + + result = getparameter(flag, nextarg, &passarg, config, operation); + if(result == PARAM_NEXT_OPERATION) { + /* Reset result as PARAM_NEXT_OPERATION is only used here and not + returned from this function */ + result = PARAM_OK; + + if(operation->url_list && operation->url_list->url) { + /* Allocate the next config */ + operation->next = malloc(sizeof(struct OperationConfig)); + if(operation->next) { + /* Initialise the newly created config */ + config_init(operation->next); + + /* Copy the easy handle */ + operation->next->easy = config->easy; + + /* Set the global config pointer */ + operation->next->global = config; + + /* Update the last operation pointer */ + config->last = operation->next; + + /* Move onto the new config */ + operation->next->prev = operation; + operation = operation->next; + } + else + result = PARAM_NO_MEM; + } + } + else if(!result && passarg) + i++; /* we're supposed to skip this */ + } + } + else { + bool used; + + /* Just add the URL please */ + result = getparameter((char *)"--url", argv[i], &used, config, + operation); + } + } + + if(result && result != PARAM_HELP_REQUESTED && + result != PARAM_MANUAL_REQUESTED && + result != PARAM_VERSION_INFO_REQUESTED && + result != PARAM_ENGINES_REQUESTED) { + const char *reason = param2text(result); + + if(orig_opt && !curlx_strequal(":", orig_opt)) + helpf(config->errors, "option %s: %s\n", orig_opt, reason); + else + helpf(config->errors, "%s\n", reason); + } + + return result; +} diff --git a/src/tool_getparam.h b/src/tool_getparam.h index a86bfce..ef4366b 100644 --- a/src/tool_getparam.h +++ b/src/tool_getparam.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -30,20 +30,24 @@ typedef enum { PARAM_REQUIRES_PARAMETER, PARAM_BAD_USE, PARAM_HELP_REQUESTED, + PARAM_MANUAL_REQUESTED, + PARAM_VERSION_INFO_REQUESTED, + PARAM_ENGINES_REQUESTED, PARAM_GOT_EXTRA_PARAMETER, PARAM_BAD_NUMERIC, PARAM_NEGATIVE_NUMERIC, PARAM_LIBCURL_DOESNT_SUPPORT, PARAM_NO_MEM, + PARAM_NEXT_OPERATION, PARAM_LAST } ParameterError; -struct Configurable; +struct GlobalConfig; +struct OperationConfig; -ParameterError getparameter(char *flag, - char *nextarg, - bool *usedarg, - struct Configurable *config); +ParameterError getparameter(char *flag, char *nextarg, bool *usedarg, + struct GlobalConfig *global, + struct OperationConfig *operation); #ifdef UNITTESTS void parse_cert_parameter(const char *cert_parameter, @@ -51,5 +55,8 @@ void parse_cert_parameter(const char *cert_parameter, char **passphrase); #endif +ParameterError parse_args(struct GlobalConfig *config, int argc, + argv_item_t argv[]); + #endif /* HEADER_CURL_TOOL_GETPARAM_H */ diff --git a/src/tool_getpass.c b/src/tool_getpass.c index 0ac7dcb..4c8dcb9 100644 --- a/src/tool_getpass.c +++ b/src/tool_getpass.c @@ -117,7 +117,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) if(buffer[i] == '\b') /* remove this letter and if this is not the first key, remove the previous one as well */ - i = i - (i >= 1) ? 2 : 1; + i = i - (i >= 1 ? 2 : 1); } #ifndef __SYMBIAN32__ /* since echo is disabled, print a newline */ diff --git a/src/tool_help.c b/src/tool_help.c index 64534ac..424a2fa 100644 --- a/src/tool_help.c +++ b/src/tool_help.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,6 +23,8 @@ #include "tool_panykey.h" #include "tool_help.h" +#include "tool_libinfo.h" +#include "tool_version.h" #include "memdebug.h" /* keep this as LAST include */ @@ -49,15 +51,15 @@ static const char *const helptext[] = { " --basic Use HTTP Basic Authentication (H)", " --cacert FILE CA certificate to verify peer against (SSL)", " --capath DIR CA directory to verify peer against (SSL)", - " -E, --cert CERT[:PASSWD] Client certificate file and password (SSL)", - " --cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)", + " -E, --cert CERT[:PASSWD] Client certificate file and password (SSL)", + " --cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)", " --ciphers LIST SSL ciphers to use (SSL)", " --compressed Request compressed response (using deflate or gzip)", - " -K, --config FILE Specify which config file to read", + " -K, --config FILE Read config from FILE", " --connect-timeout SECONDS Maximum time allowed for connection", - " -C, --continue-at OFFSET Resumed transfer offset", - " -b, --cookie STRING/FILE String or file to read cookies from (H)", - " -c, --cookie-jar FILE Write cookies to this file after operation (H)", + " -C, --continue-at OFFSET Resumed transfer OFFSET", + " -b, --cookie STRING/FILE Read cookies from STRING/FILE (H)", + " -c, --cookie-jar FILE Write cookies to FILE after operation (H)", " --create-dirs Create necessary local directory hierarchy", " --crlf Convert LF to CRLF in upload", " --crlfile FILE Get a CRL list in PEM format from the given file", @@ -65,13 +67,17 @@ static const char *const helptext[] = { " --data-ascii DATA HTTP POST ASCII data (H)", " --data-binary DATA HTTP POST binary data (H)", " --data-urlencode DATA HTTP POST data url encoded (H)", - " --delegation STRING GSS-API delegation permission", + " --delegation STRING GSS-API delegation permission", " --digest Use HTTP Digest Authentication (H)", " --disable-eprt Inhibit using EPRT or LPRT (F)", " --disable-epsv Inhibit using EPSV (F)", - " -D, --dump-header FILE Write the headers to this file", + " --dns-servers DNS server addrs to use: 1.1.1.1;2.2.2.2", + " --dns-interface Interface to use for DNS requests", + " --dns-ipv4-addr IPv4 address to use for DNS requests, dot notation", + " --dns-ipv6-addr IPv6 address to use for DNS requests, dot notation", + " -D, --dump-header FILE Write the headers to FILE", " --egd-file FILE EGD socket path for random data (SSL)", - " --engine ENGINE Crypto engine (SSL). \"--engine list\" for list", + " --engine ENGINE Crypto engine (use \"--engine list\" for list) (SSL)", #ifdef USE_ENVIRONMENT " --environment Write results to environment variables (RISC OS)", #endif @@ -82,61 +88,72 @@ static const char *const helptext[] = { " --ftp-alternative-to-user COMMAND " "String to replace \"USER [name]\" (F)", " --ftp-create-dirs Create the remote dirs if not present (F)", - " --ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)", + " --ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)", " --ftp-pasv Use PASV/EPSV instead of PORT (F)", " -P, --ftp-port ADR Use PORT with given address instead of PASV (F)", - " --ftp-skip-pasv-ip Skip the IP address for PASV (F)\n" + " --ftp-skip-pasv-ip Skip the IP address for PASV (F)\n" " --ftp-pret Send PRET before PASV (for drftpd) (F)", " --ftp-ssl-ccc Send CCC after authenticating (F)", " --ftp-ssl-ccc-mode ACTIVE/PASSIVE Set CCC mode (F)", - " --ftp-ssl-control Require SSL/TLS for ftp login, " + " --ftp-ssl-control Require SSL/TLS for FTP login, " "clear for transfer (F)", " -G, --get Send the -d data with a HTTP GET (H)", " -g, --globoff Disable URL sequences and ranges using {} and []", - " -H, --header LINE Custom header to pass to server (H)", + " -H, --header LINE Pass custom header LINE to server (H)", " -I, --head Show document info only", " -h, --help This help text", " --hostpubmd5 MD5 " - "Hex encoded MD5 string of the host public key. (SSH)", + "Hex-encoded MD5 string of the host public key. (SSH)", " -0, --http1.0 Use HTTP 1.0 (H)", + " --http1.1 Use HTTP 1.1 (H)", + " --http2 Use HTTP 2 (H)", " --ignore-content-length Ignore the HTTP Content-Length header", " -i, --include Include protocol headers in the output (H/F)", " -k, --insecure Allow connections to SSL sites without certs (H)", - " --interface INTERFACE Specify network interface/address to use", + " --interface INTERFACE Use network INTERFACE (or address)", " -4, --ipv4 Resolve name to IPv4 address", " -6, --ipv6 Resolve name to IPv6 address", - " -j, --junk-session-cookies Ignore session cookies read from file (H)", - " --keepalive-time SECONDS Interval between keepalive probes", + " -j, --junk-session-cookies Ignore session cookies read from file (H)", + " --keepalive-time SECONDS Wait SECONDS between keepalive probes", " --key KEY Private key file name (SSL/SSH)", - " --key-type TYPE Private key file type (DER/PEM/ENG) (SSL)", - " --krb LEVEL Enable Kerberos with specified security level (F)", + " --key-type TYPE Private key file type (DER/PEM/ENG) (SSL)", + " --krb LEVEL Enable Kerberos with security LEVEL (F)", #ifndef CURL_DISABLE_LIBCURL_OPTION " --libcurl FILE Dump libcurl equivalent code of this command line", #endif - " --limit-rate RATE Limit transfer speed to this rate", - " -l, --list-only List only names of an FTP directory (F)", - " --local-port RANGE Force use of these local port numbers", + " --limit-rate RATE Limit transfer speed to RATE", + " -l, --list-only List only mode (F/POP3)", + " --local-port RANGE Force use of RANGE for local port numbers", " -L, --location Follow redirects (H)", - " --location-trusted like --location and send auth to other hosts (H)", + " --location-trusted " + "Like '--location', and send auth to other hosts (H)", + " --login-options OPTIONS Server login options (IMAP, POP3, SMTP)", " -M, --manual Display the full manual", - " --mail-from FROM Mail from this address", - " --mail-rcpt TO Mail to this receiver(s)", - " --mail-auth AUTH Originator address of the original email", + " --mail-from FROM Mail from this address (SMTP)", + " --mail-rcpt TO Mail to this/these addresses (SMTP)", + " --mail-auth AUTH Originator address of the original email (SMTP)", " --max-filesize BYTES Maximum file size to download (H/F)", " --max-redirs NUM Maximum number of redirects allowed (H)", " -m, --max-time SECONDS Maximum time allowed for the transfer", " --metalink Process given URLs as metalink XML file", - " --negotiate Use HTTP Negotiate Authentication (H)", + " --negotiate Use HTTP Negotiate (SPNEGO) authentication (H)", " -n, --netrc Must read .netrc for user name and password", - " --netrc-optional Use either .netrc or URL; overrides -n", - " --netrc-file FILE Set up the netrc filename to use", + " --netrc-optional Use either .netrc or URL; overrides -n", + " --netrc-file FILE Specify FILE for netrc", + " -: --next " + "Allows the following URL to use a separate set of options", + " --no-alpn Disable the ALPN TLS extension (H)", " -N, --no-buffer Disable buffering of the output stream", " --no-keepalive Disable keepalive use on the connection", + " --no-npn Disable the NPN TLS extension (H)", " --no-sessionid Disable SSL session-ID reusing (SSL)", " --noproxy List of hosts which do not use proxy", " --ntlm Use HTTP NTLM authentication (H)", - " -o, --output FILE Write output to instead of stdout", + " --oauth2-bearer TOKEN OAuth 2 Bearer Token (IMAP, POP3, SMTP)", + " -o, --output FILE Write to FILE instead of stdout", " --pass PASS Pass phrase for the private key (SSL/SSH)", + " --pinnedpubkey FILE Public key (PEM/DER) to verify peer against " + "(OpenSSL/GnuTLS/GSKit only)", " --post301 " "Do not switch to GET after following a 301 redirect (H)", " --post302 " @@ -144,14 +161,14 @@ static const char *const helptext[] = { " --post303 " "Do not switch to GET after following a 303 redirect (H)", " -#, --progress-bar Display transfer progress as a progress bar", - " --proto PROTOCOLS Enable/disable specified protocols", - " --proto-redir PROTOCOLS " - "Enable/disable specified protocols on redirect", - " -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port", - " --proxy-anyauth Pick \"any\" proxy authentication method (H)", + " --proto PROTOCOLS Enable/disable PROTOCOLS", + " --proto-redir PROTOCOLS Enable/disable PROTOCOLS on redirect", + " -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port", + " --proxy-anyauth Pick \"any\" proxy authentication method (H)", " --proxy-basic Use Basic authentication on the proxy (H)", " --proxy-digest Use Digest authentication on the proxy (H)", - " --proxy-negotiate Use Negotiate authentication on the proxy (H)", + " --proxy-negotiate " + "Use HTTP Negotiate (SPNEGO) authentication on the proxy (H)", " --proxy-ntlm Use NTLM authentication on the proxy (H)", " -U, --proxy-user USER[:PASSWORD] Proxy user and password", " --proxy1.0 HOST[:PORT] Use HTTP/1.0 proxy on given port", @@ -159,50 +176,52 @@ static const char *const helptext[] = { " --pubkey KEY Public key file name (SSH)", " -Q, --quote CMD Send command(s) to server before transfer (F/SFTP)", " --random-file FILE File for reading random data from (SSL)", - " -r, --range RANGE Retrieve only the bytes within a range", - " --raw Do HTTP \"raw\", without any transfer decoding (H)", + " -r, --range RANGE Retrieve only the bytes within RANGE", + " --raw Do HTTP \"raw\"; no transfer decoding (H)", " -e, --referer Referer URL (H)", - " -J, --remote-header-name Use the header-provided filename (H)", + " -J, --remote-header-name Use the header-provided filename (H)", " -O, --remote-name Write output to a file named as the remote file", - " --remote-name-all Use the remote file name for all URLs", + " --remote-name-all Use the remote file name for all URLs", " -R, --remote-time Set the remote file's time on the local output", " -X, --request COMMAND Specify request command to use", " --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS", " --retry NUM " "Retry request NUM times if transient problems occur", - " --retry-delay SECONDS " - "When retrying, wait this many seconds between each", + " --retry-delay SECONDS Wait SECONDS between retries", " --retry-max-time SECONDS Retry only within this period", - " --sasl-ir Enable initial response in SASL authentication" + " --sasl-ir Enable initial response in SASL authentication", " -S, --show-error " "Show error. With -s, make curl show errors when they occur", - " -s, --silent Silent mode. Don't output anything", + " -s, --silent Silent mode (don't output anything)", " --socks4 HOST[:PORT] SOCKS4 proxy on given host + port", " --socks4a HOST[:PORT] SOCKS4a proxy on given host + port", " --socks5 HOST[:PORT] SOCKS5 proxy on given host + port", - " --socks5-hostname HOST[:PORT] " + " --socks5-hostname HOST[:PORT] " "SOCKS5 proxy, pass host name to proxy", #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - " --socks5-gssapi-service NAME SOCKS5 proxy service name for gssapi", + " --socks5-gssapi-service NAME SOCKS5 proxy service name for GSS-API", " --socks5-gssapi-nec Compatibility with NEC SOCKS5 server", #endif " -Y, --speed-limit RATE " - "Stop transfers below speed-limit for 'speed-time' secs", + "Stop transfers below RATE for 'speed-time' secs", " -y, --speed-time SECONDS " - "Time for trig speed-limit abort. Defaults to 30", + "Trigger 'speed-limit' abort after SECONDS (default: 30)", " --ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)", " --ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)", " -2, --sslv2 Use SSLv2 (SSL)", " -3, --sslv3 Use SSLv3 (SSL)", - " --ssl-allow-beast Allow security flaw to improve interop (SSL)", - " --stderr FILE Where to redirect stderr. - means stdout", + " --ssl-allow-beast Allow security flaw to improve interop (SSL)", + " --stderr FILE Where to redirect stderr (use \"-\" for stdout)", " --tcp-nodelay Use the TCP_NODELAY option", " -t, --telnet-option OPT=VAL Set telnet option", " --tftp-blksize VALUE Set TFTP BLKSIZE option (must be >512)", " -z, --time-cond TIME Transfer based on a time condition", - " -1, --tlsv1 Use TLSv1 (SSL)", - " --trace FILE Write a debug trace to the given file", - " --trace-ascii FILE Like --trace but without the hex output", + " -1, --tlsv1 Use => TLSv1 (SSL)", + " --tlsv1.0 Use TLSv1.0 (SSL)", + " --tlsv1.1 Use TLSv1.1 (SSL)", + " --tlsv1.2 Use TLSv1.2 (SSL)", + " --trace FILE Write a debug trace to FILE", + " --trace-ascii FILE Like --trace, but without hex output", " --trace-time Add time stamps to trace/verbose output", " --tr-encoding Request compressed transfer encoding (H)", " -T, --upload-file FILE Transfer FILE to destination", @@ -210,17 +229,18 @@ static const char *const helptext[] = { " -B, --use-ascii Use ASCII/text transfer", " -u, --user USER[:PASSWORD] Server user and password", " --tlsuser USER TLS username", - " --tlspassword STRING TLS password", - " --tlsauthtype STRING TLS authentication type (default SRP)", - " -A, --user-agent STRING User-Agent to send to server (H)", + " --tlspassword STRING TLS password", + " --tlsauthtype STRING TLS authentication type (default: SRP)", + " --unix-socket FILE Connect through this Unix domain socket", + " -A, --user-agent STRING Send User-Agent STRING to server (H)", " -v, --verbose Make the operation more talkative", " -V, --version Show version number and quit", #ifdef USE_WATT32 " --wdebug Turn on Watt-32 debugging", #endif - " -w, --write-out FORMAT What to output after completion", - " --xattr Store metadata in extended file attributes", - " -q If used as the first parameter disables .curlrc", + " -w, --write-out FORMAT Use output FORMAT after completion", + " --xattr Store metadata in extended file attributes", + " -q Disable .curlrc (must be first parameter)", NULL }; @@ -232,6 +252,32 @@ static const char *const helptext[] = { # define PRINT_LINES_PAUSE 16 #endif +struct feat { + const char *name; + int bitmask; +}; + +static const struct feat feats[] = { + {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, + {"Debug", CURL_VERSION_DEBUG}, + {"TrackMemory", CURL_VERSION_CURLDEBUG}, + {"IDN", CURL_VERSION_IDN}, + {"IPv6", CURL_VERSION_IPV6}, + {"Largefile", CURL_VERSION_LARGEFILE}, + {"SSPI", CURL_VERSION_SSPI}, + {"GSS-API", CURL_VERSION_GSSAPI}, + {"Kerberos", CURL_VERSION_KERBEROS5}, + {"SPNEGO", CURL_VERSION_SPNEGO}, + {"NTLM", CURL_VERSION_NTLM}, + {"NTLM_WB", CURL_VERSION_NTLM_WB}, + {"SSL", CURL_VERSION_SSL}, + {"libz", CURL_VERSION_LIBZ}, + {"CharConv", CURL_VERSION_CONV}, + {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, + {"HTTP2", CURL_VERSION_HTTP2}, + {"UnixSockets", CURL_VERSION_UNIX_SOCKETS}, +}; + void tool_help(void) { int i; @@ -244,3 +290,48 @@ void tool_help(void) } } +void tool_version_info(void) +{ + const char *const *proto; + + printf(CURL_ID "%s\n", curl_version()); + if(curlinfo->protocols) { + printf("Protocols: "); + for(proto = curlinfo->protocols; *proto; ++proto) { + printf("%s ", *proto); + } + puts(""); /* newline */ + } + if(curlinfo->features) { + unsigned int i; + printf("Features: "); + for(i = 0; i < sizeof(feats)/sizeof(feats[0]); i++) { + if(curlinfo->features & feats[i].bitmask) + printf("%s ", feats[i].name); + } +#ifdef USE_METALINK + printf("Metalink "); +#endif + puts(""); /* newline */ + } +} + +void tool_list_engines(CURL *curl) +{ + struct curl_slist *engines = NULL; + + /* Get the list of engines */ + curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines); + + puts("Build-time engines:"); + if(engines) { + for(; engines; engines = engines->next) + printf(" %s\n", engines->data); + } + else { + puts(" "); + } + + /* Cleanup the list of engines */ + curl_slist_free_all(engines); +} diff --git a/src/tool_help.h b/src/tool_help.h index 1b757dc..9ef5006 100644 --- a/src/tool_help.h +++ b/src/tool_help.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -24,6 +24,8 @@ #include "tool_setup.h" void tool_help(void); +void tool_list_engines(CURL *curl); +void tool_version_info(void); #endif /* HEADER_CURL_TOOL_HELP_H */ diff --git a/src/tool_helpers.c b/src/tool_helpers.c index ae8aaaf..dbf32f8 100644 --- a/src/tool_helpers.c +++ b/src/tool_helpers.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -65,7 +65,7 @@ const char *param2text(int res) } } -int SetHTTPrequest(struct Configurable *config, HttpReq req, HttpReq *store) +int SetHTTPrequest(struct OperationConfig *config, HttpReq req, HttpReq *store) { if((*store == HTTPREQ_UNSPEC) || (*store == req)) { @@ -75,4 +75,3 @@ int SetHTTPrequest(struct Configurable *config, HttpReq req, HttpReq *store) warnf(config, "You can only select one HTTP request!\n"); return 1; } - diff --git a/src/tool_helpers.h b/src/tool_helpers.h index c0bcd89..73bcfc7 100644 --- a/src/tool_helpers.h +++ b/src/tool_helpers.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -25,7 +25,8 @@ const char *param2text(int res); -int SetHTTPrequest(struct Configurable *config, HttpReq req, HttpReq *store); +int SetHTTPrequest(struct OperationConfig *config, HttpReq req, + HttpReq *store); #endif /* HEADER_CURL_TOOL_HELPERS_H */ diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c index 4ef2f48..3010880 100644 --- a/src/tool_hugehelp.c +++ b/src/tool_hugehelp.c @@ -2,7 +2,7 @@ #ifndef HAVE_LIBZ /* * NEVER EVER edit this manually, fix the mkhelp.pl script instead! - * Generation time: Mon Aug 5 13:11:08 2013 + * Generation time: Sun Dec 28 14:36:38 2014 */ #ifdef USE_MANUAL #include "tool_hugehelp.h" @@ -26,9 +26,9 @@ void hugehelp(void) " supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP,\n" , stdout); fputs( -" IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS,\n" -" TELNET and TFTP). The command is designed to work without user inter-\n" -" action.\n" +" IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS,\n" +" SMTP, SMTPS, TELNET and TFTP). The command is designed to work without\n" +" user interaction.\n" "\n" " curl offers a busload of useful tricks like proxy support, user authen-\n" " tication, FTP upload, HTTP post, SSL connections, cookies, file trans-\n" @@ -47,20 +47,22 @@ void hugehelp(void) " You can specify multiple URLs or parts of URLs by writing part sets\n" " within braces as in:\n" "\n" -" http://site.{one,two,three}.com\n" +" http://site.{one,two,three}.com\n" "\n" " or you can get sequences of alphanumeric series by using [] as in:\n" "\n" -" ftp://ftp.numericals.com/file[1-100].txt\n" +" ftp://ftp.numericals.com/file[1-100].txt\n" +"\n" , stdout); fputs( -" ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)\n" -" ftp://ftp.letters.com/file[a-z].txt\n" +" ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)\n" +"\n" +" ftp://ftp.letters.com/file[a-z].txt\n" "\n" " Nested sequences are not supported, but you can use several ones next\n" " to each other:\n" "\n" -" http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html\n" +" http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html\n" "\n" " You can specify any amount of URLs on the command line. They will be\n" " fetched in a sequential manner in the specified order.\n" @@ -70,26 +72,39 @@ void hugehelp(void) " You can specify a step counter for the ranges to get every Nth number\n" " or letter:\n" "\n" -" http://www.numericals.com/file[1-100:10].txt\n" -" http://www.letters.com/file[a-z:2].txt\n" +" http://www.numericals.com/file[1-100:10].txt\n" +"\n" +" http://www.letters.com/file[a-z:2].txt\n" +"\n" +" When using [] or {} sequences when invoked from a command line prompt,\n" +" you probably have to put the full URL within double quotes to avoid the\n" +" shell from interfering with it. This also goes for other characters\n" +" treated special, like for example '&', '?' and '*'.\n" +"\n" +, stdout); + fputs( +" Provide the IPv6 zone index in the URL with an escaped percentage sign\n" +" and the interface name. Like in\n" +"\n" +" http://[fe80::3%25eth0]/\n" "\n" " If you specify URL without protocol:// prefix, curl will attempt to\n" " guess what protocol you might want. It will then default to HTTP but\n" " try other protocols based on often-used host name prefixes. For exam-\n" -, stdout); - fputs( " ple, for host names starting with \"ftp.\" curl will assume you want to\n" " speak FTP.\n" "\n" +, stdout); + fputs( " curl will do its best to use what you pass to it as a URL. It is not\n" " trying to validate it as a syntactically correct URL by any means but\n" " is instead very liberal with what it accepts.\n" "\n" " curl will attempt to re-use connections for multiple file transfers, so\n" " that getting many files from the same server will not do multiple con-\n" +" nects / handshakes. This improves speed. Of course this is only done on\n" , stdout); fputs( -" nects / handshakes. This improves speed. Of course this is only done on\n" " files specified on a single command line and cannot be used between\n" " separate curl invokes.\n" "\n" @@ -99,9 +114,9 @@ void hugehelp(void) " left, etc.\n" "\n" " curl displays this data to the terminal by default, so if you invoke\n" +" curl to do an operation and it is about to write data to the terminal,\n" , stdout); fputs( -" curl to do an operation and it is about to write data to the terminal,\n" " it disables the progress meter as otherwise it would mess up the output\n" " mixing progress meter and response data.\n" "\n" @@ -110,19 +125,33 @@ void hugehelp(void) " [file] or similar.\n" "\n" " It is not the same case for FTP upload as that operation does not spit\n" -, stdout); - fputs( " out any response data to the terminal.\n" "\n" +, stdout); + fputs( " If you prefer a progress \"bar\" instead of the regular meter, -# is your\n" " friend.\n" "OPTIONS\n" +" Options start with one or two dashes. Many of the options require an\n" +" additional value next to them.\n" +"\n" +" The short \"single-dash\" form of the options, -d for example, may be\n" +" used with or without a space between it and its value, although a space\n" +" is a recommended separator. The long \"double-dash\" form, --data for\n" +, stdout); + fputs( +" example, requires a space between it and its value.\n" +"\n" +" Short version options that don't need any additional values can be used\n" +" immediately next to each other, like for example you can specify all\n" +" the options -O, -L and -v at once as -OLv.\n" +"\n" " In general, all boolean options are enabled with --option and yet again\n" " disabled with --no-option. That is, you use the exact same option name\n" -" but prefix it with \"no-\". However, in this list we mostly only list and\n" -" show the --option version of them. (This concept with --no options was\n" , stdout); fputs( +" but prefix it with \"no-\". However, in this list we mostly only list and\n" +" show the --option version of them. (This concept with --no options was\n" " added in 7.19.0. Previously most options were toggled on/off on\n" " repeated use of the same command line option.)\n" "\n" @@ -130,170 +159,213 @@ void hugehelp(void) " Make curl display progress as a simple progress bar instead of\n" " the standard, more informational, meter.\n" "\n" +" -:, --next\n" +, stdout); + fputs( +" Tells curl to use a separate operation for the following URL and\n" +" associated options. This allows you to send several URL\n" +" requests, each with their own specific options, for example,\n" +" such as different user names or custom requests for each. (Added\n" +" in 7.36.0)\n" +"\n" " -0, --http1.0\n" -" (HTTP) Forces curl to issue its requests using HTTP 1.0 instead\n" -" of using its internally preferred: HTTP 1.1.\n" +" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n" +" internally preferred: HTTP 1.1.\n" "\n" -" -1, --tlsv1\n" , stdout); fputs( -" (SSL) Forces curl to use TLS version 1 when negotiating with a\n" -" remote TLS server.\n" +" --http1.1\n" +" (HTTP) Tells curl to use HTTP version 1.1. This is the internal\n" +" default version. (Added in 7.33.0)\n" +"\n" +" --http2\n" +" (HTTP) Tells curl to issue its requests using HTTP 2. This\n" +" requires that the underlying libcurl was built to support it.\n" +" (Added in 7.33.0)\n" +"\n" +" --no-npn\n" +" Disable the NPN TLS extension. NPN is enabled by default if\n" +, stdout); + fputs( +" libcurl was built with an SSL library that supports NPN. NPN is\n" +" used by a libcurl that supports HTTP 2 to negotiate HTTP 2 sup-\n" +" port with the server during https sessions.\n" +"\n" +" (Added in 7.36.0)\n" +"\n" +" --no-alpn\n" +" Disable the ALPN TLS extension. ALPN is enabled by default if\n" +" libcurl was built with an SSL library that supports ALPN. ALPN\n" +, stdout); + fputs( +" is used by a libcurl that supports HTTP 2 to negotiate HTTP 2\n" +" support with the server during https sessions.\n" +"\n" +" (Added in 7.36.0)\n" +"\n" +" -1, --tlsv1\n" +" (SSL) Forces curl to use TLS version 1.x when negotiating with a\n" +" remote TLS server. You can use options --tlsv1.0, --tlsv1.1,\n" +" and --tlsv1.2 to control the TLS version more precisely (if the\n" +" SSL backend in use supports such a level of control).\n" "\n" +, stdout); + fputs( " -2, --sslv2\n" -" (SSL) Forces curl to use SSL version 2 when negotiating with a\n" -" remote SSL server.\n" +" (SSL) Forces curl to use SSL version 2 when negotiating with a\n" +" remote SSL server. Sometimes curl is built without SSLv2 sup-\n" +" port. SSLv2 is widely considered insecure.\n" "\n" " -3, --sslv3\n" " (SSL) Forces curl to use SSL version 3 when negotiating with a\n" -" remote SSL server.\n" +" remote SSL server. Sometimes curl is built without SSLv3 sup-\n" +" port.\n" "\n" " -4, --ipv4\n" -" If curl is capable of resolving an address to multiple IP ver-\n" , stdout); fputs( -" sions (which it is if it is IPv6-capable), this option tells\n" -" curl to resolve names to IPv4 addresses only.\n" +" This option tells curl to resolve names to IPv4 addresses only,\n" +" and not for example try IPv6.\n" "\n" " -6, --ipv6\n" -" If curl is capable of resolving an address to multiple IP ver-\n" -" sions (which it is if it is IPv6-capable), this option tells\n" -" curl to resolve names to IPv6 addresses only.\n" +" This option tells curl to resolve names to IPv6 addresses only,\n" +" and not for example try IPv4.\n" "\n" " -a, --append\n" -" (FTP/SFTP) When used in an upload, this will tell curl to append\n" +" (FTP/SFTP) When used in an upload, this makes curl append to the\n" +" target file instead of overwriting it. If the remote file\n" , stdout); fputs( -" to the target file instead of overwriting it. If the file\n" -" doesn't exist, it will be created. Note that this flag is\n" -" ignored by some SSH servers (including OpenSSH).\n" +" doesn't exist, it will be created. Note that this flag is\n" +" ignored by some SFTP servers (including OpenSSH).\n" "\n" " -A, --user-agent \n" " (HTTP) Specify the User-Agent string to send to the HTTP server.\n" -" Some badly done CGIs fail if this field isn't set to\n" -" \"Mozilla/4.0\". To encode blanks in the string, surround the\n" +" Some badly done CGIs fail if this field isn't set to\n" +" \"Mozilla/4.0\". To encode blanks in the string, surround the\n" +" string with single quote marks. This can also be set with the\n" , stdout); fputs( -" string with single quote marks. This can also be set with the\n" " -H, --header option of course.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --anyauth\n" " (HTTP) Tells curl to figure out authentication method by itself,\n" -" and use the most secure one the remote site claims to support.\n" +" and use the most secure one the remote site claims to support.\n" " This is done by first doing a request and checking the response-\n" +" headers, thus possibly inducing an extra network round-trip.\n" , stdout); fputs( -" headers, thus possibly inducing an extra network round-trip.\n" -" This is used instead of setting a specific authentication\n" -" method, which you can do with --basic, --digest, --ntlm, and\n" +" This is used instead of setting a specific authentication\n" +" method, which you can do with --basic, --digest, --ntlm, and\n" " --negotiate.\n" "\n" -" Note that using --anyauth is not recommended if you do uploads\n" -" from stdin, since it may require data to be sent twice and then\n" -, stdout); - fputs( +" Note that using --anyauth is not recommended if you do uploads\n" +" from stdin, since it may require data to be sent twice and then\n" " the client must be able to rewind. If the need should arise when\n" " uploading from stdin, the upload operation will fail.\n" "\n" +, stdout); + fputs( " -b, --cookie \n" -" (HTTP) Pass the data to the HTTP server as a cookie. It is sup-\n" -" posedly the data previously received from the server in a \"Set-\n" -" Cookie:\" line. The data should be in the format \"NAME1=VALUE1;\n" +" (HTTP) Pass the data to the HTTP server as a cookie. It is sup-\n" +" posedly the data previously received from the server in a \"Set-\n" +" Cookie:\" line. The data should be in the format \"NAME1=VALUE1;\n" " NAME2=VALUE2\".\n" "\n" +" If no '=' symbol is used in the line, it is treated as a file-\n" +" name to use to read previously stored cookie lines from, which\n" , stdout); fputs( -" If no '=' symbol is used in the line, it is treated as a file-\n" -" name to use to read previously stored cookie lines from, which\n" -" should be used in this session if they match. Using this method\n" -" also activates the \"cookie parser\" which will make curl record\n" +" should be used in this session if they match. Using this method\n" +" also activates the \"cookie parser\" which will make curl record\n" " incoming cookies too, which may be handy if you're using this in\n" -" combination with the -L, --location option. The file format of\n" -, stdout); - fputs( -" the file to read cookies from should be plain HTTP headers or\n" +" combination with the -L, --location option. The file format of\n" +" the file to read cookies from should be plain HTTP headers or\n" " the Netscape/Mozilla cookie file format.\n" "\n" -" NOTE that the file specified with -b, --cookie is only used as\n" -" input. No cookies will be stored in the file. To store cookies,\n" -" use the -c, --cookie-jar option or you could even save the HTTP\n" -" headers to a file using -D, --dump-header!\n" -"\n" , stdout); fputs( +" The file specified with -b, --cookie is only used as input. No\n" +" cookies will be written to the file. To store cookies, use the\n" +" -c, --cookie-jar option.\n" +"\n" " If this option is used several times, the last one will be used.\n" "\n" " -B, --use-ascii\n" " (FTP/LDAP) Enable ASCII transfer. For FTP, this can also be\n" " enforced by using an URL that ends with \";type=A\". This option\n" +, stdout); + fputs( " causes data sent to stdout to be in text mode for win32 systems.\n" "\n" " --basic\n" -" (HTTP) Tells curl to use HTTP Basic authentication. This is the\n" +" (HTTP) Tells curl to use HTTP Basic authentication with the\n" +" remote host. This is the default and this option is usually\n" +" pointless, unless you use it to override a previously set option\n" +" that sets a different authentication method (such as --ntlm,\n" +" --digest, or --negotiate).\n" +"\n" , stdout); fputs( -" default and this option is usually pointless, unless you use it\n" -" to override a previously set option that sets a different\n" -" authentication method (such as --ntlm, --digest, or --negoti-\n" -" ate).\n" +" Used together with -u, --user and -x, --proxy.\n" +"\n" +" See also --proxy-basic.\n" "\n" " -c, --cookie-jar \n" " (HTTP) Specify to which file you want curl to write all cookies\n" " after a completed operation. Curl writes all cookies previously\n" +" read from a specified file as well as all cookies received from\n" +" remote server(s). If no cookies are known, no data will be writ-\n" , stdout); fputs( -" read from a specified file as well as all cookies received from\n" -" remote server(s). If no cookies are known, no file will be writ-\n" " ten. The file will be written using the Netscape cookie file\n" " format. If you set the file name to a single dash, \"-\", the\n" " cookies will be written to stdout.\n" "\n" " This command line option will activate the cookie engine that\n" -, stdout); - fputs( " makes curl record and use cookies. Another way to activate it is\n" " to use the -b, --cookie option.\n" "\n" " If the cookie jar can't be created or written to, the whole curl\n" +, stdout); + fputs( " operation won't fail or even report an error clearly. Using -v\n" " will get a warning displayed, but that is the only visible feed-\n" " back you get about this possibly lethal situation.\n" "\n" -, stdout); - fputs( " If this option is used several times, the last specified file\n" " name will be used.\n" "\n" " -C, --continue-at \n" " Continue/Resume a previous file transfer at the given offset.\n" +, stdout); + fputs( " The given offset is the exact number of bytes that will be\n" " skipped, counting from the beginning of the source file before\n" " it is transferred to the destination. If used with uploads, the\n" -, stdout); - fputs( " FTP server command SIZE will not be used by curl.\n" "\n" " Use \"-C -\" to tell curl to automatically find out where/how to\n" " resume the transfer. It then uses the given output/input files\n" " to figure that out.\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " --ciphers \n" " (SSL) Specifies which ciphers to use in the connection. The list\n" -, stdout); - fputs( " of ciphers must specify valid ciphers. Read up on SSL cipher\n" " list details on this URL:\n" " http://www.openssl.org/docs/apps/ciphers.html\n" "\n" " NSS ciphers are done differently than OpenSSL and GnuTLS. The\n" -" full list of NSS ciphers is in the NSSCipherSuite entry at this\n" -" URL: http://git.fedora-\n" , stdout); fputs( +" full list of NSS ciphers is in the NSSCipherSuite entry at this\n" +" URL: http://git.fedora-\n" " hosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\n" "\n" " If this option is used several times, the last one will be used.\n" @@ -301,21 +373,21 @@ void hugehelp(void) " --compressed\n" " (HTTP) Request a compressed response using one of the algorithms\n" " curl supports, and save the uncompressed document. If this\n" +, stdout); + fputs( " option is used and the server sends an unsupported encoding,\n" " curl will report an error.\n" "\n" " --connect-timeout \n" -, stdout); - fputs( -" Maximum time in seconds that you allow the connection to the\n" -" server to take. This only limits the connection phase, once\n" -" curl has connected this option is of no more use. Since 7.32.0,\n" -" this option accepts decimal values, but the actual timeout will\n" -" decrease in accuracy as the specified timeout increases in deci-\n" -" mal precision. See also the -m, --max-time option.\n" +" Maximum time in seconds that you allow curl's connection to\n" +" take. This only limits the connection phase, so if curl con-\n" +" nects within the given period it will continue - if not it will\n" +" exit. Since version 7.32.0, this option accepts decimal values.\n" "\n" , stdout); fputs( +" See also the -m, --max-time option.\n" +"\n" " If this option is used several times, the last one will be used.\n" "\n" " --create-dirs\n" @@ -323,65 +395,67 @@ void hugehelp(void) " the necessary local directory hierarchy as needed. This option\n" " creates the dirs mentioned with the -o option, nothing else. If\n" " the -o file name uses no dir or if the dirs it mentions already\n" -" exist, no dir will be created.\n" -"\n" , stdout); fputs( +" exist, no dir will be created.\n" +"\n" " To create remote directories when using FTP or SFTP, try --ftp-\n" " create-dirs.\n" "\n" -" --crlf (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).\n" +" --crlf Convert LF to CRLF in upload. Useful for MVS (OS/390).\n" +"\n" +" (SMTP added in 7.40.0)\n" "\n" " --crlfile \n" " (HTTPS/FTPS) Provide a file using PEM format with a Certificate\n" " Revocation List that may specify peer certificates that are to\n" " be considered revoked.\n" "\n" -" If this option is used several times, the last one will be used.\n" -"\n" , stdout); fputs( +" If this option is used several times, the last one will be used.\n" +"\n" " (Added in 7.19.7)\n" " -d, --data \n" " (HTTP) Sends the specified data in a POST request to the HTTP\n" " server, in the same way that a browser does when a user has\n" " filled in an HTML form and presses the submit button. This will\n" " cause curl to pass the data to the server using the content-type\n" -" application/x-www-form-urlencoded. Compare to -F, --form.\n" -"\n" , stdout); fputs( +" application/x-www-form-urlencoded. Compare to -F, --form.\n" +"\n" " -d, --data is the same as --data-ascii. To post data purely\n" " binary, you should instead use the --data-binary option. To URL-\n" " encode the value of a form field you may use --data-urlencode.\n" "\n" " If any of these options is used more than once on the same com-\n" " mand line, the data pieces specified will be merged together\n" -" with a separating &-symbol. Thus, using '-d name=daniel -d\n" , stdout); fputs( +" with a separating &-symbol. Thus, using '-d name=daniel -d\n" " skill=lousy' would generate a post chunk that looks like\n" " 'name=daniel&skill=lousy'.\n" "\n" " If you start the data with the letter @, the rest should be a\n" " file name to read the data from, or - if you want curl to read\n" -" the data from stdin. The contents of the file must already be\n" -" URL-encoded. Multiple files can also be specified. Posting data\n" +" the data from stdin. Multiple files can also be specified. Post-\n" , stdout); fputs( -" from a file named 'foobar' would thus be done with --data @foo-\n" -" bar.\n" +" ing data from a file named 'foobar' would thus be done with\n" +" --data @foobar. When --data is told to read from a file like\n" +" that, carriage returns and newlines will be stripped out.\n" "\n" " -D, --dump-header \n" " Write the protocol headers to the specified file.\n" "\n" " This option is handy to use when you want to store the headers\n" " that an HTTP site sends to you. Cookies from the headers could\n" -" then be read in a second curl invocation by using the -b,\n" , stdout); fputs( -" --cookie option! The -c, --cookie-jar option is however a better\n" -" way to store cookies.\n" +" then be read in a second curl invocation by using the -b,\n" +" --cookie option! The -c, --cookie-jar option is a better way to\n" +" store cookies.\n" "\n" " When used in FTP, the FTP server response lines are considered\n" " being \"headers\" and thus are saved there.\n" @@ -392,32 +466,32 @@ void hugehelp(void) " See -d, --data.\n" "\n" " --data-binary \n" -" (HTTP) This posts data exactly as specified with no extra pro-\n" , stdout); fputs( +" (HTTP) This posts data exactly as specified with no extra pro-\n" " cessing whatsoever.\n" "\n" " If you start the data with the letter @, the rest should be a\n" " filename. Data is posted in a similar manner as --data-ascii\n" -" does, except that newlines are preserved and conversions are\n" -" never done.\n" +" does, except that newlines and carriage returns are preserved\n" +" and conversions are never done.\n" "\n" " If this option is used several times, the ones following the\n" +, stdout); + fputs( " first will append data as described in -d, --data.\n" "\n" " --data-urlencode \n" -, stdout); - fputs( " (HTTP) This posts data, similar to the other --data options with\n" " the exception that this performs URL-encoding. (Added in 7.18.0)\n" " To be CGI-compliant, the part should begin with a name\n" " followed by a separator and a content specification. The \n" " part can be passed to curl using one of the following syntaxes:\n" "\n" -" content\n" -" This will make curl URL-encode the content and pass that\n" , stdout); fputs( +" content\n" +" This will make curl URL-encode the content and pass that\n" " on. Just be careful so that the content doesn't contain\n" " any = or @ symbols, as that will then make the syntax\n" " match one of the other cases below!\n" @@ -426,9 +500,9 @@ void hugehelp(void) " This will make curl URL-encode the content and pass that\n" " on. The preceding = symbol is not included in the data.\n" "\n" -" name=content\n" , stdout); fputs( +" name=content\n" " This will make curl URL-encode the content part and pass\n" " that on. Note that the name part is expected to be URL-\n" " encoded already.\n" @@ -507,159 +581,228 @@ void hugehelp(void) " Disabling EPSV only changes the passive behavior. If you want to\n" " switch to active mode you need to use -P, --ftp-port.\n" "\n" -" -e, --referer \n" , stdout); fputs( -" (HTTP) Sends the \"Referer Page\" information to the HTTP server.\n" +" --dns-interface \n" +" Tell curl to send outgoing DNS requests through .\n" +" This option is a counterpart to --interface (which does not\n" +" affect DNS). The supplied string must be an interface name (not\n" +" an address).\n" +"\n" +" This option requires that libcurl was built with a resolver\n" +" backend that supports this operation. The c-ares backend is the\n" +, stdout); + fputs( +" only such one. (Added in 7.33.0)\n" +"\n" +" --dns-ipv4-addr \n" +" Tell curl to bind to when making IPv4 DNS requests,\n" +" so that the DNS requests originate from this address. The argu-\n" +" ment should be a single IPv4 address.\n" +"\n" +" This option requires that libcurl was built with a resolver\n" +" backend that supports this operation. The c-ares backend is the\n" +, stdout); + fputs( +" only such one. (Added in 7.33.0)\n" +"\n" +" --dns-ipv6-addr \n" +" Tell curl to bind to when making IPv6 DNS requests,\n" +" so that the DNS requests originate from this address. The argu-\n" +" ment should be a single IPv6 address.\n" +"\n" +" This option requires that libcurl was built with a resolver\n" +" backend that supports this operation. The c-ares backend is the\n" +, stdout); + fputs( +" only such one. (Added in 7.33.0)\n" +"\n" +" --dns-servers \n" +" Set the list of DNS servers to be used instead of the system\n" +" default. The list of IP addresses should be separated with com-\n" +" mas. Port numbers may also optionally be given as :\n" +" after each IP address.\n" +"\n" +" This option requires that libcurl was built with a resolver\n" +, stdout); + fputs( +" backend that supports this operation. The c-ares backend is the\n" +" only such one. (Added in 7.33.0)\n" +"\n" +" -e, --referer \n" +" (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n" " This can also be set with the -H, --header flag of course. When\n" " used with -L, --location you can append \";auto\" to the --referer\n" " URL to make curl automatically set the previous URL when it fol-\n" +, stdout); + fputs( " lows a Location: header. The \";auto\" string can be used alone,\n" " even if you don't set an initial --referer.\n" "\n" -, stdout); - fputs( " If this option is used several times, the last one will be used.\n" "\n" " -E, --cert \n" " (SSL) Tells curl to use the specified client certificate file\n" " when getting a file with HTTPS, FTPS or another SSL-based proto-\n" -" col. The certificate must be in PEM format. If the optional\n" -" password isn't specified, it will be queried for on the termi-\n" +" col. The certificate must be in PKCS#12 format if using Secure\n" , stdout); fputs( -" nal. Note that this option assumes a \"certificate\" file that is\n" -" the private key and the private certificate concatenated! See\n" -" --cert and --key to specify them independently.\n" +" Transport, or PEM format if using any other engine. If the\n" +" optional password isn't specified, it will be queried for on the\n" +" terminal. Note that this option assumes a \"certificate\" file\n" +" that is the private key and the private certificate concate-\n" +" nated! See --cert and --key to specify them independently.\n" "\n" -" If curl is built against the NSS SSL library then this option\n" -" can tell curl the nickname of the certificate to use within the\n" -" NSS database defined by the environment variable SSL_DIR (or by\n" +" If curl is built against the NSS SSL library then this option\n" , stdout); fputs( -" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n" -" nsspem.so) is available then PEM files may be loaded. If you\n" +" can tell curl the nickname of the certificate to use within the\n" +" NSS database defined by the environment variable SSL_DIR (or by\n" +" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n" +" nsspem.so) is available then PEM files may be loaded. If you\n" " want to use a file from the current directory, please precede it\n" -" with \"./\" prefix, in order to avoid confusion with a nickname.\n" -" If the nickname contains \":\", it needs to be preceded by \"\\\" so\n" -" that it is not recognized as password delimiter. If the nick-\n" +" with \"./\" prefix, in order to avoid confusion with a nickname.\n" , stdout); fputs( -" name contains \"\\\", it needs to be escaped as \"\\\\\" so that it is\n" +" If the nickname contains \":\", it needs to be preceded by \"\\\" so\n" +" that it is not recognized as password delimiter. If the nick-\n" +" name contains \"\\\", it needs to be escaped as \"\\\\\" so that it is\n" " not recognized as an escape character.\n" "\n" -" (iOS and Mac OS X only) If curl is built against Secure Trans-\n" -" port, then the certificate string must match the name of a cer-\n" -" tificate that's in the system or user keychain. The private key\n" -" corresponding to the certificate, and certificate chain (if\n" +" (iOS and Mac OS X only) If curl is built against Secure Trans-\n" +" port, then the certificate string can either be the name of a\n" , stdout); fputs( -" any), must also be present in the keychain.\n" +" certificate/private key in the system or user keychain, or the\n" +" path to a PKCS#12-encoded certificate and private key. If you\n" +" want to use a file from the current directory, please precede it\n" +" with \"./\" prefix, in order to avoid confusion with a nickname.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --engine \n" " Select the OpenSSL crypto engine to use for cipher operations.\n" +, stdout); + fputs( " Use --engine list to print a list of build-time supported\n" " engines. Note that not all (or none) of the engines may be\n" " available at run-time.\n" "\n" " --environment\n" -, stdout); - fputs( " (RISC OS ONLY) Sets a range of environment variables, using the\n" " names the -w option supports, to allow easier extraction of use-\n" " ful information after having run curl.\n" "\n" " --egd-file \n" +, stdout); + fputs( " (SSL) Specify the path name to the Entropy Gathering Daemon\n" " socket. The socket is used to seed the random engine for SSL\n" " connections. See also the --random-file option.\n" "\n" " --cert-type \n" -, stdout); - fputs( " (SSL) Tells curl what certificate type the provided certificate\n" " is in. PEM, DER and ENG are recognized types. If not specified,\n" " PEM is assumed.\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " --cacert \n" " (SSL) Tells curl to use the specified certificate file to verify\n" " the peer. The file may contain multiple CA certificates. The\n" -, stdout); - fputs( " certificate(s) must be in PEM format. Normally curl is built to\n" " use a default file for this, so this option is typically used to\n" " alter that default file.\n" "\n" +, stdout); + fputs( " curl recognizes the environment variable named 'CURL_CA_BUNDLE'\n" " if it is set, and uses the given path as a path to a CA cert\n" " bundle. This option overrides that variable.\n" "\n" " The windows version of curl will automatically look for a CA\n" -, stdout); - fputs( " certs file named 'curl-ca-bundle.crt', either in the same direc-\n" " tory as curl.exe, or in the Current Working Directory, or in any\n" " folder along your PATH.\n" "\n" +, stdout); + fputs( " If curl is built against the NSS SSL library, the NSS PEM\n" " PKCS#11 module (libnsspem.so) needs to be available for this\n" " option to work properly.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" -, stdout); - fputs( " --capath \n" " (SSL) Tells curl to use the specified certificate directory to\n" " verify the peer. Multiple paths can be provided by separating\n" +, stdout); + fputs( " them with \":\" (e.g. \"path1:path2:path3\"). The certificates must\n" " be in PEM format, and if curl is built against OpenSSL, the\n" " directory must have been processed using the c_rehash utility\n" -, stdout); - fputs( " supplied with OpenSSL. Using --capath can allow OpenSSL-powered\n" " curl to make SSL-connections much more efficiently than using\n" " --cacert if the --cacert file contains many CA certificates.\n" "\n" +, stdout); + fputs( " If this option is set, the default capath value will be ignored,\n" " and if it is used several times, the last one will be used.\n" "\n" -" -f, --fail\n" -" (HTTP) Fail silently (no output at all) on server errors. This\n" +" --pinnedpubkey \n" +" (SSL) Tells curl to use the specified public key file to verify\n" +" the peer. The file must contain a single public key in PEM or\n" +" DER format.\n" +"\n" +" When negotiating a TLS or SSL connection, the server sends a\n" , stdout); fputs( +" certificate indicating its identity. A public key is extracted\n" +" from this certificate and if it does not exactly match the pub-\n" +" lic key provided to this option, curl will abort the connection\n" +" before sending or receiving any data.\n" +"\n" +" This is currently only implemented in the OpenSSL, GnuTLS and\n" +" GSKit backends.\n" +"\n" +" If this option is used several times, the last one will be used.\n" +, stdout); + fputs( +" (Added in 7.39.0)\n" +"\n" +" -f, --fail\n" +" (HTTP) Fail silently (no output at all) on server errors. This\n" " is mostly done to better enable scripts etc to better deal with\n" " failed attempts. In normal cases when an HTTP server fails to\n" " deliver a document, it returns an HTML document stating so\n" " (which often also describes why and more). This flag will pre-\n" +, stdout); + fputs( " vent curl from outputting that and return error 22.\n" "\n" " This method is not fail-safe and there are occasions where non-\n" -, stdout); - fputs( " successful response codes will slip through, especially when\n" " authentication is involved (response codes 401 and 407).\n" "\n" " -F, --form \n" " (HTTP) This lets curl emulate a filled-in form in which a user\n" " has pressed the submit button. This causes curl to POST data\n" -" using the Content-Type multipart/form-data according to RFC\n" -" 2388. This enables uploading of binary files etc. To force the\n" , stdout); fputs( +" using the Content-Type multipart/form-data according to RFC\n" +" 2388. This enables uploading of binary files etc. To force the\n" " 'content' part to be a file, prefix the file name with an @\n" " sign. To just get the content part from a file, prefix the file\n" " name with the symbol <. The difference between @ and < is then\n" " that @ makes a file get attached in the post as a file upload,\n" +, stdout); + fputs( " while the < makes a text field and just get the contents for\n" " that text field from a file.\n" "\n" -, stdout); - fputs( " Example, to send your password file to the server, where 'pass-\n" " word' is the name of the form-field to which /etc/passwd will be\n" " the input:\n" @@ -667,11 +810,11 @@ void hugehelp(void) " curl -F password=@/etc/passwd www.mypasswords.com\n" "\n" " To read content from stdin instead of a file, use - as the file-\n" +, stdout); + fputs( " name. This goes for both @ and < constructs.\n" "\n" " You can also tell curl what Content-Type to use by using\n" -, stdout); - fputs( " 'type=', in a manner similar to:\n" "\n" " curl -F \"web=@index.html;type=text/html\" url.com\n" @@ -683,12 +826,12 @@ void hugehelp(void) " You can also explicitly change the name field of a file upload\n" " part by setting filename=, like this:\n" "\n" +, stdout); + fputs( " curl -F \"file=@localfile;filename=nameinpost\" url.com\n" "\n" " If filename/path contains ',' or ';', it must be quoted by dou-\n" " ble-quotes like:\n" -, stdout); - fputs( "\n" " curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" url.com\n" "\n" @@ -697,6 +840,8 @@ void hugehelp(void) " curl -F 'file=@\"localfile\";filename=\"nameinpost\"' url.com\n" "\n" " Note that if a filename/path is quoted by double-quotes, any\n" +, stdout); + fputs( " double-quote or backslash within the filename must be escaped by\n" " backslash.\n" "\n" @@ -705,145 +850,142 @@ void hugehelp(void) " This option can be used multiple times.\n" "\n" " --ftp-account [data]\n" -, stdout); - fputs( " (FTP) When an FTP server asks for \"account data\" after user name\n" " and password has been provided, this data is sent off using the\n" " ACCT command. (Added in 7.13.0)\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " --ftp-alternative-to-user \n" " (FTP) If authenticating with the USER and PASS commands fails,\n" " send this command. When connecting to Tumbleweed's Secure\n" -, stdout); - fputs( " Transport server over FTPS using a client certificate, using\n" " \"SITE AUTH\" will tell the server to retrieve the username from\n" " the certificate. (Added in 7.15.5)\n" "\n" +, stdout); + fputs( " --ftp-create-dirs\n" " (FTP/SFTP) When an FTP or SFTP URL/operation uses a path that\n" " doesn't currently exist on the server, the standard behavior of\n" " curl is to fail. Using this option, curl will instead attempt to\n" -, stdout); - fputs( " create missing directories.\n" "\n" " --ftp-method [method]\n" " (FTP) Control what method curl should use to reach a file on an\n" " FTP(S) server. The method argument should be one of the follow-\n" +, stdout); + fputs( " ing alternatives:\n" "\n" " multicwd\n" " curl does a single CWD operation for each path part in\n" " the given URL. For deep hierarchies this means very many\n" -, stdout); - fputs( " commands. This is how RFC 1738 says it should be done.\n" " This is the default but the slowest behavior.\n" "\n" " nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n" +, stdout); + fputs( " etc and give a full path to the server for all these com-\n" " mands. This is the fastest behavior.\n" "\n" " singlecwd\n" " curl does one CWD with the full target directory and then\n" -, stdout); - fputs( " operates on the file \"normally\" (like in the multicwd\n" " case). This is somewhat more standards compliant than\n" " 'nocwd' but without the full penalty of 'multicwd'.\n" " (Added in 7.15.1)\n" "\n" +, stdout); + fputs( " --ftp-pasv\n" " (FTP) Use passive mode for the data connection. Passive is the\n" " internal default behavior, but using this option can be used to\n" -, stdout); - fputs( " override a previous -P/-ftp-port option. (Added in 7.11.0)\n" "\n" " If this option is used several times, only the first one is\n" " used. Undoing an enforced passive really isn't doable but you\n" " must then instead enforce the correct -P, --ftp-port again.\n" "\n" +, stdout); + fputs( " Passive mode means that curl will try the EPSV command first and\n" " then PASV, unless --disable-epsv is used.\n" "\n" " --ftp-skip-pasv-ip\n" -, stdout); - fputs( " (FTP) Tell curl to not use the IP address the server suggests in\n" " its response to curl's PASV command when curl connects the data\n" " connection. Instead curl will re-use the same IP address it\n" " already uses for the control connection. (Added in 7.14.2)\n" "\n" +, stdout); + fputs( " This option has no effect if PORT, EPRT or EPSV is used instead\n" " of PASV.\n" "\n" " --ftp-pret\n" -, stdout); - fputs( " (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n" " Certain FTP servers, mainly drftpd, require this non-standard\n" " command for directory listings as well as up and downloads in\n" " PASV mode. (Added in 7.20.x)\n" "\n" " --ftp-ssl-ccc\n" -" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n" -" layer after authenticating. The rest of the control channel com-\n" , stdout); fputs( +" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n" +" layer after authenticating. The rest of the control channel com-\n" " munication will be unencrypted. This allows NAT routers to fol-\n" " low the FTP transaction. The default mode is passive. See --ftp-\n" " ssl-ccc-mode for other modes. (Added in 7.16.1)\n" "\n" " --ftp-ssl-ccc-mode [active/passive]\n" -" (FTP) Use CCC (Clear Command Channel) Sets the CCC mode. The\n" -" passive mode will not initiate the shutdown, but instead wait\n" , stdout); fputs( +" (FTP) Use CCC (Clear Command Channel) Sets the CCC mode. The\n" +" passive mode will not initiate the shutdown, but instead wait\n" " for the server to do it, and will not reply to the shutdown from\n" " the server. The active mode initiates the shutdown and waits for\n" " a reply from the server. (Added in 7.16.2)\n" "\n" " --ftp-ssl-control\n" " (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n" -" Allows secure authentication, but non-encrypted data transfers\n" -" for efficiency. Fails the transfer if the server doesn't sup-\n" , stdout); fputs( +" Allows secure authentication, but non-encrypted data transfers\n" +" for efficiency. Fails the transfer if the server doesn't sup-\n" " port SSL/TLS. (Added in 7.16.0) that can still be used but will\n" " be removed in a future version.\n" "\n" " --form-string \n" " (HTTP) Similar to --form except that the value string for the\n" " named parameter is used literally. Leading '@' and '<' charac-\n" -" ters, and the ';type=' string in the value have no special mean-\n" -" ing. Use this in preference to --form if there's any possibility\n" , stdout); fputs( +" ters, and the ';type=' string in the value have no special mean-\n" +" ing. Use this in preference to --form if there's any possibility\n" " that the string value may accidentally trigger the '@' or '<'\n" " features of --form.\n" "\n" " -g, --globoff\n" " This option switches off the \"URL globbing parser\". When you set\n" " this option, you can specify URLs that contain the letters {}[]\n" -" without having them being interpreted by curl itself. Note that\n" -" these letters are not normal legal URL contents but they should\n" , stdout); fputs( +" without having them being interpreted by curl itself. Note that\n" +" these letters are not normal legal URL contents but they should\n" " be encoded according to the URI standard.\n" "\n" " -G, --get\n" " When used, this option will make all data specified with -d,\n" -" --data or --data-binary to be used in an HTTP GET request\n" -" instead of the POST request that otherwise would be used. The\n" -" data will be appended to the URL with a '?' separator.\n" -"\n" -" If used in combination with -I, the POST data will instead be\n" +" --data, --data-binary or --data-urlencode to be used in an HTTP\n" +" GET request instead of the POST request that otherwise would be\n" , stdout); fputs( +" used. The data will be appended to the URL with a '?' separator.\n" +" If used in combination with -I, the POST data will instead be\n" " appended to the URL with a HEAD request.\n" "\n" " If this option is used several times, only the first one is\n" @@ -851,66 +993,75 @@ void hugehelp(void) " should then instead enforce the alternative method you prefer.\n" "\n" " -H, --header
    \n" -" (HTTP) Extra header to use when getting a web page. You may\n" -" specify any number of extra headers. Note that if you should add\n" , stdout); fputs( -" a custom header that has the same name as one of the internal\n" -" ones curl would use, your externally set header will be used\n" -" instead of the internal one. This allows you to make even trick-\n" -" ier stuff than curl would normally do. You should not replace\n" -" internally set headers without knowing perfectly well what\n" -" you're doing. Remove an internal header by giving a replacement\n" +" (HTTP) Extra header to include in the request when sending HTTP\n" +" to a server. You may specify any number of extra headers. Note\n" +" that if you should add a custom header that has the same name as\n" +" one of the internal ones curl would use, your externally set\n" +" header will be used instead of the internal one. This allows you\n" +" to make even trickier stuff than curl would normally do. You\n" , stdout); fputs( -" without content on the right side of the colon, as in: -H\n" -" \"Host:\". If you send the custom header with no-value then its\n" -" header must be terminated with a semicolon, such as -H \"X-Cus-\n" -" tom-Header;\" to send \"X-Custom-Header:\".\n" +" should not replace internally set headers without knowing per-\n" +" fectly well what you're doing. Remove an internal header by giv-\n" +" ing a replacement without content on the right side of the\n" +" colon, as in: -H \"Host:\". If you send the custom header with no-\n" +" value then its header must be terminated with a semicolon, such\n" +" as -H \"X-Custom-Header;\" to send \"X-Custom-Header:\".\n" "\n" -" curl will make sure that each header you add/replace is sent\n" -" with the proper end-of-line marker, you should thus not add that\n" , stdout); fputs( +" curl will make sure that each header you add/replace is sent\n" +" with the proper end-of-line marker, you should thus not add that\n" " as a part of the header content: do not add newlines or carriage\n" " returns, they will only mess things up for you.\n" "\n" " See also the -A, --user-agent and -e, --referer options.\n" "\n" -" This option can be used multiple times to add/replace/remove\n" +" Starting in 7.37.0, you need --proxy-header to send custom head-\n" +" ers intended for a proxy.\n" +"\n" +, stdout); + fputs( +" Example:\n" +"\n" +" # curl -H \"X-First-Name: Joe\" http://192.168.0.1/\n" +"\n" +" This option can be used multiple times to add/replace/remove\n" " multiple headers.\n" "\n" " --hostpubmd5 \n" -" (SCP/SFTP) Pass a string containing 32 hexadecimal digits. The\n" +" (SCP/SFTP) Pass a string containing 32 hexadecimal digits. The\n" +" string should be the 128 bit MD5 checksum of the remote host's\n" +" public key, curl will refuse the connection with the host unless\n" , stdout); fputs( -" string should be the 128 bit MD5 checksum of the remote host's\n" -" public key, curl will refuse the connection with the host unless\n" " the md5sums match. (Added in 7.17.1)\n" "\n" " --ignore-content-length\n" -" (HTTP) Ignore the Content-Length header. This is particularly\n" -" useful for servers running Apache 1.x, which will report incor-\n" +" (HTTP) Ignore the Content-Length header. This is particularly\n" +" useful for servers running Apache 1.x, which will report incor-\n" " rect Content-Length for files larger than 2 gigabytes.\n" "\n" " -i, --include\n" +" (HTTP) Include the HTTP-header in the output. The HTTP-header\n" +" includes things like server-name, date of the document, HTTP-\n" , stdout); fputs( -" (HTTP) Include the HTTP-header in the output. The HTTP-header\n" -" includes things like server-name, date of the document, HTTP-\n" " version and more...\n" "\n" " -I, --head\n" " (HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature\n" -" the command HEAD which this uses to get nothing but the header\n" -" of a document. When used on an FTP or FILE file, curl displays\n" -, stdout); - fputs( +" the command HEAD which this uses to get nothing but the header\n" +" of a document. When used on an FTP or FILE file, curl displays\n" " the file size and last modification time only.\n" "\n" " --interface \n" -" Perform an operation using a specified interface. You can enter\n" -" interface name, IP address or host name. An example could look\n" +" Perform an operation using a specified interface. You can enter\n" +, stdout); + fputs( +" interface name, IP address or host name. An example could look\n" " like:\n" "\n" " curl --interface eth0:1 http://www.netscape.com/\n" @@ -918,96 +1069,105 @@ void hugehelp(void) " If this option is used several times, the last one will be used.\n" "\n" " -j, --junk-session-cookies\n" +" (HTTP) When curl is told to read cookies from a given file, this\n" +" option will make it discard all \"session cookies\". This will\n" , stdout); fputs( -" (HTTP) When curl is told to read cookies from a given file, this\n" -" option will make it discard all \"session cookies\". This will\n" -" basically have the same effect as if a new session is started.\n" -" Typical browsers always discard session cookies when they're\n" +" basically have the same effect as if a new session is started.\n" +" Typical browsers always discard session cookies when they're\n" " closed down.\n" "\n" " -J, --remote-header-name\n" " (HTTP) This option tells the -O, --remote-name option to use the\n" -, stdout); - fputs( " server-specified Content-Disposition filename instead of\n" " extracting a filename from the URL.\n" "\n" +, stdout); + fputs( +" There's no attempt to decode %-sequences (yet) in the provided\n" +" file name, so this option may provide you with rather unexpected\n" +" file names.\n" +"\n" " -k, --insecure\n" -" (SSL) This option explicitly allows curl to perform \"insecure\"\n" +" (SSL) This option explicitly allows curl to perform \"insecure\"\n" " SSL connections and transfers. All SSL connections are attempted\n" -" to be made secure by using the CA certificate bundle installed\n" -" by default. This makes all connections considered \"insecure\"\n" +" to be made secure by using the CA certificate bundle installed\n" , stdout); fputs( +" by default. This makes all connections considered \"insecure\"\n" " fail unless -k, --insecure is used.\n" "\n" -" See this online resource for further details:\n" +" See this online resource for further details:\n" " http://curl.haxx.se/docs/sslcerts.html\n" "\n" " -K, --config \n" -" Specify which config file to read curl arguments from. The con-\n" -" fig file is a text file in which command line arguments can be\n" -" written which then will be used as if they were written on the\n" +" Specify which config file to read curl arguments from. The con-\n" +" fig file is a text file in which command line arguments can be\n" , stdout); fputs( -" actual command line. Options and their parameters must be speci-\n" -" fied on the same config file line, separated by whitespace,\n" -" colon, the equals sign or any combination thereof (however, the\n" -" preferred separator is the equals sign). If the parameter is to\n" -" contain whitespace, the parameter must be enclosed within\n" -" quotes. Within double quotes, the following escape sequences are\n" +" written which then will be used as if they were written on the\n" +" actual command line.\n" +"\n" +" Options and their parameters must be specified on the same con-\n" +" fig file line, separated by whitespace, colon, or the equals\n" +" sign. Long option names can optionally be given in the config\n" +" file without the initial double dashes and if so, the colon or\n" +, stdout); + fputs( +" equals characters can be used as separators. If the option is\n" +" specified with one or two dashes, there can be no colon or\n" +" equals character between the option and its parameter.\n" +"\n" +" If the parameter is to contain whitespace, the parameter must be\n" +" enclosed within quotes. Within double quotes, the following\n" +" escape sequences are available: \\\\, \\\", \\t, \\n, \\r and \\v. A\n" , stdout); fputs( -" available: \\\\, \\\", \\t, \\n, \\r and \\v. A backslash preceding any\n" -" other letter is ignored. If the first column of a config line is\n" -" a '#' character, the rest of the line will be treated as a com-\n" -" ment. Only write one option per physical line in the config\n" -" file.\n" +" backslash preceding any other letter is ignored. If the first\n" +" column of a config line is a '#' character, the rest of the line\n" +" will be treated as a comment. Only write one option per physical\n" +" line in the config file.\n" "\n" -" Specify the filename to -K, --config as '-' to make curl read\n" +" Specify the filename to -K, --config as '-' to make curl read\n" " the file from stdin.\n" "\n" +" Note that to be able to specify a URL in the config file, you\n" , stdout); fputs( -" Note that to be able to specify a URL in the config file, you\n" -" need to specify it using the --url option, and not by simply\n" -" writing the URL on its own line. So, it could look similar to\n" +" need to specify it using the --url option, and not by simply\n" +" writing the URL on its own line. So, it could look similar to\n" " this:\n" "\n" " url = \"http://curl.haxx.se/docs/\"\n" "\n" -" Long option names can optionally be given in the config file\n" -" without the initial double dashes.\n" -"\n" -, stdout); - fputs( " When curl is invoked, it always (unless -q is used) checks for a\n" " default config file and uses it if found. The default config\n" " file is checked for in the following places in this order:\n" "\n" -" 1) curl tries to find the \"home dir\": It first checks for the\n" -" CURL_HOME and then the HOME environment variables. Failing that,\n" -" it uses getpwuid() on UNIX-like systems (which returns the home\n" , stdout); fputs( +" 1) curl tries to find the \"home dir\": It first checks for the\n" +" CURL_HOME and then the HOME environment variables. Failing that,\n" +" it uses getpwuid() on Unix-like systems (which returns the home\n" " dir given the current user in your system). On Windows, it then\n" " checks for the APPDATA variable, or as a last resort the '%USER-\n" " PROFILE%\\Application Data'.\n" "\n" +, stdout); + fputs( " 2) On windows, if there is no _curlrc file in the home dir, it\n" " checks for one in the same dir the curl executable is placed. On\n" -" UNIX-like systems, it will simply try to load .curlrc from the\n" +" Unix-like systems, it will simply try to load .curlrc from the\n" " determined home dir.\n" "\n" -, stdout); - fputs( " # --- Example file ---\n" " # this is a comment\n" " url = \"curl.haxx.se\"\n" " output = \"curlhere.html\"\n" " user-agent = \"superagent/1.0\"\n" "\n" +, stdout); + fputs( " # and fetch another URL too\n" " url = \"curl.haxx.se/docs/manpage.html\"\n" " -O\n" @@ -1017,31 +1177,33 @@ void hugehelp(void) " This option can be used multiple times to load multiple config\n" " files.\n" "\n" -, stdout); - fputs( " --keepalive-time \n" " This option sets the time a connection needs to remain idle\n" +, stdout); + fputs( " before sending keepalive probes and the time between individual\n" " keepalive probes. It is currently effective on operating systems\n" " offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n" " (meaning Linux, recent AIX, HP-UX and more). This option has no\n" " effect if --no-keepalive is used. (Added in 7.18.0)\n" "\n" +" If this option is used several times, the last one will be used.\n" , stdout); fputs( -" If this option is used several times, the last one will be used.\n" " If unspecified, the option defaults to 60 seconds.\n" "\n" " --key \n" " (SSL/SSH) Private key file name. Allows you to provide your pri-\n" -" vate key in this separate file.\n" +" vate key in this separate file. For SSH, if not specified, curl\n" +" tries the following candidates in order: '~/.ssh/id_rsa',\n" +" '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --key-type \n" -" (SSL) Private key file type. Specify which type your --key pro-\n" , stdout); fputs( +" (SSL) Private key file type. Specify which type your --key pro-\n" " vided private key is. DER, PEM, and ENG are supported. If not\n" " specified, PEM is assumed.\n" "\n" @@ -1050,14 +1212,14 @@ void hugehelp(void) " --krb \n" " (FTP) Enable Kerberos authentication and use. The level must be\n" " entered and should be one of 'clear', 'safe', 'confidential', or\n" -" 'private'. Should you use a level that is not one of these,\n" , stdout); fputs( +" 'private'. Should you use a level that is not one of these,\n" " 'private' will instead be used.\n" "\n" -" This option requires a library built with kerberos4 or GSSAPI\n" -" (GSS-Negotiate) support. This is not very common. Use -V, --ver-\n" -" sion to see if your curl supports it.\n" +" This option requires a library built with kerberos4 support.\n" +" This is not very common. Use -V, --version to see if your curl\n" +" supports it.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" @@ -1065,65 +1227,85 @@ void hugehelp(void) " (FTP) When listing an FTP directory, this switch forces a name-\n" , stdout); fputs( -" only view. Especially useful if you want to machine-parse the\n" -" contents of an FTP directory since the normal directory view\n" -" doesn't use a standard look or format.\n" +" only view. This is especially useful if the user wants to\n" +" machine-parse the contents of an FTP directory since the normal\n" +" directory view doesn't use a standard look or format. When used\n" +" like this, the option causes a NLST command to be sent to the\n" +" server instead of LIST.\n" +"\n" +" Note: Some FTP servers list only files in their response to\n" +, stdout); + fputs( +" NLST; they do not include sub-directories and symbolic links.\n" "\n" -" This option causes an FTP NLST command to be sent. Some FTP\n" -" servers list only files in their response to NLST; they do not\n" -" include subdirectories and symbolic links.\n" +" (POP3) When retrieving a specific email from POP3, this switch\n" +" forces a LIST command to be performed instead of RETR. This is\n" +" particularly useful if the user wants to see if a specific mes-\n" +" sage id exists on the server and what size it is.\n" "\n" -" -L, --location\n" +" Note: When combined with -X, --request , this option\n" , stdout); fputs( -" (HTTP/HTTPS) If the server reports that the requested page has\n" +" can be used to send an UIDL command instead, so the user may use\n" +" the email's unique identifier rather than it's message id to\n" +" make the request. (Added in 7.21.5)\n" +"\n" +" -L, --location\n" +" (HTTP/HTTPS) If the server reports that the requested page has\n" " moved to a different location (indicated with a Location: header\n" -" and a 3XX response code), this option will make curl redo the\n" +" and a 3XX response code), this option will make curl redo the\n" +, stdout); + fputs( " request on the new place. If used together with -i, --include or\n" " -I, --head, headers from all requested pages will be shown. When\n" -" authentication is used, curl only sends its credentials to the\n" +" authentication is used, curl only sends its credentials to the\n" +" initial host. If a redirect takes curl to a different host, it\n" +" won't be able to intercept the user+password. See also --loca-\n" +" tion-trusted on how to change this. You can limit the amount of\n" , stdout); fputs( -" initial host. If a redirect takes curl to a different host, it\n" -" won't be able to intercept the user+password. See also --loca-\n" -" tion-trusted on how to change this. You can limit the amount of\n" " redirects to follow by using the --max-redirs option.\n" "\n" -" When curl follows a redirect and the request is not a plain GET\n" +" When curl follows a redirect and the request is not a plain GET\n" " (for example POST or PUT), it will do the following request with\n" -, stdout); - fputs( " a GET if the HTTP response was 301, 302, or 303. If the response\n" -" code was any other 3xx code, curl will re-send the following\n" +" code was any other 3xx code, curl will re-send the following\n" " request using the same unmodified method.\n" "\n" +, stdout); + fputs( +" You can tell curl to not change the non-GET request method to\n" +" GET after a 30x response by using the dedicated options for\n" +" that: --post301, --post302 and -post303.\n" +"\n" " --libcurl \n" -" Append this option to any ordinary curl command line, and you\n" -" will get a libcurl-using C source code written to the file that\n" +" Append this option to any ordinary curl command line, and you\n" +" will get a libcurl-using C source code written to the file that\n" " does the equivalent of what your command-line operation does!\n" "\n" , stdout); fputs( -" If this option is used several times, the last given file name\n" +" If this option is used several times, the last given file name\n" " will be used. (Added in 7.16.1)\n" "\n" " --limit-rate \n" -" Specify the maximum transfer rate you want curl to use. This\n" -" feature is useful if you have a limited pipe and you'd like your\n" -" transfer not to use your entire bandwidth.\n" +" Specify the maximum transfer rate you want curl to use - for\n" +" both downloads and uploads. This feature is useful if you have a\n" +" limited pipe and you'd like your transfer not to use your entire\n" +" bandwidth. To make it slower than it otherwise would be.\n" "\n" -" The given speed is measured in bytes/second, unless a suffix is\n" , stdout); fputs( +" The given speed is measured in bytes/second, unless a suffix is\n" " appended. Appending 'k' or 'K' will count the number as kilo-\n" " bytes, 'm' or M' makes it megabytes, while 'g' or 'G' makes it\n" " gigabytes. Examples: 200K, 3m and 1G.\n" "\n" " The given rate is the average speed counted during the entire\n" " transfer. It means that curl might use higher transfer speeds in\n" -" short bursts, but over time it uses no more than the given rate.\n" , stdout); fputs( +" short bursts, but over time it uses no more than the given rate.\n" " If you also use the -Y, --speed-limit option, that option will\n" " take precedence and might cripple the rate-limiting slightly, to\n" " help keeping the speed-limit logic working.\n" @@ -1132,9 +1314,9 @@ void hugehelp(void) "\n" " --local-port [-num]\n" " Set a preferred number or range of local port numbers to use for\n" -" the connection(s). Note that port numbers by nature are a\n" , stdout); fputs( +" the connection(s). Note that port numbers by nature are a\n" " scarce resource that will be busy at times so setting this range\n" " to something too narrow might cause unnecessary connection setup\n" " failures. (Added in 7.15.2)\n" @@ -1142,28 +1324,41 @@ void hugehelp(void) " --location-trusted\n" " (HTTP/HTTPS) Like -L, --location, but will allow sending the\n" " name + password to all hosts that the site may redirect to. This\n" -" may or may not introduce a security breach if the site redirects\n" , stdout); fputs( +" may or may not introduce a security breach if the site redirects\n" " you to a site to which you'll send your authentication info\n" " (which is plaintext in the case of HTTP Basic authentication).\n" "\n" " -m, --max-time \n" " Maximum time in seconds that you allow the whole operation to\n" " take. This is useful for preventing your batch jobs from hang-\n" -" ing for hours due to slow networks or links going down. Since\n" , stdout); fputs( +" ing for hours due to slow networks or links going down. Since\n" " 7.32.0, this option accepts decimal values, but the actual time-\n" " out will decrease in accuracy as the specified timeout increases\n" " in decimal precision. See also the --connect-timeout option.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" -" --mail-auth
    \n" -" (SMTP) Specify a single address. This will be used to specify\n" +" --login-options \n" , stdout); fputs( +" Specify the login options to use during server authentication.\n" +"\n" +" You can use the login options to specify protocol specific\n" +" options that may be used during authentication. At present only\n" +" IMAP, POP3 and SMTP support login options. For more information\n" +" about the login options please see RFC 2384, RFC 5092 and IETF\n" +" draft draft-earhart-url-smtp-00.txt (Added in 7.34.0).\n" +"\n" +, stdout); + fputs( +" If this option is used several times, the last one will be used.\n" +"\n" +" --mail-auth
    \n" +" (SMTP) Specify a single address. This will be used to specify\n" " the authentication address (identity) of a submitted message\n" " that is being relayed to another server.\n" "\n" @@ -1173,155 +1368,156 @@ void hugehelp(void) " (SMTP) Specify a single address that the given mail should get\n" " sent from.\n" "\n" +, stdout); + fputs( " (Added in 7.20.0)\n" "\n" " --max-filesize \n" " Specify the maximum size (in bytes) of a file to download. If\n" -, stdout); - fputs( " the file requested is larger than this value, the transfer will\n" " not start and curl will return with exit code 63.\n" "\n" " NOTE: The file size is not always known prior to download, and\n" " for such files this option has no effect even if the file trans-\n" +, stdout); + fputs( " fer ends up being larger than this given limit. This concerns\n" " both FTP and HTTP transfers.\n" "\n" " --mail-rcpt
    \n" +" (SMTP) Specify a single address, user name or mailing list name.\n" +" When performing a mail transfer, the recipient should specify a\n" +" valid email address to send the mail to. (Added in 7.20.0)\n" +"\n" +" When performing an address verification (VRFY command), the\n" , stdout); fputs( -" (SMTP) Specify a single address that the given mail should get\n" -" sent to. This option can be used multiple times to specify many\n" -" recipients.\n" +" recipient should be specified as the user name or user name and\n" +" domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n" "\n" -" (Added in 7.20.0)\n" +" When performing a mailing list expand (EXPN command), the recip-\n" +" ient should be specified using the mailing list name, such as\n" +" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n" "\n" " --max-redirs \n" -" Set maximum number of redirection-followings allowed. If -L,\n" -" --location is used, this option can be used to prevent curl from\n" -" following redirections \"in absurdum\". By default, the limit is\n" +" Set maximum number of redirection-followings allowed. If -L,\n" , stdout); fputs( -" set to 50 redirections. Set this option to -1 to make it limit-\n" +" --location is used, this option can be used to prevent curl from\n" +" following redirections \"in absurdum\". By default, the limit is\n" +" set to 50 redirections. Set this option to -1 to make it limit-\n" " less.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --metalink\n" -" This option can tell curl to parse and process a given URI as\n" -" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n" -" and make use of the mirrors listed within for failover if there\n" +" This option can tell curl to parse and process a given URI as\n" , stdout); fputs( -" are errors (such as the file or server not being available). It\n" -" will also verify the hash of the file after the download com-\n" -" pletes. The Metalink file itself is downloaded and processed in\n" +" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n" +" and make use of the mirrors listed within for failover if there\n" +" are errors (such as the file or server not being available). It\n" +" will also verify the hash of the file after the download com-\n" +" pletes. The Metalink file itself is downloaded and processed in\n" " memory and not stored in the local file system.\n" "\n" +, stdout); + fputs( " Example to use a remote Metalink file:\n" "\n" " curl --metalink http://www.example.com/example.metalink\n" "\n" -, stdout); - fputs( " To use a Metalink file in the local file system, use FILE proto-\n" " col (file://):\n" "\n" " curl --metalink file://example.metalink\n" "\n" -" Please note that if FILE protocol is disabled, there is no way\n" -" to use a local Metalink file at the time of this writing. Also\n" -" note that if --metalink and --include are used together,\n" -" --include will be ignored. This is because including headers in\n" +" Please note that if FILE protocol is disabled, there is no way\n" +" to use a local Metalink file at the time of this writing. Also\n" , stdout); fputs( -" the response will break Metalink parser and if the headers are\n" +" note that if --metalink and --include are used together,\n" +" --include will be ignored. This is because including headers in\n" +" the response will break Metalink parser and if the headers are\n" " included in the file described in Metalink file, hash check will\n" " fail.\n" "\n" " (Added in 7.27.0, if built against the libmetalink library.)\n" "\n" " -n, --netrc\n" -" Makes curl scan the .netrc (_netrc on Windows) file in the\n" +, stdout); + fputs( +" Makes curl scan the .netrc (_netrc on Windows) file in the\n" " user's home directory for login name and password. This is typi-\n" +" cally used for FTP on Unix. If used with HTTP, curl will enable\n" +" user authentication. See netrc(4) or ftp(1) for details on the\n" +" file format. Curl will not complain if that file doesn't have\n" +" the right permissions (it should not be either world- or group-\n" , stdout); fputs( -" cally used for FTP on UNIX. If used with HTTP, curl will enable\n" -" user authentication. See netrc(4) or ftp(1) for details on the\n" -" file format. Curl will not complain if that file doesn't have\n" -" the right permissions (it should not be either world- or group-\n" -" readable). The environment variable \"HOME\" is used to find the\n" +" readable). The environment variable \"HOME\" is used to find the\n" " home directory.\n" "\n" -, stdout); - fputs( -" A quick and very simple example of how to setup a .netrc to\n" -" allow curl to FTP to the machine host.domain.com with user name\n" +" A quick and very simple example of how to setup a .netrc to\n" +" allow curl to FTP to the machine host.domain.com with user name\n" " 'myself' and password 'secret' should look similar to:\n" "\n" " machine host.domain.com login myself password secret\n" "\n" " -N, --no-buffer\n" -" Disables the buffering of the output stream. In normal work sit-\n" -" uations, curl will use a standard buffered output stream that\n" , stdout); fputs( +" Disables the buffering of the output stream. In normal work sit-\n" +" uations, curl will use a standard buffered output stream that\n" " will have the effect that it will output the data in chunks, not\n" -" necessarily exactly when the data arrives. Using this option\n" +" necessarily exactly when the data arrives. Using this option\n" " will disable that buffering.\n" "\n" -" Note that this is the negated option name documented. You can\n" +" Note that this is the negated option name documented. You can\n" " thus use --buffer to enforce the buffering.\n" "\n" -" --netrc-file\n" -" This option is similar to --netrc, except that you provide the\n" , stdout); fputs( -" path (absolute or relative) to the netrc file that Curl should\n" -" use. You can only specify one netrc file per invocation. If\n" -" several --netrc-file options are provided, only the last one\n" +" --netrc-file\n" +" This option is similar to --netrc, except that you provide the\n" +" path (absolute or relative) to the netrc file that Curl should\n" +" use. You can only specify one netrc file per invocation. If\n" +" several --netrc-file options are provided, only the last one\n" " will be used. (Added in 7.21.5)\n" "\n" -" This option overrides any use of --netrc as they are mutually\n" +" This option overrides any use of --netrc as they are mutually\n" +, stdout); + fputs( " exclusive. It will also abide by --netrc-optional if specified.\n" "\n" " --netrc-optional\n" -, stdout); - fputs( -" Very similar to --netrc, but this option makes the .netrc usage\n" +" Very similar to --netrc, but this option makes the .netrc usage\n" " optional and not mandatory as the --netrc option does.\n" "\n" " --negotiate\n" -" (HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate\n" -" method was designed by Microsoft and is used in their web appli-\n" -" cations. It is primarily meant as a support for Kerberos5\n" -" authentication but may be also used along with another authenti-\n" -, stdout); - fputs( -" cation method. For more information see IETF draft draft-brezak-\n" -" spnego-http-04.txt.\n" +" (HTTP) Enables Negotiate (SPNEGO) authentication.\n" "\n" -" If you want to enable Negotiate for your proxy authentication,\n" -" then use --proxy-negotiate.\n" -"\n" -" This option requires a library built with GSSAPI support. This\n" -" is not very common. Use -V, --version to see if your version\n" -" supports GSS-Negotiate.\n" +" If you want to enable Negotiate (SPNEGO) for proxy authentica-\n" +" tion, then use --proxy-negotiate.\n" "\n" , stdout); fputs( +" This option requires a library built with GSS-API or SSPI sup-\n" +" port. Use -V, --version to see if your curl supports GSS-\n" +" API/SSPI and SPNEGO.\n" +"\n" " When using this option, you must also provide a fake -u, --user\n" " option to activate the authentication code properly. Sending a\n" " '-u :' is enough as the user name and password from the -u\n" " option aren't actually used.\n" "\n" +, stdout); + fputs( " If this option is used several times, only the first one is\n" " used.\n" "\n" " --no-keepalive\n" " Disables the use of keepalive messages on the TCP connection, as\n" -, stdout); - fputs( " by default curl enables them.\n" "\n" " Note that this is the negated option name documented. You can\n" @@ -1329,10 +1525,10 @@ void hugehelp(void) "\n" " --no-sessionid\n" " (SSL) Disable curl's use of SSL session-ID caching. By default\n" -" all transfers are done using the cache. Note that while nothing\n" -" should ever get hurt by attempting to reuse SSL session-IDs,\n" , stdout); fputs( +" all transfers are done using the cache. Note that while nothing\n" +" should ever get hurt by attempting to reuse SSL session-IDs,\n" " there seem to be broken SSL implementations in the wild that may\n" " require you to disable this in order for you to succeed. (Added\n" " in 7.16.0)\n" @@ -1340,27 +1536,27 @@ void hugehelp(void) " Note that this is the negated option name documented. You can\n" " thus use --sessionid to enforce session-ID caching.\n" "\n" -" --noproxy \n" -" Comma-separated list of hosts which do not use a proxy, if one\n" , stdout); fputs( +" --noproxy \n" +" Comma-separated list of hosts which do not use a proxy, if one\n" " is specified. The only wildcard is a single * character, which\n" " matches all hosts, and effectively disables the proxy. Each name\n" " in this list is matched as either a domain which contains the\n" " hostname, or the hostname itself. For example, local.com would\n" +, stdout); + fputs( " match local.com, local.com:80, and www.local.com, but not\n" " www.notlocal.com. (Added in 7.19.4).\n" "\n" -, stdout); - fputs( " --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n" " method was designed by Microsoft and is used by IIS web servers.\n" " It is a proprietary protocol, reverse-engineered by clever peo-\n" " ple and implemented in curl based on their efforts. This kind of\n" -" behavior should not be endorsed, you should encourage everyone\n" -" who uses NTLM to switch to a public and documented authentica-\n" , stdout); fputs( +" behavior should not be endorsed, you should encourage everyone\n" +" who uses NTLM to switch to a public and documented authentica-\n" " tion method instead, such as Digest.\n" "\n" " If you want to enable NTLM for your proxy authentication, then\n" @@ -1369,25 +1565,25 @@ void hugehelp(void) " This option requires a library built with SSL support. Use -V,\n" " --version to see if your curl supports NTLM.\n" "\n" +, stdout); + fputs( " If this option is used several times, only the first one is\n" " used.\n" "\n" " -o, --output \n" -, stdout); - fputs( " Write output to instead of stdout. If you are using {} or\n" " [] to fetch multiple documents, you can use '#' followed by a\n" " number in the specifier. That variable will be replaced\n" " with the current string for the URL being fetched. Like in:\n" "\n" +, stdout); + fputs( " curl http://{one,two}.site.com -o \"file_#1.txt\"\n" "\n" " or use several variables like:\n" "\n" " curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n" "\n" -, stdout); - fputs( " You may use this option as many times as the number of URLs you\n" " have.\n" "\n" @@ -1395,11 +1591,11 @@ void hugehelp(void) " ries dynamically. Specifying the output as '-' (a single dash)\n" " will force the output to be done to stdout.\n" "\n" +, stdout); + fputs( " -O, --remote-name\n" " Write output to a local file named like the remote file we get.\n" " (Only the file part of the remote file is used, the path is cut\n" -, stdout); - fputs( " off.)\n" "\n" " The remote file name to use for saving is extracted from the\n" @@ -1407,22 +1603,64 @@ void hugehelp(void) "\n" " Consequentially, the file will be saved in the current working\n" " directory. If you want the file saved in a different directory,\n" +, stdout); + fputs( " make sure you change current working directory before you invoke\n" " curl with the -O, --remote-name flag!\n" "\n" +" There is no URL decoding done on the file name. If it has %20 or\n" +" other URL encoded parts of the name, they will end up as-is as\n" +" file name.\n" +"\n" +" You may use this option as many times as the number of URLs you\n" +" have.\n" +"\n" +" --oauth2-bearer\n" +, stdout); + fputs( +" (IMAP, POP3, SMTP) Specify the Bearer Token for OAUTH 2.0 server\n" +" authentication. The Bearer Token is used in conjunction with the\n" +" user name which can be specified as part of the --url or -u,\n" +" --user options.\n" +"\n" +" The Bearer Token and user name are formatted according to RFC\n" +" 6750.\n" +"\n" +" If this option is used several times, the last one will be used.\n" +"\n" +" --proxy-header
    \n" +, stdout); + fputs( +" (HTTP) Extra header to include in the request when sending HTTP\n" +" to a proxy. You may specify any number of extra headers. This is\n" +" the equivalent option to -H, --header but is for proxy communi-\n" +" cation only like in CONNECT requests when you want a separate\n" +" header sent to the proxy to what is sent to the actual remote\n" +" host.\n" +"\n" +" curl will make sure that each header you add/replace is sent\n" +, stdout); + fputs( +" with the proper end-of-line marker, you should thus not add that\n" +" as a part of the header content: do not add newlines or carriage\n" +" returns, they will only mess things up for you.\n" +"\n" +" Headers specified with this option will not be included in\n" +" requests that curl knows will not be sent to a proxy.\n" +"\n" +" This option can be used multiple times to add/replace/remove\n" +" multiple headers.\n" , stdout); fputs( -" You may use this option as many times as the number of URLs you\n" -" have.\n" -"\n" +" (Added in 7.37.0)\n" " -p, --proxytunnel\n" " When an HTTP proxy is used (-x, --proxy), this option will cause\n" " non-HTTP protocols to attempt to tunnel through the proxy\n" " instead of merely using it to do HTTP-like operations. The tun-\n" " nel approach is made with the HTTP proxy CONNECT request and\n" +" requires that the proxy allows direct connect to the remote port\n" , stdout); fputs( -" requires that the proxy allows direct connect to the remote port\n" " number curl wants to tunnel through to.\n" "\n" " -P, --ftp-port
    \n" @@ -1430,9 +1668,9 @@ void hugehelp(void) " necting with FTP. This switch makes curl use active mode. In\n" " practice, curl then tells the server to connect back to the\n" " client's specified address and port, while passive mode asks the\n" +" server to setup an IP address and port for it to connect to.\n" , stdout); fputs( -" server to setup an IP address and port for it to connect to.\n" "
    should be one of:\n" "\n" " interface\n" @@ -1445,9 +1683,9 @@ void hugehelp(void) " host name\n" " i.e \"my.host.domain\" to specify the machine\n" "\n" +" - make curl pick the same IP address that is already used\n" , stdout); fputs( -" - make curl pick the same IP address that is already used\n" " for the control connection\n" "\n" " If this option is used several times, the last one will be used. Dis-\n" @@ -1456,9 +1694,9 @@ void hugehelp(void) " PORT++.\n" "\n" " Starting in 7.19.5, you can append \":[start]-[end]\" to the right of the\n" +" address, to tell curl what TCP port range to use. That means you spec-\n" , stdout); fputs( -" address, to tell curl what TCP port range to use. That means you spec-\n" " ify a port range, from a lower to a higher number. A single number\n" " works as well, but do note that it increases the risk of failure since\n" " the port may not be available.\n" @@ -1469,27 +1707,27 @@ void hugehelp(void) " If this option is used several times, the last one will be used.\n" "\n" " --post301\n" +" (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert\n" , stdout); fputs( -" (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert\n" " POST requests into GET requests when following a 301 redirect-\n" " ion. The non-RFC behaviour is ubiquitous in web browsers, so\n" " curl does the conversion by default to maintain consistency.\n" " However, a server may require a POST to remain a POST after such\n" " a redirection. This option is meaningful only when using -L,\n" -, stdout); - fputs( " --location (Added in 7.17.1)\n" "\n" " --post302\n" +, stdout); + fputs( " (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert\n" " POST requests into GET requests when following a 302 redirect-\n" " ion. The non-RFC behaviour is ubiquitous in web browsers, so\n" " curl does the conversion by default to maintain consistency.\n" " However, a server may require a POST to remain a POST after such\n" +" a redirection. This option is meaningful only when using -L,\n" , stdout); fputs( -" a redirection. This option is meaningful only when using -L,\n" " --location (Added in 7.19.1)\n" "\n" " --post303\n" @@ -1497,9 +1735,9 @@ void hugehelp(void) " POST requests into GET requests when following a 303 redirect-\n" " ion. The non-RFC behaviour is ubiquitous in web browsers, so\n" " curl does the conversion by default to maintain consistency.\n" +" However, a server may require a POST to remain a POST after such\n" , stdout); fputs( -" However, a server may require a POST to remain a POST after such\n" " a redirection. This option is meaningful only when using -L,\n" " --location (Added in 7.26.0)\n" "\n" @@ -1507,10 +1745,10 @@ void hugehelp(void) " Tells curl to use the listed protocols for its initial\n" " retrieval. Protocols are evaluated left to right, are comma sep-\n" " arated, and are each a protocol name or 'all', optionally pre-\n" -, stdout); - fputs( " fixed by zero or more modifiers. Available modifiers are:\n" "\n" +, stdout); + fputs( " + Permit this protocol in addition to protocols already permit-\n" " ted (this is the default if no modifier is used).\n" "\n" @@ -1519,10 +1757,10 @@ void hugehelp(void) "\n" " = Permit only this protocol (ignoring the list already permit-\n" " ted), though subject to later modification by subsequent\n" -, stdout); - fputs( " entries in the comma separated list.\n" "\n" +, stdout); + fputs( " For example:\n" "\n" " --proto -ftps uses the default protocols, but disables ftps\n" @@ -1534,9 +1772,9 @@ void hugehelp(void) " also only enables http and https\n" "\n" " Unknown protocols produce a warning. This allows scripts to\n" +" safely rely on being able to disable potentially dangerous pro-\n" , stdout); fputs( -" safely rely on being able to disable potentially dangerous pro-\n" " tocols, without relying upon support for that protocol being\n" " built into curl to avoid an error.\n" "\n" @@ -1547,9 +1785,9 @@ void hugehelp(void) " (Added in 7.20.2)\n" "\n" " --proto-redir \n" +" Tells curl to use the listed protocols after a redirect. See\n" , stdout); fputs( -" Tells curl to use the listed protocols after a redirect. See\n" " --proto for how protocols are represented.\n" "\n" " (Added in 7.20.2)\n" @@ -1560,9 +1798,9 @@ void hugehelp(void) " request/response round-trip. (Added in 7.13.2)\n" "\n" " --proxy-basic\n" +" Tells curl to use HTTP Basic authentication when communicating\n" , stdout); fputs( -" Tells curl to use HTTP Basic authentication when communicating\n" " with the given proxy. Use --basic for enabling HTTP Basic with a\n" " remote host. Basic is the default authentication method curl\n" " uses with proxies.\n" @@ -1572,12 +1810,12 @@ void hugehelp(void) " with the given proxy. Use --digest for enabling HTTP Digest with\n" " a remote host.\n" "\n" +" --proxy-negotiate\n" , stdout); fputs( -" --proxy-negotiate\n" -" Tells curl to use HTTP Negotiate authentication when communicat-\n" -" ing with the given proxy. Use --negotiate for enabling HTTP\n" -" Negotiate with a remote host. (Added in 7.17.1)\n" +" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n" +" communicating with the given proxy. Use --negotiate for enabling\n" +" HTTP Negotiate (SPNEGO) with a remote host. (Added in 7.17.1)\n" "\n" " --proxy-ntlm\n" " Tells curl to use HTTP NTLM authentication when communicating\n" @@ -1601,44 +1839,51 @@ void hugehelp(void) " key in this separate file.\n" "\n" " If this option is used several times, the last one will be used.\n" +" (As of 7.39.0, curl attempts to automatically extract the public\n" +" key from the private key file, so passing this option is gener-\n" +" ally not required. Note that this public key extraction requires\n" +" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n" +" that is itself linked against OpenSSL.)\n" "\n" +, stdout); + fputs( " -q If used as the first parameter on the command line, the curlrc\n" " config file will not be read and used. See the -K, --config for\n" " details on the default config file search path.\n" "\n" " -Q, --quote \n" " (FTP/SFTP) Send an arbitrary command to the remote FTP or SFTP\n" -, stdout); - fputs( " server. Quote commands are sent BEFORE the transfer takes place\n" " (just after the initial PWD command in an FTP transfer, to be\n" +, stdout); + fputs( " exact). To make commands take place after a successful transfer,\n" " prefix them with a dash '-'. To make commands be sent after\n" " curl has changed the working directory, just before the transfer\n" " command(s), prefix the command with a '+' (this is only sup-\n" -, stdout); - fputs( " ported for FTP). You may specify any number of commands. If the\n" " server returns failure for one of the commands, the entire oper-\n" +, stdout); + fputs( " ation will be aborted. You must send syntactically correct FTP\n" " commands as RFC 959 defines to FTP servers, or one of the com-\n" " mands listed below to SFTP servers. This option can be used\n" " multiple times. When speaking to an FTP server, prefix the com-\n" -, stdout); - fputs( " mand with an asterisk (*) to make curl continue even if the com-\n" " mand fails as by default curl will stop at first failure.\n" "\n" +, stdout); + fputs( " SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n" " quote commands itself before sending them to the server. File\n" " names may be quoted shell-style to embed spaces or special char-\n" " acters. Following is the list of all supported SFTP quote com-\n" " mands:\n" "\n" -, stdout); - fputs( " chgrp group file\n" " The chgrp command sets the group ID of the file named by\n" +, stdout); + fputs( " the file operand to the group ID specified by the group\n" " operand. The group operand is a decimal integer group ID.\n" "\n" @@ -1647,10 +1892,10 @@ void hugehelp(void) " specified file. The mode operand is an octal integer mode\n" " number.\n" "\n" -, stdout); - fputs( " chown user file\n" " The chown command sets the owner of the file named by the\n" +, stdout); + fputs( " file operand to the user ID specified by the user oper-\n" " and. The user operand is a decimal integer user ID.\n" "\n" @@ -1659,10 +1904,10 @@ void hugehelp(void) " target_file location pointing to the source_file loca-\n" " tion.\n" "\n" -, stdout); - fputs( " mkdir directory_name\n" " The mkdir command creates the directory named by the\n" +, stdout); + fputs( " directory_name operand.\n" "\n" " pwd The pwd command returns the absolute pathname of the cur-\n" @@ -1671,11 +1916,11 @@ void hugehelp(void) " rename source target\n" " The rename command renames the file or directory named by\n" " the source operand to the destination path named by the\n" -, stdout); - fputs( " target operand.\n" "\n" " rm file\n" +, stdout); + fputs( " The rm command removes the file specified by the file op-\n" " erand.\n" "\n" @@ -1687,9 +1932,9 @@ void hugehelp(void) " See ln.\n" "\n" " -r, --range \n" +" (HTTP/FTP/SFTP/FILE) Retrieve a byte range (i.e a partial docu-\n" , stdout); fputs( -" (HTTP/FTP/SFTP/FILE) Retrieve a byte range (i.e a partial docu-\n" " ment) from a HTTP/1.1, FTP or SFTP server or a local FILE.\n" " Ranges can be specified in a number of ways.\n" "\n" @@ -1701,11 +1946,11 @@ void hugehelp(void) "\n" " 9500- specifies the bytes from offset 9500 and forward\n" "\n" -, stdout); - fputs( " 0-0,-1 specifies the first and last byte only(*)(H)\n" "\n" " 500-700,600-799\n" +, stdout); + fputs( " specifies 300 bytes from offset 500(H)\n" "\n" " 100-199,500-599\n" @@ -1715,10 +1960,10 @@ void hugehelp(void) " response!\n" "\n" " Only digit characters (0-9) are valid in the 'start' and 'stop' fields\n" -, stdout); - fputs( " of the 'start-stop' range syntax. If a non-digit character is given in\n" " the range, the server's response will be unspecified, depending on the\n" +, stdout); + fputs( " server's configuration.\n" "\n" " You should also be aware that many HTTP/1.1 servers do not have this\n" @@ -1726,50 +1971,48 @@ void hugehelp(void) " instead get the whole document.\n" "\n" " FTP and SFTP range downloads only support the simple 'start-stop' syn-\n" -, stdout); - fputs( " tax (optionally with one of the numbers omitted). FTP use depends on\n" " the extended FTP command SIZE.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" +, stdout); + fputs( " -R, --remote-time\n" " When used, this will make curl attempt to figure out the time-\n" " stamp of the remote file, and if that is available make the\n" " local file get that same timestamp.\n" "\n" " --random-file \n" -, stdout); - fputs( " (SSL) Specify the path name to file containing what will be con-\n" " sidered as random data. The data is used to seed the random\n" " engine for SSL connections. See also the --egd-file option.\n" "\n" +, stdout); + fputs( " --raw (HTTP) When used, it disables all internal HTTP decoding of con-\n" " tent or transfer encodings and instead makes them passed on\n" " unaltered, raw. (Added in 7.16.2)\n" "\n" " --remote-name-all\n" -, stdout); - fputs( " This option changes the default action for all given URLs to be\n" " dealt with as if -O, --remote-name were used for each one. So if\n" " you want to disable that for a specific URL after --remote-name-\n" +, stdout); + fputs( " all has been used, you must use \"-o -\" or --no-remote-name.\n" " (Added in 7.19.0)\n" "\n" " --resolve \n" " Provide a custom address for a specific host and port pair.\n" -, stdout); - fputs( " Using this, you can make the curl requests(s) use a specified\n" " address and prevent the otherwise normally resolved address to\n" " be used. Consider it a sort of /etc/hosts alternative provided\n" +, stdout); + fputs( " on the command line. The port number should be the number used\n" " for the specific protocol the host will be used for. It means\n" " you need several entries if you want to provide address for the\n" -, stdout); - fputs( " same host but different ports.\n" "\n" " This option can be used many times to add many host names to\n" @@ -1778,33 +2021,35 @@ void hugehelp(void) " (Added in 7.21.3)\n" "\n" " --retry \n" +, stdout); + fputs( " If a transient error is returned when curl tries to perform a\n" " transfer, it will retry this number of times before giving up.\n" " Setting the number to 0 makes curl do no retries (which is the\n" -, stdout); - fputs( " default). Transient error means either: a timeout, an FTP 4xx\n" " response code or an HTTP 5xx response code.\n" "\n" " When curl is about to retry a transfer, it will first wait one\n" +, stdout); + fputs( " second and then for all forthcoming retries it will double the\n" " waiting time until it reaches 10 minutes which then will be the\n" " delay between the rest of the retries. By using --retry-delay\n" -, stdout); - fputs( " you disable this exponential backoff algorithm. See also\n" " --retry-max-time to limit the total time allowed for retries.\n" " (Added in 7.12.3)\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " --retry-delay \n" " Make curl sleep this amount of time before each retry when a\n" " transfer has failed with a transient error (it changes the\n" -, stdout); - fputs( " default backoff time algorithm between retries). This option is\n" " only interesting if --retry is also used. Setting this delay to\n" +, stdout); + fputs( " zero will make curl use the default backoff time. (Added in\n" " 7.12.3)\n" "\n" @@ -1812,21 +2057,21 @@ void hugehelp(void) "\n" " --retry-max-time \n" " The retry timer is reset before the first transfer attempt.\n" -, stdout); - fputs( " Retries will be done as usual (see --retry) as long as the timer\n" " hasn't reached this given limit. Notice that if the timer hasn't\n" +, stdout); + fputs( " reached the limit, the request will be made and while perform-\n" " ing, it may take longer than this given time period. To limit a\n" " single request's maximum time, use -m, --max-time. Set this\n" " option to zero to not timeout retries. (Added in 7.12.3)\n" "\n" -, stdout); - fputs( " If this option is used several times, the last one will be used.\n" "\n" " -s, --silent\n" " Silent or quiet mode. Don't show progress meter or error mes-\n" +, stdout); + fputs( " sages. Makes Curl mute. It will still output the data you ask\n" " for, potentially even to the terminal/stdout unless you redirect\n" " it.\n" @@ -1836,92 +2081,92 @@ void hugehelp(void) " 7.31.0)\n" "\n" " -S, --show-error\n" -, stdout); - fputs( " When used with -s it makes curl show an error message if it\n" " fails.\n" "\n" " --ssl (FTP, POP3, IMAP, SMTP) Try to use SSL/TLS for the connection.\n" +, stdout); + fputs( " Reverts to a non-secure connection if the server doesn't support\n" " SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n" " ent levels of encryption required. (Added in 7.20.0)\n" "\n" " This option was formerly known as --ftp-ssl (Added in 7.11.0).\n" -, stdout); - fputs( " That option name can still be used but will be removed in a\n" " future version.\n" "\n" " --ssl-reqd\n" +, stdout); + fputs( " (FTP, POP3, IMAP, SMTP) Require SSL/TLS for the connection.\n" " Terminates the connection if the server doesn't support SSL/TLS.\n" " (Added in 7.20.0)\n" "\n" " This option was formerly known as --ftp-ssl-reqd (added in\n" " 7.15.5). That option name can still be used but will be removed\n" -, stdout); - fputs( " in a future version.\n" "\n" " --ssl-allow-beast\n" " (SSL) This option tells curl to not work around a security flaw\n" +, stdout); + fputs( " in the SSL3 and TLS1.0 protocols known as BEAST. If this option\n" -" isn't used, the SSL layer may use work-arounds known to cause\n" +" isn't used, the SSL layer may use workarounds known to cause\n" " interoperability problems with some older SSL implementations.\n" " WARNING: this option loosens the SSL security, and by using this\n" -, stdout); - fputs( " flag you ask for exactly that. (Added in 7.25.0)\n" "\n" " --socks4 \n" " Use the specified SOCKS4 proxy. If the port number is not speci-\n" +, stdout); + fputs( " fied, it is assumed at port 1080. (Added in 7.15.2)\n" "\n" " This option overrides any previous use of -x, --proxy, as they\n" " are mutually exclusive.\n" "\n" " Since 7.21.7, this option is superfluous since you can specify a\n" -, stdout); - fputs( " socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n" " If this option is used several times, the last one will be used.\n" "\n" " --socks4a \n" +, stdout); + fputs( " Use the specified SOCKS4a proxy. If the port number is not spec-\n" " ified, it is assumed at port 1080. (Added in 7.18.0)\n" "\n" " This option overrides any previous use of -x, --proxy, as they\n" " are mutually exclusive.\n" "\n" -, stdout); - fputs( " Since 7.21.7, this option is superfluous since you can specify a\n" " socks4a proxy with -x, --proxy using a socks4a:// protocol pre-\n" " fix.\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " --socks5-hostname \n" " Use the specified SOCKS5 proxy (and let the proxy resolve the\n" " host name). If the port number is not specified, it is assumed\n" -, stdout); - fputs( " at port 1080. (Added in 7.18.0)\n" "\n" " This option overrides any previous use of -x, --proxy, as they\n" " are mutually exclusive.\n" "\n" +, stdout); + fputs( " Since 7.21.7, this option is superfluous since you can specify a\n" " socks5 hostname proxy with -x, --proxy using a socks5h:// proto-\n" " col prefix.\n" "\n" " If this option is used several times, the last one will be used.\n" -, stdout); - fputs( " (This option was previously wrongly documented and used as\n" " --socks without the number appended.)\n" "\n" " --socks5 \n" +, stdout); + fputs( " Use the specified SOCKS5 proxy - but resolve the host name\n" " locally. If the port number is not specified, it is assumed at\n" " port 1080.\n" @@ -1929,10 +2174,10 @@ void hugehelp(void) " This option overrides any previous use of -x, --proxy, as they\n" " are mutually exclusive.\n" "\n" -, stdout); - fputs( " Since 7.21.7, this option is superfluous since you can specify a\n" " socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" " (This option was previously wrongly documented and used as\n" " --socks without the number appended.)\n" @@ -1940,33 +2185,33 @@ void hugehelp(void) " This option (as well as --socks4) does not work with IPV6, FTPS\n" " or LDAP.\n" "\n" -, stdout); - fputs( " --socks5-gssapi-service \n" " The default service name for a socks server is rcmd/server-fqdn.\n" " This option allows you to change it.\n" "\n" +, stdout); + fputs( " Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n" " would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n" " service sockd/real-name would use sockd/real-name for cases\n" " where the proxy-name does not match the principal name. (Added\n" -, stdout); - fputs( " in 7.19.4).\n" "\n" " --socks5-gssapi-nec\n" -" As part of the gssapi negotiation a protection mode is negoti-\n" +" As part of the GSS-API negotiation a protection mode is negoti-\n" +, stdout); + fputs( " ated. RFC 1961 says in section 4.3/4.4 it should be protected,\n" " but the NEC reference implementation does not. The option\n" " --socks5-gssapi-nec allows the unprotected exchange of the pro-\n" " tection mode negotiation. (Added in 7.19.4).\n" "\n" " --stderr \n" -, stdout); - fputs( " Redirect all writes to stderr to the specified file instead. If\n" " the file name is a plain '-', it is instead written to stdout.\n" "\n" +, stdout); + fputs( " If this option is used several times, the last one will be used.\n" "\n" " -t, --telnet-option \n" @@ -1976,31 +2221,31 @@ void hugehelp(void) "\n" " XDISPLOC= Sets the X display location.\n" "\n" -, stdout); - fputs( " NEW_ENV= Sets an environment variable.\n" "\n" " -T, --upload-file \n" " This transfers the specified local file to the remote URL. If\n" +, stdout); + fputs( " there is no file part in the specified URL, Curl will append the\n" " local file name. NOTE that you must use a trailing / on the last\n" " directory to really prove to Curl that there is no file name or\n" " curl will think that your last directory name is the remote file\n" -, stdout); - fputs( " name to use. That will most likely cause the upload operation to\n" " fail. If this is used on an HTTP(S) server, the PUT command will\n" " be used.\n" "\n" +, stdout); + fputs( " Use the file name \"-\" (a single dash) to use stdin instead of a\n" " given file. Alternately, the file name \".\" (a single period)\n" " may be specified instead of \"-\" to use stdin in non-blocking\n" " mode to allow reading server output while stdin is being\n" -, stdout); - fputs( " uploaded.\n" "\n" " You can specify one -T for each URL on the command line. Each -T\n" +, stdout); + fputs( " + URL pair specifies what to upload and to where. curl also sup-\n" " ports \"globbing\" of the -T argument, meaning that you can upload\n" " multiple files to a single URL by using the same URL globbing\n" @@ -2010,11 +2255,11 @@ void hugehelp(void) "\n" " or even\n" "\n" -, stdout); - fputs( " curl -T \"img[1-1000].png\" ftp://ftp.picturemania.com/upload/\n" "\n" " --tcp-nodelay\n" +, stdout); + fputs( " Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n" " page for details about this option. (Added in 7.11.2)\n" "\n" @@ -2023,10 +2268,10 @@ void hugehelp(void) " size that curl will try to use when transferring data to or from\n" " a TFTP server. By default 512 bytes will be used.\n" "\n" -, stdout); - fputs( " If this option is used several times, the last one will be used.\n" "\n" +, stdout); + fputs( " (Added in 7.20.0)\n" "\n" " --tlsauthtype \n" @@ -2035,105 +2280,145 @@ void hugehelp(void) " --tlspassword are specified but --tlsauthtype is not, then this\n" " option defaults to \"SRP\". (Added in 7.21.4)\n" "\n" -" --tlsuser \n" +" --tlspassword \n" +" Set password for use with the TLS authentication method speci-\n" , stdout); fputs( +" fied with --tlsauthtype. Requires that --tlsuser also be set.\n" +" (Added in 7.21.4)\n" +"\n" +" --tlsuser \n" " Set username for use with the TLS authentication method speci-\n" " fied with --tlsauthtype. Requires that --tlspassword also be\n" " set. (Added in 7.21.4)\n" "\n" -" --tlspassword \n" -" Set password for use with the TLS authentication method speci-\n" -" fied with --tlsauthtype. Requires that --tlsuser also be set.\n" -" (Added in 7.21.4)\n" +" --tlsv1.0\n" +" (SSL) Forces curl to use TLS version 1.0 when negotiating with a\n" +" remote TLS server. (Added in 7.34.0)\n" "\n" -" --tr-encoding\n" +" --tlsv1.1\n" , stdout); fputs( +" (SSL) Forces curl to use TLS version 1.1 when negotiating with a\n" +" remote TLS server. (Added in 7.34.0)\n" +"\n" +" --tlsv1.2\n" +" (SSL) Forces curl to use TLS version 1.2 when negotiating with a\n" +" remote TLS server. (Added in 7.34.0)\n" +"\n" +" --tr-encoding\n" " (HTTP) Request a compressed Transfer-Encoding response using one\n" -" of the algorithms curl supports, and uncompress the data while\n" +" of the algorithms curl supports, and uncompress the data while\n" " receiving it.\n" "\n" +, stdout); + fputs( " (Added in 7.21.6)\n" "\n" " --trace \n" -" Enables a full trace dump of all incoming and outgoing data,\n" +" Enables a full trace dump of all incoming and outgoing data,\n" " including descriptive information, to the given output file. Use\n" " \"-\" as filename to have the output sent to stdout.\n" "\n" -, stdout); - fputs( " This option overrides previous uses of -v, --verbose or --trace-\n" " ascii.\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --trace-ascii \n" -" Enables a full trace dump of all incoming and outgoing data,\n" +, stdout); + fputs( +" Enables a full trace dump of all incoming and outgoing data,\n" " including descriptive information, to the given output file. Use\n" " \"-\" as filename to have the output sent to stdout.\n" "\n" -, stdout); - fputs( " This is very similar to --trace, but leaves out the hex part and\n" -" only shows the ASCII part of the dump. It makes smaller output\n" +" only shows the ASCII part of the dump. It makes smaller output\n" " that might be easier to read for untrained humans.\n" "\n" +, stdout); + fputs( " This option overrides previous uses of -v, --verbose or --trace.\n" " If this option is used several times, the last one will be used.\n" "\n" " --trace-time\n" -" Prepends a time stamp to each trace or verbose line that curl\n" -, stdout); - fputs( +" Prepends a time stamp to each trace or verbose line that curl\n" " displays. (Added in 7.14.0)\n" "\n" +" --unix-socket \n" +" (HTTP) Connect through this Unix domain socket, instead of using\n" +" the network. (Added in 7.40.0)\n" +"\n" " -u, --user \n" +, stdout); + fputs( " Specify the user name and password to use for server authentica-\n" " tion. Overrides -n, --netrc and --netrc-optional.\n" "\n" -" If you just give the user name (without entering a colon) curl\n" -" will prompt for a password.\n" +" If you simply specify the user name, curl will prompt for a\n" +" password.\n" +"\n" +" The user name and passwords are split up on the first colon,\n" +" which makes it impossible to use a colon in the user name with\n" +" this option. The password can, still.\n" +"\n" +, stdout); + fputs( +" When using Kerberos V5 with a Windows based server you should\n" +" include the Windows domain name in the user name, in order for\n" +" the server to succesfully obtain a Kerberos Ticket. If you don't\n" +" then the initial authentication handshake may fail.\n" +"\n" +" When using NTLM, the user name can be specified simply as the\n" +" user name, without the domain, if there is a single domain and\n" +, stdout); + fputs( +" forest in your setup for example.\n" +"\n" +" To specify the domain name use either Down-Level Logon Name or\n" +" UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n" +" user@example.com respectively.\n" "\n" -" If you use an SSPI-enabled curl binary and do NTLM authentica-\n" +" If you use a Windows SSPI-enabled curl binary and perform Ker-\n" +" beros V5, Negotiate, NTLM or Digest authentication then you can\n" +" tell curl to select the user name and password from your envi-\n" , stdout); fputs( -" tion, you can force curl to pick up the user name and password\n" -" from your environment by simply specifying a single colon with\n" -" this option: \"-u :\".\n" +" ronment by specifying a single colon with this option: \"-u :\".\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " -U, --proxy-user \n" -" Specify the user name and password to use for proxy authentica-\n" +" Specify the user name and password to use for proxy authentica-\n" " tion.\n" "\n" -" If you use an SSPI-enabled curl binary and do NTLM authentica-\n" +" If you use a Windows SSPI-enabled curl binary and do either\n" +" Negotiate or NTLM authentication then you can tell curl to\n" , stdout); fputs( -" tion, you can force curl to pick up the user name and password\n" -" from your environment by simply specifying a single colon with\n" -" this option: \"-U :\".\n" +" select the user name and password from your environment by spec-\n" +" ifying a single colon with this option: \"-U :\".\n" "\n" " If this option is used several times, the last one will be used.\n" "\n" " --url \n" -" Specify a URL to fetch. This option is mostly handy when you\n" +" Specify a URL to fetch. This option is mostly handy when you\n" " want to specify URL(s) in a config file.\n" "\n" +" This option may be used any number of times. To control where\n" , stdout); fputs( -" This option may be used any number of times. To control where\n" -" this URL is written, use the -o, --output or the -O, --remote-\n" +" this URL is written, use the -o, --output or the -O, --remote-\n" " name options.\n" " -v, --verbose\n" -" Makes the fetching more verbose/talkative. Mostly useful for\n" -" debugging. A line starting with '>' means \"header data\" sent by\n" -" curl, '<' means \"header data\" received by curl that is hidden in\n" +" Be more verbose/talkative during the operation. Useful for\n" +" debugging and seeing what's going on \"under the hood\". A line\n" +" starting with '>' means \"header data\" sent by curl, '<' means\n" +" \"header data\" received by curl that is hidden in normal cases,\n" , stdout); fputs( -" normal cases, and a line starting with '*' means additional info\n" -" provided by curl.\n" +" and a line starting with '*' means additional info provided by\n" +" curl.\n" "\n" " Note that if you only want HTTP headers in the output, -i,\n" " --include might be the option you're looking for.\n" @@ -2148,11 +2433,11 @@ void hugehelp(void) " Use -s, --silent to make curl quiet.\n" "\n" " -w, --write-out \n" -" Defines what to display on stdout after a completed and success-\n" -" ful operation. The format is a string that may contain plain\n" -" text mixed with any number of variables. The string can be spec-\n" -" ified as \"string\", to get read from a particular file you spec-\n" -" ify it \"@filename\" and to tell curl to read the format from\n" +" Make curl display information on stdout after a completed trans-\n" +" fer. The format is a string that may contain plain text mixed\n" +" with any number of variables. The format can be specified as a\n" +" literal \"string\", or you can have curl read the format from a\n" +" file with \"@filename\" and to tell curl to read the format from\n" , stdout); fputs( " stdin you write \"@-\".\n" @@ -2308,17 +2593,28 @@ void hugehelp(void) " If this option is used several times, the last one will be used.\n" "\n" " -x, --proxy <[protocol://][user:password@]proxyhost[:port]>\n" -" Use the specified HTTP proxy. If the port number is not speci-\n" -" fied, it is assumed at port 1080.\n" +" Use the specified proxy.\n" +"\n" +" The proxy string can be specified with a protocol:// prefix to\n" +, stdout); + fputs( +" specify alternative proxy protocols. Use socks4://, socks4a://,\n" +" socks5:// or socks5h:// to request the specific SOCKS version to\n" +" be used. No protocol specified, http:// and all others will be\n" +" treated as HTTP proxies. (The protocol support was added in curl\n" +" 7.21.7)\n" +"\n" +" If the port number is not specified in the proxy string, it is\n" +" assumed to be 1080.\n" "\n" , stdout); fputs( -" This option overrides existing environment variables that set\n" -" the proxy to use. If there's an environment variable setting a\n" +" This option overrides existing environment variables that set\n" +" the proxy to use. If there's an environment variable setting a\n" " proxy, you can set proxy to \"\" to override it.\n" "\n" " All operations that are performed over an HTTP proxy will trans-\n" -" parently be converted to HTTP. It means that certain protocol\n" +" parently be converted to HTTP. It means that certain protocol\n" " specific operations might not be available. This is not the case\n" , stdout); fputs( @@ -2326,169 +2622,177 @@ void hugehelp(void) " ytunnel option.\n" "\n" " User and password that might be provided in the proxy string are\n" -" URL decoded by curl. This allows you to pass in special charac-\n" +" URL decoded by curl. This allows you to pass in special charac-\n" " ters such as @ by using %40 or pass in a colon with %3a.\n" "\n" -" The proxy host can be specified the exact same way as the proxy\n" -" environment variables, including the protocol prefix (http://)\n" +" The proxy host can be specified the exact same way as the proxy\n" +" environment variables, including the protocol prefix (http://)\n" , stdout); fputs( " and the embedded user + password.\n" "\n" -" From 7.21.7, the proxy string may be specified with a proto-\n" -" col:// prefix to specify alternative proxy protocols. Use\n" -" socks4://, socks4a://, socks5:// or socks5h:// to request the\n" -" specific SOCKS version to be used. No protocol specified,\n" -" http:// and all others will be treated as HTTP proxies.\n" -"\n" -, stdout); - fputs( " If this option is used several times, the last one will be used.\n" "\n" " -X, --request \n" " (HTTP) Specifies a custom request method to use when communicat-\n" -" ing with the HTTP server. The specified request will be used\n" -" instead of the method otherwise used (which defaults to GET).\n" -" Read the HTTP 1.1 specification for details and explanations.\n" +" ing with the HTTP server. The specified request will be used\n" +" instead of the method otherwise used (which defaults to GET).\n" +" Read the HTTP 1.1 specification for details and explanations.\n" , stdout); fputs( -" Common additional HTTP requests include PUT and DELETE, but\n" +" Common additional HTTP requests include PUT and DELETE, but\n" " related technologies like WebDAV offers PROPFIND, COPY, MOVE and\n" " more.\n" "\n" -" Normally you don't need this option. All sorts of GET, HEAD,\n" +" Normally you don't need this option. All sorts of GET, HEAD,\n" " POST and PUT requests are rather invoked by using dedicated com-\n" " mand line options.\n" "\n" -" This option only changes the actual word used in the HTTP\n" +" This option only changes the actual word used in the HTTP\n" , stdout); fputs( -" request, it does not alter the way curl behaves. So for example\n" -" if you want to make a proper HEAD request, using -X HEAD will\n" +" request, it does not alter the way curl behaves. So for example\n" +" if you want to make a proper HEAD request, using -X HEAD will\n" " not suffice. You need to use the -I, --head option.\n" "\n" " (FTP) Specifies a custom FTP command to use instead of LIST when\n" " doing file lists with FTP.\n" "\n" -" If this option is used several times, the last one will be used.\n" +" (POP3) Specifies a custom POP3 command to use instead of LIST or\n" +" RETR. (Added in 7.26.0)\n" "\n" -" --xattr\n" , stdout); fputs( +" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n" +" (Added in 7.30.0)\n" +"\n" +" (SMTP) Specifies a custom SMTP command to use instead of HELP or\n" +" VRFY. (Added in 7.34.0)\n" +"\n" +" If this option is used several times, the last one will be used.\n" +"\n" +" --xattr\n" " When saving output to a file, this option tells curl to store\n" " certain file metadata in extended file attributes. Currently,\n" +, stdout); + fputs( " the URL is stored in the xdg.origin.url attribute and, for HTTP,\n" " the content type is stored in the mime_type attribute. If the\n" " file system does not support extended attributes, a warning is\n" " issued.\n" "\n" " -y, --speed-time diff --git a/tests/Makefile.in b/tests/Makefile.in index 7ba9d96..c97f116 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -239,6 +239,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -263,7 +264,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -272,7 +272,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -293,6 +292,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -328,11 +328,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ diff --git a/tests/README b/tests/README index 3ddc1c9..a8b8adc 100644 --- a/tests/README +++ b/tests/README @@ -81,6 +81,9 @@ The cURL Test Suite machine, or just move the servers in case you have local services on any of those ports. + The HTTP server supports listening on a Unix domain socket, the default + location is 'http.sock'. + 1.4 Run 'make test'. This builds the test suite support code and invokes the @@ -144,7 +147,9 @@ The cURL Test Suite runtests.pl's -t option will enable torture testing mode, which runs each test many times and makes each different memory allocation fail on each successive run. This tests the out of memory error handling code to ensure - that memory leaks do not occur even in those situations. + that memory leaks do not occur even in those situations. It can help to + compile curl with CPPFLAGS=-DMEMDEBUG_LOG_SYNC when using this option, to + ensure that the memory log file is properly written even if curl crashes. 1.7 Debug diff --git a/tests/certs/Makefile.am b/tests/certs/Makefile.am index cd35bdf..ddb5c9f 100644 --- a/tests/certs/Makefile.am +++ b/tests/certs/Makefile.am @@ -40,6 +40,8 @@ CERTFILES = \ Server-localhost-sv.p12 \ Server-localhost-sv.pem \ Server-localhost-sv.prm \ + Server-localhost-sv.pub.der \ + Server-localhost-sv.pub.pem \ Server-localhost.nn-sv.crl \ Server-localhost.nn-sv.crt \ Server-localhost.nn-sv.csr \ @@ -48,6 +50,8 @@ CERTFILES = \ Server-localhost.nn-sv.key \ Server-localhost.nn-sv.pem \ Server-localhost.nn-sv.prm \ + Server-localhost.nn-sv.pub.der \ + Server-localhost.nn-sv.pub.pem \ Server-localhost0h-sv.crl \ Server-localhost0h-sv.crt \ Server-localhost0h-sv.csr \ @@ -56,7 +60,9 @@ CERTFILES = \ Server-localhost0h-sv.key \ Server-localhost0h-sv.p12 \ Server-localhost0h-sv.pem \ - Server-localhost0h-sv.prm + Server-localhost0h-sv.prm \ + Server-localhost0h-sv.pub.der \ + Server-localhost0h-sv.pub.pem SRPFILES = \ srp-verifier-conf \ diff --git a/tests/certs/Makefile.in b/tests/certs/Makefile.in index 3d71cc0..0610cae 100644 --- a/tests/certs/Makefile.in +++ b/tests/certs/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -218,6 +218,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -242,7 +243,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -251,7 +251,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -272,6 +271,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -307,11 +307,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -411,6 +413,8 @@ CERTFILES = \ Server-localhost-sv.p12 \ Server-localhost-sv.pem \ Server-localhost-sv.prm \ + Server-localhost-sv.pub.der \ + Server-localhost-sv.pub.pem \ Server-localhost.nn-sv.crl \ Server-localhost.nn-sv.crt \ Server-localhost.nn-sv.csr \ @@ -419,6 +423,8 @@ CERTFILES = \ Server-localhost.nn-sv.key \ Server-localhost.nn-sv.pem \ Server-localhost.nn-sv.prm \ + Server-localhost.nn-sv.pub.der \ + Server-localhost.nn-sv.pub.pem \ Server-localhost0h-sv.crl \ Server-localhost0h-sv.crt \ Server-localhost0h-sv.csr \ @@ -427,7 +433,9 @@ CERTFILES = \ Server-localhost0h-sv.key \ Server-localhost0h-sv.p12 \ Server-localhost0h-sv.pem \ - Server-localhost0h-sv.prm + Server-localhost0h-sv.prm \ + Server-localhost0h-sv.pub.der \ + Server-localhost0h-sv.pub.pem SRPFILES = \ srp-verifier-conf \ diff --git a/tests/certs/Server-localhost-sv.pub.der b/tests/certs/Server-localhost-sv.pub.der new file mode 100644 index 0000000000000000000000000000000000000000..7e89b51a146ecc576aa558373c92baf6391b27c3 GIT binary patch literal 162 zcmV;T0A2qufuAr91_>&LNQUg6z3DX$S1=lNVbWa*>m=YnWzZ{$VNSt%eQ+y1$E6S7D_}_R8nR Q(YR$ot7l{v0s{d60g(&LNQU-4;&%f20y{~+DT~$96y}K+9bDh?Ln$_m^AzcWPqH$khLF22tES+yu2oqX5 Q?|disKMM0ssI2 literal 0 HcmV?d00001 diff --git a/tests/certs/Server-localhost.nn-sv.pub.pem b/tests/certs/Server-localhost.nn-sv.pub.pem new file mode 100644 index 0000000..3131e95 --- /dev/null +++ b/tests/certs/Server-localhost.nn-sv.pub.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDT1E7bY1w/OjpeOAmU5k1wnQ2v +SeaCXQe39c2g369x8c+/1Zq9r3x4XVU/FL27LA5zndaCmtXm9iFdCJKicV+AX1zO +8MI3N3kPTT3U8oBtRzZF0dKLei4ScUtHhvWMma/nDs+1yU16dfeydAxB46u7LJ1v +VAgTWjrvfCf3PwsLcQIDAQAB +-----END PUBLIC KEY----- diff --git a/tests/certs/Server-localhost0h-sv.pub.der b/tests/certs/Server-localhost0h-sv.pub.der new file mode 100644 index 0000000000000000000000000000000000000000..2b071d3ad86fff7cf40733b98adee9ca43b7a148 GIT binary patch literal 162 zcmV;T0A2qufuAr91_>&LNQUL4$|utSr3`>l^)|H, et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ @@ -77,9 +99,9 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.inc $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs subdir = tests/data -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ $(top_srcdir)/m4/curl-confopts.m4 \ @@ -158,6 +180,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -182,7 +205,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -191,7 +213,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -212,6 +233,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -247,11 +269,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -347,6 +371,7 @@ test289 test290 test291 test292 test293 test294 test295 test296 test297 \ test298 test299 test300 test301 test302 test303 test304 test305 test306 \ test307 test308 test309 test310 test311 test312 test313 \ test320 test321 test322 test323 test324 \ +test325 \ test350 test351 test352 test353 test354 \ \ test400 test401 test402 test403 test404 test405 test406 test407 test408 \ @@ -367,18 +392,27 @@ test599 test600 test601 test602 test603 test604 test605 test606 test607 \ test608 test609 test610 test611 test612 test613 test614 test615 test616 \ test617 test618 test619 test620 test621 test622 test623 test624 test625 \ test626 test627 test628 test629 test630 test631 test632 test633 test634 \ -test635 test636 test637 test638 test639 \ +test635 test636 test637 test638 test639 test640 test641 \ \ test700 test701 test702 test703 test704 test705 test706 test707 test708 \ test709 test710 test711 test712 \ \ test800 test801 test802 test803 test804 test805 test806 test807 test808 \ -test809 \ +test809 test810 test811 test812 test813 test814 test815 test816 test817 \ +test818 test819 test820 test821 test822 test823 test824 test825 test826 \ +test827 test828 test829 test830 test831 test832 test833 test834 test835 \ +test836 \ \ -test850 test851 test852 test853 test854 test855 test856 test857 \ +test850 test851 test852 test853 test854 test855 test856 test857 test858 \ +test859 test860 test861 test862 test863 test864 test865 test866 test867 \ +test868 test869 test870 test871 test872 test873 test874 test875 test876 \ +test877 test878 test879 test880 test881 test882 \ \ test900 test901 test902 test903 test904 test905 test906 test907 test908 \ -test909 test910 test911 \ +test909 test910 test911 test912 test913 test914 test915 test916 test917 \ +test918 test919 test920 test921 test922 test923 test924 test925 test926 \ +test927 test928 test929 test930 test931 test932 test933 test934 test935 \ +test936 test937 test938 test939 test940 test941 \ \ test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \ test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \ @@ -396,18 +430,19 @@ test1096 test1097 test1098 test1099 test1100 test1101 test1102 test1103 \ test1104 test1105 test1106 test1107 test1108 test1109 test1110 test1111 \ test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \ test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \ -test1128 test1129 test1130 test1131 test1132 test1133 \ +test1128 test1129 test1130 test1131 test1132 test1133 test1134 \ \ test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \ test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \ test1216 test1217 test1218 test1219 \ test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \ -test1228 test1229 test1230 test1231 test1232 test1233 \ +test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \ +test1236 test1237 test1238 test1239 test1240 \ \ test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \ test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \ -test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \ -test1324 test1325 test1326 test1327 test1328 test1329 test1330 test1331 \ +test1316 test1317 test1318 test1319 test1320 test1321 \ + test1325 test1326 test1327 test1328 test1329 test1330 test1331 \ test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \ test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \ test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \ @@ -416,13 +451,24 @@ test1364 test1365 test1366 test1367 test1368 test1369 test1370 test1371 \ test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \ test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \ test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \ -test1396 \ +test1396 test1397 test1398 \ \ test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \ -test1408 test1409 test1410 test1412 test1413 test1414 \ +test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \ +test1416 test1417 test1418 test1419 test1420 \ +\ +test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \ +test1436 \ \ test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \ -test1508 test1509 test1510 test1511 test1512 \ +test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \ +test1516 \ +\ +test1520 \ +\ +test1525 test1526 test1527 test1528 test1529 \ +\ +test1800 test1801 \ \ test1900 test1901 test1902 test1903 \ \ @@ -430,13 +476,15 @@ test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \ test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \ test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \ -test2032 test2033 +test2032 test2033 test2034 test2035 test2036 test2037 test2038 + +# TESTCASES are taken from Makefile.inc EXTRA_DIST = $(TESTCASES) DISABLED all: all-am .SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -457,6 +505,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; +$(srcdir)/Makefile.inc: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc new file mode 100644 index 0000000..6467ca0 --- /dev/null +++ b/tests/data/Makefile.inc @@ -0,0 +1,164 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2015, 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 http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### + +# this list is in numerical order +TESTCASES = test1 test2 test3 test4 test5 test6 test7 test8 test9 \ +test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 \ +test20 test21 test22 test23 test24 test25 test26 test27 test28 test29 \ +test30 test31 test32 test33 test34 test35 test36 test37 test38 test39 \ +test40 test41 test42 test43 test44 test45 test46 test47 test48 test49 \ +test50 test51 test52 test53 test54 test55 test56 test57 test58 test59 \ +test60 test61 test62 test63 test64 test65 test66 test67 test68 test69 \ +test70 test71 test72 test73 test74 test75 test76 test77 test78 test79 \ +test80 test81 test82 test83 test84 test85 test86 test87 test88 test89 \ +test90 test91 test92 test93 test94 test95 test96 test97 test98 test99 \ +test100 test101 test102 test103 test104 test105 test106 test107 test108 \ +test109 test110 test111 test112 test113 test114 test115 test116 test117 \ +test118 test119 test120 test121 test122 test123 test124 test125 test126 \ +test127 test128 test129 test130 test131 test132 test133 test134 test135 \ +test136 test137 test138 test139 test140 test141 test142 test143 test144 \ +test145 test146 test147 test148 test149 test150 test151 test152 test153 \ +test154 test155 test156 test157 test158 test159 test160 test161 test162 \ +test163 test164 test165 test166 test167 test168 test169 test170 test171 \ +test172 test173 test174 test175 test176 test177 test178 test179 test180 \ +test181 test182 test183 test184 test185 test186 test187 test188 test189 \ +test190 test191 test192 test193 test194 test195 test196 test197 test198 \ +test199 test200 test201 test202 test203 test204 test205 test206 test207 \ +test208 test209 test210 test211 test212 test213 test214 test215 test216 \ +test217 test218 test220 test221 test222 test223 test224 test225 \ +test226 test227 test228 test229 test231 test233 test234 \ +test235 test236 test237 test238 test239 test240 test241 test242 test243 \ + test245 test246 test247 test248 test249 test250 test251 test252 \ +test253 test254 test255 test256 test257 test258 test259 test260 test261 \ +test262 test263 test264 test265 test266 test267 test268 test269 test270 \ +test271 test272 test273 test274 test275 test276 test277 test278 test279 \ +test280 test281 test282 test283 test284 test285 test286 test287 test288 \ +test289 test290 test291 test292 test293 test294 test295 test296 test297 \ +test298 test299 test300 test301 test302 test303 test304 test305 test306 \ +test307 test308 test309 test310 test311 test312 test313 \ + test320 test321 test322 test323 test324 \ +test325 \ +test350 test351 test352 test353 test354 \ +\ +test400 test401 test402 test403 test404 test405 test406 test407 test408 \ +test409 \ +\ +test500 test501 test502 test503 test504 test505 test506 test507 test508 \ +test509 test510 test511 test512 test513 test514 test515 test516 test517 \ +test518 test519 test520 test521 test522 test523 test524 test525 test526 \ +test527 test528 test529 test530 test531 test532 test533 test534 test535 \ +test536 test537 test538 test539 test540 test541 test542 test543 test544 \ +test545 test546 test547 test548 test549 test550 test551 test552 test553 \ +test554 test555 test556 test557 test558 test560 test561 test562 \ +test563 test564 test565 test566 test567 test568 test569 test570 test571 \ +test572 test573 test574 test575 test576 test578 test579 test580 \ +test581 test582 test583 test584 test585 test586 test587 test588 \ +test590 test591 test592 test593 test594 test595 test596 test597 test598 \ +test599 test600 test601 test602 test603 test604 test605 test606 test607 \ +test608 test609 test610 test611 test612 test613 test614 test615 test616 \ +test617 test618 test619 test620 test621 test622 test623 test624 test625 \ +test626 test627 test628 test629 test630 test631 test632 test633 test634 \ +test635 test636 test637 test638 test639 test640 test641 \ +\ +test700 test701 test702 test703 test704 test705 test706 test707 test708 \ +test709 test710 test711 test712 \ +\ +test800 test801 test802 test803 test804 test805 test806 test807 test808 \ +test809 test810 test811 test812 test813 test814 test815 test816 test817 \ +test818 test819 test820 test821 test822 test823 test824 test825 test826 \ +test827 test828 test829 test830 test831 test832 test833 test834 test835 \ +test836 \ +\ +test850 test851 test852 test853 test854 test855 test856 test857 test858 \ +test859 test860 test861 test862 test863 test864 test865 test866 test867 \ +test868 test869 test870 test871 test872 test873 test874 test875 test876 \ +test877 test878 test879 test880 test881 test882 \ +\ +test900 test901 test902 test903 test904 test905 test906 test907 test908 \ +test909 test910 test911 test912 test913 test914 test915 test916 test917 \ +test918 test919 test920 test921 test922 test923 test924 test925 test926 \ +test927 test928 test929 test930 test931 test932 test933 test934 test935 \ +test936 test937 test938 test939 test940 test941 \ +\ +test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \ +test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \ +test1016 test1017 test1018 test1019 test1020 test1021 test1022 test1023 \ +test1024 test1025 test1026 test1027 test1028 test1029 test1030 test1031 \ +test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 \ +test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 \ +test1048 test1049 test1050 test1051 test1052 test1053 test1054 test1055 \ +test1056 test1057 test1058 test1059 test1060 test1061 test1062 test1063 \ +test1064 test1065 test1066 test1067 test1068 test1069 test1070 test1071 \ +test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 \ +test1080 test1081 test1082 test1083 test1084 test1085 test1086 test1087 \ +test1088 test1089 test1090 test1091 test1092 test1093 test1094 test1095 \ +test1096 test1097 test1098 test1099 test1100 test1101 test1102 test1103 \ +test1104 test1105 test1106 test1107 test1108 test1109 test1110 test1111 \ +test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \ +test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \ +test1128 test1129 test1130 test1131 test1132 test1133 test1134 \ +\ +test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \ +test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \ +test1216 test1217 test1218 test1219 \ +test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \ +test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \ +test1236 test1237 test1238 test1239 test1240 \ +\ +test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \ +test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \ +test1316 test1317 test1318 test1319 test1320 test1321 \ + test1325 test1326 test1327 test1328 test1329 test1330 test1331 \ +test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \ +test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \ +test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \ +test1356 test1357 test1358 test1359 test1360 test1361 test1362 test1363 \ +test1364 test1365 test1366 test1367 test1368 test1369 test1370 test1371 \ +test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \ +test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \ +test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \ +test1396 test1397 test1398 \ +\ +test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \ +test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \ +test1416 test1417 test1418 test1419 test1420 \ +\ +test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \ +test1436 \ +\ +test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \ +test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \ +test1516 \ +\ +test1520 \ +\ +test1525 test1526 test1527 test1528 test1529 \ +\ +test1800 test1801 \ +\ +test1900 test1901 test1902 test1903 \ +\ +test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \ +test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \ +test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \ +test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \ +test2032 test2033 test2034 test2035 test2036 test2037 test2038 diff --git a/tests/data/test100 b/tests/data/test100 index 6127163..72f9c85 100644 --- a/tests/data/test100 +++ b/tests/data/test100 @@ -11,11 +11,11 @@ LIST # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. -drwxr-xr-x 2 98 98 512 May 2 1996 .NeXT +drwxr-xr-x 2 98 98 512 May 2 1996 curl-releases -r--r--r-- 1 0 1 35 Jul 16 1996 README lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev @@ -23,7 +23,7 @@ drwxrwxrwx 2 98 98 512 May 29 16:04 download.html dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr - + # @@ -36,7 +36,7 @@ ftp FTP dir list PASV -ftp://%HOSTIP:%FTPPORT/ +ftp://%HOSTIP:%FTPPORT/test-100/ @@ -47,6 +47,7 @@ ftp://%HOSTIP:%FTPPORT/ USER anonymous PASS ftp@example.com PWD +CWD test-100 EPSV TYPE A LIST diff --git a/tests/data/test1001 b/tests/data/test1001 index 9a87d6e..4adbd89 100644 --- a/tests/data/test1001 +++ b/tests/data/test1001 @@ -63,6 +63,10 @@ ok http + +!SSPI +crypto + HTTP POST --digest with PUT and resumed upload and modified method @@ -87,7 +91,6 @@ Host: %HOSTIP:%HTTPPORT Accept: */* Proxy-Connection: Keep-Alive Content-Length: 0 -Expect: 100-continue GET http://%HOSTIP:%HTTPPORT/1001 HTTP/1.1 Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1001", response="6af4d89c952f4dd4cc215a6878dc499d" diff --git a/tests/data/test1002 b/tests/data/test1002 index 04c18f9..4c3bf16 100644 --- a/tests/data/test1002 +++ b/tests/data/test1002 @@ -62,6 +62,10 @@ ok http + +!SSPI +crypto + HTTP POST --digest with PUT and resumed upload and modified method, twice @@ -86,7 +90,6 @@ Host: %HOSTIP:%HTTPPORT Accept: */* Proxy-Connection: Keep-Alive Content-Length: 0 -Expect: 100-continue GET http://%HOSTIP:%HTTPPORT/1002.upload1 HTTP/1.1 Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload1", response="198aa9b6acb4b0c71d02a197a5e41f54" diff --git a/tests/data/test1008 b/tests/data/test1008 index 30714f9..bcc503e 100644 --- a/tests/data/test1008 +++ b/tests/data/test1008 @@ -85,6 +85,8 @@ http NTLM +!SSPI +debug HTTP proxy CONNECT auth NTLM with chunked-encoded 407 response @@ -96,7 +98,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://test.remote.example.com.1008:%HTTPPORT/path/10080002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel +http://test.remote.example.com.1008:%HTTPPORT/path/10080002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm --proxytunnel chkhostname curlhost @@ -116,7 +118,7 @@ Proxy-Connection: Keep-Alive CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1 Host: test.remote.example.com.1008:%HTTPPORT -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== Proxy-Connection: Keep-Alive GET /path/10080002 HTTP/1.1 diff --git a/tests/data/test101 b/tests/data/test101 index 815292b..09faade 100644 --- a/tests/data/test101 +++ b/tests/data/test101 @@ -10,7 +10,7 @@ LIST # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1010 b/tests/data/test1010 index 1f8bf3a..a51d68a 100644 --- a/tests/data/test1010 +++ b/tests/data/test1010 @@ -11,7 +11,7 @@ LIST # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1021 b/tests/data/test1021 index 8112724..3ac9e12 100644 --- a/tests/data/test1021 +++ b/tests/data/test1021 @@ -91,6 +91,8 @@ http NTLM +!SSPI +debug HTTP proxy CONNECT with any proxyauth and proxy offers NTLM and close @@ -102,7 +104,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://test.remote.example.com.1021:%HTTPPORT/path/10210002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-anyauth --proxytunnel +http://test.remote.example.com.1021:%HTTPPORT/path/10210002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-anyauth --proxytunnel chkhostname curlhost @@ -126,7 +128,7 @@ Proxy-Connection: Keep-Alive CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1 Host: test.remote.example.com.1021:%HTTPPORT -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== Proxy-Connection: Keep-Alive GET /path/10210002 HTTP/1.1 diff --git a/tests/data/test1029 b/tests/data/test1029 index 9c2bc5f..2ffc7c6 100644 --- a/tests/data/test1029 +++ b/tests/data/test1029 @@ -12,11 +12,11 @@ followlocation # Server-side -HTTP/1.1 301 This is a weirdo text message swsclose -Location: data/10290002.txt?coolsite=yes -Content-Length: 62 -Connection: close - +HTTP/1.1 301 This is a weirdo text message swsclose +Location: data/10290002.txt?coolsite=yes +Content-Length: 62 +Connection: close + This server reply is for testing a simple Location: following @@ -45,12 +45,12 @@ Host: %HOSTIP:%HTTPPORT Accept: */* - -HTTP/1.1 301 This is a weirdo text message swsclose -Location: data/10290002.txt?coolsite=yes -Content-Length: 62 -Connection: close - + +HTTP/1.1 301 This is a weirdo text message swsclose +Location: data/10290002.txt?coolsite=yes +Content-Length: 62 +Connection: close + This server reply is for testing a simple Location: following http://%HOSTIP:%HTTPPORT/we/want/our/data/10290002.txt?coolsite=yes diff --git a/tests/data/test1030 b/tests/data/test1030 index d05a092..a0f215d 100644 --- a/tests/data/test1030 +++ b/tests/data/test1030 @@ -60,6 +60,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test1032 b/tests/data/test1032 index 614cdbf..5691864 100644 --- a/tests/data/test1032 +++ b/tests/data/test1032 @@ -3,7 +3,7 @@ HTTP HTTP HEAD -range +Range diff --git a/tests/data/test1041 b/tests/data/test1041 index fa1692c..c0d23c6 100644 --- a/tests/data/test1041 +++ b/tests/data/test1041 @@ -12,7 +12,7 @@ Content-Range # Server-side -HTTP/1.1 OK swsclose +HTTP/1.1 200 OK swsclose Date: Thu, 09 Nov 2010 14:49:00 GMT Server: test-server/fake Accept-Ranges: bytes diff --git a/tests/data/test1042 b/tests/data/test1042 index d532120..f9a2255 100644 --- a/tests/data/test1042 +++ b/tests/data/test1042 @@ -56,10 +56,10 @@ Content-Type: text/plain http -HTTP GET from end of entirely-downloaded file, no server resume +HTTP GET beyond end of entirely-downloaded file, no server resume -http://%HOSTIP:%HTTPPORT/1042 -C - +http://%HOSTIP:%HTTPPORT/1042 -C 200 012345678 @@ -85,7 +85,7 @@ http://%HOSTIP:%HTTPPORT/1042 -C - GET /1042 HTTP/1.1 -Range: bytes=100- +Range: bytes=200- Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test1047 b/tests/data/test1047 index 421708c..028a8a6 100644 --- a/tests/data/test1047 +++ b/tests/data/test1047 @@ -13,7 +13,7 @@ LIST # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1048 b/tests/data/test1048 index cba99ba..c303473 100644 --- a/tests/data/test1048 +++ b/tests/data/test1048 @@ -2,6 +2,8 @@ FTP +FTP-ipv6 +IPv6 PASV LIST --interface diff --git a/tests/data/test1060 b/tests/data/test1060 index e303a89..e4aea65 100644 --- a/tests/data/test1060 +++ b/tests/data/test1060 @@ -868,6 +868,7 @@ daniel http +!SSPI crypto diff --git a/tests/data/test1061 b/tests/data/test1061 index a1d7286..a55a272 100644 --- a/tests/data/test1061 +++ b/tests/data/test1061 @@ -873,6 +873,7 @@ daniel http +!SSPI crypto diff --git a/tests/data/test1071 b/tests/data/test1071 index 758457a..d338e2c 100644 --- a/tests/data/test1071 +++ b/tests/data/test1071 @@ -66,6 +66,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test1079 b/tests/data/test1079 index c188e79..24cd20d 100644 --- a/tests/data/test1079 +++ b/tests/data/test1079 @@ -42,6 +42,7 @@ Content-Length: 26 http +!SSPI crypto diff --git a/tests/data/test1080 b/tests/data/test1080 index ae37fb7..e0f7d62 100644 --- a/tests/data/test1080 +++ b/tests/data/test1080 @@ -49,7 +49,7 @@ Host: %HOSTIP:%HTTPPORT Accept: */* - + HTTP/1.1 301 This is a weirdo text message swsclose Location: data/10800002.txt?coolsite=yes Content-Length: 62 diff --git a/tests/data/test1081 b/tests/data/test1081 index d290020..d9f895f 100644 --- a/tests/data/test1081 +++ b/tests/data/test1081 @@ -57,7 +57,7 @@ Host: %HOSTIP:%HTTPPORT Accept: */* - + HTTP/1.1 301 This is a weirdo text message swsclose Location: data/10810099.txt?coolsite=yes Content-Length: 62 diff --git a/tests/data/test1086 b/tests/data/test1086 index 402e1f9..354b2e0 100644 --- a/tests/data/test1086 +++ b/tests/data/test1086 @@ -6,6 +6,7 @@ EPSV RETR timeout FAILURE +flaky diff --git a/tests/data/test1095 b/tests/data/test1095 index d401b52..a442120 100644 --- a/tests/data/test1095 +++ b/tests/data/test1095 @@ -52,6 +52,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test1097 b/tests/data/test1097 index b899810..3b733a5 100644 --- a/tests/data/test1097 +++ b/tests/data/test1097 @@ -47,6 +47,7 @@ https NTLM +!SSPI HTTP POST using CONNECT with --proxy-ntlm but no auth is required diff --git a/tests/data/test1098 b/tests/data/test1098 index b5c45cb..9805648 100644 --- a/tests/data/test1098 +++ b/tests/data/test1098 @@ -11,10 +11,10 @@ CURLOPT_PROXY # Server-side -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Content-Length: 6 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 6 + hello @@ -57,16 +57,16 @@ Accept: */* Proxy-Connection: Keep-Alive - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Content-Length: 6 - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 6 + hello -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Content-Length: 6 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 6 + hello diff --git a/tests/data/test1099 b/tests/data/test1099 index f81e601..cde4039 100644 --- a/tests/data/test1099 +++ b/tests/data/test1099 @@ -38,7 +38,7 @@ opcode: 1 filename: /1099 mode: octet - + data for 1099 diff --git a/tests/data/test1100 b/tests/data/test1100 index e38c0e0..10fa25d 100644 --- a/tests/data/test1100 +++ b/tests/data/test1100 @@ -63,6 +63,8 @@ This is the final page ! NTLM +!SSPI +debug http @@ -99,7 +101,7 @@ Content-Length: 0 Content-Type: application/x-www-form-urlencoded POST /1100 HTTP/1.1 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test1105 b/tests/data/test1105 index 25f194c..9564775 100644 --- a/tests/data/test1105 +++ b/tests/data/test1105 @@ -59,8 +59,7 @@ userid=myname&password=mypassword # This file was generated by libcurl! Edit at your own risk. 127.0.0.1 FALSE /we/want/ FALSE 0 foobar name -.127.0.0.1 TRUE "/silly/" FALSE 0 mismatch this -.0.0.1 TRUE / FALSE 0 partmatch present +127.0.0.1 FALSE "/silly/" FALSE 0 mismatch this diff --git a/tests/data/test1112 b/tests/data/test1112 index 9307d93..849f671 100644 --- a/tests/data/test1112 +++ b/tests/data/test1112 @@ -89,7 +89,7 @@ ftps FTPS download with strict timeout and slow data transfer --k --ftp-ssl-control ftps://%HOSTIP:%FTPSPORT/1112 -m 7 +-k --ftp-ssl-control ftps://%HOSTIP:%FTPSPORT/1112 -m 16 diff --git a/tests/data/test1113 b/tests/data/test1113 index 4d692ae..8d10975 100644 --- a/tests/data/test1113 +++ b/tests/data/test1113 @@ -6,13 +6,14 @@ RETR LIST wildcardmatch ftplistparser +flaky # # Server-side - + @@ -82,7 +83,7 @@ EPSV RETR someothertext.txt QUIT - + This file should have permissions 444 This file should have permissions 666 This file should have permissions 777 diff --git a/tests/data/test1114 b/tests/data/test1114 index 8eee429..573eda4 100644 --- a/tests/data/test1114 +++ b/tests/data/test1114 @@ -34,7 +34,7 @@ ftp://%HOSTIP:%FTPPORT/fully_simulated/DOS/* 0 - + ============================================================= Remains: 12 Filename: . diff --git a/tests/data/test1115 b/tests/data/test1115 index 0f294d4..f9d6e36 100644 --- a/tests/data/test1115 +++ b/tests/data/test1115 @@ -29,9 +29,6 @@ Content-Length: 0 http - -crypto - HTTP GET with unexpected 1xx response diff --git a/tests/data/test1119 b/tests/data/test1119 index 4b5a9ec..017f598 100644 --- a/tests/data/test1119 +++ b/tests/data/test1119 @@ -1,6 +1,7 @@ +source analysis symbols-in-versions diff --git a/tests/data/test1123 b/tests/data/test1123 index 3172fed..bd441a9 100644 --- a/tests/data/test1123 +++ b/tests/data/test1123 @@ -4,6 +4,7 @@ HTTP HTTP GET compressed +Transfer-Encoding # diff --git a/tests/data/test1124 b/tests/data/test1124 index d860bee..58f63f9 100644 --- a/tests/data/test1124 +++ b/tests/data/test1124 @@ -5,7 +5,7 @@ HTTP HTTP GET compressed Transfer-Encoding -chunked +chunked Transfer-Encoding # diff --git a/tests/data/test1132 b/tests/data/test1132 index 366ffc7..8aa6432 100644 --- a/tests/data/test1132 +++ b/tests/data/test1132 @@ -1,6 +1,7 @@ +source analysis memory-includes diff --git a/tests/data/test1133 b/tests/data/test1133 index 7337931..8b016fc 100644 --- a/tests/data/test1133 +++ b/tests/data/test1133 @@ -40,7 +40,7 @@ foo # Verify data after the test has been "shot" -^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed, boundary=|-------).* +^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).* POST /we/want/1133 HTTP/1.1 @@ -71,7 +71,7 @@ foo ------------------------------24e78000bd32 Content-Disposition: form-data; name="file3" -Content-Type: multipart/mixed, boundary=----------------------------7f0e85a48b0b +Content-Type: multipart/mixed; boundary=----------------------------7f0e85a48b0b Content-Disposition: attachment; filename="test1133,a\"nd;.txt" Content-Type: m/f diff --git a/tests/data/test1134 b/tests/data/test1134 new file mode 100644 index 0000000..f8db6eb --- /dev/null +++ b/tests/data/test1134 @@ -0,0 +1,65 @@ + + + +HTTP +HTTP HEAD +-G + + +# +# Server-side + + +connection-monitor + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 10 + +contents1 + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 10 + +contents2 + + + +# +# Client-side + + +http + + +HTTP connection re-use with different credentials + + +http://%HOSTIP:%HTTPPORT/1134 -u user1:password1 --next http://%HOSTIP:%HTTPPORT/11340001 -u 2user:password2 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1134 HTTP/1.1 +Authorization: Basic dXNlcjE6cGFzc3dvcmQx +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /11340001 HTTP/1.1 +Authorization: Basic MnVzZXI6cGFzc3dvcmQy +Host: %HOSTIP:%HTTPPORT +Accept: */* + +[DISCONNECT] + + + diff --git a/tests/data/test116 b/tests/data/test116 index 9a36f97..2ed4ab0 100644 --- a/tests/data/test116 +++ b/tests/data/test116 @@ -2,6 +2,7 @@ FTP +EPRT PORT FAILURE EPRT refused diff --git a/tests/data/test1212 b/tests/data/test1212 index 9d92a8d..3fd8fdd 100644 --- a/tests/data/test1212 +++ b/tests/data/test1212 @@ -1,12 +1,13 @@ -Proxy -Socks Proxy +HTTP +SOCKS5 NO_PROXY noproxy + # Server-side diff --git a/tests/data/test1215 b/tests/data/test1215 index ea62eeb..d49f71f 100644 --- a/tests/data/test1215 +++ b/tests/data/test1215 @@ -58,6 +58,8 @@ Finally, this is the real page! NTLM +!SSPI +debug http @@ -93,7 +95,7 @@ Accept: */* Proxy-Connection: Keep-Alive GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.30.0-DEV Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test1220 b/tests/data/test1220 index d365249..959abbf 100644 --- a/tests/data/test1220 +++ b/tests/data/test1220 @@ -1,4 +1,11 @@ + + +FILE +URL + + + # Server-side diff --git a/tests/data/test1221 b/tests/data/test1221 index a0e3d74..261cb8c 100644 --- a/tests/data/test1221 +++ b/tests/data/test1221 @@ -1,4 +1,11 @@ + + +build system +source analysis + + + # # Client-side @@ -19,7 +26,7 @@ none - + Testing curl_10char_object_name... result: 16AFKPQRST expected: 16AFKPQRST input: 123__678__ABC__FGH__KLM__PQRSTUV diff --git a/tests/data/test1222 b/tests/data/test1222 index 0df8bde..51edc97 100644 --- a/tests/data/test1222 +++ b/tests/data/test1222 @@ -1,4 +1,11 @@ + + +build system +source analysis + + + # # Client-side @@ -17,9 +24,9 @@ none # # Verify data after the test has been "shot" - + - + Testing curl_8char_object_name... result: 16AFKPQR expected: 16AFKPQR input: 123__678__ABC__FGH__KLM__PQRSTUV diff --git a/tests/data/test1228 b/tests/data/test1228 index f0313ce..a7e56a7 100644 --- a/tests/data/test1228 +++ b/tests/data/test1228 @@ -4,7 +4,7 @@ HTTP HTTP GET HTTP proxy -cookies +cookies cookie path diff --git a/tests/data/test1229 b/tests/data/test1229 index dcb55e8..77e7e8c 100644 --- a/tests/data/test1229 +++ b/tests/data/test1229 @@ -52,6 +52,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test1230 b/tests/data/test1230 index a071850..3c1d3d4 100644 --- a/tests/data/test1230 +++ b/tests/data/test1230 @@ -3,10 +3,11 @@ HTTP HTTP CONNECT +HTTP proxy IPv6 - + # # Server-side @@ -55,7 +56,7 @@ HTTP CONNECT to IPv6 numerical address # 0x4ce == 1230, the test number --g http://[1234:1234:1234::4ce]:%HTTPPORT/wanted/page/1230 -p -x %HOSTIP:%HTTPPORT +http://[1234:1234:1234::4ce]:%HTTPPORT/wanted/page/1230 -p -x %HOSTIP:%HTTPPORT diff --git a/tests/data/test1234 b/tests/data/test1234 new file mode 100644 index 0000000..41c4bc0 --- /dev/null +++ b/tests/data/test1234 @@ -0,0 +1,33 @@ + + + +globbing +{} list +FAILURE + + +# Server-side + + + +# Client-side + + +none + + +abusing {}-globbing + + +"%HOSTIP:%HTTPPORT/1234[0-1]{" "%HOSTIP:%HTTPPORT/{}{}{}{" + + + +# Verify data after the test has been "shot" + +# 3 == CURLE_URL_MALFORMAT + +3 + + + diff --git a/tests/data/test1235 b/tests/data/test1235 new file mode 100644 index 0000000..9e51219 --- /dev/null +++ b/tests/data/test1235 @@ -0,0 +1,95 @@ + + + +HTTP +HTTP GET +globbing +{} list + + +# Server-side + + +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 15 + +the number one + + +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 16 + +two is nice too + + + +# Client-side + + +http + + +multiple requests using {}{} in the URL + + +"%HOSTIP:%HTTPPORT/{1235,1235}{0001,0002}" + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /12350001 HTTP/1.1 +User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled) +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /12350002 HTTP/1.1 +User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled) +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /12350001 HTTP/1.1 +User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled) +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /12350002 HTTP/1.1 +User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled) +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +--_curl_--%HOSTIP:%HTTPPORT/12350001 +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 15 + +the number one +--_curl_--%HOSTIP:%HTTPPORT/12350002 +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 16 + +two is nice too +--_curl_--%HOSTIP:%HTTPPORT/12350001 +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 15 + +the number one +--_curl_--%HOSTIP:%HTTPPORT/12350002 +HTTP/1.1 200 OK +Funny-head: yesyes +Content-Length: 16 + +two is nice too + + + diff --git a/tests/data/test1236 b/tests/data/test1236 new file mode 100644 index 0000000..0829be3 --- /dev/null +++ b/tests/data/test1236 @@ -0,0 +1,33 @@ + + + +globbing +FAILURE + + +# Server-side + + + +# Client-side + + +none + + +[] globbing overflowing the range counter + +# 2^62 == 4611686018427387904 + +"%HOSTIP:%HTTPPORT/1234[0-1]{" "%HOSTIP:%HTTPPORT/[1-4611686018427387904][1-4611686018427387904]" + + + +# Verify data after the test has been "shot" + +# 3 == CURLE_URL_MALFORMAT + +3 + + + diff --git a/tests/data/test1237 b/tests/data/test1237 new file mode 100644 index 0000000..68f023d --- /dev/null +++ b/tests/data/test1237 @@ -0,0 +1,47 @@ + + + +HTTP +HTTP Basic auth + + +# Server-side + + +HTTP/1.1 200 OK +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + +-foo- + + + +# Client-side + + +http + + +URL with 1000+ letter user name + password + + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@%HOSTIP:%HTTPPORT/1237" + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1237 HTTP/1.1 +Authorization: Basic QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI= +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1238 b/tests/data/test1238 new file mode 100644 index 0000000..1859339 --- /dev/null +++ b/tests/data/test1238 @@ -0,0 +1,49 @@ + + + +TFTP +TFTP RRQ + + + +# +# Server-side + + +writedelay: 1 + +# ~1200 bytes (so that they don't fit in two 512 byte chunks) + +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 + + + +# +# Client-side + + +tftp + + +slow TFTP retrieve cancel due to -Y and -y + +# if less than 1000 bytes/sec within 2 seconds, abort! + +tftp://%HOSTIP:%TFTPPORT//1238 -Y1000 -y2 + + + +# +# Verify pseudo protocol after the test has been "shot" + + +opcode: 1 +filename: /1238 +mode: octet + +# 28 = CURLE_OPERATION_TIMEDOUT + +28 + + + diff --git a/tests/data/test1239 b/tests/data/test1239 new file mode 100644 index 0000000..b3503d9 --- /dev/null +++ b/tests/data/test1239 @@ -0,0 +1,68 @@ + + + +HTTP +HTTP GET +-z + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2010 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html + +-foo- + + + +# +# Client-side + + +http + + +HTTP with -z + -w response_code and simulated 304 + + +http://%HOSTIP:%HTTPPORT/1239 -z "-dec 12 12:00:00 1999 GMT" -w '%{response_code}' + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1239 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +If-Unmodified-Since: Sun, 12 Dec 1999 12:00:00 GMT + + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2010 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html + +304 + + + diff --git a/tests/data/test1240 b/tests/data/test1240 new file mode 100644 index 0000000..6435950 --- /dev/null +++ b/tests/data/test1240 @@ -0,0 +1,48 @@ + + + +globbing +HTTP + + +# Server-side + + +HTTP/1.1 200 OK +Content-Length: 6 +Connection: close + +-foo- + + + +# Client-side + + +http + + +glob [0-1] with stuff after range (7.33.0 regression) + + +"%HOSTIP:%HTTPPORT/0[0-1]/1240" + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /00/1240 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /01/1240 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test130 b/tests/data/test130 index dcc46fc..827b1a0 100644 --- a/tests/data/test130 +++ b/tests/data/test130 @@ -12,7 +12,7 @@ netrc # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1309 b/tests/data/test1309 index 0a44a91..c2f67ff 100644 --- a/tests/data/test1309 +++ b/tests/data/test1309 @@ -24,7 +24,7 @@ unit1309 - + Result: 0.1013[3] 0.1003[2] diff --git a/tests/data/test131 b/tests/data/test131 index 86501c6..6e99d8a 100644 --- a/tests/data/test131 +++ b/tests/data/test131 @@ -13,7 +13,7 @@ netrc # # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1316 b/tests/data/test1316 index 51f58c2..d6ea5e1 100644 --- a/tests/data/test1316 +++ b/tests/data/test1316 @@ -21,7 +21,7 @@ Magic: sure you can FTP me # When doing LIST, we get the default list output hard-coded in the test # FTP server - + HTTP/1.1 200 Mighty fine indeed Magic: sure you can FTP me @@ -54,6 +54,9 @@ dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr ftp http-proxy + +http + FTP LIST tunneled through HTTP proxy diff --git a/tests/data/test1319 b/tests/data/test1319 index 7818503..0520b1b 100644 --- a/tests/data/test1319 +++ b/tests/data/test1319 @@ -51,6 +51,9 @@ body pop3 http-proxy + +http + POP3 fetch tunneled through HTTP proxy diff --git a/tests/data/test132 b/tests/data/test132 index ed96953..51cb89c 100644 --- a/tests/data/test132 +++ b/tests/data/test132 @@ -12,7 +12,7 @@ netrc # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1320 b/tests/data/test1320 index 15ec7bb..7a15f80 100644 --- a/tests/data/test1320 +++ b/tests/data/test1320 @@ -25,8 +25,11 @@ smtp: sure hit me smtp http-proxy + +http + -SMTP send tunneled trough HTTP proxy +SMTP send tunneled through HTTP proxy From: different @@ -35,7 +38,7 @@ To: another body -smtp://smtp.1320:%SMTPPORT/user --mail-rcpt 1320@foo --mail-rcpt 1320@foobar.example --mail-from 1320@from -T - -p -x %HOSTIP:%PROXYPORT +smtp://smtp.1320:%SMTPPORT/1320 --mail-rcpt recipient@example.com --mail-from sender@example.com -T - -p -x %HOSTIP:%PROXYPORT @@ -46,10 +49,9 @@ smtp://smtp.1320:%SMTPPORT/user --mail-rcpt 1320@foo --mail-rcpt 1320@foobar.exa ^User-Agent: curl/.* -EHLO user -MAIL FROM:<1320@from> -RCPT TO:<1320@foo> -RCPT TO:<1320@foobar.example> +EHLO 1320 +MAIL FROM: +RCPT TO: DATA QUIT diff --git a/tests/data/test1321 b/tests/data/test1321 index bfa31e0..266fd88 100644 --- a/tests/data/test1321 +++ b/tests/data/test1321 @@ -47,6 +47,9 @@ body imap http-proxy + +http + IMAP FETCH tunneled through HTTP proxy diff --git a/tests/data/test1325 b/tests/data/test1325 index 2b98d6a..9f5ee58 100644 --- a/tests/data/test1325 +++ b/tests/data/test1325 @@ -1,5 +1,5 @@ -# http://greenbytes.de/tech/webdav/draft-reschke-http-status-308-latest.html +# http://greenbytes.de/tech/webdav/draft-reschke-http-status-308-latest.html HTTP diff --git a/tests/data/test1328 b/tests/data/test1328 index c3991ec..0608888 100644 --- a/tests/data/test1328 +++ b/tests/data/test1328 @@ -3,7 +3,8 @@ HTTP HTTP GET --f +globbing +--fail diff --git a/tests/data/test133 b/tests/data/test133 index 085092d..0b4d2ff 100644 --- a/tests/data/test133 +++ b/tests/data/test133 @@ -12,7 +12,7 @@ netrc # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1330 b/tests/data/test1330 index 2aba0ce..1fb5a66 100644 --- a/tests/data/test1330 +++ b/tests/data/test1330 @@ -36,7 +36,7 @@ nothing # # Verify data after the test has been "shot" - + MEM unit1330.c: malloc() MEM unit1330.c: free() diff --git a/tests/data/test1331 b/tests/data/test1331 index 406cb9e..6896856 100644 --- a/tests/data/test1331 +++ b/tests/data/test1331 @@ -1,8 +1,8 @@ + # Test case inspired by this question on stackoverflow: # # http://stackoverflow.com/questions/10017165/use-libcurl-with-bluecoat-cookie-proxy # - HTTP diff --git a/tests/data/test1332 b/tests/data/test1332 index 1850ece..3447b2d 100644 --- a/tests/data/test1332 +++ b/tests/data/test1332 @@ -1,5 +1,5 @@ -# test case cloned from 1076 and then 302 was replaced with 303 +# test case cloned from 1076 and then 302 was replaced with 303 HTTP diff --git a/tests/data/test1334 b/tests/data/test1334 index 93c939f..59116e3 100644 --- a/tests/data/test1334 +++ b/tests/data/test1334 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -55,21 +55,21 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1335 b/tests/data/test1335 index 3f43c7a..bb499e7 100644 --- a/tests/data/test1335 +++ b/tests/data/test1335 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -55,18 +55,18 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test1336 b/tests/data/test1336 index 9e8aca3..ebe562b 100644 --- a/tests/data/test1336 +++ b/tests/data/test1336 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1336; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1336; charset=funny; option=strange + 12345 @@ -59,22 +59,22 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1336; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1336; charset=funny; option=strange + - + diff --git a/tests/data/test1337 b/tests/data/test1337 index 4044190..80a99fa 100644 --- a/tests/data/test1337 +++ b/tests/data/test1337 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1337; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1337; charset=funny; option=strange + 12345 @@ -59,19 +59,19 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1337; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1337; charset=funny; option=strange + diff --git a/tests/data/test1338 b/tests/data/test1338 index 8a1b395..d96f804 100644 --- a/tests/data/test1338 +++ b/tests/data/test1338 @@ -10,13 +10,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -56,21 +56,21 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1339 b/tests/data/test1339 index 06106ad..a3c1f0e 100644 --- a/tests/data/test1339 +++ b/tests/data/test1339 @@ -10,13 +10,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -56,18 +56,18 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test134 b/tests/data/test134 index 8a3ba62..e314b66 100644 --- a/tests/data/test134 +++ b/tests/data/test134 @@ -12,7 +12,7 @@ netrc # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test1340 b/tests/data/test1340 index ad26bba..81f1ed6 100644 --- a/tests/data/test1340 +++ b/tests/data/test1340 @@ -10,14 +10,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1340; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1340; charset=funny; option=strange + 12345 @@ -57,19 +57,19 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1340; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1340; charset=funny; option=strange + diff --git a/tests/data/test1341 b/tests/data/test1341 index 013a888..b364ede 100644 --- a/tests/data/test1341 +++ b/tests/data/test1341 @@ -10,14 +10,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1341; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1341; charset=funny; option=strange + 12345 @@ -57,19 +57,19 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1341; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1341; charset=funny; option=strange + curl: Saved to filename '%PWD/log/name1341' diff --git a/tests/data/test1342 b/tests/data/test1342 index 7820663..1d7889d 100644 --- a/tests/data/test1342 +++ b/tests/data/test1342 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -55,28 +55,28 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1343 b/tests/data/test1343 index 904a379..a05cab0 100644 --- a/tests/data/test1343 +++ b/tests/data/test1343 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -55,25 +55,25 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test1344 b/tests/data/test1344 index 145305d..ac354f0 100644 --- a/tests/data/test1344 +++ b/tests/data/test1344 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1344; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1344; charset=funny; option=strange + 12345 @@ -59,30 +59,30 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1344; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1344; charset=funny; option=strange + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1344; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1344; charset=funny; option=strange + - + diff --git a/tests/data/test1345 b/tests/data/test1345 index 7d53728..6d1201e 100644 --- a/tests/data/test1345 +++ b/tests/data/test1345 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1345; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1345; charset=funny; option=strange + 12345 @@ -59,27 +59,27 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1345; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1345; charset=funny; option=strange + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1345; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1345; charset=funny; option=strange + diff --git a/tests/data/test1346 b/tests/data/test1346 index eda9a2c..347214e 100644 --- a/tests/data/test1346 +++ b/tests/data/test1346 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -55,18 +55,18 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - + diff --git a/tests/data/test1347 b/tests/data/test1347 index b221846..8eac42c 100644 --- a/tests/data/test1347 +++ b/tests/data/test1347 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1347; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1347; charset=funny; option=strange + 12345 @@ -59,19 +59,19 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1347; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1347; charset=funny; option=strange + 12345 - + diff --git a/tests/data/test1348 b/tests/data/test1348 index 77f2c0f..5f374cb 100644 --- a/tests/data/test1348 +++ b/tests/data/test1348 @@ -49,12 +49,12 @@ RETR file1348 QUIT - + fooo mooo - + diff --git a/tests/data/test1349 b/tests/data/test1349 index 28576fe..33906f8 100644 --- a/tests/data/test1349 +++ b/tests/data/test1349 @@ -60,7 +60,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1350 b/tests/data/test1350 index df12de5..b788597 100644 --- a/tests/data/test1350 +++ b/tests/data/test1350 @@ -60,7 +60,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1351 b/tests/data/test1351 index d81265e..3e9cc21 100644 --- a/tests/data/test1351 +++ b/tests/data/test1351 @@ -61,7 +61,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1352 b/tests/data/test1352 index fa9d1ce..cf690af 100644 --- a/tests/data/test1352 +++ b/tests/data/test1352 @@ -61,7 +61,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1353 b/tests/data/test1353 index b2954b1..8bd751c 100644 --- a/tests/data/test1353 +++ b/tests/data/test1353 @@ -60,7 +60,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1354 b/tests/data/test1354 index aa54f2d..13c5a1b 100644 --- a/tests/data/test1354 +++ b/tests/data/test1354 @@ -58,7 +58,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1356 b/tests/data/test1356 index adc7346..ea610a5 100644 --- a/tests/data/test1356 +++ b/tests/data/test1356 @@ -10,14 +10,14 @@ RETR # file1356 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1356; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1356; charset=funny; option=strange + MOOOO @@ -60,19 +60,19 @@ RETR file1356 QUIT - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1356; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1356; charset=funny; option=strange + MOOOO - + diff --git a/tests/data/test1357 b/tests/data/test1357 index 9525720..3df0ad3 100644 --- a/tests/data/test1357 +++ b/tests/data/test1357 @@ -76,7 +76,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1358 b/tests/data/test1358 index 24cc724..b0e2795 100644 --- a/tests/data/test1358 +++ b/tests/data/test1358 @@ -76,7 +76,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1359 b/tests/data/test1359 index 96445bb..fc7851d 100644 --- a/tests/data/test1359 +++ b/tests/data/test1359 @@ -77,7 +77,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1360 b/tests/data/test1360 index abfbe8c..0000d60 100644 --- a/tests/data/test1360 +++ b/tests/data/test1360 @@ -77,7 +77,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1361 b/tests/data/test1361 index b97de16..884e0b2 100644 --- a/tests/data/test1361 +++ b/tests/data/test1361 @@ -76,7 +76,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1362 b/tests/data/test1362 index 0ea7461..98fffb6 100644 --- a/tests/data/test1362 +++ b/tests/data/test1362 @@ -76,7 +76,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1363 b/tests/data/test1363 index fedc6fc..c34f05a 100644 --- a/tests/data/test1363 +++ b/tests/data/test1363 @@ -10,14 +10,14 @@ RETR # file1363 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1363; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1363; charset=funny; option=strange + MOOOO @@ -60,19 +60,19 @@ RETR file1363 QUIT - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1363; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1363; charset=funny; option=strange + MOOOO - + diff --git a/tests/data/test1364 b/tests/data/test1364 index f4f48ff..e8c981d 100644 --- a/tests/data/test1364 +++ b/tests/data/test1364 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -50,21 +50,21 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1365 b/tests/data/test1365 index f5e95e8..4a09cfd 100644 --- a/tests/data/test1365 +++ b/tests/data/test1365 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -50,18 +50,18 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test1366 b/tests/data/test1366 index 2a7d059..62e3b0c 100644 --- a/tests/data/test1366 +++ b/tests/data/test1366 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1366; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1366; charset=funny; option=strange + 12345 @@ -51,22 +51,22 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1366; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1366; charset=funny; option=strange + - + diff --git a/tests/data/test1367 b/tests/data/test1367 index 6b576b7..d4bd3d7 100644 --- a/tests/data/test1367 +++ b/tests/data/test1367 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1367; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1367; charset=funny; option=strange + 12345 @@ -51,19 +51,19 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1367; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1367; charset=funny; option=strange + diff --git a/tests/data/test1368 b/tests/data/test1368 index 9dc9a5e..6a926ab 100644 --- a/tests/data/test1368 +++ b/tests/data/test1368 @@ -10,13 +10,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -51,21 +51,21 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1369 b/tests/data/test1369 index a24665a..5176ed0 100644 --- a/tests/data/test1369 +++ b/tests/data/test1369 @@ -10,13 +10,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -51,18 +51,18 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test1370 b/tests/data/test1370 index 26b4b15..d0abbdd 100644 --- a/tests/data/test1370 +++ b/tests/data/test1370 @@ -10,14 +10,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1370; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1370; charset=funny; option=strange + 12345 @@ -52,22 +52,22 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1370; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1370; charset=funny; option=strange + - + diff --git a/tests/data/test1371 b/tests/data/test1371 index 31a64a3..fe3977f 100644 --- a/tests/data/test1371 +++ b/tests/data/test1371 @@ -10,14 +10,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1371; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1371; charset=funny; option=strange + 12345 @@ -52,19 +52,19 @@ Accept: */* - + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1371; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1371; charset=funny; option=strange + diff --git a/tests/data/test1372 b/tests/data/test1372 index 9c617f8..a2b8ec9 100644 --- a/tests/data/test1372 +++ b/tests/data/test1372 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -50,28 +50,28 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + - + diff --git a/tests/data/test1373 b/tests/data/test1373 index 2f6e3bd..ae906d7 100644 --- a/tests/data/test1373 +++ b/tests/data/test1373 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -50,25 +50,25 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + diff --git a/tests/data/test1374 b/tests/data/test1374 index aef2b7d..f8d9d0d 100644 --- a/tests/data/test1374 +++ b/tests/data/test1374 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1374; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1374; charset=funny; option=strange + 12345 @@ -51,30 +51,30 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1374; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1374; charset=funny; option=strange + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1374; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1374; charset=funny; option=strange + - + diff --git a/tests/data/test1375 b/tests/data/test1375 index 717b645..595f03a 100644 --- a/tests/data/test1375 +++ b/tests/data/test1375 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1375; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1375; charset=funny; option=strange + 12345 @@ -51,27 +51,27 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1375; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1375; charset=funny; option=strange + 12345 - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1375; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1375; charset=funny; option=strange + diff --git a/tests/data/test1376 b/tests/data/test1376 index 02068db..f34c277 100644 --- a/tests/data/test1376 +++ b/tests/data/test1376 @@ -9,13 +9,13 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 @@ -50,18 +50,18 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + 12345 - + diff --git a/tests/data/test1377 b/tests/data/test1377 index fede100..f542b11 100644 --- a/tests/data/test1377 +++ b/tests/data/test1377 @@ -9,14 +9,14 @@ HTTP GET # -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1377; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1377; charset=funny; option=strange + 12345 @@ -51,19 +51,19 @@ Accept: */* - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1377; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1377; charset=funny; option=strange + 12345 - + diff --git a/tests/data/test1378 b/tests/data/test1378 index 6b24f99..e004afc 100644 --- a/tests/data/test1378 +++ b/tests/data/test1378 @@ -44,12 +44,12 @@ RETR file1378 QUIT - + fooo mooo - + diff --git a/tests/data/test1379 b/tests/data/test1379 index 0fd06d5..81314b6 100644 --- a/tests/data/test1379 +++ b/tests/data/test1379 @@ -53,7 +53,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1380 b/tests/data/test1380 index ec7800d..e715270 100644 --- a/tests/data/test1380 +++ b/tests/data/test1380 @@ -53,7 +53,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1381 b/tests/data/test1381 index 8f3bc37..a55c6b5 100644 --- a/tests/data/test1381 +++ b/tests/data/test1381 @@ -54,7 +54,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1382 b/tests/data/test1382 index fbf5195..a657e1f 100644 --- a/tests/data/test1382 +++ b/tests/data/test1382 @@ -54,7 +54,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1383 b/tests/data/test1383 index 0469e72..0694a22 100644 --- a/tests/data/test1383 +++ b/tests/data/test1383 @@ -53,7 +53,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1384 b/tests/data/test1384 index 2deeb7c..c07c266 100644 --- a/tests/data/test1384 +++ b/tests/data/test1384 @@ -53,7 +53,7 @@ mooo 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person diff --git a/tests/data/test1385 b/tests/data/test1385 index cc39279..ee35ab7 100644 --- a/tests/data/test1385 +++ b/tests/data/test1385 @@ -44,12 +44,12 @@ RETR file1385 QUIT - + fooo mooo - + diff --git a/tests/data/test1386 b/tests/data/test1386 index da47d5b..c7f5d8a 100644 --- a/tests/data/test1386 +++ b/tests/data/test1386 @@ -10,14 +10,14 @@ RETR # file1386 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1386; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1386; charset=funny; option=strange + MOOOO @@ -52,19 +52,19 @@ RETR file1386 QUIT - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1386; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1386; charset=funny; option=strange + MOOOO - + diff --git a/tests/data/test1387 b/tests/data/test1387 index a2c5a4d..2b6c3fc 100644 --- a/tests/data/test1387 +++ b/tests/data/test1387 @@ -10,14 +10,14 @@ RETR # file1387 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1387; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1387; charset=funny; option=strange + MOOOO @@ -53,14 +53,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1387; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1387; charset=funny; option=strange + MOOOO @@ -68,7 +68,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -76,8 +76,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1387 () (214 bytes). +213 222 +150 Binary data connection for 1387 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1388 b/tests/data/test1388 index b4662e6..3d2c59a 100644 --- a/tests/data/test1388 +++ b/tests/data/test1388 @@ -10,14 +10,14 @@ RETR # file1388 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1388; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1388; charset=funny; option=strange + MOOOO @@ -53,14 +53,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1388; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1388; charset=funny; option=strange + MOOOO @@ -68,7 +68,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -76,8 +76,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1388 () (214 bytes). +213 222 +150 Binary data connection for 1388 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1389 b/tests/data/test1389 index c2ac3ad..4aaacd8 100644 --- a/tests/data/test1389 +++ b/tests/data/test1389 @@ -11,14 +11,14 @@ RETR # file1389 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1389; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1389; charset=funny; option=strange + MOOOO @@ -54,14 +54,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1389; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1389; charset=funny; option=strange + MOOOO @@ -69,7 +69,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -77,8 +77,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1389 () (214 bytes). +213 222 +150 Binary data connection for 1389 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1390 b/tests/data/test1390 index 3cf86e7..0668cf7 100644 --- a/tests/data/test1390 +++ b/tests/data/test1390 @@ -11,14 +11,14 @@ RETR # file1390 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1390; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1390; charset=funny; option=strange + MOOOO @@ -54,14 +54,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1390; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1390; charset=funny; option=strange + MOOOO @@ -69,7 +69,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -77,8 +77,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1390 () (214 bytes). +213 222 +150 Binary data connection for 1390 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1391 b/tests/data/test1391 index 913f25a..09c670a 100644 --- a/tests/data/test1391 +++ b/tests/data/test1391 @@ -10,14 +10,14 @@ RETR # file1391 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1391; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1391; charset=funny; option=strange + MOOOO @@ -53,14 +53,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1391; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1391; charset=funny; option=strange + MOOOO @@ -68,7 +68,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -76,8 +76,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1391 () (214 bytes). +213 222 +150 Binary data connection for 1391 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1392 b/tests/data/test1392 index b05fc31..994c881 100644 --- a/tests/data/test1392 +++ b/tests/data/test1392 @@ -10,14 +10,14 @@ RETR # file1392 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1392; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1392; charset=funny; option=strange + MOOOO @@ -53,14 +53,14 @@ QUIT -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1392; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1392; charset=funny; option=strange + MOOOO @@ -68,7 +68,7 @@ MOOOO 220- _ _ ____ _ 220- ___| | | | _ \| | 220- / __| | | | |_) | | -220- | (__| |_| | _ <| |___ +220- | (__| |_| | _ {| |___ 220 \___|\___/|_| \_\_____| 331 We are happy you popped in! 230 Welcome you silly person @@ -76,8 +76,8 @@ MOOOO 250 CWD command successful. 229 Entering Passive Mode (stripped) 200 I modify TYPE as you wanted -213 214 -150 Binary data connection for 1392 () (214 bytes). +213 222 +150 Binary data connection for 1392 () (222 bytes). 226 File transfer complete diff --git a/tests/data/test1393 b/tests/data/test1393 index ebb8151..12f9284 100644 --- a/tests/data/test1393 +++ b/tests/data/test1393 @@ -10,14 +10,14 @@ RETR # file1393 contents... -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1393; charset=funny; option=strange - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1393; charset=funny; option=strange + MOOOO @@ -52,19 +52,19 @@ RETR file1393 QUIT - -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 6 -Connection: close -Content-Type: text/html -Content-Disposition: filename=name1393; charset=funny; option=strange - + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html +Content-Disposition: filename=name1393; charset=funny; option=strange + MOOOO - + diff --git a/tests/data/test1397 b/tests/data/test1397 new file mode 100644 index 0000000..5f479b4 --- /dev/null +++ b/tests/data/test1397 @@ -0,0 +1,27 @@ + + + +unittest +ssl +wildcard + + + +# +# Client-side + + +none + + +unittest + + +Check wildcard certificate matching function Curl_cert_hostcheck + + +unit1397 + + + + diff --git a/tests/data/test1398 b/tests/data/test1398 new file mode 100644 index 0000000..dd50baa --- /dev/null +++ b/tests/data/test1398 @@ -0,0 +1,26 @@ + + + +unittest +curl_msnprintf + + + +# +# Client-side + + +none + + +unittest + + +curl_msnprintf unit tests + + +unit1398 + + + + diff --git a/tests/data/test1404 b/tests/data/test1404 index 88a06ba..4415697 100644 --- a/tests/data/test1404 +++ b/tests/data/test1404 @@ -27,7 +27,7 @@ Connection: close http -HTTP RFC1867-type formposting - -F with three files, one with explicit type +--libcurl for HTTP RFC1867-type formposting - -F with three files, one with explicit type http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content,log/test1404.txt' --libcurl log/test1404.c diff --git a/tests/data/test1405 b/tests/data/test1405 index 692bb1a..38bfd5c 100644 --- a/tests/data/test1405 +++ b/tests/data/test1405 @@ -5,7 +5,6 @@ FTP post-quote pre-quote -quote --libcurl @@ -31,7 +30,7 @@ REPLY FAIL 500 this might not be a failure! ftp -FTP with quote ops +--libcurl for FTP with quote ops ftp://%HOSTIP:%FTPPORT/1405 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3" -Q "*FAIL" -Q "+*FAIL HARD" --libcurl log/test1405.c diff --git a/tests/data/test1406 b/tests/data/test1406 index 6245c51..c80459f 100644 --- a/tests/data/test1406 +++ b/tests/data/test1406 @@ -1,5 +1,5 @@ -# Based on test802 +# Based on test900 # N.B. --libcurl output not sufficient to deal with uploaded files. @@ -11,6 +11,9 @@ SMTP # # Server-side + +CAPA SIZE + # @@ -20,7 +23,7 @@ SMTP smtp -SMTP +--libcurl for SMTP From: different @@ -29,7 +32,7 @@ To: another body -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 1406@foo --mail-rcpt 1406@foobar.example --mail-from 1406@from -T log/test1406.eml --libcurl log/test1406.c +smtp://%HOSTIP:%SMTPPORT/1406 --mail-rcpt recipient.one@example.com --mail-rcpt recipient.two@example.com --mail-from sender@example.com -T log/test1406.eml --libcurl log/test1406.c @@ -37,10 +40,10 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 1406@foo --mail-rcpt 1406@foobar.examp # Verify data after the test has been "shot" -EHLO user -MAIL FROM:<1406@from> SIZE=38 -RCPT TO:<1406@foo> -RCPT TO:<1406@foobar.example> +EHLO 1406 +MAIL FROM: SIZE=38 +RCPT TO: +RCPT TO: DATA QUIT @@ -65,19 +68,19 @@ int main(int argc, char *argv[]) struct curl_slist *slist1; slist1 = NULL; - slist1 = curl_slist_append(slist1, "1406@foo"); - slist1 = curl_slist_append(slist1, "1406@foobar.example"); + slist1 = curl_slist_append(slist1, "recipient.one@example.com"); + slist1 = curl_slist_append(slist1, "recipient.two@example.com"); hnd = curl_easy_init(); curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38); - curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/user"); + curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/1406"); curl_easy_setopt(hnd, CURLOPT_HEADER, 1L); curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L); curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped"); curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L); curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L); - curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "1406@from"); + curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "sender@example.com"); curl_easy_setopt(hnd, CURLOPT_MAIL_RCPT, slist1); /* Here is a list of options the curl code used that cannot get generated diff --git a/tests/data/test1407 b/tests/data/test1407 index 842778a..e84463a 100644 --- a/tests/data/test1407 +++ b/tests/data/test1407 @@ -1,8 +1,9 @@ -# Based on test808 +# Based on test851 POP3 +Clear Text LIST --libcurl @@ -23,7 +24,7 @@ REPLY LIST +OK 1407 100\r\n. pop3 -POP3 LIST one message +--libcurl for POP3 LIST one message pop3://%HOSTIP:%POP3PORT/1407 -l -u user:secret --libcurl log/test1407.c diff --git a/tests/data/test1408 b/tests/data/test1408 index 01b2f6d..54d5e77 100644 --- a/tests/data/test1408 +++ b/tests/data/test1408 @@ -3,7 +3,7 @@ HTTP HTTP GET -IPV6 +IPv6 cookies cookiejar diff --git a/tests/data/test1411 b/tests/data/test1411 new file mode 100644 index 0000000..3ffd586 --- /dev/null +++ b/tests/data/test1411 @@ -0,0 +1,60 @@ + + + +HTTP +PUT + + + + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + + +# +# Client-side + + +http + + +# make sure there's no Expect: 100-continue when there's no file to send! + +HTTP with zero size file PUT + + +http://%HOSTIP:%HTTPPORT/1411 -T log/empty1411 + +# create an empty file + + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +PUT /1411 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Content-Length: 0 + + + + diff --git a/tests/data/test1412 b/tests/data/test1412 index e88919d..971aac8 100644 --- a/tests/data/test1412 +++ b/tests/data/test1412 @@ -74,6 +74,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test1415 b/tests/data/test1415 new file mode 100644 index 0000000..d97dfce --- /dev/null +++ b/tests/data/test1415 @@ -0,0 +1,75 @@ + + + +HTTP +HTTP GET +HTTP proxy +cookies +cookiejar +delete expired cookie + + + +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 4 +Content-Type: text/html +Funny-head: yesyes +Set-Cookie: test1value=test1; domain=example.com; path=/; +Set-Cookie: test2value=test2; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/; +Set-Cookie: test3value=test3; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/; +Set-Cookie: test4value=test4; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/; +Set-Cookie: test5value=test5; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/; +Set-Cookie: test6value=test6; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/; +Set-Cookie: test7value=test7; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/; +Set-Cookie: test8value=test8; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/; + +boo + + + +# Client-side + + +http + + +Delete expired cookies + + +TZ=GMT + + +http://example.com/we/want/1415 -b none -c log/jar1415.txt -x %HOSTIP:%HTTPPORT + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET http://example.com/we/want/1415 HTTP/1.1 +Host: example.com +Accept: */* +Proxy-Connection: Keep-Alive + + + + +# Netscape HTTP Cookie File +# http://curl.haxx.se/docs/http-cookies.html +# This file was generated by libcurl! Edit at your own risk. + +.example.com TRUE / FALSE 0 test1value test1 +.example.com TRUE / FALSE 2114380800 test2value test2 +.example.com TRUE / FALSE 2114380800 test4value test4 +.example.com TRUE / FALSE 2114380800 test7value test7 + + + diff --git a/tests/data/test1416 b/tests/data/test1416 new file mode 100644 index 0000000..546575e --- /dev/null +++ b/tests/data/test1416 @@ -0,0 +1,63 @@ + + + +HTTP +HTTP GET +chunked Transfer-Encoding + + +# +# Server-side + + +HTTP/1.1 200 funky chunky! +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Connection: mooo + +12345678123456789 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +30 +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +21;heresatest=moooo +cccccccccccccccccccccccccccccccc + +0 + + + + +# +# Client-side + + +http + + +HTTP GET with chunked Transfer-Encoding overflowed chunked size + + +http://%HOSTIP:%HTTPPORT/1416 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1416 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +# 56 = CURLE_RECV_ERROR + +56 + + + + diff --git a/tests/data/test1417 b/tests/data/test1417 new file mode 100644 index 0000000..13ba6b1 --- /dev/null +++ b/tests/data/test1417 @@ -0,0 +1,78 @@ + + + +HTTP +HTTP GET +chunked Transfer-Encoding + + +# +# Server-side + + +HTTP/1.1 200 funky chunky! +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Trailer: chunky-trailer +Connection: mooo + +40 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +30 +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +21;heresatest=moooo +cccccccccccccccccccccccccccccccc + +0 +chunky-trailer: header data + + + +HTTP/1.1 200 funky chunky! +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Trailer: chunky-trailer +Connection: mooo + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccc + + + +# +# Client-side + + +http + + +HTTP GET with chunked encoding and chunked trailer without CRs + + +http://%HOSTIP:%HTTPPORT/1417 -D log/heads1417 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1417 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +HTTP/1.1 200 funky chunky! +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Trailer: chunky-trailer +Connection: mooo + +chunky-trailer: header data + + + + diff --git a/tests/data/test1418 b/tests/data/test1418 new file mode 100644 index 0000000..de133af --- /dev/null +++ b/tests/data/test1418 @@ -0,0 +1,108 @@ + + + +HTTP +HTTP GET +HTTP NTLM auth +connection re-use + + +# Server-side + + +connection-monitor + + + +HTTP/1.1 401 Authentication please! +Content-Length: 20 +WWW-Authenticate: Digest realm="loonie", nonce="314156592" +WWW-Authenticate: Basic + +Please auth with me + + +# This is supposed to be returned when the server gets the second +# Authorization: NTLM line passed-in from the client + +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Length: 4 + +moo + + + +HTTP/1.1 200 OK +Server: Another one/1.0 +Content-Length: 4 + +boo + + +# This is the first reply after the redirection + +HTTP/1.1 200 OK +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 34 + +This is not the real page either! + + + +HTTP/1.1 401 Authentication please! +Content-Length: 20 +WWW-Authenticate: Digest realm="loonie", nonce="314156592" +WWW-Authenticate: Basic + +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Length: 4 + +moo + + + + +# Client-side + + +http + + +!SSPI +crypto + + +HTTP with --anyauth and connection re-use + + +http://%HOSTIP:%HTTPPORT/1418 -u testuser:testpass --anyauth http://%HOSTIP:%HTTPPORT/14180003 + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1418 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /1418 HTTP/1.1 +Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/1418", response="986238b7e0077754944c966f56d9bc77" +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /14180003 HTTP/1.1 +Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540" +Host: %HOSTIP:%HTTPPORT +Accept: */* + +[DISCONNECT] + + + diff --git a/tests/data/test1419 b/tests/data/test1419 new file mode 100644 index 0000000..f29ce44 --- /dev/null +++ b/tests/data/test1419 @@ -0,0 +1,69 @@ + + + +HTTP +HTTP GET +HTTP NTLM auth +connection re-use + + +# Server-side + + +connection-monitor + + + +HTTP/1.1 200 fine! +Content-Length: 20 + +Feel free to get it + + + +HTTP/1.1 200 OK +Server: Another one/1.0 +Content-Length: 4 + +boo + + + +HTTP/1.1 200 fine! +Content-Length: 20 + +Feel free to get it + + + +# Client-side + + +http + + +HTTP with --anyauth (but no auth!) and connection re-use + + +http://%HOSTIP:%HTTPPORT/1419 --anyauth http://%HOSTIP:%HTTPPORT/14190003 + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1419 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + +GET /14190003 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + +[DISCONNECT] + + + diff --git a/tests/data/test1420 b/tests/data/test1420 new file mode 100644 index 0000000..79ca675 --- /dev/null +++ b/tests/data/test1420 @@ -0,0 +1,108 @@ + +# Based on test800 + + +IMAP +Clear Text +FETCH +--libcurl + + + +# +# Server-side + + +From: me@somewhere +To: fake@nowhere + +body + +-- + yours sincerely + + + +# +# Client-side + + +imap + + +--libcurl for IMAP FETCH message + + +'imap://%HOSTIP:%IMAPPORT/1420/;UID=1' -u user:secret --libcurl log/test1420.c + + + +# +# Verify data after the test has been "shot" + + +A001 CAPABILITY +A002 LOGIN user secret +A003 SELECT 1420 +A004 FETCH 1 BODY[] +A005 LOGOUT + + +/********* Sample code generated by the curl command line tool ********** + * All curl_easy_setopt() options are documented at: + * http://curl.haxx.se/libcurl/c/curl_easy_setopt.html + ************************************************************************/ +#include + +int main(int argc, char *argv[]) +{ + CURLcode ret; + CURL *hnd; + + hnd = curl_easy_init(); + curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;UID=1"); + curl_easy_setopt(hnd, CURLOPT_HEADER, 1L); + curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret"); + curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped"); + curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L); + curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); + curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L); + + /* Here is a list of options the curl code used that cannot get generated + as source easily. You may select to either not use them or implement + them yourself. + + CURLOPT_WRITEDATA set to a objectpointer + CURLOPT_WRITEFUNCTION set to a functionpointer + CURLOPT_READDATA set to a objectpointer + CURLOPT_READFUNCTION set to a functionpointer + CURLOPT_SEEKDATA set to a objectpointer + CURLOPT_SEEKFUNCTION set to a functionpointer + CURLOPT_ERRORBUFFER set to a objectpointer + CURLOPT_STDERR set to a objectpointer + CURLOPT_DEBUGFUNCTION set to a functionpointer + CURLOPT_DEBUGDATA set to a objectpointer + CURLOPT_HEADERFUNCTION set to a functionpointer + CURLOPT_HEADERDATA set to a objectpointer + + */ + + ret = curl_easy_perform(hnd); + + curl_easy_cleanup(hnd); + hnd = NULL; + + return (int)ret; +} +/**** End of sample code ****/ + + +# curl's default user-agent varies with version, libraries etc. +s/(USERAGENT, \")[^\"]+/${1}stripped/ +# CURLOPT_SSL_VERIFYPEER and SSH_KNOWNHOSTS vary with configurations - just +# ignore them +$_ = '' if /CURLOPT_SSL_VERIFYPEER/ +$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/ + + + diff --git a/tests/data/test1428 b/tests/data/test1428 new file mode 100644 index 0000000..f976569 --- /dev/null +++ b/tests/data/test1428 @@ -0,0 +1,81 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +HTTP Basic auth +proxytunnel + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Funny-head: yesyes +Content-Length: 9 + +contents + + +HTTP/1.1 200 Mighty fine indeed + + + +HTTP/1.1 200 Mighty fine indeed + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Funny-head: yesyes +Content-Length: 9 + +contents + + + +# +# Client-side + + +http +http-proxy + + +HTTP over proxy-tunnel with --proxy-header and --header + + +http://test.1428:%HTTPPORT/we/want/that/page/1428 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self' --header "header-type: server" --proxy-header "header-type: proxy" + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +CONNECT test.1428:%HTTPPORT HTTP/1.1 +User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3 +Host: test.1428:%HTTPPORT +Proxy-Connection: Keep-Alive +header-type: proxy + + + +GET /we/want/that/page/1428 HTTP/1.1 +Authorization: Basic aWFtOm15OjtzZWxm +User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3 +Host: test.1428:%HTTPPORT +Accept: */* +header-type: server + + + + diff --git a/tests/data/test1429 b/tests/data/test1429 new file mode 100644 index 0000000..da09dca --- /dev/null +++ b/tests/data/test1429 @@ -0,0 +1,69 @@ + + + +HTTP +HTTP GET + + + + + +HTTP/1.1 1234 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + + +HTTP GET with 4-digit reponse code + + +http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}' + + + +# +# Verify data after the test has been "shot" + + +HTTP/1.1 1234 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- +1234 + + +^User-Agent:.* + + +GET /1429 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1430 b/tests/data/test1430 new file mode 100644 index 0000000..c5f65cf --- /dev/null +++ b/tests/data/test1430 @@ -0,0 +1,53 @@ + + + +HTTP +HTTP GET + + + + + +HTTP/1.1 -12 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + +HTTP GET with negative reponse code + + +http://%HOSTIP:%HTTPPORT/1430 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1430 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1431 b/tests/data/test1431 new file mode 100644 index 0000000..4ea33ed --- /dev/null +++ b/tests/data/test1431 @@ -0,0 +1,53 @@ + + + +HTTP +HTTP GET + + + + + +HTTP/1.1 2 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + +HTTP GET with single-digit reponse code + + +http://%HOSTIP:%HTTPPORT/1431 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1431 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1432 b/tests/data/test1432 new file mode 100644 index 0000000..eb1d0c2 --- /dev/null +++ b/tests/data/test1432 @@ -0,0 +1,54 @@ + + + +HTTP +HTTP GET + + + + + +HTTP/1.1 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + + +HTTP GET with 100-digit reponse code and survive + + +http://%HOSTIP:%HTTPPORT/1432 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1432 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1433 b/tests/data/test1433 new file mode 100644 index 0000000..8634db2 --- /dev/null +++ b/tests/data/test1433 @@ -0,0 +1,69 @@ + + + +HTTP +HTTP GET + + + + + +HTTP/1.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# +# Client-side + + +http + + + +HTTP GET with 100-digit subversion number in response + + +http://%HOSTIP:%HTTPPORT/1433 --write-out '%{response_code}' + + + +# +# Verify data after the test has been "shot" + + +HTTP/1.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- +200 + + +^User-Agent:.* + + +GET /1433 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1434 b/tests/data/test1434 new file mode 100644 index 0000000..fba104b --- /dev/null +++ b/tests/data/test1434 @@ -0,0 +1,90 @@ + + + +HTTP +HTTP GET +Resume + + + +# Server-side + +# Some servers (e.g. Apache 1.2) respond this way to an invalid byte range + +HTTP/1.1 200 OK +Connection: close +Content-Length: 100 +Content-Type: text/plain + +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 + + +# The file data that exists at the start of the test must be included in +# the verification. + +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +HTTP/1.1 200 OK +Connection: close +Content-Length: 100 +Content-Type: text/plain + + + + +# Client-side + + +http + + +HTTP GET resume at exactly the existing file size is fine + + +http://%HOSTIP:%HTTPPORT/1434 -C 100 + + +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 +012345678 + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1434 HTTP/1.1 +Range: bytes=100- +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1435 b/tests/data/test1435 new file mode 100644 index 0000000..bd171a4 --- /dev/null +++ b/tests/data/test1435 @@ -0,0 +1,46 @@ + + + +HTTP +HTTP GET +unix sockets + + + + + +HTTP/1.1 200 OK +Date: Sun, 16 Nov 2014 23:47:38 GMT +Content-Length: 17 + +Based on test300 + + + + + +unix-sockets + + +http-unix + + +simple HTTP GET over Unix socket + + +--unix-socket %HTTPUNIXPATH http://server-interpreted.example.com/1435 + + + + + +^User-Agent:.* + + +GET /1435 HTTP/1.1 +Host: server-interpreted.example.com +Accept: */* + + + + diff --git a/tests/data/test1436 b/tests/data/test1436 new file mode 100644 index 0000000..e40a3bf --- /dev/null +++ b/tests/data/test1436 @@ -0,0 +1,85 @@ + + + +HTTP +HTTP GET +unix sockets + + + + + +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:47 GMT +Content-Length: 6 + +First + + +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:48 GMT +Content-Length: 7 + +Second + + +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:49 GMT +Content-Length: 6 + +Third + + + + + +unix-sockets + + +http-unix + + +HTTP requests with multiple connections over Unix socket + + +--unix-socket %HTTPUNIXPATH http://one.example.com/14360001 http://two.example.com/14360002 http://one.example.com/14360003 + + + + + +^User-Agent:.* + + +GET /14360001 HTTP/1.1 +Host: one.example.com +Accept: */* + +GET /14360002 HTTP/1.1 +Host: two.example.com +Accept: */* + +GET /14360003 HTTP/1.1 +Host: one.example.com +Accept: */* + + + +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:47 GMT +Content-Length: 6 + +First +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:48 GMT +Content-Length: 7 + +Second +HTTP/1.1 200 OK +Date: Mon, 17 Nov 2014 13:42:49 GMT +Content-Length: 6 + +Third + + + diff --git a/tests/data/test150 b/tests/data/test150 index cdd4cf6..f846fd0 100644 --- a/tests/data/test150 +++ b/tests/data/test150 @@ -1,4 +1,11 @@ + + +HTTP +HTTP GET +HTTP NTLM auth + + @@ -50,6 +57,8 @@ Finally, this is the real page! NTLM +!SSPI +debug http @@ -84,7 +93,7 @@ Host: %HOSTIP:%HTTPPORT Accept: */* GET /150 HTTP/1.1 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test1500 b/tests/data/test1500 index 0a5919c..cd3131e 100644 --- a/tests/data/test1500 +++ b/tests/data/test1500 @@ -10,13 +10,13 @@ multi # Server-side -HTTP/1.1 200 all good! -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Type: text/html -Content-Length: 12 -Connection: close - +HTTP/1.1 200 all good! +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Type: text/html +Content-Length: 12 +Connection: close + Hello World diff --git a/tests/data/test1502 b/tests/data/test1502 index ac9e048..4c084d6 100644 --- a/tests/data/test1502 +++ b/tests/data/test1502 @@ -10,17 +10,17 @@ CURLOPT_RESOLVE -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" -Accept-Ranges: bytes -Content-Length: 6 -Connection: close -Content-Type: text/html -Funny-head: yesyes - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + -foo- diff --git a/tests/data/test1503 b/tests/data/test1503 index 66bf3fa..8665de6 100644 --- a/tests/data/test1503 +++ b/tests/data/test1503 @@ -10,17 +10,17 @@ CURLOPT_RESOLVE -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" -Accept-Ranges: bytes -Content-Length: 6 -Connection: close -Content-Type: text/html -Funny-head: yesyes - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + -foo- diff --git a/tests/data/test1504 b/tests/data/test1504 index cedc9cc..b8463c5 100644 --- a/tests/data/test1504 +++ b/tests/data/test1504 @@ -10,17 +10,17 @@ CURLOPT_RESOLVE -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" -Accept-Ranges: bytes -Content-Length: 6 -Connection: close -Content-Type: text/html -Funny-head: yesyes - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + -foo- diff --git a/tests/data/test1505 b/tests/data/test1505 index 3ab5284..c6e5a7c 100644 --- a/tests/data/test1505 +++ b/tests/data/test1505 @@ -10,17 +10,17 @@ CURLOPT_RESOLVE -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" -Accept-Ranges: bytes -Content-Length: 6 -Connection: close -Content-Type: text/html -Funny-head: yesyes - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + -foo- diff --git a/tests/data/test1506 b/tests/data/test1506 index 8870b2f..815fef9 100644 --- a/tests/data/test1506 +++ b/tests/data/test1506 @@ -3,41 +3,42 @@ HTTP multi +verbose logs # Server-side -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file diff --git a/tests/data/test1507 b/tests/data/test1507 index 76ec532..ab7b47e 100644 --- a/tests/data/test1507 +++ b/tests/data/test1507 @@ -32,7 +32,7 @@ To: another body -smtp://%HOSTIP:%SMTPPORT/user +smtp://%HOSTIP:%SMTPPORT/1507 @@ -40,7 +40,7 @@ smtp://%HOSTIP:%SMTPPORT/user # Verify data after the test has been "shot" -EHLO user +EHLO 1507 MAIL FROM:<1507-realuser@example.com> RCPT TO:<1507-recipient@example.com> DATA diff --git a/tests/data/test1508 b/tests/data/test1508 index f8607e5..b276b8b 100644 --- a/tests/data/test1508 +++ b/tests/data/test1508 @@ -24,7 +24,7 @@ http://%HOSTIP:%HTTPPORT/path/1508 # Verify data after the test has been "shot" - + We are done diff --git a/tests/data/test1509 b/tests/data/test1509 index dd68b05..b4bfc66 100644 --- a/tests/data/test1509 +++ b/tests/data/test1509 @@ -21,25 +21,25 @@ Server: the beast that eats naughty clients -HTTP/1.1 200 OK swsclose -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" - +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + HTTP/1.1 200 Mighty fine indeed Server: the beast that eats naughty clients -HTTP/1.1 200 OK swsclose -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT -ETag: "21025-dc7-39462498" - -header length is ........: 239 -header length should be..: 239 +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + +header length is ........: 245 +header length should be..: 245 diff --git a/tests/data/test1510 b/tests/data/test1510 index 050f051..fdf6c7d 100644 --- a/tests/data/test1510 +++ b/tests/data/test1510 @@ -2,41 +2,42 @@ HTTP +verbose logs # Server-side -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file diff --git a/tests/data/test1511 b/tests/data/test1511 index 806657f..d2b26e5 100644 --- a/tests/data/test1511 +++ b/tests/data/test1511 @@ -8,7 +8,7 @@ HTTP # Server-side -HTTP/1.1 200 +HTTP/1.1 200 OK Date: Thu, 09 Nov 2010 14:49:00 GMT Server: test-server/fakem Last-Modified: Mon, 22 Apr 2013 17:45:05 GMT @@ -20,7 +20,7 @@ Hello World -HTTP/1.1 200 +HTTP/1.1 200 OK Date: Thu, 09 Nov 2010 14:49:00 GMT Server: test-server/fakem Last-Modified: Mon, 22 Apr 2013 17:45:05 GMT @@ -28,7 +28,7 @@ Content-Type: text/html Content-Length: 12 Connection: close -HTTP/1.1 200 +HTTP/1.1 200 OK Date: Thu, 09 Nov 2010 14:49:00 GMT Server: test-server/fakem Last-Modified: Mon, 22 Apr 2013 17:45:05 GMT diff --git a/tests/data/test1512 b/tests/data/test1512 index 9d2134b..a5de5cd 100644 --- a/tests/data/test1512 +++ b/tests/data/test1512 @@ -9,35 +9,35 @@ GLOBAL DNS CACHE # Server-side -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file -HTTP/1.1 200 OK -Date: Thu, 09 Nov 2010 14:49:00 GMT -Server: test-server/fake -Content-Length: 47 - +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 47 + file contents should appear once for each file diff --git a/tests/data/test1513 b/tests/data/test1513 new file mode 100644 index 0000000..4a63f18 --- /dev/null +++ b/tests/data/test1513 @@ -0,0 +1,42 @@ + + + +PROGRESSFUNCTION + + + +# Server-side + + + +# Client-side + + +none + + +http + + +lib1513 + + +return failure immediately from progress callback + + +# this server/host won't be used for real + +http://localhost/1513 + + + +# Verify data after the test has been "shot" + + + +# 42 == CURLE_ABORTED_BY_CALLBACK + +42 + + + diff --git a/tests/data/test1514 b/tests/data/test1514 new file mode 100644 index 0000000..38f5da6 --- /dev/null +++ b/tests/data/test1514 @@ -0,0 +1,48 @@ + + + +HTTP +HTTP POST +Content-Length + + + +# Server-side + + +HTTP/1.1 411 Length Required +Date: Sun, 19 Jan 2014 18:50:58 GMT +Server: test-server/fake swsclose +Connection: close + + + +# Client-side + + +http + + +lib1514 + + +HTTP POST with read callback and unknown data size + + +http://%HOSTIP:%HTTPPORT/1514 + + + +# Verify data after the test has been "shot" + +# Content-Length header is not present + +POST /1514 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Content-Type: application/x-www-form-urlencoded +Expect: 100-continue + + + + diff --git a/tests/data/test1515 b/tests/data/test1515 new file mode 100644 index 0000000..3a49d1b --- /dev/null +++ b/tests/data/test1515 @@ -0,0 +1,58 @@ + + + + +HTTP +multi +FAILURE +resolve + + + + +# Close the connection after the first request. Second request will happen after +# the DNS cache timeout elapses and must succeed exactly like the first one. + +HTTP/1.1 200 OK +Date: Thu, 03 Feb 2014 17:04:00 GMT +Server: test-server/fake swsclose +Connection: close +Content-Type: text/html +Content-Length: 6 + +hello + + +HTTP/1.1 200 OK +Date: Thu, 03 Feb 2014 17:04:02 GMT +Server: test-server/fake swsclose +Connection: close +Content-Type: text/html +Content-Length: 6 + +hello + + + + + +http + + +lib1515 + + +caching of manual libcurl DNS entries after DNS cache timeout + + +/path/1515 %HOSTIP %HTTPPORT + + + + + +0 + + + + diff --git a/tests/data/test1516 b/tests/data/test1516 new file mode 100644 index 0000000..bf2cd15 --- /dev/null +++ b/tests/data/test1516 @@ -0,0 +1,58 @@ + + + + +HTTP +multi +FAILURE +resolve + + + + +# Close the connection after the first request but don't tell the client to do +# so! When starting the second request it'll detect a dead connection and must +# not clean the DNS entries added manually. + +HTTP/1.1 200 OK +Date: Thu, 03 Feb 2014 17:04:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Content-Length: 6 + +hello + + +HTTP/1.1 200 OK +Date: Thu, 03 Feb 2014 17:04:02 GMT +Server: test-server/fake swsclose +Connection: close +Content-Type: text/html +Content-Length: 6 + +hello + + + + + +http + + +lib1515 + + +caching of manual libcurl DNS entries after dead connection + + +/path/1516 %HOSTIP %HTTPPORT + + + + + +0 + + + + diff --git a/tests/data/test1520 b/tests/data/test1520 new file mode 100644 index 0000000..5f9344d --- /dev/null +++ b/tests/data/test1520 @@ -0,0 +1,63 @@ + +# Based off test 901 after bug report #1456 + + +SMTP + + + +# +# Client-side + + +smtp + + +lib1520 + + + +SMTP with CRLF-dot-CRLF in data + + +From: different +To: another + + +. +. + +. + +body + + +smtp://%HOSTIP:%SMTPPORT/1520 + + + +# +# Verify data after the test has been "shot" + + +EHLO 1520 +MAIL FROM: +RCPT TO: +DATA +QUIT + + +From: different +To: another + + +.. +.. + +.. + +body +. + + + diff --git a/tests/data/test1525 b/tests/data/test1525 new file mode 100644 index 0000000..0560d5c --- /dev/null +++ b/tests/data/test1525 @@ -0,0 +1,76 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +HTTP proxy +proxytunnel +CURLOPT_PROXYHEADER + + + +# Server-side + + +HTTP/1.1 200 OK +Content-Length: 17 + + + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + +HTTP/1.1 200 OK +Content-Length: 17 + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + + +# Client-side + + +http +http-proxy + + +lib1525 + + +CURLOPT_PROXYHEADER is ignored CURLHEADER_UNIFIED + + + http://the.old.moo.1525:%HTTPPORT/1525 %HOSTIP:%PROXYPORT + + + +# Verify data after the test has been "shot" + + +CONNECT the.old.moo.1525:%HTTPPORT HTTP/1.1 +Host: the.old.moo.1525:%HTTPPORT +Proxy-Connection: Keep-Alive +User-Agent: Http Agent + + + +PUT /1525 HTTP/1.1 +Host: the.old.moo.1525:%HTTPPORT +Accept: */* +User-Agent: Http Agent +Content-Length: 13 +Expect: 100-continue + +Hello Cloud! + + + diff --git a/tests/data/test1526 b/tests/data/test1526 new file mode 100644 index 0000000..aa111c8 --- /dev/null +++ b/tests/data/test1526 @@ -0,0 +1,76 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +HTTP proxy +proxytunnel +CURLOPT_PROXYHEADER + + + +# Server-side + + +HTTP/1.1 200 OK +Server: present + + + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + +HTTP/1.1 200 OK +Server: present + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + + +# Client-side + + +http +http-proxy + + +lib1526 + + +CURLOPT_PROXYHEADER: separate host/proxy headers + + + http://the.old.moo.1526:%HTTPPORT/1526 %HOSTIP:%PROXYPORT + + + +# Verify data after the test has been "shot" + + +CONNECT the.old.moo.1526:%HTTPPORT HTTP/1.1 +Host: the.old.moo.1526:%HTTPPORT +Proxy-Connection: Keep-Alive +User-Agent: Proxy Agent + + + +PUT /1526 HTTP/1.1 +Host: the.old.moo.1526:%HTTPPORT +Accept: */* +User-Agent: Http Agent +Content-Length: 13 +Expect: 100-continue + +Hello Cloud! + + + diff --git a/tests/data/test1527 b/tests/data/test1527 new file mode 100644 index 0000000..ee4887a --- /dev/null +++ b/tests/data/test1527 @@ -0,0 +1,76 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +HTTP proxy +proxytunnel + + + +# Server-side + + +HTTP/1.1 200 OK +We-are: good + + + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + +HTTP/1.1 200 OK +We-are: good + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" + + + +# Client-side + + +http +http-proxy + + +lib1527 + + +Check same headers are generated without CURLOPT_PROXYHEADER + + + http://the.old.moo.1527:%HTTPPORT/1527 %HOSTIP:%PROXYPORT + + + +# Verify data after the test has been "shot" + + +CONNECT the.old.moo.1527:%HTTPPORT HTTP/1.1 +Host: the.old.moo.1527:%HTTPPORT +Proxy-Connection: Keep-Alive +User-Agent: Http Agent +Expect: 100-continue + + + +PUT /1527 HTTP/1.1 +Host: the.old.moo.1527:%HTTPPORT +Accept: */* +User-Agent: Http Agent +Expect: 100-continue +Content-Length: 13 + +Hello Cloud! + + + diff --git a/tests/data/test1528 b/tests/data/test1528 new file mode 100644 index 0000000..876806a --- /dev/null +++ b/tests/data/test1528 @@ -0,0 +1,60 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +HTTP proxy +proxytunnel + + + +# Server-side + + +HTTP/1.1 200 OK +We-are: good + + + +HTTP/1.1 200 OK swsclose +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Content-Length: 5 + +stop + + + +# Client-side + + +http +http-proxy + + +lib1528 + + +Separately specified proxy/server headers sent in a proxy GET + + + http://the.old.moo:%HTTPPORT/1528 %HOSTIP:%PROXYPORT + + + +# Verify data after the test has been "shot" + + +GET http://the.old.moo:%HTTPPORT/1528 HTTP/1.1 +Host: the.old.moo:%HTTPPORT +Accept: */* +Proxy-Connection: Keep-Alive +User-Agent: Http Agent +Proxy-User-Agent: Http Agent2 + + + + diff --git a/tests/data/test1529 b/tests/data/test1529 new file mode 100644 index 0000000..33df268 --- /dev/null +++ b/tests/data/test1529 @@ -0,0 +1,43 @@ + + + +HTTP +HTTP GET +HTTP proxy + + + +# Server-side + + +HTTP/1.1 200 OK +We-are: good + + + + +# Client-side + + +http +http-proxy + + +lib1529 + + +HTTP request-injection in URL sent over proxy + + + "http://the.old.moo:%HTTPPORT/1529" %HOSTIP:%PROXYPORT + + + +# it should be detected and an error should be reported + +# 3 == CURLE_URL_MALFORMAT + +3 + + + diff --git a/tests/data/test153 b/tests/data/test153 index 5a1db31..89560f8 100644 --- a/tests/data/test153 +++ b/tests/data/test153 @@ -63,6 +63,7 @@ This IS the second real page! http +!SSPI crypto diff --git a/tests/data/test154 b/tests/data/test154 index 89e2bd5..aa7989e 100644 --- a/tests/data/test154 +++ b/tests/data/test154 @@ -63,6 +63,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test155 b/tests/data/test155 index 70ac7fd..4e0870a 100644 --- a/tests/data/test155 +++ b/tests/data/test155 @@ -3,6 +3,7 @@ HTTP HTTP PUT +HTTP NTLM auth @@ -75,6 +76,8 @@ Finally, this is the real page! NTLM +!SSPI +debug http @@ -119,10 +122,9 @@ Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= Host: %HOSTIP:%HTTPPORT Accept: */* Content-Length: 0 -Expect: 100-continue PUT /155 HTTP/1.1 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test159 b/tests/data/test159 index 1f8a2f8..e05ceef 100644 --- a/tests/data/test159 +++ b/tests/data/test159 @@ -3,6 +3,7 @@ HTTP HTTP GET +HTTP NTLM auth @@ -56,6 +57,8 @@ Finally, this is the real page! NTLM +!SSPI +debug http @@ -90,7 +93,7 @@ Host: %HOSTIP:%HTTPPORT Accept: */* GET /159 HTTP/1.0 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test162 b/tests/data/test162 index 9b75f7c..828c2a5 100644 --- a/tests/data/test162 +++ b/tests/data/test162 @@ -27,6 +27,7 @@ isn't because there's no Proxy-Authorization: NTLM header NTLM +!SSPI http diff --git a/tests/data/test167 b/tests/data/test167 index 2ce968d..550803a 100644 --- a/tests/data/test167 +++ b/tests/data/test167 @@ -43,6 +43,7 @@ Nice auth sir! http +!SSPI crypto diff --git a/tests/data/test168 b/tests/data/test168 index e72e931..e46b726 100644 --- a/tests/data/test168 +++ b/tests/data/test168 @@ -57,6 +57,7 @@ Nice auth sir! http +!SSPI crypto diff --git a/tests/data/test169 b/tests/data/test169 index f7419e6..f236a89 100644 --- a/tests/data/test169 +++ b/tests/data/test169 @@ -77,6 +77,8 @@ http NTLM +!SSPI +debug HTTP with proxy-requiring-NTLM to site-requiring-Digest @@ -88,7 +90,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://data.from.server.requiring.digest.hohoho.com/169 --proxy http://%HOSTIP:%HTTPPORT --proxy-user foo:bar --proxy-ntlm --digest --user digest:alot +http://data.from.server.requiring.digest.hohoho.com/169 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm --digest --user digest:alot chkhostname curlhost @@ -109,7 +111,7 @@ Accept: */* Proxy-Connection: Keep-Alive GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1 -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAAAwADAHAAAAAIAAgAcwAAAAAAAAAAAAAABoKBAIP6B+XVQ6vQsx3DfDXUVhd9436GAxPu0IYcl2Z7LxHmNeOAWQ+vxUmhuCFJBUgXCWZvb2N1cmxob3N0 +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3 Host: data.from.server.requiring.digest.hohoho.com Accept: */* diff --git a/tests/data/test170 b/tests/data/test170 index a2c2217..f0e596b 100644 --- a/tests/data/test170 +++ b/tests/data/test170 @@ -19,6 +19,7 @@ http NTLM +!SSPI HTTP POST with --proxy-ntlm and no SSL with no response diff --git a/tests/data/test172 b/tests/data/test172 index b3efae9..3d53418 100644 --- a/tests/data/test172 +++ b/tests/data/test172 @@ -36,7 +36,7 @@ http://%HOSTIP:%HTTPPORT/we/want/172 -b log/jar172.txt -b "tool=curl; name=fool" .%HOSTIP TRUE /silly/ FALSE 0 ismatch this .%HOSTIP TRUE / FALSE 0 partmatch present -%HOSTIP FALSE /we/want/ FALSE 1391252187 nodomain value +%HOSTIP FALSE /we/want/ FALSE 2139150993 nodomain value diff --git a/tests/data/test176 b/tests/data/test176 index 413c149..ffff82c 100644 --- a/tests/data/test176 +++ b/tests/data/test176 @@ -3,6 +3,7 @@ HTTP HTTP POST +HTTP NTLM auth @@ -47,6 +48,7 @@ content for you NTLM +!SSPI http diff --git a/tests/data/test18 b/tests/data/test18 index 43e3ab3..e1d7639 100644 --- a/tests/data/test18 +++ b/tests/data/test18 @@ -3,6 +3,7 @@ HTTP HTTP GET +globbing {} list diff --git a/tests/data/test1800 b/tests/data/test1800 new file mode 100644 index 0000000..b7d534e --- /dev/null +++ b/tests/data/test1800 @@ -0,0 +1,55 @@ + + + +HTTP +http2 + + + +# Server-side + + +HTTP/1.1 200 Ignored! +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +Content-Length: 6 +Connection: close +Content-Type: text/html + +-foo- + + + +# Client-side + + +http + + +http2 + + +HTTP/2 upgrade refused + + +http://%HOSTIP:%HTTPPORT/1800 --http2 + + + + + + +^User-Agent:.* + + +GET /1800 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Connection: Upgrade, HTTP2-Settings +Upgrade: %H2CVER +HTTP2-Settings: AAMAAABkAAQAAP__ + + + + diff --git a/tests/data/test1801 b/tests/data/test1801 new file mode 100644 index 0000000..3e069f5 --- /dev/null +++ b/tests/data/test1801 @@ -0,0 +1,66 @@ + + + +HTTP +http2 + + + +# Server-side + + +HTTP/1.1 101 Switching! + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +Content-Length: 6 +Content-Type: text/html + +lies! + + + +HTTP/1.1 101 Switching! + + + +# listen to the upgrade request! + +upgrade + + + +# Client-side + + +http + + +http2 + + +HTTP/2 upgrade with lying server + + +http://%HOSTIP:%HTTPPORT/1801 --http2 + + + + + + +^User-Agent:.* + + +GET /1801 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Connection: Upgrade, HTTP2-Settings +Upgrade: %H2CVER +HTTP2-Settings: AAMAAABkAAQAAP__ + + + + diff --git a/tests/data/test1900 b/tests/data/test1900 index 857c609..04c59a8 100644 --- a/tests/data/test1900 +++ b/tests/data/test1900 @@ -32,6 +32,9 @@ Handle 3 Completed with status 0 http-pipe + +http + lib1900 @@ -49,6 +52,7 @@ http://%HOSTIP:%HTTPPIPEPORT/ 0 1k.txt 0 1k.txt 0 1k.txt + # Verify data after the test has been "shot" diff --git a/tests/data/test1901 b/tests/data/test1901 index bacf9cb..17c04d1 100644 --- a/tests/data/test1901 +++ b/tests/data/test1901 @@ -4,6 +4,7 @@ HTTP pipelining multi +flaky @@ -32,6 +33,9 @@ Handle 6 Completed with status 0 http-pipe + +http + lib1900 @@ -50,6 +54,7 @@ blacklist_site 127.0.0.1:%HTTPPIPEPORT 0 1k.txt 0 1k.txt 0 1k.txt + # Verify data after the test has been "shot" diff --git a/tests/data/test1902 b/tests/data/test1902 index 22f2621..555b486 100644 --- a/tests/data/test1902 +++ b/tests/data/test1902 @@ -4,6 +4,7 @@ HTTP pipelining multi +flaky @@ -32,6 +33,9 @@ Handle 3 Completed with status 0 http-pipe + +http + lib1900 @@ -49,6 +53,7 @@ http://%HOSTIP:%HTTPPIPEPORT/ 0 1k.txt 0 1k.txt 0 1k.txt + # Verify data after the test has been "shot" diff --git a/tests/data/test1903 b/tests/data/test1903 index 01efa67..c725618 100644 --- a/tests/data/test1903 +++ b/tests/data/test1903 @@ -4,6 +4,7 @@ HTTP pipelining multi +flaky @@ -32,6 +33,9 @@ Handle 1 Completed with status 0 http-pipe + +http + lib1900 @@ -49,6 +53,7 @@ http://%HOSTIP:%HTTPPIPEPORT/ 10 alphabet.txt 10 alphabet.txt 10 alphabet.txt + # Verify data after the test has been "shot" diff --git a/tests/data/test194 b/tests/data/test194 index 1010ee9..26f7f17 100644 --- a/tests/data/test194 +++ b/tests/data/test194 @@ -25,6 +25,19 @@ Connection: close bad + +HTTP/1.1 416 Requested Range Not Satisfiable swsclose +Date: Fri, 24 Oct 2003 21:33:12 GMT +Server: Apache/1.3.19 (Unix) (Red-Hat/Linux) mod_ssl/2.8.1 OpenSSL/0.9.6 PHP/4.3.1 +Last-Modified: Fri, 24 Oct 2003 18:01:23 GMT +ETag: "ab57a-507-3f9968f3" +Accept-Ranges: bytes +Content-Length: 4 +Content-Range: bytes */87 +Content-Type: image/gif +Connection: close + + # Client-side @@ -52,6 +65,9 @@ Host: %HOSTIP:%HTTPPORT Accept: */* - +# CURLE_HTTP_RETURNED_ERROR + +22 + diff --git a/tests/data/test199 b/tests/data/test199 index e8df66e..881ee03 100644 --- a/tests/data/test199 +++ b/tests/data/test199 @@ -3,6 +3,7 @@ HTTP HTTP GET +globbing # diff --git a/tests/data/test2013 b/tests/data/test2013 index 60e85f3..0985b32 100644 --- a/tests/data/test2013 +++ b/tests/data/test2013 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX absolute path +Metalink local XML file, attempt Unix absolute path --metalink file://%PWD/log/test2013.metalink diff --git a/tests/data/test2014 b/tests/data/test2014 index 01dc8b3..d2dbdc7 100644 --- a/tests/data/test2014 +++ b/tests/data/test2014 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX path relative to current +Metalink local XML file, attempt Unix path relative to current --metalink file://%PWD/log/test2014.metalink diff --git a/tests/data/test2015 b/tests/data/test2015 index e4d09d5..a35f311 100644 --- a/tests/data/test2015 +++ b/tests/data/test2015 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX path relative to upper +Metalink local XML file, attempt Unix path relative to upper --metalink file://%PWD/log/test2015.metalink diff --git a/tests/data/test2016 b/tests/data/test2016 index fbd6cd5..572aa65 100644 --- a/tests/data/test2016 +++ b/tests/data/test2016 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX path traversal +Metalink local XML file, attempt Unix path traversal --metalink file://%PWD/log/test2016.metalink diff --git a/tests/data/test2017 b/tests/data/test2017 index 52df14e..15fd934 100644 --- a/tests/data/test2017 +++ b/tests/data/test2017 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX home path traversal +Metalink local XML file, attempt Unix home path traversal --metalink file://%PWD/log/test2017.metalink diff --git a/tests/data/test2018 b/tests/data/test2018 index b76233e..6d0652d 100644 --- a/tests/data/test2018 +++ b/tests/data/test2018 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX questionable file name I +Metalink local XML file, attempt Unix questionable file name I --metalink file://%PWD/log/test2018.metalink diff --git a/tests/data/test2019 b/tests/data/test2019 index cd09804..b17b3f2 100644 --- a/tests/data/test2019 +++ b/tests/data/test2019 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX questionable file name II +Metalink local XML file, attempt Unix questionable file name II --metalink file://%PWD/log/test2019.metalink diff --git a/tests/data/test2020 b/tests/data/test2020 index f89600b..8bf85a4 100644 --- a/tests/data/test2020 +++ b/tests/data/test2020 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX questionable file name III +Metalink local XML file, attempt Unix questionable file name III --metalink file://%PWD/log/test2020.metalink diff --git a/tests/data/test2021 b/tests/data/test2021 index 133eb16..20a9224 100644 --- a/tests/data/test2021 +++ b/tests/data/test2021 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX questionable file name IV +Metalink local XML file, attempt Unix questionable file name IV --metalink file://%PWD/log/test2021.metalink diff --git a/tests/data/test2022 b/tests/data/test2022 index 8cb0df5..4f4efd1 100644 --- a/tests/data/test2022 +++ b/tests/data/test2022 @@ -35,7 +35,7 @@ file Metalink -Metalink local XML file, attempt UNIX questionable file name V +Metalink local XML file, attempt Unix questionable file name V --metalink file://%PWD/log/test2022.metalink diff --git a/tests/data/test2024 b/tests/data/test2024 index 1fbb204..9c155a2 100644 --- a/tests/data/test2024 +++ b/tests/data/test2024 @@ -115,6 +115,10 @@ Finally, this is the real page! http + +!SSPI +crypto + libauthretry diff --git a/tests/data/test2025 b/tests/data/test2025 index 4c8df18..03b6b14 100644 --- a/tests/data/test2025 +++ b/tests/data/test2025 @@ -195,6 +195,7 @@ Finally, this is the real page! NTLM +!SSPI http diff --git a/tests/data/test2026 b/tests/data/test2026 index c940b6f..b1d2341 100644 --- a/tests/data/test2026 +++ b/tests/data/test2026 @@ -151,6 +151,10 @@ Finally, this is the real page! http + +!SSPI +crypto + libauthretry diff --git a/tests/data/test2027 b/tests/data/test2027 index c84e24b..e9a62d6 100644 --- a/tests/data/test2027 +++ b/tests/data/test2027 @@ -174,6 +174,10 @@ Finally, this is the real page! http + +!SSPI +crypto + libauthretry diff --git a/tests/data/test2028 b/tests/data/test2028 index 793ad3e..2a03836 100644 --- a/tests/data/test2028 +++ b/tests/data/test2028 @@ -231,6 +231,7 @@ Finally, this is the real page! NTLM +!SSPI http diff --git a/tests/data/test2029 b/tests/data/test2029 index 7b8a5e2..7c697e3 100644 --- a/tests/data/test2029 +++ b/tests/data/test2029 @@ -168,6 +168,7 @@ Finally, this is the real page! NTLM +!SSPI http diff --git a/tests/data/test2030 b/tests/data/test2030 index 8de81d0..a80c15e 100644 --- a/tests/data/test2030 +++ b/tests/data/test2030 @@ -220,6 +220,7 @@ Finally, this is the real page! NTLM +!SSPI http diff --git a/tests/data/test2031 b/tests/data/test2031 index 19f7533..0df841b 100644 --- a/tests/data/test2031 +++ b/tests/data/test2031 @@ -234,6 +234,7 @@ Finally, this is the real page! NTLM +!SSPI http diff --git a/tests/data/test2032 b/tests/data/test2032 index 02aca81..23f44e6 100644 --- a/tests/data/test2032 +++ b/tests/data/test2032 @@ -12,75 +12,75 @@ HTTP NTLM auth -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 Need Basic or NTLM auth (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 27 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 27 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is not the real page! -HTTP/1.1 401 NTLM intermediate (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 33 -WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= - +HTTP/1.1 401 NTLM intermediate (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 33 +WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= + This is still not the real page! -HTTP/1.1 200 Things are fine in server land -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 32 - +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 32 + Finally, this is the real page! -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 NTLM intermediate (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 33 -WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= - -HTTP/1.1 200 Things are fine in server land -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 32 - +HTTP/1.1 401 NTLM intermediate (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 33 +WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= + +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 32 + Finally, this is the real page! @@ -90,6 +90,7 @@ Finally, this is the real page! NTLM +!SSPI http @@ -123,22 +124,22 @@ chkhostname curlhost GET /20320100 HTTP/1.1 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320100 HTTP/1.1 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320200 HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320200 HTTP/1.1 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* diff --git a/tests/data/test2033 b/tests/data/test2033 index d3e2fbd..aacbe5e 100644 --- a/tests/data/test2033 +++ b/tests/data/test2033 @@ -13,75 +13,75 @@ pipelining -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 Need Basic or NTLM auth (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 27 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 27 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is not the real page! -HTTP/1.1 401 NTLM intermediate (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 33 -WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= - +HTTP/1.1 401 NTLM intermediate (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 33 +WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= + This is still not the real page! -HTTP/1.1 200 Things are fine in server land -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 32 - +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 32 + Finally, this is the real page! -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 Need Basic or NTLM auth -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 29 -WWW-Authenticate: NTLM -WWW-Authenticate: Basic realm="testrealm" - +HTTP/1.1 401 Need Basic or NTLM auth +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 29 +WWW-Authenticate: NTLM +WWW-Authenticate: Basic realm="testrealm" + This is a bad password page! -HTTP/1.1 401 NTLM intermediate (2) -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 33 -WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= - -HTTP/1.1 200 Things are fine in server land -Server: Microsoft-IIS/5.0 -Content-Type: text/html; charset=iso-8859-1 -Content-Length: 32 - +HTTP/1.1 401 NTLM intermediate (2) +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 33 +WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg= + +HTTP/1.1 200 Things are fine in server land +Server: Microsoft-IIS/5.0 +Content-Type: text/html; charset=iso-8859-1 +Content-Length: 32 + Finally, this is the real page! @@ -91,6 +91,7 @@ Finally, this is the real page! NTLM +!SSPI http @@ -124,22 +125,22 @@ chkhostname curlhost GET /20320100 HTTP/1.1 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320100 HTTP/1.1 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320200 HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* GET /20320200 HTTP/1.1 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q= -Host: 127.0.0.1:8990 +Host: 127.0.0.1:%HTTPPORT Accept: */* diff --git a/tests/data/test2034 b/tests/data/test2034 new file mode 100644 index 0000000..9bf0a81 --- /dev/null +++ b/tests/data/test2034 @@ -0,0 +1,58 @@ + + + +HTTPS +HTTP GET +PEM certificate + + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 7 + +MooMoo + + + +# +# Client-side + + +SSL +SSLpinning + + +https Server-localhost-sv.pem + + +simple HTTPS GET with DER public key pinning + + +--cacert %SRCDIR/certs/EdelCurlRoot-ca.crt --pinnedpubkey %SRCDIR/certs/Server-localhost-sv.pub.der https://localhost:%HTTPSPORT/2034 + +# Ensure that we're running on localhost because we're checking the host name + +perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );" + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /2034 HTTP/1.1 +Host: localhost:%HTTPSPORT +Accept: */* + + + + diff --git a/tests/data/test2035 b/tests/data/test2035 new file mode 100644 index 0000000..7002a5b --- /dev/null +++ b/tests/data/test2035 @@ -0,0 +1,44 @@ + + + +HTTPS +HTTP GET +PEM certificate + + + +# +# Server-side + + + +# +# Client-side + + +SSL +SSLpinning + + +https Server-localhost-sv.pem + + +HTTPS wrong DER pinnedpubkey but right CN + + +--cacert %SRCDIR/certs/EdelCurlRoot-ca.crt --pinnedpubkey %SRCDIR/certs/Server-localhost-sv.der https://localhost:%HTTPSPORT/2035 + +# Ensure that we're running on localhost because we're checking the host name + +perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );" + + + +# +# Verify data after the test has been "shot" + + +90 + + + diff --git a/tests/data/test2036 b/tests/data/test2036 new file mode 100644 index 0000000..0ab8b66 --- /dev/null +++ b/tests/data/test2036 @@ -0,0 +1,39 @@ + + + +FAILURE + + +# +# Server-side + + + +# +# Client-side + + +none + + +http + + +HTTP, -O with no slash at all in the URL + + +%HOSTIP:%HTTPPORT -O + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +23 + + + diff --git a/tests/data/test2037 b/tests/data/test2037 new file mode 100644 index 0000000..d630538 --- /dev/null +++ b/tests/data/test2037 @@ -0,0 +1,58 @@ + + + +HTTPS +HTTP GET +PEM certificate + + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 7 + +MooMoo + + + +# +# Client-side + + +SSL +SSLpinning + + +https Server-localhost-sv.pem + + +simple HTTPS GET with PEM public key pinning + + +--cacert %SRCDIR/certs/EdelCurlRoot-ca.crt --pinnedpubkey %SRCDIR/certs/Server-localhost-sv.pub.pem https://localhost:%HTTPSPORT/2037 + +# Ensure that we're running on localhost because we're checking the host name + +perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );" + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /2037 HTTP/1.1 +Host: localhost:%HTTPSPORT +Accept: */* + + + + diff --git a/tests/data/test2038 b/tests/data/test2038 new file mode 100644 index 0000000..63d935a --- /dev/null +++ b/tests/data/test2038 @@ -0,0 +1,44 @@ + + + +HTTPS +HTTP GET +PEM certificate + + + +# +# Server-side + + + +# +# Client-side + + +SSL +SSLpinning + + +https Server-localhost-sv.pem + + +HTTPS wrong PEM pinnedpubkey but right CN + + +--cacert %SRCDIR/certs/EdelCurlRoot-ca.crt --pinnedpubkey %SRCDIR/certs/Server-localhost-sv.pem https://localhost:%HTTPSPORT/2038 + +# Ensure that we're running on localhost because we're checking the host name + +perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );" + + + +# +# Verify data after the test has been "shot" + + +90 + + + diff --git a/tests/data/test206 b/tests/data/test206 index 902d0a6..5f0c885 100644 --- a/tests/data/test206 +++ b/tests/data/test206 @@ -71,6 +71,7 @@ daniel http +!SSPI crypto diff --git a/tests/data/test207 b/tests/data/test207 index 85f9af6..e44385f 100644 --- a/tests/data/test207 +++ b/tests/data/test207 @@ -3,6 +3,8 @@ HTTP HTTP GET +CURLE_PARTIAL_FILE +FAILURE # diff --git a/tests/data/test209 b/tests/data/test209 index d8bd8bd..961eba1 100644 --- a/tests/data/test209 +++ b/tests/data/test209 @@ -75,6 +75,8 @@ http NTLM +!SSPI +debug HTTP proxy CONNECT auth NTLM @@ -86,7 +88,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://test.remote.example.com.209:%HTTPPORT/path/2090002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel +http://test.remote.example.com.209:%HTTPPORT/path/2090002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm --proxytunnel chkhostname curlhost @@ -106,7 +108,7 @@ Proxy-Connection: Keep-Alive CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1 Host: test.remote.example.com.209:%HTTPPORT -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== Proxy-Connection: Keep-Alive GET /path/2090002 HTTP/1.1 diff --git a/tests/data/test212 b/tests/data/test212 index 8daed55..444525f 100644 --- a/tests/data/test212 +++ b/tests/data/test212 @@ -2,6 +2,7 @@ FTP +EPRT diff --git a/tests/data/test213 b/tests/data/test213 index 5c14aa8..edbb6a6 100644 --- a/tests/data/test213 +++ b/tests/data/test213 @@ -75,6 +75,8 @@ http NTLM +!SSPI +debug HTTP 1.0 proxy CONNECT auth NTLM and then POST @@ -86,7 +88,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://test.remote.example.com.213:%HTTPPORT/path/2130002 --proxy1.0 http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel -d "postit" +http://test.remote.example.com.213:%HTTPPORT/path/2130002 --proxy1.0 http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm --proxytunnel -d "postit" chkhostname curlhost @@ -106,7 +108,7 @@ Proxy-Connection: Keep-Alive CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0 Host: test.remote.example.com.213:%HTTPPORT -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== Proxy-Connection: Keep-Alive POST /path/2130002 HTTP/1.1 diff --git a/tests/data/test215 b/tests/data/test215 index 8770efb..987fd99 100644 --- a/tests/data/test215 +++ b/tests/data/test215 @@ -9,7 +9,7 @@ FTP # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test22 b/tests/data/test22 index 2e8bdec..f45f862 100644 --- a/tests/data/test22 +++ b/tests/data/test22 @@ -26,7 +26,7 @@ http get HTTP with URL > 10000 bytes -%HOSTIP:%HTTPPORT/`perl -e "print \"a\" x 10000;"`/22 +%HOSTIP:%HTTPPORT/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/22 diff --git a/tests/data/test227 b/tests/data/test227 index 523fa02..5b6d98c 100644 --- a/tests/data/test227 +++ b/tests/data/test227 @@ -4,7 +4,6 @@ FTP post-quote pre-quote -quote # Server-side diff --git a/tests/data/test239 b/tests/data/test239 index 2748100..89ccaef 100644 --- a/tests/data/test239 +++ b/tests/data/test239 @@ -52,6 +52,8 @@ http NTLM +!SSPI +debug HTTP proxy-auth NTLM and then POST @@ -63,7 +65,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://%HOSTIP:%HTTPPORT/239 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm -d "postit" +http://%HOSTIP:%HTTPPORT/239 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm -d "postit" chkhostname curlhost @@ -86,7 +88,7 @@ Content-Length: 0 Content-Type: application/x-www-form-urlencoded POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1 -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test243 b/tests/data/test243 index d53a437..0ac4222 100644 --- a/tests/data/test243 +++ b/tests/data/test243 @@ -73,6 +73,8 @@ http NTLM +!SSPI +debug HTTP POST with --proxy-anyauth, picking NTLM @@ -84,7 +86,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://%HOSTIP:%HTTPPORT/243 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-anyauth -d "postit" +http://%HOSTIP:%HTTPPORT/243 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-anyauth -d "postit" chkhostname curlhost @@ -115,7 +117,7 @@ Content-Length: 0 Content-Type: application/x-www-form-urlencoded POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1 -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test245 b/tests/data/test245 index 8ad45d3..02a2772 100644 --- a/tests/data/test245 +++ b/tests/data/test245 @@ -50,6 +50,7 @@ ok http +!SSPI crypto diff --git a/tests/data/test246 b/tests/data/test246 index b92c17a..cfa31db 100644 --- a/tests/data/test246 +++ b/tests/data/test246 @@ -60,6 +60,7 @@ ok http +!SSPI crypto diff --git a/tests/data/test250 b/tests/data/test250 index aeed134..3d0a8f3 100644 --- a/tests/data/test250 +++ b/tests/data/test250 @@ -10,7 +10,7 @@ FTP # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test251 b/tests/data/test251 index d50e1b3..cc8cbfa 100644 --- a/tests/data/test251 +++ b/tests/data/test251 @@ -9,7 +9,7 @@ FTP # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test258 b/tests/data/test258 index 0d95dec..1173707 100644 --- a/tests/data/test258 +++ b/tests/data/test258 @@ -56,6 +56,7 @@ ok http +!SSPI crypto diff --git a/tests/data/test259 b/tests/data/test259 index b9d8ef1..d4a8227 100644 --- a/tests/data/test259 +++ b/tests/data/test259 @@ -52,6 +52,7 @@ ok http +!SSPI crypto diff --git a/tests/data/test265 b/tests/data/test265 index 07de455..1a162b8 100644 --- a/tests/data/test265 +++ b/tests/data/test265 @@ -78,6 +78,8 @@ http NTLM +!SSPI +debug HTTP proxy CONNECT auth NTLM and then POST, response-body in the 407 @@ -89,7 +91,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -http://test.remote.example.com.265:%HTTPPORT/path/2650002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel -d "postit" +http://test.remote.example.com.265:%HTTPPORT/path/2650002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user testuser:testpass --proxy-ntlm --proxytunnel -d "postit" chkhostname curlhost @@ -109,7 +111,7 @@ Proxy-Connection: Keep-Alive CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1 Host: test.remote.example.com.265:%HTTPPORT -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAKAeQjzKtCQ7ubW8S6MN7B59436GAxPu0CVROwwNBsgxML49gcbAXLT/bU+H5wrS9XNpbGx5Y3VybGhvc3Q= +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== Proxy-Connection: Keep-Alive POST /path/2650002 HTTP/1.1 diff --git a/tests/data/test267 b/tests/data/test267 index 479031c..ea4a9cf 100644 --- a/tests/data/test267 +++ b/tests/data/test267 @@ -56,6 +56,8 @@ Finally, this is the real page! NTLM +!SSPI +debug http @@ -94,7 +96,7 @@ Content-Length: 0 Content-Type: application/x-www-form-urlencoded POST /267 HTTP/1.1 -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q= +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 Host: %HOSTIP:%HTTPPORT Accept: */* diff --git a/tests/data/test273 b/tests/data/test273 index dc52a10..c8010d9 100644 --- a/tests/data/test273 +++ b/tests/data/test273 @@ -52,6 +52,7 @@ This IS the real page! http +!SSPI crypto diff --git a/tests/data/test280 b/tests/data/test280 index c169993..de7534e 100644 --- a/tests/data/test280 +++ b/tests/data/test280 @@ -12,7 +12,7 @@ LIST # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test294 b/tests/data/test294 index 4d7f2b8..a9752a2 100644 --- a/tests/data/test294 +++ b/tests/data/test294 @@ -13,7 +13,7 @@ ACCT # When doing LIST, we get the default list output hard-coded in the test # FTP server - + total 20 drwxr-xr-x 8 98 98 512 Oct 22 13:06 . drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. diff --git a/tests/data/test31 b/tests/data/test31 index 38af83b..dfcac04 100644 --- a/tests/data/test31 +++ b/tests/data/test31 @@ -51,7 +51,8 @@ Set-Cookie: novalue; domain=reallysilly Set-Cookie: test=yes; domain=foo.com; expires=Sat Feb 2 11:56:27 GMT 2030 Set-Cookie: test2=yes; domain=se; expires=Sat Feb 2 11:56:27 GMT 2030 Set-Cookie: magic=yessir; path=/silly/; HttpOnly -Set-Cookie: blexp=yesyes; domain=.0.0.1; domain=.0.0.1; expiry=totally bad; +Set-Cookie: blexp=yesyes; domain=127.0.0.1; domain=127.0.0.1; expiry=totally bad; +Set-Cookie: partialip=nono; domain=.0.0.1; boo @@ -95,34 +96,34 @@ Accept: */* # http://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. -.127.0.0.1 TRUE /silly/ FALSE 0 ismatch this -.127.0.0.1 TRUE /overwrite FALSE 0 overwrite this2 -.127.0.0.1 TRUE /secure1/ TRUE 0 sec1value secure1 -.127.0.0.1 TRUE /secure2/ TRUE 0 sec2value secure2 -.127.0.0.1 TRUE /secure3/ TRUE 0 sec3value secure3 -.127.0.0.1 TRUE /secure4/ TRUE 0 sec4value secure4 -.127.0.0.1 TRUE /secure5/ TRUE 0 sec5value secure5 -.127.0.0.1 TRUE /secure6/ TRUE 0 sec6value secure6 -.127.0.0.1 TRUE /secure7/ TRUE 0 sec7value secure7 -.127.0.0.1 TRUE /secure8/ TRUE 0 sec8value secure8 -.127.0.0.1 TRUE /secure9/ TRUE 0 secure very1 -#HttpOnly_.127.0.0.1 TRUE /p1/ FALSE 0 httpo1 value1 -#HttpOnly_.127.0.0.1 TRUE /p2/ FALSE 0 httpo2 value2 -#HttpOnly_.127.0.0.1 TRUE /p3/ FALSE 0 httpo3 value3 -#HttpOnly_.127.0.0.1 TRUE /p4/ FALSE 0 httpo4 value4 -#HttpOnly_.127.0.0.1 TRUE /p4/ FALSE 0 httponly myvalue1 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec myvalue2 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec2 myvalue3 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec3 myvalue4 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec4 myvalue5 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec5 myvalue6 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec6 myvalue7 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec7 myvalue8 -#HttpOnly_.127.0.0.1 TRUE /p4/ TRUE 0 httpandsec8 myvalue9 -.127.0.0.1 TRUE / FALSE 0 partmatch present +127.0.0.1 FALSE /silly/ FALSE 0 ismatch this +127.0.0.1 FALSE /overwrite FALSE 0 overwrite this2 +127.0.0.1 FALSE /secure1/ TRUE 0 sec1value secure1 +127.0.0.1 FALSE /secure2/ TRUE 0 sec2value secure2 +127.0.0.1 FALSE /secure3/ TRUE 0 sec3value secure3 +127.0.0.1 FALSE /secure4/ TRUE 0 sec4value secure4 +127.0.0.1 FALSE /secure5/ TRUE 0 sec5value secure5 +127.0.0.1 FALSE /secure6/ TRUE 0 sec6value secure6 +127.0.0.1 FALSE /secure7/ TRUE 0 sec7value secure7 +127.0.0.1 FALSE /secure8/ TRUE 0 sec8value secure8 +127.0.0.1 FALSE /secure9/ TRUE 0 secure very1 +#HttpOnly_127.0.0.1 FALSE /p1/ FALSE 0 httpo1 value1 +#HttpOnly_127.0.0.1 FALSE /p2/ FALSE 0 httpo2 value2 +#HttpOnly_127.0.0.1 FALSE /p3/ FALSE 0 httpo3 value3 +#HttpOnly_127.0.0.1 FALSE /p4/ FALSE 0 httpo4 value4 +#HttpOnly_127.0.0.1 FALSE /p4/ FALSE 0 httponly myvalue1 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec myvalue2 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec2 myvalue3 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec3 myvalue4 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec4 myvalue5 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec5 myvalue6 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec6 myvalue7 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec7 myvalue8 +#HttpOnly_127.0.0.1 FALSE /p4/ TRUE 0 httpandsec8 myvalue9 +127.0.0.1 FALSE / FALSE 0 partmatch present 127.0.0.1 FALSE /we/want/ FALSE 2054030187 nodomain value #HttpOnly_127.0.0.1 FALSE /silly/ FALSE 0 magic yessir -.0.0.1 TRUE /we/want/ FALSE 0 blexp yesyes +127.0.0.1 FALSE /we/want/ FALSE 0 blexp yesyes diff --git a/tests/data/test320 b/tests/data/test320 index 899bec5..8f6df05 100644 --- a/tests/data/test320 +++ b/tests/data/test320 @@ -15,7 +15,7 @@ Content-type: text/html -

    This is GNUTLS

    +

    This is GnuTLS

    Session ID: 003030000100000001000000000000000030330001000000B062410001000000

    @@ -25,9 +25,9 @@ Content-type: text/html - + -

    Protocol version:TLS1.2
    Key Exchange:SRP
    CompressionNULL
    CipherAES-128-CBC
    CipherAES-NNN-CBC
    MACSHA1
    CiphersuiteSRP_SHA_AES_128_CBC_SHA1
    +CiphersuiteSRP_SHA_AES_NNN_CBC_SHA1


    Your HTTP header was:

    User-Agent: curl/7.21.4-DEV (x86_64-apple-darwin10.5.0) libcurl/7.21.4-DEV GnuTLS/2.10.4 zlib/1.2.5 libidn/1.19
     Host: localhost:9011
     Accept: */*
    @@ -50,7 +50,7 @@ TLS-SRP
     simple TLS-SRP HTTPS GET, check user in response
      
     
    ---insecure --tlsauthtype SRP --tlsuser jsmith --tlspassword abc https://%HOSTIP:%HTTPTLSSRPPORT
    +--insecure --tlsauthtype SRP --tlsuser jsmith --tlspassword abc https://%HOSTIP:%HTTPTLSPORT
     
     
     
    @@ -64,21 +64,21 @@ Content-type: text/html
     
     
     
    -

    This is GNUTLS

    +

    This is GnuTLS

    If your browser supports session resuming, then you should see the same session ID, when you press the reload button.

    Connected as user 'jsmith'.

    -

    + - + -

    Key Exchange:SRP
    CompressionNULL
    CipherAES-128-CBC
    CipherAES-NNN-CBC
    MACSHA1
    CiphersuiteSRP_SHA_AES_128_CBC_SHA1
    - -Host: %HOSTIP:%HTTPTLSSRPPORT +
    CiphersuiteSRP_SHA_AES_NNN_CBC_SHA1
    +

    +Host: %HOSTIP:%HTTPTLSPORT
     Accept: */*
     
     

    @@ -87,8 +87,10 @@ Accept: */* s/^

    Session ID:.*// -s/^


    Your HTTP header was:.*// -s/Protocol version:.*// +s/^


    Your HTTP header was:

    .*/
    /
    +s/Protocol version:.*[0-9]//
    +s/GNUTLS/GnuTLS/
    +s/(AES[-_])\d\d\d([-_]CBC)/$1NNN$2/
     
     
     
    diff --git a/tests/data/test321 b/tests/data/test321
    index ccdfb86..c6b208b 100644
    --- a/tests/data/test321
    +++ b/tests/data/test321
    @@ -19,7 +19,7 @@ TLS-SRP
     TLS-SRP with bad username and password
      
     
    ---insecure --tlsauthtype SRP --tlsuser baduser --tlspassword badpass https://%HOSTIP:%HTTPTLSSRPPORT
    +--insecure --tlsauthtype SRP --tlsuser baduser --tlspassword badpass https://%HOSTIP:%HTTPTLSPORT
     
     
     
    diff --git a/tests/data/test322 b/tests/data/test322
    index f35345e..f7f8279 100644
    --- a/tests/data/test322
    +++ b/tests/data/test322
    @@ -19,7 +19,7 @@ TLS-SRP
     TLS-SRP with bad password
      
     
    ---insecure --tlsauthtype SRP --tlsuser jsmith --tlspassword badpass https://%HOSTIP:%HTTPTLSSRPPORT
    +--insecure --tlsauthtype SRP --tlsuser jsmith --tlspassword badpass https://%HOSTIP:%HTTPTLSPORT
     
     
     
    diff --git a/tests/data/test324 b/tests/data/test324
    index bc1c48f..b58d940 100644
    --- a/tests/data/test324
    +++ b/tests/data/test324
    @@ -19,7 +19,7 @@ TLS-SRP
     TLS-SRP with server cert checking
      
      # no --insecure
    ---tlsauthtype SRP --tlsuser jsmith --tlspassword abc https://%HOSTIP:%HTTPTLSSRPPORT/want/323
    +--tlsauthtype SRP --tlsuser jsmith --tlspassword abc https://%HOSTIP:%HTTPTLSPORT/want/323
     
     
     
    diff --git a/tests/data/test325 b/tests/data/test325
    new file mode 100644
    index 0000000..6d5898d
    --- /dev/null
    +++ b/tests/data/test325
    @@ -0,0 +1,66 @@
    +
    +
    +
    +HTTPS
    +HTTP GET
    +--proto-redir
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +HTTP/1.1 301 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 7
    +Location: http://%HOSTIP:%HTTPPORT/325
    +
    +MooMoo
    +
    +
    +HTTP/1.1 301 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 7
    +Location: http://%HOSTIP:%HTTPPORT/325
    +
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +SSL
    +
    +
    +https
    +
    + 
    +HTTPS with attempted redirect to denied HTTP
    + 
    + 
    +-k https://%HOSTIP:%HTTPSPORT/325 --proto-redir -http --location
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +^User-Agent:.*
    +
    +
    +GET /325 HTTP/1.1
    +Host: %HOSTIP:%HTTPSPORT
    +Accept: */*
    +
    +
    +# 1 - Protocol http not supported or disabled in libcurl
    +
    +1
    +
    +
    +
    diff --git a/tests/data/test33 b/tests/data/test33
    index 82cf80b..9b86cd3 100644
    --- a/tests/data/test33
    +++ b/tests/data/test33
    @@ -10,7 +10,7 @@ Content-Range
     # Server-side
     
     
    -HTTP/1.1 OK swsclose
    +HTTP/1.1 200 OK swsclose
     
     
     
    diff --git a/tests/data/test350 b/tests/data/test350
    index 9c22d30..6cb53fa 100644
    --- a/tests/data/test350
    +++ b/tests/data/test350
    @@ -11,7 +11,7 @@ LIST
     
     # When doing LIST, we get the default list output hard-coded in the test
     # FTP server
    -
    +
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
    diff --git a/tests/data/test351 b/tests/data/test351
    index 5d44a64..219677f 100644
    --- a/tests/data/test351
    +++ b/tests/data/test351
    @@ -11,7 +11,7 @@ LIST
     
     # When doing LIST, we get the default list output hard-coded in the test
     # FTP server
    -
    +
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
    diff --git a/tests/data/test352 b/tests/data/test352
    index d868894..5f498a2 100644
    --- a/tests/data/test352
    +++ b/tests/data/test352
    @@ -11,7 +11,7 @@ LIST
     
     # When doing LIST, we get the default list output hard-coded in the test
     # FTP server
    -
    +
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
    diff --git a/tests/data/test353 b/tests/data/test353
    index 417b8c3..1adee37 100644
    --- a/tests/data/test353
    +++ b/tests/data/test353
    @@ -11,7 +11,7 @@ LIST
     
     # When doing LIST, we get the default list output hard-coded in the test
     # FTP server
    -
    +
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
    diff --git a/tests/data/test500 b/tests/data/test500
    index f9b17f3..faf3d72 100644
    --- a/tests/data/test500
    +++ b/tests/data/test500
    @@ -8,18 +8,18 @@ HTTP GET
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     -foo-
     
     
    @@ -45,7 +45,7 @@ http://%HOSTIP:%HTTPPORT/500 log/ip500
     #
     # Verify data after the test has been "shot"
     
    -
    +
     IP: %HOSTIP
     
     
    diff --git a/tests/data/test502 b/tests/data/test502
    index f73a4eb..f8d776b 100644
    --- a/tests/data/test502
    +++ b/tests/data/test502
    @@ -7,7 +7,7 @@ FILE
     #
     # Server-side
     
    -
    +
     foo
        bar swsclose
     bar
    diff --git a/tests/data/test506 b/tests/data/test506
    index 630e816..07bbdea 100644
    --- a/tests/data/test506
    +++ b/tests/data/test506
    @@ -72,7 +72,7 @@ http://%HOSTIP:%HTTPPORT/506
     
     # Verify data after the test has been "shot"
     
    -
    +
     GLOBAL_INIT
     SHARE_INIT
     CURLSHOPT_LOCKFUNC
    @@ -156,33 +156,55 @@ unlock: share  [Pigs in space]: 53
     CURLOPT_COOKIEJAR
     CURLOPT_COOKIELIST FLUSH
     lock:   cookie [Pigs in space]: 54
    -lock:   cookie [Pigs in space]: 55
    -unlock: cookie [Pigs in space]: 56
    -unlock: cookie [Pigs in space]: 57
    +unlock: cookie [Pigs in space]: 55
     PERFORM
    -lock:   dns    [Pigs in space]: 58
    -unlock: dns    [Pigs in space]: 59
    +lock:   dns    [Pigs in space]: 56
    +unlock: dns    [Pigs in space]: 57
    +lock:   cookie [Pigs in space]: 58
    +unlock: cookie [Pigs in space]: 59
     lock:   cookie [Pigs in space]: 60
     unlock: cookie [Pigs in space]: 61
     lock:   cookie [Pigs in space]: 62
     unlock: cookie [Pigs in space]: 63
    -lock:   cookie [Pigs in space]: 64
    -unlock: cookie [Pigs in space]: 65
     run 3: overwrite cookie 1 and 4
    -lock:   dns    [Pigs in space]: 66
    -unlock: dns    [Pigs in space]: 67
    -try SHARE_CLEANUP...
    +lock:   dns    [Pigs in space]: 64
    +unlock: dns    [Pigs in space]: 65
    +CLEANUP
    +lock:   cookie [Pigs in space]: 66
    +unlock: cookie [Pigs in space]: 67
     lock:   share  [Pigs in space]: 68
     unlock: share  [Pigs in space]: 69
    +CURLOPT_SHARE
    +lock:   share  [Pigs in space]: 70
    +unlock: share  [Pigs in space]: 71
    +CURLOPT_COOKIELIST ALL
    +lock:   cookie [Pigs in space]: 72
    +unlock: cookie [Pigs in space]: 73
    +CURLOPT_COOKIEJAR
    +CURLOPT_COOKIELIST RELOAD
    +lock:   cookie [Pigs in space]: 74
    +unlock: cookie [Pigs in space]: 75
    +loaded cookies:
    +-----------------
    +  .host.foo.com	TRUE	/	FALSE	1896263787	injected	yes
    +  .foo.com	TRUE	/	FALSE	1993463787	test1	overwritten1
    +  .host.foo.com	TRUE	/	FALSE	1896263787	test2	two
    +  .foo.com	TRUE	/	FALSE	1896263787	test3	three
    +  .host.foo.com	TRUE	/	FALSE	2061978987	test4	overwritten4
    +  .host.foo.com	TRUE	/	FALSE	1896263787	test5	five
    +-----------------
    +try SHARE_CLEANUP...
    +lock:   share  [Pigs in space]: 76
    +unlock: share  [Pigs in space]: 77
     SHARE_CLEANUP failed, correct
     CLEANUP
    -lock:   cookie [Pigs in space]: 70
    -unlock: cookie [Pigs in space]: 71
    -lock:   share  [Pigs in space]: 72
    -unlock: share  [Pigs in space]: 73
    +lock:   cookie [Pigs in space]: 78
    +unlock: cookie [Pigs in space]: 79
    +lock:   share  [Pigs in space]: 80
    +unlock: share  [Pigs in space]: 81
     SHARE_CLEANUP
    -lock:   share  [Pigs in space]: 74
    -unlock: share  [Pigs in space]: 75
    +lock:   share  [Pigs in space]: 82
    +unlock: share  [Pigs in space]: 83
     GLOBAL_CLEANUP
     
     
    diff --git a/tests/data/test508 b/tests/data/test508
    index 5cd4b8c..2b8a2d5 100644
    --- a/tests/data/test508
    +++ b/tests/data/test508
    @@ -1,14 +1,21 @@
     
    +
    +
    +HTTP
    +POST
    +POST callback
    +
    +
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake swsclose
    -Connection: close
    -Content-Type: text/html
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake swsclose
    +Connection: close
    +Content-Type: text/html
    +
     hello
     
     
    diff --git a/tests/data/test509 b/tests/data/test509
    index dfe9027..5de1599 100644
    --- a/tests/data/test509
    +++ b/tests/data/test509
    @@ -1,4 +1,9 @@
     
    +
    +
    +memory callbacks
    +
    +
     #
     # Server-side
     
    @@ -9,6 +14,9 @@
     
     none
     
    +
    +http
    +
     # tool is what to use instead of 'curl'
     
     lib509
    @@ -25,7 +33,7 @@ nothing
     #
     # Verify data after the test has been "shot"
     
    -
    +
     seen custom_calloc()
     seen custom_malloc()
     seen custom_realloc()
    diff --git a/tests/data/test510 b/tests/data/test510
    index f1f1a3c..5ba0a7f 100644
    --- a/tests/data/test510
    +++ b/tests/data/test510
    @@ -9,13 +9,13 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake swsclose
    -Connection: close
    -Content-Type: text/html
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake swsclose
    +Connection: close
    +Content-Type: text/html
    +
     hello
     
     
    diff --git a/tests/data/test512 b/tests/data/test512
    index ce644db..d259f40 100644
    --- a/tests/data/test512
    +++ b/tests/data/test512
    @@ -9,7 +9,7 @@ HTTP GET
     #
     # Server-side
     
    -
    +
     HTTP/1.1 200 OK swsclose
     Date: Thu, 09 Nov 2010 14:49:00 GMT
     Server: yes
    diff --git a/tests/data/test514 b/tests/data/test514
    index a8e66ea..ca37a5d 100644
    --- a/tests/data/test514
    +++ b/tests/data/test514
    @@ -8,18 +8,18 @@ HTTP HEAD
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     
     
     
    diff --git a/tests/data/test515 b/tests/data/test515
    index d139f29..526f1e1 100644
    --- a/tests/data/test515
    +++ b/tests/data/test515
    @@ -8,12 +8,12 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 3
    -
    +
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 3
    +
     OK
     
     
    diff --git a/tests/data/test516 b/tests/data/test516
    index 93f21d6..9bc175b 100644
    --- a/tests/data/test516
    +++ b/tests/data/test516
    @@ -9,12 +9,12 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 3
    -
    +
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 3
    +
     OK
     
     
    diff --git a/tests/data/test517 b/tests/data/test517
    index 7b703b4..c81a45e 100644
    --- a/tests/data/test517
    +++ b/tests/data/test517
    @@ -1,4 +1,10 @@
     
    +
    +
    +getdate
    +unittest
    +
    +
     #
     # Server-side
     
    @@ -25,7 +31,7 @@ nothing
     #
     # Verify data after the test has been "shot"
     
    -
    +
     0: Sun, 06 Nov 1994 08:49:37 GMT => 784111777
     1: Sunday, 06-Nov-94 08:49:37 GMT => 784111777
     2: Sun Nov  6 08:49:37 1994 => 784111777
    diff --git a/tests/data/test518 b/tests/data/test518
    index 58c8b2c..0c88147 100644
    --- a/tests/data/test518
    +++ b/tests/data/test518
    @@ -10,17 +10,17 @@ HTTP GET
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     -foo-
     
     
    diff --git a/tests/data/test519 b/tests/data/test519
    index 1a9768d..b8ca9ab 100644
    --- a/tests/data/test519
    +++ b/tests/data/test519
    @@ -9,34 +9,34 @@ HTTP GET
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK swsbounce
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 8
    -
    +
    +HTTP/1.1 200 OK swsbounce
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 8
    +
     content
     
     
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 9
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 9
    +
     content2
     
     
    -HTTP/1.1 200 OK swsbounce
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 8
    -
    +HTTP/1.1 200 OK swsbounce
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 8
    +
     content
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 9
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 9
    +
     content2
     
     
    diff --git a/tests/data/test521 b/tests/data/test521
    index 9bc5501..90f51b3 100644
    --- a/tests/data/test521
    +++ b/tests/data/test521
    @@ -11,7 +11,7 @@ CURLOPT_PORT
     
     # When doing LIST, we get the default list output hard-coded in the test
     # FTP server
    -
    +
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
    diff --git a/tests/data/test522 b/tests/data/test522
    index 4ac46ff..56d1f3b 100644
    --- a/tests/data/test522
    +++ b/tests/data/test522
    @@ -11,14 +11,14 @@ CURLOPT_PORT
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +
     hello
     
     
    @@ -53,7 +53,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     
    -
    +
     hello
     
     
    diff --git a/tests/data/test523 b/tests/data/test523
    index bae7e6f..7d3db38 100644
    --- a/tests/data/test523
    +++ b/tests/data/test523
    @@ -13,14 +13,14 @@ CURLOPT_PROXY
     # Server-side
     
     
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +
     hello
     
     
    @@ -57,7 +57,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     
    -
    +
     hello
     
     
    diff --git a/tests/data/test528 b/tests/data/test528
    index 0a55fd3..1d2e415 100644
    --- a/tests/data/test528
    +++ b/tests/data/test528
    @@ -10,11 +10,11 @@ multi
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 47
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 47
    +
     file contents should appear once for each file
     
     
    diff --git a/tests/data/test530 b/tests/data/test530
    index 09e7421..40182e2 100644
    --- a/tests/data/test530
    +++ b/tests/data/test530
    @@ -10,35 +10,35 @@ multi
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 47
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 47
    +
     file contents should appear once for each file
     
     
    -HTTP/1.1 200 OK
    +HTTP/1.1 200 OK
     
     
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
     
     
    -Server: test-server/fake
    -Content-Length: 47
    -
    +Server: test-server/fake
    +Content-Length: 47
    +
     file contents should appear once for each file
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 47
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 47
    +
     file contents should appear once for each file
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 47
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 47
    +
     file contents should appear once for each file
     
     
    diff --git a/tests/data/test535 b/tests/data/test535
    index 85515a1..6837d2a 100644
    --- a/tests/data/test535
    +++ b/tests/data/test535
    @@ -8,23 +8,23 @@ multi
     
     
     
    -
    -HTTP/1.1 404 Badness
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -ETag: "21025-dc7-39462498"
    -Content-Length: 6
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 404 Badness
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +ETag: "21025-dc7-39462498"
    +Content-Length: 6
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     hejsan
     
     
    -HTTP/1.1 200 Fine
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Content-Length: 13
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 200 Fine
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Content-Length: 13
    +Connection: close
    +Content-Type: text/html
    +
     fine content
     
     
    diff --git a/tests/data/test536 b/tests/data/test536
    index 51cde15..51ac971 100644
    --- a/tests/data/test536
    +++ b/tests/data/test536
    @@ -9,23 +9,23 @@ multi
     
     
     
    -
    -HTTP/1.1 404 Badness
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -ETag: "21025-dc7-39462498"
    -Content-Length: 6
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 404 Badness
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +ETag: "21025-dc7-39462498"
    +Content-Length: 6
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     hejsan
     
     
    -HTTP/1.1 200 Fine
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Content-Length: 13
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 200 Fine
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Content-Length: 13
    +Connection: close
    +Content-Type: text/html
    +
     fine content
     
     
    diff --git a/tests/data/test537 b/tests/data/test537
    index bef8f83..14e285f 100644
    --- a/tests/data/test537
    +++ b/tests/data/test537
    @@ -10,17 +10,17 @@ HTTP GET
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     -foo-
     
     
    diff --git a/tests/data/test539 b/tests/data/test539
    index 15da794..eaa64d5 100644
    --- a/tests/data/test539
    +++ b/tests/data/test539
    @@ -8,11 +8,11 @@ FTP
     #
     # Server-side
     
    -
    +
     file contents
     
     
    -
    +
     file contents
     total 20
     drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
    diff --git a/tests/data/test540 b/tests/data/test540
    index c99f9a0..a2f7364 100644
    --- a/tests/data/test540
    +++ b/tests/data/test540
    @@ -58,6 +58,7 @@ http
     lib540
     
     
    +!SSPI
     crypto
     
      
    diff --git a/tests/data/test543 b/tests/data/test543
    index df5c1df..4556330 100644
    --- a/tests/data/test543
    +++ b/tests/data/test543
    @@ -28,7 +28,7 @@ curl_easy_escape
     # There's no MTDM in the protocol here since this code doesn't ask for the
     # time/date of the file
     
    -
    +
     %9C%26K%3DI%04%A1%01%E0%D8%7C%20%B7%EFS%29%FA%1DW%E1
     
     
    diff --git a/tests/data/test544 b/tests/data/test544
    index 963baec..78cb5a4 100644
    --- a/tests/data/test544
    +++ b/tests/data/test544
    @@ -9,12 +9,12 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 3
    -
    +
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 3
    +
     OK
     
     
    diff --git a/tests/data/test545 b/tests/data/test545
    index 11e3fb9f331e75eb9d723be96143a7e481875fb8..f2a5dddee6a41878a9f1ad0aefebe903815e5111 100644
    GIT binary patch
    delta 128
    zcmZ3)HjiyW+{7#?M&5}nDh9kIthLwUbFBk8`E2|}|Qj78x67y0N^70i*iV`z(GV{_EK!TGOFs>8;isq%31I1Ep
    Zl`2z
     
     NTLM
    +!SSPI
    +debug
     
      
     HTTP proxy auth NTLM with POST data from read callback
    @@ -87,7 +89,7 @@ CURL_GETHOSTNAME=curlhost
     LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
      
      
    -http://test.remote.example.com/path/547 http://%HOSTIP:%HTTPPORT s1lly:pers0n
    +http://test.remote.example.com/path/547 http://%HOSTIP:%HTTPPORT testuser:testpass
     
     
     chkhostname curlhost
    @@ -119,7 +121,7 @@ Content-Length: 0
     Content-Type: application/x-www-form-urlencoded
     
     POST http://test.remote.example.com/path/547 HTTP/1.1
    -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAIYrD1xJmhNBNL9fLzuk9PV9436GAxPu0EKWzqQ/sZDVLXnp1JrySgl8A+cibE6z4HMxbGx5Y3VybGhvc3Q=
    +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
     Host: test.remote.example.com
     Accept: */*
    diff --git a/tests/data/test548 b/tests/data/test548
    index a6e2a9b..54f242f 100644
    --- a/tests/data/test548
    +++ b/tests/data/test548
    @@ -76,6 +76,8 @@ lib548
     
     
     NTLM
    +!SSPI
    +debug
     
      
     HTTP proxy auth NTLM with POST data from CURLOPT_POSTFIELDS
    @@ -87,7 +89,7 @@ CURL_GETHOSTNAME=curlhost
     LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
      
      
    -http://test.remote.example.com/path/548 http://%HOSTIP:%HTTPPORT s1lly:pers0n
    +http://test.remote.example.com/path/548 http://%HOSTIP:%HTTPPORT testuser:testpass
     
     
     chkhostname curlhost
    @@ -119,7 +121,7 @@ Content-Length: 0
     Content-Type: application/x-www-form-urlencoded
     
     POST http://test.remote.example.com/path/548 HTTP/1.1
    -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAIYrD1xJmhNBNL9fLzuk9PV9436GAxPu0EKWzqQ/sZDVLXnp1JrySgl8A+cibE6z4HMxbGx5Y3VybGhvc3Q=
    +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
     Host: test.remote.example.com
     Accept: */*
    diff --git a/tests/data/test549 b/tests/data/test549
    index e4bd6bf..a248edb 100644
    --- a/tests/data/test549
    +++ b/tests/data/test549
    @@ -12,14 +12,14 @@ HTTP proxy
     # Server-side
     
     
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +
     hello
     
     
    @@ -58,7 +58,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     
    -
    +
     hello
     
     
    diff --git a/tests/data/test550 b/tests/data/test550
    index e9605d6..a609aa2 100644
    --- a/tests/data/test550
    +++ b/tests/data/test550
    @@ -12,14 +12,14 @@ CURLOPT_PROXY
     # Server-side
     
     
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +
     hello
     
     
    @@ -58,7 +58,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     
    -
    +
     hello
     
     
    diff --git a/tests/data/test551 b/tests/data/test551
    index 4f5220a..5776303 100644
    --- a/tests/data/test551
    +++ b/tests/data/test551
    @@ -61,6 +61,8 @@ http
     lib547
     
     
    +!SSPI
    +crypto
     
      
     HTTP proxy auth Digest with POST data from read callback
    diff --git a/tests/data/test552 b/tests/data/test552
    index a974fc5cb04c11b2513e2bfd447656137a20bb5f..61de9fe24ea82b56f4ad7a0f029bf07b1be10206 100644
    GIT binary patch
    delta 40
    vcmZp;&(V38V?!Vtk796efG1aSQDs3%{^kHSb;jmuj`nH}#_iP{OswhvAv_G8
    
    delta 288
    zcmXYr%}T>S6osisQ}PtIRQ!V)bSXu+#lJ;ctfUq3mJw-;4HsYu$r6fw5YYpt1}Y}FVWo%;v-%)0K-FqE;)IsZ~4t9crEy12%b^rhX
    
    diff --git a/tests/data/test553 b/tests/data/test553
    index 5552936..bd937f0 100644
    --- a/tests/data/test553
    +++ b/tests/data/test553
    @@ -44,8 +44,6 @@ http://%HOSTIP:%HTTPPORT/path/553
     
     ^User-Agent: curl/.*
     
    -# We strip off a large chunk of the type-2 NTLM message since it depends on
    -# the local host name and thus differs on different machines!
     
     POST /path/553 HTTP/1.1
     Host: %HOSTIP:%HTTPPORT
    diff --git a/tests/data/test554 b/tests/data/test554
    index b08d774..b55fa3d 100644
    --- a/tests/data/test554
    +++ b/tests/data/test554
    @@ -9,13 +9,13 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake swsclose
    -Connection: close
    -Content-Type: text/html
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake swsclose
    +Connection: close
    +Content-Type: text/html
    +
     hello
     
     
    diff --git a/tests/data/test555 b/tests/data/test555
    index bf06b52..c802fea 100644
    --- a/tests/data/test555
    +++ b/tests/data/test555
    @@ -81,6 +81,8 @@ lib555
     
     
     NTLM
    +!SSPI
    +debug
     
      
     HTTP proxy auth NTLM with POST data from read callback multi-if
    @@ -92,7 +94,7 @@ CURL_GETHOSTNAME=curlhost
     LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
      
      
    -http://test.remote.example.com/path/555 http://%HOSTIP:%HTTPPORT s1lly:pers0n
    +http://test.remote.example.com/path/555 http://%HOSTIP:%HTTPPORT testuser:testpass
     
     
     chkhostname curlhost
    @@ -128,7 +130,7 @@ Content-Length: 0
     Content-Type: application/x-www-form-urlencoded
     
     POST http://test.remote.example.com/path/555 HTTP/1.1
    -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAAIAAgAdQAAAAAAAAAAAAAABoKBAIYrD1xJmhNBNL9fLzuk9PV9436GAxPu0EKWzqQ/sZDVLXnp1JrySgl8A+cibE6z4HMxbGx5Y3VybGhvc3Q=
    +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
     Host: test.remote.example.com
     Accept: */*
    diff --git a/tests/data/test556 b/tests/data/test556
    index 998bdfb..55c7c91 100644
    --- a/tests/data/test556
    +++ b/tests/data/test556
    @@ -8,12 +8,12 @@ HTTP GET
     
     
     
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -Content-Length: 6
    -Connection: close
    -
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +Content-Length: 6
    +Connection: close
    +
     -foo-
     
     
    diff --git a/tests/data/test557 b/tests/data/test557
    index 3da67e9..ee2793f 100644
    --- a/tests/data/test557
    +++ b/tests/data/test557
    @@ -1,4 +1,10 @@
     
    +
    +
    +printf
    +unittest
    +
    +
     #
     # Server-side
     
    @@ -25,7 +31,7 @@ nothing
     #
     # Verify data after the test has been "shot"
     
    -
    +
     All curl_mprintf() unsigned short tests OK!
     All curl_mprintf() signed short tests OK!
     All curl_mprintf() unsigned int tests OK!
    diff --git a/tests/data/test558 b/tests/data/test558
    index f8cbfbe..7a9ba70 100644
    --- a/tests/data/test558
    +++ b/tests/data/test558
    @@ -34,7 +34,7 @@ nothing
     #
     # Verify data after the test has been "shot"
     
    -
    +
     MEM lib558.c: malloc()
     MEM lib558.c: free()
     MEM escape.c: malloc()
    diff --git a/tests/data/test560 b/tests/data/test560
    index 0e991b8..8d00554 100644
    --- a/tests/data/test560
    +++ b/tests/data/test560
    @@ -11,11 +11,11 @@ multi
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Length: 7
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Length: 7
    +
     MooMoo
     
     
    diff --git a/tests/data/test561 b/tests/data/test561
    index 8f069e6..a6188ea 100644
    --- a/tests/data/test561
    +++ b/tests/data/test561
    @@ -13,14 +13,14 @@ type=
     # Server-side
     
     
    -HTTP/1.1 200 OK swsclose
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -
    +HTTP/1.1 200 OK swsclose
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +
     hello
     
     
    @@ -59,7 +59,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     
    -
    +
     hello
     
     
    diff --git a/tests/data/test565 b/tests/data/test565
    index b8d12b4..90fa4d1 100644
    --- a/tests/data/test565
    +++ b/tests/data/test565
    @@ -56,6 +56,10 @@ ok
     
     http
     
    +
    +!SSPI
    +crypto
    +
     # tool is what to use instead of 'curl'
     
     lib565
    diff --git a/tests/data/test566 b/tests/data/test566
    index 95da61d..9923d8f 100644
    --- a/tests/data/test566
    +++ b/tests/data/test566
    @@ -8,18 +8,18 @@ HTTP GET
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 0
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 0
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     
     
     
    @@ -44,7 +44,7 @@ http://%HOSTIP:%HTTPPORT/566 log/ip566
     #
     # Verify data after the test has been "shot"
     
    -
    +
     CL: 0
     
     
    diff --git a/tests/data/test567 b/tests/data/test567
    index 4fd1484..de0f632 100644
    --- a/tests/data/test567
    +++ b/tests/data/test567
    @@ -11,11 +11,11 @@ OPTIONS
     # Server-side
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -CSeq: 1
    -Public: DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
    -Curl-Private: swsclose
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +CSeq: 1
    +Public: DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
    +Curl-Private: swsclose
     
     
     
    diff --git a/tests/data/test568 b/tests/data/test568
    index 0f8440f..09fa81c 100644
    --- a/tests/data/test568
    +++ b/tests/data/test568
    @@ -11,37 +11,37 @@ ANNOUNCE
     # Server-side
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Cseq: 1
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Cseq: 1
    +
     
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Cseq: 2
    -Content-Length: 70
    -Content-Type: application/sdp
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Cseq: 2
    +Content-Length: 70
    +Content-Type: application/sdp
    +
     v=0
     s=rtspd SDP
     i=A fake SDP reply
     u=http://www.curl.example.com/fakesdp.ps
     
     
    -RTSP/1.0 200 Okie Dokie
    -Server: RTSPD/libcurl-test
    -Cseq: 3
    -
    +RTSP/1.0 200 Okie Dokie
    +Server: RTSPD/libcurl-test
    +Cseq: 3
    +
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -CSeq: 4
    -Curl-private: swsclose
    -Informational: Empty Options Response
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +CSeq: 4
    +Curl-private: swsclose
    +Informational: Empty Options Response
    +
     
     
     
    diff --git a/tests/data/test570 b/tests/data/test570
    index aec8638..65f32a5 100644
    --- a/tests/data/test570
    +++ b/tests/data/test570
    @@ -11,28 +11,28 @@ Mismatch checking
     # Server-side
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -CSeq: 2
    -Public: DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
    -Informational: CSeq Mismatch
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +CSeq: 2
    +Public: DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
    +Informational: CSeq Mismatch
    +
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: asdf
    -CSeq: 999
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: asdf
    +CSeq: 999
    +
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: asdfWRONG
    -Informational: Session ID mismatch
    -Curl-Private: swsclose
    -CSeq: 1000
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: asdfWRONG
    +Informational: Session ID mismatch
    +Curl-Private: swsclose
    +CSeq: 1000
    +
     
     
     
    diff --git a/tests/data/test571 b/tests/data/test571
    index f41ef01..5e138cd 100644
    --- a/tests/data/test571
    +++ b/tests/data/test571
    @@ -15,37 +15,37 @@ RTP
     # Server-side
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: asdf
    -CSeq: 1
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: asdf
    +CSeq: 1
    +
     
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -CSeq: 2
    -Session: asdf
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +CSeq: 2
    +Session: asdf
    +
     
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Cseq: 3
    -Content-Length: 4
    -Content-Type: fake/evil
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Cseq: 3
    +Content-Length: 4
    +Content-Type: fake/evil
    +
     $99
     
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: asdf
    -CSeq: 4
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: asdf
    +CSeq: 4
    +
     
     
     
    @@ -83,7 +83,7 @@ rtsp://%HOSTIP:%RTSPPORT/571 log/protofile.txt
     
     
     
    -
    +
     RTP: message size 10, channel 1
     RTP: message size 500, channel 0
     RTP: message size 196, channel 0
    diff --git a/tests/data/test572 b/tests/data/test572
    index 83ae646..903ded9 100644
    --- a/tests/data/test572
    +++ b/tests/data/test572
    @@ -11,52 +11,52 @@ GET_PARAMETER
     # Server-side
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: getparams-test
    -CSeq: 1
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: getparams-test
    +CSeq: 1
    +
     
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: getparams-test
    -Content-Type: text/parameters
    -Content-Length: 32
    -Cseq: 2
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: getparams-test
    +Content-Type: text/parameters
    +Content-Length: 32
    +Cseq: 2
    +
     scale=enormous
     speed=ludicrous
     
     
     
     
    -RTSP/1.0 204 OK
    -Server: RTSPD/libcurl-test
    -Session: getparams-test
    -Cseq: 3
    -
    +RTSP/1.0 204 OK
    +Server: RTSPD/libcurl-test
    +Session: getparams-test
    +Cseq: 3
    +
     
     
     
    -RTSP/1.0 200 Okie Dokie
    -Server: RTSPD/libcurl-test
    -Session: getparams-test
    -Cseq: 4
    -Content-Length: 37
    -
    +RTSP/1.0 200 Okie Dokie
    +Server: RTSPD/libcurl-test
    +Session: getparams-test
    +Cseq: 4
    +Content-Length: 37
    +
     packets_received: 1000
     jitter: 0.314
     
     
    -RTSP/1.0 200 OK
    -Server: RTSPD/libcurl-test
    -Session: getparams-test
    -CSeq: 5
    -Curl-private: swsclose
    -Informational: Empty Options Response
    -
    +RTSP/1.0 200 OK
    +Server: RTSPD/libcurl-test
    +Session: getparams-test
    +CSeq: 5
    +Curl-private: swsclose
    +Informational: Empty Options Response
    +
     
     
     
    diff --git a/tests/data/test573 b/tests/data/test573
    index 54ff8fb..e3299b8 100644
    --- a/tests/data/test573
    +++ b/tests/data/test573
    @@ -3,23 +3,24 @@
     
     HTTP
     multi
    +flaky
     
     
     #
     # Server-side
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     -foo-
     
     
    diff --git a/tests/data/test574 b/tests/data/test574
    index 1fa4654..cb41f03 100644
    --- a/tests/data/test574
    +++ b/tests/data/test574
    @@ -25,7 +25,7 @@ ftp
     lib574
     
     
    -FTP wildcard download - changed fnmatch, 2x perform (UNIX LIST response)
    +FTP wildcard download - changed fnmatch, 2x perform (Unix LIST response)
     
     
     ftp://%HOSTIP:%FTPPORT/fully_simulated/UNIX/*.txt
    @@ -82,7 +82,7 @@ EPSV
     RETR someothertext.txt
     QUIT
     
    -
    +
     This file should have permissions 444
     This file should have permissions 666
     This file should have permissions 777
    diff --git a/tests/data/test575 b/tests/data/test575
    index 5670e6b..8133834 100644
    --- a/tests/data/test575
    +++ b/tests/data/test575
    @@ -100,7 +100,7 @@ EPSV
     RETR someothertext.txt
     QUIT
     
    -
    +
     This file should have permissions 444
     This file should have permissions 666
     This file should have permissions 777
    diff --git a/tests/data/test576 b/tests/data/test576
    index 4d4b90c..74a3aed 100644
    --- a/tests/data/test576
    +++ b/tests/data/test576
    @@ -22,7 +22,7 @@ ftp
     lib576
     
      
    -FTP wildcard download - skip/parser_correctness/CURLOPT_FNMATCH_FUNCTION (UNIX)
    +FTP wildcard download - skip/parser_correctness/CURLOPT_FNMATCH_FUNCTION (Unix)
      
      
     ftp://%HOSTIP:%FTPPORT/fully_simulated/UNIX/*
    @@ -34,7 +34,7 @@ ftp://%HOSTIP:%FTPPORT/fully_simulated/UNIX/*
     
     0
     
    -
    +
     =============================================================
     Remains:      14
     Filename:     .
    diff --git a/tests/data/test578 b/tests/data/test578
    index 0b6a437..e4ee4ac 100644
    --- a/tests/data/test578
    +++ b/tests/data/test578
    @@ -8,18 +8,18 @@ HTTP POST
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    -ETag: "21025-dc7-39462498"
    -Accept-Ranges: bytes
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -Funny-head: yesyes
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
    +ETag: "21025-dc7-39462498"
    +Accept-Ranges: bytes
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +Funny-head: yesyes
    +
     -foo-
     
     
    @@ -45,7 +45,7 @@ http://%HOSTIP:%HTTPPORT/500 log/ip578
     #
     # Verify data after the test has been "shot"
     
    -
    +
     PASSED, UL data matched data size
     
     
    diff --git a/tests/data/test579 b/tests/data/test579
    index 5f87944..e352e3d 100644
    --- a/tests/data/test579
    +++ b/tests/data/test579
    @@ -10,43 +10,43 @@ HTTP Digest auth
     # Server-side
     
     
    -HTTP/1.1 100 Continue
    -Server: Microsoft-IIS/5.0
    -Date: Sun, 03 Apr 2005 14:57:45 GMT
    -X-Powered-By: ASP.NET
    -
    -HTTP/1.1 401 authentication please swsbounce
    -Server: Microsoft-IIS/6.0
    -WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
    -Content-Type: text/html; charset=iso-8859-1
    -Content-Length: 0
    -
    +HTTP/1.1 100 Continue
    +Server: Microsoft-IIS/5.0
    +Date: Sun, 03 Apr 2005 14:57:45 GMT
    +X-Powered-By: ASP.NET
    +
    +HTTP/1.1 401 authentication please swsbounce
    +Server: Microsoft-IIS/6.0
    +WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
    +Content-Type: text/html; charset=iso-8859-1
    +Content-Length: 0
    +
     
     
    -HTTP/1.1 200 A OK
    -Server: Microsoft-IIS/6.0
    -Content-Type: text/html; charset=iso-8859-1
    -Content-Length: 3
    -
    +HTTP/1.1 200 A OK
    +Server: Microsoft-IIS/6.0
    +Content-Type: text/html; charset=iso-8859-1
    +Content-Length: 3
    +
     ok
     
     
    -HTTP/1.1 100 Continue
    -Server: Microsoft-IIS/5.0
    -Date: Sun, 03 Apr 2005 14:57:45 GMT
    -X-Powered-By: ASP.NET
    -
    -HTTP/1.1 401 authentication please swsbounce
    -Server: Microsoft-IIS/6.0
    -WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
    -Content-Type: text/html; charset=iso-8859-1
    -Content-Length: 0
    -
    -HTTP/1.1 200 A OK
    -Server: Microsoft-IIS/6.0
    -Content-Type: text/html; charset=iso-8859-1
    -Content-Length: 3
    -
    +HTTP/1.1 100 Continue
    +Server: Microsoft-IIS/5.0
    +Date: Sun, 03 Apr 2005 14:57:45 GMT
    +X-Powered-By: ASP.NET
    +
    +HTTP/1.1 401 authentication please swsbounce
    +Server: Microsoft-IIS/6.0
    +WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
    +Content-Type: text/html; charset=iso-8859-1
    +Content-Length: 0
    +
    +HTTP/1.1 200 A OK
    +Server: Microsoft-IIS/6.0
    +Content-Type: text/html; charset=iso-8859-1
    +Content-Length: 3
    +
     ok
     
     
    @@ -56,6 +56,9 @@ ok
     
     http
     
    +
    +crypto
    +
     # tool is what to use instead of 'curl'
     
     lib579
    @@ -72,14 +75,13 @@ http://%HOSTIP:%HTTPPORT/579 log/ip579
     #
     # Verify data after the test has been "shot"
     
    -
    +
     Progress callback called with UL 0 out of 0
    -Progress callback called with UL 0 out of -1
    -Progress callback called with UL 8 out of -1
    -Progress callback called with UL 16 out of -1
    -Progress callback called with UL 26 out of -1
    -Progress callback called with UL 61 out of -1
    -Progress callback called with UL 66 out of -1
    +Progress callback called with UL 8 out of 0
    +Progress callback called with UL 16 out of 0
    +Progress callback called with UL 26 out of 0
    +Progress callback called with UL 61 out of 0
    +Progress callback called with UL 66 out of 0
     
     
     
    diff --git a/tests/data/test580 b/tests/data/test580
    index 8256f0e..1396559 100644
    --- a/tests/data/test580
    +++ b/tests/data/test580
    @@ -11,14 +11,14 @@ Duplicate-header
     # Server-side
     
     
    -HTTP/1.1 302 eat this!
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Location: this-is-the-first.html
    -Content-Length: 0
    -Connection: close
    -Location: and there's a second one too! / moo.html
    -
    +HTTP/1.1 302 eat this!
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Location: this-is-the-first.html
    +Content-Length: 0
    +Connection: close
    +Location: and there's a second one too! / moo.html
    +
     
     
     
    diff --git a/tests/data/test581 b/tests/data/test581
    index acaa41b..83d7b60 100644
    --- a/tests/data/test581
    +++ b/tests/data/test581
    @@ -11,14 +11,14 @@ Duplicate-header
     # Server-side
     
     
    -HTTP/1.1 200 all good!
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Content-Type: text/html
    -Content-Length: 0
    -Connection: close
    -Content-Type: changed/my/mind
    -
    +HTTP/1.1 200 all good!
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Content-Type: text/html
    +Content-Length: 0
    +Connection: close
    +Content-Type: changed/my/mind
    +
     
     
     
    diff --git a/tests/data/test582 b/tests/data/test582
    index 8881a87..64c32db 100644
    --- a/tests/data/test582
    +++ b/tests/data/test582
    @@ -34,6 +34,9 @@ Moooooooooooo
     
     # Verify data after the test has been "shot"
     
    +
    +disable
    +
     
     
     
    diff --git a/tests/data/test583 b/tests/data/test583
    index 8fca7d2..6ad7f7d 100644
    --- a/tests/data/test583
    +++ b/tests/data/test583
    @@ -35,6 +35,9 @@ sftp://localhost:%SSHPORT%PWD/log/upload583.txt %USER:
     
     # Verify data after the test has been "shot"
     
    +
    +disable
    +
     
     0
     
    diff --git a/tests/data/test584 b/tests/data/test584
    index 582a911..309c7b6 100644
    --- a/tests/data/test584
    +++ b/tests/data/test584
    @@ -11,31 +11,31 @@ multi
     # Silly division of the first request is solely to appease the server which expects n_data_items == n_requests
     
     
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 4
    -
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 4
    +
     584
     
     
    -HTTP/1.1 200 OK
    +HTTP/1.1 200 OK
     
     
    -Server: test-server/fake
    +Server: test-server/fake
     
     
    -Content-Length: 0
    -
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 5
    -
    +Content-Length: 0
    +
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 5
    +
     585
     
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 4
    -
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 4
    +
     586
     
     
    @@ -76,26 +76,26 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     
    -
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 4
    -
    +
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 4
    +
     584
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 0
    -
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 5
    -
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 0
    +
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 5
    +
     585
     
    -HTTP/1.1 200 OK
    -Server: test-server/fake
    -Content-Length: 4
    -
    +HTTP/1.1 200 OK
    +Server: test-server/fake
    +Content-Length: 4
    +
     586
     
     
    diff --git a/tests/data/test585 b/tests/data/test585
    index 32cb06f..2096e81 100644
    --- a/tests/data/test585
    +++ b/tests/data/test585
    @@ -12,23 +12,23 @@ CURLOPT_CLOSESOCKETFUNCTION
     # Server-side
     
     
    -HTTP/1.1 302 eat this!
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Location: this-is-the-first.html
    -Content-Length: 0
    -Connection: close
    -
    +HTTP/1.1 302 eat this!
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Location: this-is-the-first.html
    +Content-Length: 0
    +Connection: close
    +
     
     
     [OPEN] counter: 1
    -HTTP/1.1 302 eat this!
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Location: this-is-the-first.html
    -Content-Length: 0
    -Connection: close
    -
    +HTTP/1.1 302 eat this!
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Location: this-is-the-first.html
    +Content-Length: 0
    +Connection: close
    +
     [CLOSE] counter: 1
     
     
    diff --git a/tests/data/test588 b/tests/data/test588
    index 0515b52..b30828c 100644
    --- a/tests/data/test588
    +++ b/tests/data/test588
    @@ -1,9 +1,9 @@
    +
     #
     # This test is exactly like 525 but the server rejects the EPRT command.
     # Written up to make sure that there's nothing in the multi interface
     # active connection case that differs between PORT and EPRT use
     #
    -
     
     
     FTP
    diff --git a/tests/data/test590 b/tests/data/test590
    index f50664d..0712c16 100644
    --- a/tests/data/test590
    +++ b/tests/data/test590
    @@ -74,6 +74,8 @@ lib590
     
     
     NTLM
    +!SSPI
    +debug
     
      
     HTTP proxy offers Negotiate+NTLM, use only NTLM
    @@ -112,7 +114,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     GET http://test.remote.example.com/path/590 HTTP/1.1
    -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAAAgACAHAAAAAIAAgAcgAAAAAAAAAAAAAABoKBAAQt1KW5CgG4YdWWcfXyfXBz1ZMCzYp37xYjBiAizmw58O6eQS7yR66eqYGWeSwl9W1lY3VybGhvc3Q=
    +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAAAgACAPYAAAAIAAgA+AAAAAAAAAAAAAAABoKBAB3Hr6SDn3NDNkgebbaP88ExMjM0MjIzNFIW4N7aYT44bAIg1jt2blUBAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbWVjdXJsaG9zdA==
     User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
     Host: test.remote.example.com
     Accept: */*
    diff --git a/tests/data/test591 b/tests/data/test591
    index 1455a38..e1dfcd3 100644
    --- a/tests/data/test591
    +++ b/tests/data/test591
    @@ -1,9 +1,9 @@
    +
     #
     # For this test the server rejects the EPRT command,
     # code in lib591 makes use of curl_multi_timeout()
     # and server does not establish data connection.
     #
    -
     
     
     FTP
    diff --git a/tests/data/test592 b/tests/data/test592
    index f443205..6151ccc 100644
    --- a/tests/data/test592
    +++ b/tests/data/test592
    @@ -1,9 +1,9 @@
    +
     #
     # For this test the server rejects the EPRT command,
     # code in lib591 makes use of curl_multi_timeout()
     # and server does not establish data connection.
     #
    -
     
     
     FTP
    diff --git a/tests/data/test593 b/tests/data/test593
    index c3b1f91..a136000 100644
    --- a/tests/data/test593
    +++ b/tests/data/test593
    @@ -1,9 +1,9 @@
    +
     #
     # For this test the server rejects the EPRT command,
     # code in lib591 makes use of curl_multi_timeout()
     # and server does not establish data connection.
     #
    -
     
     
     FTP
    diff --git a/tests/data/test594 b/tests/data/test594
    index 77b5864..d6144ae 100644
    --- a/tests/data/test594
    +++ b/tests/data/test594
    @@ -1,9 +1,9 @@
    +
     #
     # For this test the server rejects the EPRT command,
     # code in lib591 makes use of curl_multi_timeout()
     # and server does not establish data connection.
     #
    -
     
     
     FTP
    diff --git a/tests/data/test595 b/tests/data/test595
    index 28ff9c1..0099a85 100644
    --- a/tests/data/test595
    +++ b/tests/data/test595
    @@ -1,7 +1,7 @@
    +
     #
     # This test is like 585 but uses passive FTP instead of HTTP
     #
    -
     
     
     FTP
    diff --git a/tests/data/test596 b/tests/data/test596
    index bb5def4..9377289 100644
    --- a/tests/data/test596
    +++ b/tests/data/test596
    @@ -1,7 +1,7 @@
    +
     #
     # This test is like 585 but uses active FTP instead of HTTP
     #
    -
     
     
     FTP
    diff --git a/tests/data/test598 b/tests/data/test598
    index f43bbac..11a0dbc 100644
    --- a/tests/data/test598
    +++ b/tests/data/test598
    @@ -12,31 +12,31 @@ curl_easy_reset
     #
     # Server-side
     
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +
     -foo-
     
     
     # since the request runs twice
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +
     -foo-
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +
     -foo-
     
     
    diff --git a/tests/data/test599 b/tests/data/test599
    index 8215137..9ce8b23 100644
    --- a/tests/data/test599
    +++ b/tests/data/test599
    @@ -9,24 +9,24 @@ HTTP POST
     # Server-side
     
     
    -HTTP/1.1 302 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Location: 5990001
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 302 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Location: 5990001
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +
     -foo-
     
     
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Transfer-Encoding: chunked
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Transfer-Encoding: chunked
    +Connection: close
    +Content-Type: text/html
    +
     32
     this data is slightly larger than the first piece
     
    @@ -35,21 +35,21 @@ this data is slightly larger than the first piece
     
     
     
    -HTTP/1.1 302 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Location: 5990001
    -Content-Length: 6
    -Connection: close
    -Content-Type: text/html
    -
    -HTTP/1.1 200 OK
    -Date: Thu, 09 Nov 2010 14:49:00 GMT
    -Server: test-server/fake
    -Transfer-Encoding: chunked
    -Connection: close
    -Content-Type: text/html
    -
    +HTTP/1.1 302 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Location: 5990001
    +Content-Length: 6
    +Connection: close
    +Content-Type: text/html
    +
    +HTTP/1.1 200 OK
    +Date: Thu, 09 Nov 2010 14:49:00 GMT
    +Server: test-server/fake
    +Transfer-Encoding: chunked
    +Connection: close
    +Content-Type: text/html
    +
     this data is slightly larger than the first piece
     
     
    @@ -71,13 +71,15 @@ lib599
     HTTP GET with progress callback and redirects changing content sizes
      
      
    -http://%HOSTIP:%HTTPPORT/599
    +http://%HOSTIP:%HTTPPORT/599 log/ip599
     
     
     
     #
     # Verify data after the test has been "shot"
     
    -
    +
    +CL: -1
    +
     
     
    diff --git a/tests/data/test604 b/tests/data/test604
    index af0259fb..566086e 100644
    --- a/tests/data/test604
    +++ b/tests/data/test604
    @@ -23,6 +23,9 @@ SFTP retrieval of nonexistent file
     #
     # Verify data after the test has been "shot"
     
    +
    +disable
    +
     
     78
     
    diff --git a/tests/data/test61 b/tests/data/test61
    index d2de279..e6dbbb9 100644
    --- a/tests/data/test61
    +++ b/tests/data/test61
    @@ -23,6 +23,7 @@ Set-Cookie: test3=maybe; domain=foo.com; path=/moo; secure
     Set-Cookie: test4=no; domain=nope.foo.com; path=/moo; secure
     Set-Cookie: test5=name; domain=anything.com; path=/ ; secure
     Set-Cookie: fake=fooledyou; domain=..com; path=/;
    +Set-Cookie: supercookie=fooledyou; domain=.com; path=/;^M
     Content-Length: 4
     
     boo
    diff --git a/tests/data/test623 b/tests/data/test623
    index 19e505b..1a639d6 100644
    --- a/tests/data/test623
    +++ b/tests/data/test623
    @@ -33,6 +33,9 @@ for ssh upload test
     #
     # Verify data after the test has been "shot"
     
    +
    +disable
    +
     
     79
     
    diff --git a/tests/data/test627 b/tests/data/test627
    index ae29d9b..01c5221 100644
    --- a/tests/data/test627
    +++ b/tests/data/test627
    @@ -2,7 +2,7 @@
     
     
     SFTP
    -quote
    +pre-quote
     NOBODY
     
     
    diff --git a/tests/data/test64 b/tests/data/test64
    index 6bd82a8..7a2e3d0 100644
    --- a/tests/data/test64
    +++ b/tests/data/test64
    @@ -52,6 +52,7 @@ This IS the real page!
     http
     
     
    +!SSPI
     crypto
     
      
    diff --git a/tests/data/test640 b/tests/data/test640
    new file mode 100644
    index 0000000..e3e715b
    --- /dev/null
    +++ b/tests/data/test640
    @@ -0,0 +1,41 @@
    +
    +
    +
    +SFTP
    +NOBODY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +sftp
    +
    + 
    +SFTP --head retrieval
    + 
    + 
    +--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%PWD/log/file640.txt --insecure --head
    +
    +
    +Test data
    +for ssh test
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +disable
    +
    +
    +
    diff --git a/tests/data/test641 b/tests/data/test641
    new file mode 100644
    index 0000000..beb59d6
    --- /dev/null
    +++ b/tests/data/test641
    @@ -0,0 +1,41 @@
    +
    +
    +
    +SCP
    +NOBODY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +scp
    +
    + 
    +SCP --head retrieval
    + 
    + 
    +--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%PWD/log/file641.txt --insecure --head
    +
    +
    +Test data
    +for ssh test
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +disable
    +
    +
    +
    diff --git a/tests/data/test65 b/tests/data/test65
    index 8582a0c..001d598 100644
    --- a/tests/data/test65
    +++ b/tests/data/test65
    @@ -52,6 +52,7 @@ This is not the real page either
     http
     
     
    +!SSPI
     crypto
     
      
    diff --git a/tests/data/test67 b/tests/data/test67
    index bfe6edd..58d35e6 100644
    --- a/tests/data/test67
    +++ b/tests/data/test67
    @@ -56,6 +56,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -90,7 +92,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /67 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test68 b/tests/data/test68
    index 10b4429..92a915b 100644
    --- a/tests/data/test68
    +++ b/tests/data/test68
    @@ -55,6 +55,8 @@ Wrong password dude. Get it fixed and return.
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -89,7 +91,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /68 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test69 b/tests/data/test69
    index 441aed7..50603b0 100644
    --- a/tests/data/test69
    +++ b/tests/data/test69
    @@ -72,6 +72,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -111,7 +113,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /69 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test70 b/tests/data/test70
    index 2fc0327..74f70e1 100644
    --- a/tests/data/test70
    +++ b/tests/data/test70
    @@ -52,6 +52,7 @@ This IS the real page!
     # Client-side
     
     
    +!SSPI
     NTLM
     
     
    diff --git a/tests/data/test72 b/tests/data/test72
    index 5c24271..b90e19c 100644
    --- a/tests/data/test72
    +++ b/tests/data/test72
    @@ -54,6 +54,7 @@ This IS the real page!
     http
     
     
    +!SSPI
     crypto
     
      
    diff --git a/tests/data/test74 b/tests/data/test74
    index 4c08e26..dbe0e9c 100644
    --- a/tests/data/test74
    +++ b/tests/data/test74
    @@ -3,6 +3,7 @@
     
     HTTP
     HTTP GET
    +globbing
     {} list
     
     
    diff --git a/tests/data/test75 b/tests/data/test75
    index 07f6990..d8836b9 100644
    --- a/tests/data/test75
    +++ b/tests/data/test75
    @@ -3,6 +3,7 @@
     
     HTTP
     HTTP GET
    +globbing
     FAILURE
     
     
    @@ -24,7 +25,7 @@ http
     HTTP, urlglob retrieval with bad range
      
      
    -"http://%HOSTIP:%HTTPPORT/[2-1]" -o "log/weee#1.dump" --stderr -
    +"http://a-site-never-accessed.example.org/[2-1]" -o "log/weee#1.dump" --stderr -
     
     # The error message on stdout implicitly depends on the length of the
     # URL, so refuse to run if the length is unexpected.
    @@ -43,7 +44,7 @@ perl %SRCDIR/libtest/test75.pl http://%HOSTIP:%HTTPPORT/ 22
     3
     
     
    -curl: (3) [globbing] error: bad range specification after pos 24
    +curl: (3) [globbing] bad range in column 47
     
     
     
    diff --git a/tests/data/test77 b/tests/data/test77
    index 90f4563..6a92158 100644
    --- a/tests/data/test77
    +++ b/tests/data/test77
    @@ -3,6 +3,7 @@
     
     HTTP
     HTTP GET
    +If-Modified-Since
     -z
     
     
    diff --git a/tests/data/test78 b/tests/data/test78
    index aa889c5..6768000 100644
    --- a/tests/data/test78
    +++ b/tests/data/test78
    @@ -3,6 +3,7 @@
     
     HTTP
     HTTP GET
    +If-Modified-Since
     -z
     
     
    diff --git a/tests/data/test8 b/tests/data/test8
    index 4d54541..030fd55 100644
    --- a/tests/data/test8
    +++ b/tests/data/test8
    @@ -42,7 +42,8 @@ Set-Cookie: duplicate=test; domain=.0.0.1; domain=.0.0.1; path=/donkey;
     Set-Cookie: cookie=yes; path=/we;
     Set-Cookie: cookie=perhaps; path=/we/want;
     Set-Cookie: nocookie=yes; path=/WE;
    -Set-Cookie: blexp=yesyes; domain=.0.0.1; domain=.0.0.1; expiry=totally bad;
    +Set-Cookie: blexp=yesyes; domain=%HOSTIP; domain=%HOSTIP; expiry=totally bad;
    +Set-Cookie: partialip=nono; domain=.0.0.1;
     
     
     
    diff --git a/tests/data/test800 b/tests/data/test800
    index 88e3f60..6b29f7a 100644
    --- a/tests/data/test800
    +++ b/tests/data/test800
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     FETCH
     
     
    @@ -27,7 +28,7 @@ body
     imap
     
      
    -IMAP FETCH
    +IMAP FETCH message
      
      
     'imap://%HOSTIP:%IMAPPORT/800/;UID=1' -u user:secret
    diff --git a/tests/data/test801 b/tests/data/test801
    index d112eb2..0012d3e 100644
    --- a/tests/data/test801
    +++ b/tests/data/test801
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     FETCH
     
     
    @@ -24,7 +25,7 @@ body
     imap
     
      
    -IMAP FETCH by UID and SECTION
    +IMAP FETCH message by UID and SECTION
      
      
     'imap://%HOSTIP:%IMAPPORT/801/;UID=123/;SECTION=1' -u user:secret
    diff --git a/tests/data/test802 b/tests/data/test802
    index 3bb7165..17349a8 100644
    --- a/tests/data/test802
    +++ b/tests/data/test802
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     SELECT
     UIDVALIDITY
     
    diff --git a/tests/data/test803 b/tests/data/test803
    index 220c845..5b8cc9e 100644
    --- a/tests/data/test803
    +++ b/tests/data/test803
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     SELECT
     UIDVALIDITY
     FAILURE
    diff --git a/tests/data/test804 b/tests/data/test804
    index 3fcf955..c6dfccf 100644
    --- a/tests/data/test804
    +++ b/tests/data/test804
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     SELECT
     
     
    @@ -27,7 +28,7 @@ imap
     IMAP doesn't perform SELECT if re-using the same mailbox
      
      
    --u user:secret 'imap://%HOSTIP:%IMAPPORT/804/;UID=123/;SECTION=1' 'imap://%HOSTIP:%IMAPPORT/804/;UID=456/;SECTION=2.3'
    +'imap://%HOSTIP:%IMAPPORT/804/;UID=123/;SECTION=1' 'imap://%HOSTIP:%IMAPPORT/804/;UID=456/;SECTION=2.3' -u user:secret
     
     
     
    diff --git a/tests/data/test805 b/tests/data/test805
    index 8703951..e70c1a6 100644
    --- a/tests/data/test805
    +++ b/tests/data/test805
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     APPEND
     UPLOAD
     
    @@ -19,10 +20,10 @@ UPLOAD
     imap
     
      
    -IMAP APPEND
    +IMAP APPEND message
      
      
    --u user:secret -T log/upload805 'imap://%HOSTIP:%IMAPPORT/805'
    +imap://%HOSTIP:%IMAPPORT/805 -T log/upload805 -u user:secret
     
     
     Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
    diff --git a/tests/data/test806 b/tests/data/test806
    index 59f6b1e..37822a4 100644
    --- a/tests/data/test806
    +++ b/tests/data/test806
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     LIST
     
     
    @@ -23,10 +24,10 @@ LIST
     imap
     
      
    -IMAP LIST
    +IMAP LIST mailbox
      
      
    --u user:secret 'imap://%HOSTIP:%IMAPPORT/806/'
    +imap://%HOSTIP:%IMAPPORT/806 -u user:secret
     
     
     
    diff --git a/tests/data/test807 b/tests/data/test807
    index 0a6838b..1271b6d 100644
    --- a/tests/data/test807
    +++ b/tests/data/test807
    @@ -2,7 +2,8 @@
     
     
     IMAP
    -STORE
    +Clear Text
    +LSUB
     CUSTOMREQUEST
     
     
    @@ -11,7 +12,9 @@ CUSTOMREQUEST
     # Server-side
     
     
    -* 123 FETCH (FLAGS (\Seen \Deleted))
    +* LSUB () "/" /807/blurdybloop
    +* LSUB (\Noselect) "/" /807/foo
    +* LSUB () "/" /807/foo/bar
     
     
     
    @@ -22,10 +25,10 @@ CUSTOMREQUEST
     imap
     
      
    -IMAP STORE (CUSTOMREQUEST)
    +IMAP LSUB mailbox
      
      
    --u user:secret -X 'STORE 123 +Flags \Deleted' 'imap://%HOSTIP:%IMAPPORT/807'
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'LSUB "807" *'
     
     
     
    @@ -35,9 +38,8 @@ IMAP STORE (CUSTOMREQUEST)
     
     A001 CAPABILITY
     A002 LOGIN user secret
    -A003 SELECT 807
    -A004 STORE 123 +Flags \Deleted
    -A005 LOGOUT
    +A003 LSUB "807" *
    +A004 LOGOUT
     
     
     
    diff --git a/tests/data/test808 b/tests/data/test808
    index 52ecb84..30c8bdf 100644
    --- a/tests/data/test808
    +++ b/tests/data/test808
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     EXAMINE
     CUSTOMREQUEST
     
    @@ -28,10 +29,10 @@ CUSTOMREQUEST
     imap
     
      
    -IMAP EXAMINE (CUSTOMREQUEST)
    +IMAP EXAMINE mailbox (CUSTOMREQUEST)
      
      
    -'imap://%HOSTIP:%IMAPPORT' -u user:secret -X 'EXAMINE 808'
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'EXAMINE 808'
     
     
     
    diff --git a/tests/data/test809 b/tests/data/test809
    index 099dd33..4283179 100644
    --- a/tests/data/test809
    +++ b/tests/data/test809
    @@ -2,6 +2,7 @@
     
     
     IMAP
    +Clear Text
     STATUS
     CUSTOMREQUEST
     
    @@ -22,7 +23,7 @@ CUSTOMREQUEST
     imap
     
      
    -IMAP STATUS (CUSTOMREQUEST)
    +IMAP mailbox STATUS (CUSTOMREQUEST)
      
      
     imap://%HOSTIP:%IMAPPORT -u user:secret -X 'STATUS 809 (UIDNEXT MESSAGES)'
    diff --git a/tests/data/test81 b/tests/data/test81
    index 0da0bdc..ff258ed 100644
    --- a/tests/data/test81
    +++ b/tests/data/test81
    @@ -55,6 +55,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -90,7 +92,7 @@ Accept: */*
     Proxy-Connection: Keep-Alive
     
     GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
    -Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test810 b/tests/data/test810
    new file mode 100644
    index 0000000..6b4d243
    --- /dev/null
    +++ b/tests/data/test810
    @@ -0,0 +1,43 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +SEARCH
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +* SEARCH 1 123 456 810
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP SEARCH for NEW messages
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT/810?NEW -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 SELECT 810
    +A004 SEARCH NEW
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test811 b/tests/data/test811
    new file mode 100644
    index 0000000..8fb3aa7
    --- /dev/null
    +++ b/tests/data/test811
    @@ -0,0 +1,40 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +CREATE
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP CREATE mailbox (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'CREATE 811'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 CREATE 811
    +A004 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test812 b/tests/data/test812
    new file mode 100644
    index 0000000..6d1b42d
    --- /dev/null
    +++ b/tests/data/test812
    @@ -0,0 +1,40 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +DELETE
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP DELETE mailbox (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'DELETE 812'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 DELETE 812
    +A004 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test813 b/tests/data/test813
    new file mode 100644
    index 0000000..3544da6
    --- /dev/null
    +++ b/tests/data/test813
    @@ -0,0 +1,40 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +RENAME
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP RENAME mailbox (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'RENAME 666 813'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 RENAME 666 813
    +A004 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test814 b/tests/data/test814
    new file mode 100644
    index 0000000..0b90e5b
    --- /dev/null
    +++ b/tests/data/test814
    @@ -0,0 +1,41 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +CHECK
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP CHECK mailbox (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT/814 -u user:secret -X 'CHECK'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 SELECT 814
    +A004 CHECK
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test815 b/tests/data/test815
    new file mode 100644
    index 0000000..6ebe5bf
    --- /dev/null
    +++ b/tests/data/test815
    @@ -0,0 +1,46 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +STORE
    +CLOSE
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +* 123 FETCH (FLAGS (\Seen \Deleted))
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP STORE - delete message (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT/815 -X 'STORE 123 +Flags \Deleted' -u user:secret -: imap://%HOSTIP:%IMAPPORT/815 -X CLOSE -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 SELECT 815
    +A004 STORE 123 +Flags \Deleted
    +A005 CLOSE
    +A006 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test816 b/tests/data/test816
    new file mode 100644
    index 0000000..6df9b7d
    --- /dev/null
    +++ b/tests/data/test816
    @@ -0,0 +1,49 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +STORE
    +EXPUNGE
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +* 123 FETCH (FLAGS (\Seen \Deleted))
    +
    +
    +* 123 EXPUNGE
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP STORE - delete message with confirmation (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT/816 -X 'STORE 123 +Flags \Deleted' -u user:secret -: imap://%HOSTIP:%IMAPPORT/816 -X EXPUNGE -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 SELECT 816
    +A004 STORE 123 +Flags \Deleted
    +A005 EXPUNGE
    +A006 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test817 b/tests/data/test817
    new file mode 100644
    index 0000000..9b44ae9
    --- /dev/null
    +++ b/tests/data/test817
    @@ -0,0 +1,40 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +COPY
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP COPY message to mailbox (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT -u user:secret -X 'COPY 123 817'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 COPY 123 817
    +A004 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test818 b/tests/data/test818
    new file mode 100644
    index 0000000..95282c4
    --- /dev/null
    +++ b/tests/data/test818
    @@ -0,0 +1,46 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +NOOP
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +* 22 EXPUNGE
    +* 23 EXISTS
    +* 3 RECENT
    +* 14 FETCH (FLAGS (\Seen \Deleted))
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP NOOP (CUSTOMREQUEST)
    + 
    + 
    +imap://%HOSTIP:%IMAPPORT -X NOOP -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user secret
    +A003 NOOP
    +A004 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test819 b/tests/data/test819
    new file mode 100644
    index 0000000..d0aa47b
    --- /dev/null
    +++ b/tests/data/test819
    @@ -0,0 +1,56 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH PLAIN
    +RFC4616
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +REPLY AUTHENTICATE +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP plain authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/819/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +A003 SELECT 819
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test820 b/tests/data/test820
    new file mode 100644
    index 0000000..f638f1c
    --- /dev/null
    +++ b/tests/data/test820
    @@ -0,0 +1,57 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH LOGIN
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH LOGIN
    +REPLY AUTHENTICATE + VXNlcm5hbWU6
    +REPLY dXNlcg== + UGFzc3dvcmQ6
    +REPLY c2VjcmV0 A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP login authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/820/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE LOGIN
    +dXNlcg==
    +c2VjcmV0
    +A003 SELECT 820
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test821 b/tests/data/test821
    new file mode 100644
    index 0000000..aee373b
    --- /dev/null
    +++ b/tests/data/test821
    @@ -0,0 +1,59 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH CRAM-MD5
    +RFC2195
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5
    +REPLY AUTHENTICATE + PDE5NzIuOTg3NjU0MzIxQGN1cmw+
    +REPLY dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg== A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +crypto
    +
    + 
    +IMAP CRAM-MD5 authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/821/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE CRAM-MD5
    +dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg==
    +A003 SELECT 821
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test822 b/tests/data/test822
    new file mode 100644
    index 0000000..65ac43e
    --- /dev/null
    +++ b/tests/data/test822
    @@ -0,0 +1,71 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH NTLM
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTHENTICATE +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +NTLM
    +!SSPI
    +debug
    +
    + 
    +IMAP NTLM authentication
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/822/;UID=1' -u testuser:testpass
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +A003 SELECT 822
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test823 b/tests/data/test823
    new file mode 100644
    index 0000000..6f8249b
    --- /dev/null
    +++ b/tests/data/test823
    @@ -0,0 +1,63 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH DIGEST-MD5
    +RFC2831
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5
    +REPLY AUTHENTICATE + cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
    +REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPWJlYjMzYmY2MWFhMDgzNzZmZWE4ZjJkM2MwODliMjFmLHFvcD1hdXRo +
    +REPLY  A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +IMAP DIGEST-MD5 authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/823/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE DIGEST-MD5
    +dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPWJlYjMzYmY2MWFhMDgzNzZmZWE4ZjJkM2MwODliMjFmLHFvcD1hdXRo
    +
    +A003 SELECT 823
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test824 b/tests/data/test824
    new file mode 100644
    index 0000000..242c1b4
    --- /dev/null
    +++ b/tests/data/test824
    @@ -0,0 +1,56 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH OAUTH2
    +RFC6749
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH XOAUTH2
    +REPLY AUTHENTICATE +
    +REPLY dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP OAuth 2.0 authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/824/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE XOAUTH2
    +dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +A003 SELECT 824
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test825 b/tests/data/test825
    new file mode 100644
    index 0000000..6532b3a
    --- /dev/null
    +++ b/tests/data/test825
    @@ -0,0 +1,56 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH PLAIN
    +SASL-IR
    +RFC4616
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +CAPA SASL-IR
    +REPLY AUTHENTICATE A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP plain authentication with initial response
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/825/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE PLAIN dXNlcgB1c2VyAHNlY3JldA==
    +A003 SELECT 825
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test826 b/tests/data/test826
    new file mode 100644
    index 0000000..0f92829
    --- /dev/null
    +++ b/tests/data/test826
    @@ -0,0 +1,57 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH LOGIN
    +SASL-IR
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH LOGIN
    +CAPA SASL-IR
    +REPLY AUTHENTICATE + UGFzc3dvcmQ6
    +REPLY c2VjcmV0 A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP login authentication with initial response
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/826/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE LOGIN dXNlcg==
    +c2VjcmV0
    +A003 SELECT 826
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test827 b/tests/data/test827
    new file mode 100644
    index 0000000..778e765
    --- /dev/null
    +++ b/tests/data/test827
    @@ -0,0 +1,71 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH NTLM
    +SASL-IR
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +CAPA SASL-IR
    +REPLY AUTHENTICATE + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +NTLM
    +!SSPI
    +debug
    +
    + 
    +IMAP NTLM authentication with initial response
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/827/;UID=1' -u testuser:testpass
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +A003 SELECT 827
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test828 b/tests/data/test828
    new file mode 100644
    index 0000000..b2fb693
    --- /dev/null
    +++ b/tests/data/test828
    @@ -0,0 +1,56 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH OAUTH2
    +SASL-IR
    +RFC6749
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH XOAUTH2
    +CAPA SASL-IR
    +REPLY AUTHENTICATE A002 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP OAuth 2.0 authentication with initial response
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/828/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +A003 SELECT 828
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test1324 b/tests/data/test829
    similarity index 88%
    rename from tests/data/test1324
    rename to tests/data/test829
    index c9835ef..cefba0d 100644
    --- a/tests/data/test1324
    +++ b/tests/data/test829
    @@ -15,7 +15,7 @@ imap
     IMAP with URL-encoded CR LF in the URL
      
      
    -imap://%HOSTIP:%IMAPPORT/%0d%0a/1322
    +imap://%HOSTIP:%IMAPPORT/%0d%0a/829
     
     
     
    diff --git a/tests/data/test83 b/tests/data/test83
    index 4386c12..e00a288 100644
    --- a/tests/data/test83
    +++ b/tests/data/test83
    @@ -50,7 +50,7 @@ http-proxy
     HTTP over proxy-tunnel with site authentication
      
      
    -http://test.83:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user iam:myself
    +http://test.83:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self'
     
     
     
    @@ -69,7 +69,7 @@ Proxy-Connection: Keep-Alive
     
     
     GET /we/want/that/page/83 HTTP/1.1
    -Authorization: Basic aWFtOm15c2VsZg==
    +Authorization: Basic aWFtOm15OjtzZWxm
     User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
     Host: test.83:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test830 b/tests/data/test830
    new file mode 100644
    index 0000000..5803bb1
    --- /dev/null
    +++ b/tests/data/test830
    @@ -0,0 +1,56 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL CANCELLATION
    +RFC2195
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5
    +CAPA LOGINDISABLED
    +REPLY AUTHENTICATE + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +crypto
    +
    + 
    +IMAP CRAM-MD5 graceful cancellation
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/830/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "LOGOUT"
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE CRAM-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test831 b/tests/data/test831
    new file mode 100644
    index 0000000..8bff7ea
    --- /dev/null
    +++ b/tests/data/test831
    @@ -0,0 +1,67 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH NTLM
    +SASL CANCELLATION
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +CAPA LOGINDISABLED
    +REPLY AUTHENTICATE +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +IMAP NTLM graceful cancellation
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/831/;UID=1' -u testuser:testpass
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "LOGOUT"
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +
    +
    +
    diff --git a/tests/data/test832 b/tests/data/test832
    new file mode 100644
    index 0000000..044edb1
    --- /dev/null
    +++ b/tests/data/test832
    @@ -0,0 +1,58 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL CANCELLATION
    +RFC2831
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5
    +CAPA LOGINDISABLED
    +REPLY AUTHENTICATE + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +IMAP DIGEST-MD5 graceful cancellation
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/832/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "LOGOUT"
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE DIGEST-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test833 b/tests/data/test833
    new file mode 100644
    index 0000000..b5fa03f
    --- /dev/null
    +++ b/tests/data/test833
    @@ -0,0 +1,65 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC2195
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5 PLAIN
    +REPLY "AUTHENTICATE CRAM-MD5" + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +REPLY "AUTHENTICATE PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +crypto
    +
    + 
    +IMAP CRAM-MD5 authentication with SASL downgrade
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/833/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE CRAM-MD5
    +*
    +A003 AUTHENTICATE PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +A004 SELECT 833
    +A005 FETCH 1 BODY[]
    +A006 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test834 b/tests/data/test834
    new file mode 100644
    index 0000000..17101dd
    --- /dev/null
    +++ b/tests/data/test834
    @@ -0,0 +1,76 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH NTLM
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM PLAIN
    +REPLY "AUTHENTICATE NTLM" +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +REPLY "AUTHENTICATE PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +IMAP NTLM authentication with SASL downgrade
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/834/;UID=1' -u user:secret
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +A003 AUTHENTICATE PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +A004 SELECT 834
    +A005 FETCH 1 BODY[]
    +A006 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test835 b/tests/data/test835
    new file mode 100644
    index 0000000..34f28b7
    --- /dev/null
    +++ b/tests/data/test835
    @@ -0,0 +1,67 @@
    +
    +
    +
    +IMAP
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC2831
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5 PLAIN
    +REPLY "AUTHENTICATE DIGEST-MD5" + Rubbish
    +REPLY * A002 NO AUTH exchange cancelled by client
    +REPLY "AUTHENTICATE PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +IMAP DIGEST-MD5 authentication with SASL downgrade
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/835/;UID=1' -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 AUTHENTICATE DIGEST-MD5
    +*
    +A003 AUTHENTICATE PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +A004 SELECT 835
    +A005 FETCH 1 BODY[]
    +A006 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test836 b/tests/data/test836
    new file mode 100644
    index 0000000..035d48f
    --- /dev/null
    +++ b/tests/data/test836
    @@ -0,0 +1,59 @@
    +
    +
    +
    +IMAP
    +Clear Text
    +FETCH
    +connection re-use
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +REPLY "LOGIN user.one secret" A002 OK LOGIN completed
    +REPLY "LOGIN user.two secret" B002 OK LOGIN completed
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +imap
    +
    + 
    +IMAP multiple connection authentication
    + 
    + 
    +'imap://%HOSTIP:%IMAPPORT/836/;UID=1' -u user.one:secret -: 'imap://%HOSTIP:%IMAPPORT/836/;UID=2' -u user.two:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +A001 CAPABILITY
    +A002 LOGIN user.one secret
    +A003 SELECT 836
    +A004 FETCH 1 BODY[]
    +A005 LOGOUT
    +B001 CAPABILITY
    +B002 LOGIN user.two secret
    +B003 SELECT 836
    +B004 FETCH 2 BODY[]
    +B005 LOGOUT
    +
    +
    +
    diff --git a/tests/data/test850 b/tests/data/test850
    index b0d0e3d..6176101 100644
    --- a/tests/data/test850
    +++ b/tests/data/test850
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     RETR
     
     
    @@ -27,7 +28,7 @@ body
     pop3
     
      
    -POP3 RETR
    +POP3 RETR message
      
      
     pop3://%HOSTIP:%POP3PORT/850 -u user:secret
    diff --git a/tests/data/test851 b/tests/data/test851
    index 5ebb3a0..60c49c4 100644
    --- a/tests/data/test851
    +++ b/tests/data/test851
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     LIST
     
     
    diff --git a/tests/data/test852 b/tests/data/test852
    index e07c172..de9fbe2 100644
    --- a/tests/data/test852
    +++ b/tests/data/test852
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     LIST
     FAILURE
     
    diff --git a/tests/data/test853 b/tests/data/test853
    index 934837f..a3b9688 100644
    --- a/tests/data/test853
    +++ b/tests/data/test853
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     LIST
     
     
    @@ -19,7 +20,7 @@ SLOWDOWN
     
     1 100
     2 4294967400
    -4 200
    +3 200
     
     
     
    diff --git a/tests/data/test854 b/tests/data/test854
    index 074969a..a8a18b6 100644
    --- a/tests/data/test854
    +++ b/tests/data/test854
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     LIST
     
     
    diff --git a/tests/data/test855 b/tests/data/test855
    index bcbdf48..87fe744 100644
    --- a/tests/data/test855
    +++ b/tests/data/test855
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     RETR
     FAILURE
     
    diff --git a/tests/data/test856 b/tests/data/test856
    index 7076cf6..4d8d7ed 100644
    --- a/tests/data/test856
    +++ b/tests/data/test856
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     FAILURE
     
     
    @@ -9,9 +10,6 @@ FAILURE
     #
     # Server-side
     
    -
    -REPLY PASS -ERR invalid login
    -
     
     
     #
    @@ -31,11 +29,12 @@ pop3://%HOSTIP:%POP3PORT/856 -u user:wrong
     #
     # Verify data after the test has been "shot"
     
    +# 67 - CURLE_LOGIN_DENIED
     
     67
     
     #
    -# The multi interface considers a broken "DO" request as a prematurely broken
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
     # transfer and such a connection will not get a "QUIT"
     
     CAPA
    diff --git a/tests/data/test857 b/tests/data/test857
    index 716c49e..055e35c 100644
    --- a/tests/data/test857
    +++ b/tests/data/test857
    @@ -2,6 +2,7 @@
     
     
     POP3
    +Clear Text
     RETR
     
     
    @@ -38,7 +39,7 @@ To: fake@nowhere
     pop3
     
      
    -POP3 RETR with dot-prefixed line
    +POP3 RETR message with dot-prefixed line
      
      
     pop3://%HOSTIP:%POP3PORT/857 -u user:secret
    diff --git a/tests/data/test858 b/tests/data/test858
    new file mode 100644
    index 0000000..926dcd9
    --- /dev/null
    +++ b/tests/data/test858
    @@ -0,0 +1,41 @@
    +
    +
    +
    +POP3
    +Clear Text
    +DELE
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 DELE message (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/858 -u user:secret -X DELE -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +DELE 858
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test859 b/tests/data/test859
    new file mode 100644
    index 0000000..3d2e1c7
    --- /dev/null
    +++ b/tests/data/test859
    @@ -0,0 +1,41 @@
    +
    +
    +
    +POP3
    +Clear Text
    +STAT
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 STAT (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT -u user:secret -X STAT -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +STAT
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test86 b/tests/data/test86
    index 70c28e9..a69509a 100644
    --- a/tests/data/test86
    +++ b/tests/data/test86
    @@ -3,6 +3,7 @@
     
     HTTP
     HTTP GET
    +globbing
     [] range
     
     
    diff --git a/tests/data/test860 b/tests/data/test860
    new file mode 100644
    index 0000000..26809bf
    --- /dev/null
    +++ b/tests/data/test860
    @@ -0,0 +1,41 @@
    +
    +
    +
    +POP3
    +Clear Text
    +NOOP
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 NOOP (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT -u user:secret -X NOOP -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +NOOP
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test861 b/tests/data/test861
    new file mode 100644
    index 0000000..4cc3987
    --- /dev/null
    +++ b/tests/data/test861
    @@ -0,0 +1,52 @@
    +
    +
    +
    +POP3
    +Clear Text
    +UIDL
    +CUSTOMREQUEST
    +RFC2449
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +CAPA UIDL USER
    +
    +# When doing UIDL, we get the default list output hard-coded in the test
    +# POP3 server
    +
    +1 1
    +2 2
    +3 4
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 UIDL (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT -u user:secret -X UIDL
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +UIDL
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test862 b/tests/data/test862
    new file mode 100644
    index 0000000..a21b514
    --- /dev/null
    +++ b/tests/data/test862
    @@ -0,0 +1,50 @@
    +
    +
    +
    +POP3
    +Clear Text
    +TOP
    +CUSTOMREQUEST
    +RFC2449
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +CAPA TOP USER
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 retrieve message header (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT -u user:secret -X 'TOP 862 0'
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +TOP 862 0
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test863 b/tests/data/test863
    new file mode 100644
    index 0000000..940045f
    --- /dev/null
    +++ b/tests/data/test863
    @@ -0,0 +1,41 @@
    +
    +
    +
    +POP3
    +Clear Text
    +RSET
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 RSET (CUSTOMREQUEST)
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT -u user:secret -X RSET -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user
    +PASS secret
    +RSET
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test864 b/tests/data/test864
    new file mode 100644
    index 0000000..9ad98f7
    --- /dev/null
    +++ b/tests/data/test864
    @@ -0,0 +1,54 @@
    +
    +
    +
    +POP3
    +APOP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +CAPA APOP
    +REPLY welcome +OK cURL POP3 server ready to serve <1972.987654321\@curl>
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +crypto
    +
    + 
    +POP3 APOP authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/864 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +APOP user 7501b4cdc224d469940e65e7b5e4d6eb
    +RETR 864
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test865 b/tests/data/test865
    new file mode 100644
    index 0000000..6f66f82
    --- /dev/null
    +++ b/tests/data/test865
    @@ -0,0 +1,57 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH PLAIN
    +RFC1734
    +RFC4616
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +REPLY AUTH +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 plain authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/865 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +RETR 865
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test866 b/tests/data/test866
    new file mode 100644
    index 0000000..8fee23a
    --- /dev/null
    +++ b/tests/data/test866
    @@ -0,0 +1,58 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH LOGIN
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH LOGIN
    +REPLY AUTH + VXNlcm5hbWU6
    +REPLY dXNlcg== + UGFzc3dvcmQ6
    +REPLY c2VjcmV0 +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 login authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/866 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH LOGIN
    +dXNlcg==
    +c2VjcmV0
    +RETR 866
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test867 b/tests/data/test867
    new file mode 100644
    index 0000000..139b467
    --- /dev/null
    +++ b/tests/data/test867
    @@ -0,0 +1,60 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH CRAM-MD5
    +RFC1734
    +RFC2195
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5
    +REPLY AUTH + PDE5NzIuOTg3NjU0MzIxQGN1cmw+
    +REPLY dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +crypto
    +
    + 
    +POP3 CRAM-MD5 authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/867 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH CRAM-MD5
    +dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg==
    +RETR 867
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test868 b/tests/data/test868
    new file mode 100644
    index 0000000..591bd50
    --- /dev/null
    +++ b/tests/data/test868
    @@ -0,0 +1,72 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH NTLM
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTH +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +NTLM
    +!SSPI
    +debug
    +
    + 
    +POP3 NTLM authentication
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/868 -u testuser:testpass
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +RETR 868
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test869 b/tests/data/test869
    new file mode 100644
    index 0000000..cba33b3
    --- /dev/null
    +++ b/tests/data/test869
    @@ -0,0 +1,64 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH DIGEST-MD5
    +RFC1734
    +RFC2831
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5
    +REPLY AUTH + cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
    +REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9MDE2MTNmOWEwNTgxODNmYTc2NmFkNWEwOThiNmE3MTUscW9wPWF1dGg= +
    +REPLY  +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +POP3 DIGEST-MD5 authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/869 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH DIGEST-MD5
    +dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9MDE2MTNmOWEwNTgxODNmYTc2NmFkNWEwOThiNmE3MTUscW9wPWF1dGg=
    +
    +RETR 869
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test87 b/tests/data/test87
    index 40b274b..488037c 100644
    --- a/tests/data/test87
    +++ b/tests/data/test87
    @@ -1,6 +1,9 @@
     
     
     
    +HTTP
    +HTTP GET
    +globbing
     [] range
     FAILURE
     
    @@ -8,29 +11,51 @@ FAILURE
     #
     # Server-side
     
    +
    +HTTP/1.1 200 OK
    +Funny-head: yesyes
    +Content-Length: 15
    +
    +the number one
    +
    +
    +HTTP/1.1 200 OK
    +Funny-head: yesyes
    +Content-Length: 16
    +
    +two is nice too
    +
    +
     
     #
     # Client-side
     
     
    -none
    +http
     
     
     http
     
      
    -urlglob with bad -o #[num] usage
    +urlglob with out of range -o #[num] usage
      
      
    -"http://%HOSTIP:%HTTPPORT/[870001-870003]" -o "log/dumpit#2.dump"
    +"http://%HOSTIP:%HTTPPORT/[870001-870002]" -o "log/dumpit#2.dump"
     
     
     
     #
    -# Verify data after the test has been "shot"
    +# Verify data after the test has been "shot". Note that the command line
    +# will write both responses into the same file name so only the second
    +# survives
    +#
     
    -
    -2
    -
    +
    +HTTP/1.1 200 OK
    +Funny-head: yesyes
    +Content-Length: 16
    +
    +two is nice too
    +
     
     
    diff --git a/tests/data/test870 b/tests/data/test870
    new file mode 100644
    index 0000000..885b8c1
    --- /dev/null
    +++ b/tests/data/test870
    @@ -0,0 +1,57 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH OAUTH2
    +RFC1734
    +RFC5034
    +RFC6749
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH XOAUTH2
    +REPLY AUTH +
    +REPLY dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 OAuth 2.0 authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/870 -u user --oauth2-bearer mF_9.B5f-4.1JqM
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH XOAUTH2
    +dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +RETR 870
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test871 b/tests/data/test871
    new file mode 100644
    index 0000000..f4f2360
    --- /dev/null
    +++ b/tests/data/test871
    @@ -0,0 +1,56 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH PLAIN
    +SASL-IR
    +RFC1734
    +RFC4616
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +REPLY AUTH +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 plain authentication with initial response
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/871 -u user:secret --sasl-ir
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==
    +RETR 871
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test872 b/tests/data/test872
    new file mode 100644
    index 0000000..05cb2a2
    --- /dev/null
    +++ b/tests/data/test872
    @@ -0,0 +1,57 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH LOGIN
    +SASL-IR
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH LOGIN
    +REPLY AUTH + UGFzc3dvcmQ6
    +REPLY c2VjcmV0 +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 login authentication with initial response
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/872 -u user:secret --sasl-ir
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH LOGIN dXNlcg==
    +c2VjcmV0
    +RETR 872
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test873 b/tests/data/test873
    new file mode 100644
    index 0000000..a91b360
    --- /dev/null
    +++ b/tests/data/test873
    @@ -0,0 +1,71 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH NTLM
    +SASL-IR
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTH + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +NTLM
    +!SSPI
    +debug
    +
    + 
    +POP3 NTLM authentication with initial response
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/873 -u testuser:testpass --sasl-ir
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +RETR 873
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test874 b/tests/data/test874
    new file mode 100644
    index 0000000..de221fa
    --- /dev/null
    +++ b/tests/data/test874
    @@ -0,0 +1,56 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH OAUTH2
    +SASL-IR
    +RFC1734
    +RFC5034
    +RFC6749
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH XOAUTH2
    +REPLY AUTH +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 OAuth 2.0 authentication with initial response
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/874 -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +RETR 874
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test1322 b/tests/data/test875
    similarity index 88%
    rename from tests/data/test1322
    rename to tests/data/test875
    index 996727e..53e9940 100644
    --- a/tests/data/test1322
    +++ b/tests/data/test875
    @@ -15,7 +15,7 @@ pop3
     POP3 with URL-encoded CR LF in the URL
      
      
    -pop3://%HOSTIP:%POP3PORT/%0d%0a/1322
    +pop3://%HOSTIP:%POP3PORT/%0d%0a/875
     
     
     
    diff --git a/tests/data/test876 b/tests/data/test876
    new file mode 100644
    index 0000000..6d30e53
    --- /dev/null
    +++ b/tests/data/test876
    @@ -0,0 +1,57 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL CANCELLATION
    +RFC1734
    +RFC2195
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5
    +REPLY AUTH + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +crypto
    +
    + 
    +POP3 CRAM-MD5 graceful cancellation
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/876 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +CAPA
    +AUTH CRAM-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test877 b/tests/data/test877
    new file mode 100644
    index 0000000..c477594
    --- /dev/null
    +++ b/tests/data/test877
    @@ -0,0 +1,68 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH NTLM
    +SASL CANCELLATION
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTH +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +POP3 NTLM graceful cancellation
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/877 -u testuser:testpass
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +CAPA
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +
    +
    +
    diff --git a/tests/data/test878 b/tests/data/test878
    new file mode 100644
    index 0000000..98961fb
    --- /dev/null
    +++ b/tests/data/test878
    @@ -0,0 +1,59 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL CANCELLATION
    +RFC1734
    +RFC2831
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5
    +REPLY AUTH + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +POP3 DIGEST-MD5 graceful cancellation
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/878 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +CAPA
    +AUTH DIGEST-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test879 b/tests/data/test879
    new file mode 100644
    index 0000000..681d779
    --- /dev/null
    +++ b/tests/data/test879
    @@ -0,0 +1,66 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC1734
    +RFC2195
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5 PLAIN
    +REPLY "AUTH CRAM-MD5" + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +crypto
    +
    + 
    +POP3 CRAM-MD5 authentication with SASL downgrade
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/879 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH CRAM-MD5
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +RETR 879
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test88 b/tests/data/test88
    index 2495aec..253b420 100644
    --- a/tests/data/test88
    +++ b/tests/data/test88
    @@ -56,6 +56,7 @@ This IS the real page!
     http
     
     
    +!SSPI
     crypto
     
      
    @@ -82,7 +83,6 @@ PUT /88 HTTP/1.1
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
     Content-Length: 0
    -Expect: 100-continue
     
     PUT /88 HTTP/1.1
     Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/88", response="78a49fa53d0c228778297687d4168e71"
    diff --git a/tests/data/test880 b/tests/data/test880
    new file mode 100644
    index 0000000..f5eb697
    --- /dev/null
    +++ b/tests/data/test880
    @@ -0,0 +1,77 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH NTLM
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC1734
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM PLAIN
    +REPLY "AUTH NTLM" +
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +POP3 NTLM authentication with SASL downgrade
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/880 -u user:secret
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +RETR 880
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test881 b/tests/data/test881
    new file mode 100644
    index 0000000..80eca50
    --- /dev/null
    +++ b/tests/data/test881
    @@ -0,0 +1,68 @@
    +
    +
    +
    +POP3
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC1734
    +RFC2831
    +RFC5034
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5 PLAIN
    +REPLY "AUTH DIGEST-MD5" + Rubbish
    +REPLY * -ERR AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" +
    +REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +POP3 DIGEST-MD5 authentication with SASL downgrade
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/881 -u user:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +AUTH DIGEST-MD5
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +RETR 881
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test882 b/tests/data/test882
    new file mode 100644
    index 0000000..1e321ff
    --- /dev/null
    +++ b/tests/data/test882
    @@ -0,0 +1,58 @@
    +
    +
    +
    +POP3
    +Clear Text
    +RETR
    +connection re-use
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +REPLY "PASS secret" +OK Login successful
    +
    +
    +From: me@somewhere
    +To: fake@nowhere
    +
    +body
    +
    +--
    +  yours sincerely
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +pop3
    +
    + 
    +POP3 multiple connection authentication
    + 
    + 
    +pop3://%HOSTIP:%POP3PORT/882001 -u user.one:secret -: pop3://%HOSTIP:%POP3PORT/882002 -u user.two:secret
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +CAPA
    +USER user.one
    +PASS secret
    +RETR 882001
    +QUIT
    +CAPA
    +USER user.two
    +PASS secret
    +RETR 882002
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test89 b/tests/data/test89
    index f348eb6..cbabe8e 100644
    --- a/tests/data/test89
    +++ b/tests/data/test89
    @@ -89,6 +89,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -123,7 +125,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /89 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    @@ -135,7 +137,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /you/890010 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBALIBPdoGahtQQ8gQ7TJrKTYzMjM0NDIzNBFnpKw8B1BLcb456sVeozgBAQAAAAAAAACAPtXesZ0BMzIzNDQyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test90 b/tests/data/test90
    index 24a7ff4..90dae2c 100644
    --- a/tests/data/test90
    +++ b/tests/data/test90
    @@ -127,6 +127,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -165,7 +167,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /90 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    @@ -181,7 +183,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /you/900010 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoKBAFpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOXRlc3R1c2VyY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBALIBPdoGahtQQ8gQ7TJrKTYzMjM0NDIzNBFnpKw8B1BLcb456sVeozgBAQAAAAAAAACAPtXesZ0BMzIzNDQyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
     User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test900 b/tests/data/test900
    index 749a965..0dd7f52 100644
    --- a/tests/data/test900
    +++ b/tests/data/test900
    @@ -26,7 +26,7 @@ To: another
     body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 900@foo --mail-rcpt 900@foobar.example --mail-from 900@from -T -
    +smtp://%HOSTIP:%SMTPPORT/900 --mail-rcpt recipient@example.com --mail-from sender@example.com -T -
     
     
     
    @@ -34,10 +34,9 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 900@foo --mail-rcpt 900@foobar.example
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<900@from>
    -RCPT TO:<900@foo>
    -RCPT TO:<900@foobar.example>
    +EHLO 900
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test901 b/tests/data/test901
    index ed24518..8148b29 100644
    --- a/tests/data/test901
    +++ b/tests/data/test901
    @@ -32,7 +32,7 @@ To: another
     body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 901@foo --mail-from '<901@from>' -T -
    +smtp://%HOSTIP:%SMTPPORT/901 --mail-rcpt recipient@example.com --mail-from sender@example.com -T -
     
     
     
    @@ -40,9 +40,9 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 901@foo --mail-from '<901@from>' -T -
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<901@from>
    -RCPT TO:<901@foo>
    +EHLO 901
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test902 b/tests/data/test902
    index 4da1b99..8ee105f 100644
    --- a/tests/data/test902
    +++ b/tests/data/test902
    @@ -12,7 +12,6 @@ RFC821
     
     
     REPLY EHLO 500 Command unrecognized
    -REPLY HELO 250 Already old but still servicing...
     
     
     
    @@ -32,7 +31,7 @@ To: another
     body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 902@foo --mail-from 902@from -T -
    +smtp://%HOSTIP:%SMTPPORT/902 --mail-rcpt recipient@example.com --mail-from sender@example.com -T -
     
     
     
    @@ -40,10 +39,10 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 902@foo --mail-from 902@from -T -
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -HELO user
    -MAIL FROM:<902@from>
    -RCPT TO:<902@foo>
    +EHLO 902
    +HELO 902
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test903 b/tests/data/test903
    index 157bd48..2baf5e6 100644
    --- a/tests/data/test903
    +++ b/tests/data/test903
    @@ -2,7 +2,8 @@
     
     
     SMTP
    -SMTP AUTH PLAIN
    +SASL
    +SASL AUTH PLAIN
     RFC4616
     RFC4954
     
    @@ -12,9 +13,9 @@ RFC4954
     # Server-side
     
     
    -REPLY EHLO 250 AUTH PLAIN
    +AUTH PLAIN
     REPLY AUTH 334 PLAIN supported
    -REPLY dGVzdAB0ZXN0ADEyMzQ= 235 Authenticated
    +REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
     
     
     
    @@ -31,7 +32,7 @@ SMTP plain authentication
     mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 903@foo --mail-from 903@from -u test:1234 -T -
    +smtp://%HOSTIP:%SMTPPORT/903 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
     
     
     
    @@ -39,11 +40,11 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 903@foo --mail-from 903@from -u test:1
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    +EHLO 903
     AUTH PLAIN
    -dGVzdAB0ZXN0ADEyMzQ=
    -MAIL FROM:<903@from>
    -RCPT TO:<903@foo>
    +dXNlcgB1c2VyAHNlY3JldA==
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test904 b/tests/data/test904
    index 1a23f41..dd3dad0 100644
    --- a/tests/data/test904
    +++ b/tests/data/test904
    @@ -2,7 +2,8 @@
     
     
     SMTP
    -SMTP AUTH LOGIN
    +SASL
    +SASL AUTH LOGIN
     RFC4954
     
     
    @@ -11,10 +12,10 @@ RFC4954
     # Server-side
     
     
    -REPLY EHLO 250 AUTH LOGIN
    -REPLY AUTH 334 LOGIN supported
    -REPLY dGVzdA== 334 UGFzc3dvcmQ6
    -REPLY MTIzNA== 235 Authenticated
    +AUTH LOGIN
    +REPLY AUTH 334 VXNlcm5hbWU6
    +REPLY dXNlcg== 334 UGFzc3dvcmQ6
    +REPLY c2VjcmV0 235 Authenticated
     
     
     
    @@ -31,7 +32,7 @@ SMTP login authentication
     mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 904@foo --mail-from 904@from -u test:1234 -T -
    +smtp://%HOSTIP:%SMTPPORT/904 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
     
     
     
    @@ -39,12 +40,12 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 904@foo --mail-from 904@from -u test:1
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    +EHLO 904
     AUTH LOGIN
    -dGVzdA==
    -MTIzNA==
    -MAIL FROM:<904@from>
    -RCPT TO:<904@foo>
    +dXNlcg==
    +c2VjcmV0
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test905 b/tests/data/test905
    index fccd84b..565b041 100644
    --- a/tests/data/test905
    +++ b/tests/data/test905
    @@ -2,7 +2,8 @@
     
     
     SMTP
    -SMTP AUTH CRAM-MD5
    +SASL
    +SASL AUTH CRAM-MD5
     RFC2195
     RFC4954
     
    @@ -12,9 +13,9 @@ RFC4954
     # Server-side
     
     
    -REPLY EHLO 250 AUTH CRAM-MD5
    -REPLY AUTH 334 PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+
    -REPLY dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw 235 Authenticated
    +AUTH CRAM-MD5
    +REPLY AUTH 334 PDE5NzIuOTg3NjU0MzIxQGN1cmw+
    +REPLY dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg== 235 Authenticated
     
     
     
    @@ -34,7 +35,7 @@ SMTP CRAM-MD5 authentication
     mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 905@foo --mail-from 905@from -u tim:tanstaaftanstaaf -T -
    +smtp://%HOSTIP:%SMTPPORT/905 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
     
     
     
    @@ -42,11 +43,11 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 905@foo --mail-from 905@from -u tim:ta
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    +EHLO 905
     AUTH CRAM-MD5
    -dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw
    -MAIL FROM:<905@from>
    -RCPT TO:<905@foo>
    +dXNlciA3MDMxNzI1NTk5ZmRiYjVkNDEyNjg5YWEzMjNlM2UwYg==
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test906 b/tests/data/test906
    index 1f88990..3c04d15 100644
    --- a/tests/data/test906
    +++ b/tests/data/test906
    @@ -2,12 +2,21 @@
     
     
     SMTP
    +SASL
    +SASL AUTH NTLM
    +RFC4954
     
     
     
     #
     # Server-side
     
    +
    +AUTH NTLM
    +REPLY AUTH 334 NTLM supported
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
    +
     
     
     #
    @@ -16,35 +25,46 @@ SMTP
     
     smtp
     
    +
    +NTLM
    +!SSPI
    +debug
    +
      
    -SMTP without --mail-from
    +SMTP NTLM authentication
      
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
     
    -From: different
    -To: another
    -
    -body
    +mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 906@foo -T -
    +smtp://%HOSTIP:%SMTPPORT/906 --mail-rcpt recipient@example.com --mail-from sender@example.com -u testuser:testpass -T -
     
    +
    +chkhostname curlhost
    +
     
     
     #
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<>
    -RCPT TO:<906@foo>
    +EHLO 906
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
     
    -From: different
    -To: another
    -
    -body
    +mail body
     .
     
     
    diff --git a/tests/data/test907 b/tests/data/test907
    index 511d519..65c87b4 100644
    --- a/tests/data/test907
    +++ b/tests/data/test907
    @@ -2,8 +2,9 @@
     
     
     SMTP
    -SMTP AUTH PLAIN SASL-IR
    -RFC4616
    +SASL
    +SASL AUTH DIGEST-MD5
    +RFC2831
     RFC4954
     
     
    @@ -12,8 +13,10 @@ RFC4954
     # Server-side
     
     
    -REPLY EHLO 250 AUTH PLAIN
    -REPLY AUTH 235 Authenticated
    +AUTH DIGEST-MD5
    +REPLY AUTH 334 cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
    +REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPWJkYmExNzYwOGY4NmMyZjEzYTczMTM1NzdkZjkyMzNkLHFvcD1hdXRo 334
    +REPLY  235 Authenticated
     
     
     
    @@ -23,14 +26,19 @@ REPLY AUTH 235 Authenticated
     
     smtp
     
    +
    +!SSPI
    +debug
    +crypto
    +
      
    -SMTP plain authentication with initial response
    +SMTP DIGEST-MD5 authentication
      
     
     mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 907@foo --mail-from 907@from -u test:1234 --sasl-ir -T -
    +smtp://%HOSTIP:%SMTPPORT/907 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
     
     
     
    @@ -38,10 +46,12 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 907@foo --mail-from 907@from -u test:1
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -AUTH PLAIN dGVzdAB0ZXN0ADEyMzQ=
    -MAIL FROM:<907@from>
    -RCPT TO:<907@foo>
    +EHLO 907
    +AUTH DIGEST-MD5
    +dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPWJkYmExNzYwOGY4NmMyZjEzYTczMTM1NzdkZjkyMzNkLHFvcD1hdXRo
    +
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test908 b/tests/data/test908
    index 61d56c5..c471cb7 100644
    --- a/tests/data/test908
    +++ b/tests/data/test908
    @@ -2,8 +2,10 @@
     
     
     SMTP
    -SMTP AUTH LOGIN SASL-IR
    +SASL
    +SASL AUTH OAUTH2
     RFC4954
    +RFC6749
     
     
     
    @@ -11,9 +13,9 @@ RFC4954
     # Server-side
     
     
    -REPLY EHLO 250 AUTH LOGIN
    -REPLY AUTH 334 UGFzc3dvcmQ6
    -REPLY MTIzNA== 235 Authenticated
    +AUTH XOAUTH2
    +REPLY AUTH 334 XOAUTH2 supported
    +REPLY dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB 235 Authenticated
     
     
     
    @@ -24,13 +26,13 @@ REPLY MTIzNA== 235 Authenticated
     smtp
     
      
    -SMTP login authentication with initial response
    +SMTP OAuth 2.0 authentication
      
     
     mail body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 908@foo --mail-from 908@from -u test:1234 --sasl-ir -T -
    +smtp://%HOSTIP:%SMTPPORT/908 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM -T -
     
     
     
    @@ -38,11 +40,11 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 908@foo --mail-from 908@from -u test:1
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -AUTH LOGIN dGVzdA==
    -MTIzNA==
    -MAIL FROM:<908@from>
    -RCPT TO:<908@foo>
    +EHLO 908
    +AUTH XOAUTH2
    +dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test909 b/tests/data/test909
    index 2fc1f19..e3e907a 100644
    --- a/tests/data/test909
    +++ b/tests/data/test909
    @@ -8,10 +8,6 @@ SMTP
     #
     # Server-side
     
    -# the key in this response is that it doesn't include SIZE support
    -
    -REPLY EHLO 250 mooo
    -
     
     
     #
    @@ -30,7 +26,7 @@ To: another
     body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 909@foo --mail-rcpt 909@foobar.example --mail-from 909@from -T log/test909.eml
    +smtp://%HOSTIP:%SMTPPORT/909 --mail-rcpt recipient@example.com --mail-from sender@example.com -T log/test909.eml
     
     
     
    @@ -38,10 +34,9 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 909@foo --mail-rcpt 909@foobar.example
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<909@from>
    -RCPT TO:<909@foo>
    -RCPT TO:<909@foobar.example>
    +EHLO 909
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test91 b/tests/data/test91
    index e6f34ae..26ee318 100644
    --- a/tests/data/test91
    +++ b/tests/data/test91
    @@ -73,6 +73,8 @@ Finally, this is the real page!
     
     
     NTLM
    +!SSPI
    +debug
     
     
     http
    @@ -112,7 +114,7 @@ Host: %HOSTIP:%HTTPPORT
     Accept: */*
     
     GET /91 HTTP/1.1
    -Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAgACABwAAAABgAGAHgAAAAIAAgAfgAAAAAAAAAAAAAABoKBAMIyJpR5mHpg2FZha5kRaFZ9436GAxPu0C5llxexSQ5QzVkiLSfkcpVyRgCXXqR+Am15ZG9tYWlubXlzZWxmY3VybGhvc3Q=
    +Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAgACAD2AAAABgAGAP4AAAAIAAgABAEAAAAAAAAAAAAABoKBAI9byKoy6qyyS+1JCYN1XYoxMjM0MjIzNEYCr85trkciZ2j/7/T8MmUBAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbXlkb21haW5teXNlbGZjdXJsaG9zdA==
     User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
     Host: %HOSTIP:%HTTPPORT
     Accept: */*
    diff --git a/tests/data/test910 b/tests/data/test910
    index 5013fdc..c1b84ac 100644
    --- a/tests/data/test910
    +++ b/tests/data/test910
    @@ -26,7 +26,7 @@ To: another
     body
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 910@foo --mail-rcpt 910@foobar.example --mail-from 910@from -T -
    +smtp://%HOSTIP:%SMTPPORT/910 --mail-rcpt recipient@example.com --mail-from sender@example.com -T -
     
     
     
    @@ -34,10 +34,9 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 910@foo --mail-rcpt 910@foobar.example
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<910@from>
    -RCPT TO:<910@foo>
    -RCPT TO:<910@foobar.example>
    +EHLO 910
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test911 b/tests/data/test911
    index 6b7a1f4..cc87349 100644
    --- a/tests/data/test911
    +++ b/tests/data/test911
    @@ -25,7 +25,7 @@ SMTP with no mail data
     
     
      
    -smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 911@foo --mail-rcpt 911@foobar.example --mail-from 911@from -T -
    +smtp://%HOSTIP:%SMTPPORT/911 --mail-rcpt recipient@example.com --mail-from sender@example.com -T -
     
     
     
    @@ -33,10 +33,9 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 911@foo --mail-rcpt 911@foobar.example
     # Verify data after the test has been "shot"
     
     
    -EHLO user
    -MAIL FROM:<911@from>
    -RCPT TO:<911@foo>
    -RCPT TO:<911@foobar.example>
    +EHLO 911
    +MAIL FROM:
    +RCPT TO:
     DATA
     QUIT
     
    diff --git a/tests/data/test912 b/tests/data/test912
    new file mode 100644
    index 0000000..8970c3f
    --- /dev/null
    +++ b/tests/data/test912
    @@ -0,0 +1,55 @@
    +
    +
    +
    +SMTP
    +SIZE
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +CAPA SIZE
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with SIZE support
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/912 --mail-rcpt recipient@example.com --mail-from sender@example.com -T log/test912.eml
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 912
    +MAIL FROM: SIZE=38
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +From: different
    +To: another
    +
    +body
    +.
    +
    +
    +
    diff --git a/tests/data/test913 b/tests/data/test913
    new file mode 100644
    index 0000000..d13a11a
    --- /dev/null
    +++ b/tests/data/test913
    @@ -0,0 +1,50 @@
    +
    +
    +
    +SMTP
    +SIZE
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +CAPA "SIZE 32"
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with large message SIZE
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/913 --mail-rcpt recipient@example.com --mail-from sender@example.com -T log/test913.eml
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 55 - CURLE_SEND_ERROR
    +
    +55
    +
    +
    +EHLO 913
    +MAIL FROM: SIZE=38
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test914 b/tests/data/test914
    new file mode 100644
    index 0000000..d1532c8
    --- /dev/null
    +++ b/tests/data/test914
    @@ -0,0 +1,46 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP invalid --mail-from
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/914 --mail-rcpt recipient@example.com --mail-from invalid -T log/test914.eml
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 55 - CURLE_SEND_ERROR
    +
    +55
    +
    +
    +EHLO 914
    +MAIL FROM:
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test915 b/tests/data/test915
    new file mode 100644
    index 0000000..4d31db3
    --- /dev/null
    +++ b/tests/data/test915
    @@ -0,0 +1,51 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP without --mail-from
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/915 --mail-rcpt recipient@example.com -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 915
    +MAIL FROM:<>
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +From: different
    +To: another
    +
    +body
    +.
    +
    +
    +
    diff --git a/tests/data/test916 b/tests/data/test916
    new file mode 100644
    index 0000000..0021155
    --- /dev/null
    +++ b/tests/data/test916
    @@ -0,0 +1,47 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with invalid --mail-rcpt
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/916 --mail-rcpt invalid --mail-from sender@example.com -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 55 - CURLE_SEND_ERROR
    +
    +55
    +
    +
    +EHLO 916
    +MAIL FROM:
    +RCPT TO:
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test917 b/tests/data/test917
    new file mode 100644
    index 0000000..cc75da3
    --- /dev/null
    +++ b/tests/data/test917
    @@ -0,0 +1,55 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with multiple --mail-rcpt
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/917 --mail-rcpt recipient.one@example.com --mail-rcpt recipient.two@example.com --mail-rcpt recipient.three@example.com --mail-rcpt recipient.four@example.com --mail-rcpt recipient.five@example.com --mail-from sender@example.com -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 917
    +MAIL FROM:
    +RCPT TO:
    +RCPT TO:
    +RCPT TO:
    +RCPT TO:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +From: different
    +To: another
    +
    +body
    +.
    +
    +
    +
    diff --git a/tests/data/test918 b/tests/data/test918
    new file mode 100644
    index 0000000..3756edd
    --- /dev/null
    +++ b/tests/data/test918
    @@ -0,0 +1,48 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with multiple and invalid --mail-rcpt
    + 
    +
    +From: different
    +To: another
    +
    +body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/918 --mail-rcpt recipient.one@example.com --mail-rcpt invalid --mail-rcpt recipient.three@example.com --mail-rcpt sTrAnGe --mail-rcpt recipient.five@example.com --mail-from sender@example.com -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 55 - CURLE_SEND_ERROR
    +
    +55
    +
    +
    +EHLO 918
    +MAIL FROM:
    +RCPT TO:
    +RCPT TO:
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test919 b/tests/data/test919
    new file mode 100644
    index 0000000..3e74494
    --- /dev/null
    +++ b/tests/data/test919
    @@ -0,0 +1,55 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH PLAIN
    +SASL-IR
    +RFC4616
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +REPLY AUTH 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP plain authentication with initial response
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/919 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret --sasl-ir -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 919
    +AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test920 b/tests/data/test920
    new file mode 100644
    index 0000000..82f6c56
    --- /dev/null
    +++ b/tests/data/test920
    @@ -0,0 +1,56 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH LOGIN
    +SASL-IR
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH LOGIN
    +REPLY AUTH 334 UGFzc3dvcmQ6
    +REPLY c2VjcmV0 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP login authentication with initial response
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/920 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret --sasl-ir -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 920
    +AUTH LOGIN dXNlcg==
    +c2VjcmV0
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test921 b/tests/data/test921
    new file mode 100644
    index 0000000..91a7c6f
    --- /dev/null
    +++ b/tests/data/test921
    @@ -0,0 +1,70 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH NTLM
    +SASL-IR
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTH 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
    +REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +NTLM
    +!SSPI
    +debug
    +
    + 
    +SMTP NTLM authentication with initial response
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/921 --mail-rcpt recipient@example.com --mail-from sender@example.com -u testuser:testpass --sasl-ir -T -
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 921
    +AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test922 b/tests/data/test922
    new file mode 100644
    index 0000000..e9e0d5f
    --- /dev/null
    +++ b/tests/data/test922
    @@ -0,0 +1,55 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH OAUTH2
    +SASL-IR
    +RFC4954
    +RFC6749
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH XOAUTH2
    +REPLY AUTH 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP OAuth 2.0 authentication with initial response
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/922 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 922
    +AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG1GXzkuQjVmLTQuMUpxTQEB
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test923 b/tests/data/test923
    new file mode 100644
    index 0000000..cb811bb
    --- /dev/null
    +++ b/tests/data/test923
    @@ -0,0 +1,40 @@
    +
    +
    +
    +SMTP
    +VRFY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +250 
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP VRFY
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/923 --mail-rcpt recipient
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 923
    +VRFY recipient
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test924 b/tests/data/test924
    new file mode 100644
    index 0000000..51e373c
    --- /dev/null
    +++ b/tests/data/test924
    @@ -0,0 +1,43 @@
    +
    +
    +
    +SMTP
    +VRFY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +553-Ambiguous; Possibilities are:
    +553-Joe Smith 
    +553-Harry Smith 
    +553 Melvin Smith 
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP ambiguous VRFY
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/924 --mail-rcpt smith
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 924
    +VRFY smith
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test925 b/tests/data/test925
    new file mode 100644
    index 0000000..2d53100
    --- /dev/null
    +++ b/tests/data/test925
    @@ -0,0 +1,40 @@
    +
    +
    +
    +SMTP
    +VRFY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +252 Send some mail and I'll try my best
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP external VRFY
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/925 --mail-rcpt user@example.net
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 925
    +VRFY user@example.net
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test926 b/tests/data/test926
    new file mode 100644
    index 0000000..4c4576c
    --- /dev/null
    +++ b/tests/data/test926
    @@ -0,0 +1,44 @@
    +
    +
    +
    +SMTP
    +VRFY
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +REPLY VRFY 550 Unknown user
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP unknown user VRFY
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/926 --mail-rcpt recipient
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 56 - CURLE_RECV_ERROR
    +
    +56
    +
    +
    +EHLO 926
    +VRFY recipient
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test927 b/tests/data/test927
    new file mode 100644
    index 0000000..b199710
    --- /dev/null
    +++ b/tests/data/test927
    @@ -0,0 +1,43 @@
    +
    +
    +
    +SMTP
    +EXPN
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +250-Joe Smith 
    +250-Harry Smith 
    +250 Melvin Smith 
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP mailing list EXPN (CUSTOMREQUEST)
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/927 --mail-rcpt Friends -X EXPN
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 927
    +EXPN Friends
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test928 b/tests/data/test928
    new file mode 100644
    index 0000000..81bbdc2
    --- /dev/null
    +++ b/tests/data/test928
    @@ -0,0 +1,41 @@
    +
    +
    +
    +SMTP
    +HELP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +214-This server supports the following commands:
    +214 HELO EHLO RCPT DATA RSET MAIL VRFY EXPN QUIT HELP
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP HELP
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/928
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 928
    +HELP
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test929 b/tests/data/test929
    new file mode 100644
    index 0000000..3761ab5
    --- /dev/null
    +++ b/tests/data/test929
    @@ -0,0 +1,38 @@
    +
    +
    +
    +SMTP
    +NOOP
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP NOOP (CUSTOMREQUEST)
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/929 -X NOOP -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 929
    +NOOP
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test930 b/tests/data/test930
    new file mode 100644
    index 0000000..be633c1
    --- /dev/null
    +++ b/tests/data/test930
    @@ -0,0 +1,38 @@
    +
    +
    +
    +SMTP
    +RSET
    +CUSTOMREQUEST
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP RSET (CUSTOMREQUEST)
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/930 -X RSET -I
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 930
    +RSET
    +QUIT
    +
    +
    +
    diff --git a/tests/data/test1323 b/tests/data/test931
    similarity index 88%
    rename from tests/data/test1323
    rename to tests/data/test931
    index 90eb88b..722aa02 100644
    --- a/tests/data/test1323
    +++ b/tests/data/test931
    @@ -15,7 +15,7 @@ smtp
     SMTP with URL-encoded CR LF in the URL
      
      
    -smtp://%HOSTIP:%SMTPPORT/%0d%0a/1323
    +smtp://%HOSTIP:%SMTPPORT/%0d%0a/931
     
     
     
    diff --git a/tests/data/test932 b/tests/data/test932
    new file mode 100644
    index 0000000..13ab790
    --- /dev/null
    +++ b/tests/data/test932
    @@ -0,0 +1,56 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL CANCELLATION
    +RFC2195
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5
    +REPLY AUTH 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +crypto
    +
    + 
    +SMTP CRAM-MD5 graceful cancellation
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/932 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +EHLO 932
    +AUTH CRAM-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test933 b/tests/data/test933
    new file mode 100644
    index 0000000..08b4e9d
    --- /dev/null
    +++ b/tests/data/test933
    @@ -0,0 +1,67 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH NTLM
    +SASL CANCELLATION
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM
    +REPLY AUTH 334 NTLM supported
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +SMTP NTLM graceful cancellation
    + 
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/933 --mail-rcpt recipient@example.com --mail-from sender@example.com -u testuser:testpass -T -
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +EHLO 933
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +
    +
    +
    diff --git a/tests/data/test934 b/tests/data/test934
    new file mode 100644
    index 0000000..1794d81
    --- /dev/null
    +++ b/tests/data/test934
    @@ -0,0 +1,58 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL CANCELLATION
    +RFC2831
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5
    +REPLY AUTH 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +SMTP DIGEST-MD5 graceful cancellation
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/934 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +# 67 - CURLE_LOGIN_DENIED
    +
    +67
    +
    +#
    +# The multi interface considers a broken "CONNECT" as a prematurely broken
    +# transfer and such a connection will not get a "QUIT"
    +
    +EHLO 934
    +AUTH DIGEST-MD5
    +*
    +
    +
    +
    diff --git a/tests/data/test935 b/tests/data/test935
    new file mode 100644
    index 0000000..3fd5c2e
    --- /dev/null
    +++ b/tests/data/test935
    @@ -0,0 +1,65 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH CRAM-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC2195
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH CRAM-MD5 PLAIN
    +REPLY "AUTH CRAM-MD5" 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" 334 PLAIN supported
    +REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +crypto
    +
    + 
    +SMTP CRAM-MD5 authentication with SASL downgrade
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/935 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 935
    +AUTH CRAM-MD5
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test936 b/tests/data/test936
    new file mode 100644
    index 0000000..88c8a93
    --- /dev/null
    +++ b/tests/data/test936
    @@ -0,0 +1,76 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH NTLM
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH NTLM PLAIN
    +REPLY "AUTH NTLM" 334 NTLM supported
    +REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" 334 PLAIN supported
    +REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +NTLM
    +!SSPI
    +
    + 
    +SMTP NTLM authentication with SASL downgrade
    + 
    +
    +mail body
    +
    + 
    +# we force our own host name, in order to make the test machine independent
    +CURL_GETHOSTNAME=curlhost
    +# we try to use the LD_PRELOAD hack, if not a debug build
    +LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
    + 
    + 
    +smtp://%HOSTIP:%SMTPPORT/936 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +chkhostname curlhost
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 936
    +AUTH NTLM
    +TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test937 b/tests/data/test937
    new file mode 100644
    index 0000000..a2cb9b5
    --- /dev/null
    +++ b/tests/data/test937
    @@ -0,0 +1,67 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH DIGEST-MD5
    +SASL AUTH PLAIN
    +SASL DOWNGRADE
    +RFC2831
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH DIGEST-MD5 PLAIN
    +REPLY "AUTH DIGEST-MD5" 334 Rubbish
    +REPLY * 501 AUTH exchange cancelled by client
    +REPLY "AUTH PLAIN" 334 PLAIN supported
    +REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    +
    +!SSPI
    +debug
    +crypto
    +
    + 
    +SMTP DIGEST-MD5 authentication with SASL downgrade
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/937 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 937
    +AUTH DIGEST-MD5
    +*
    +AUTH PLAIN
    +dXNlcgB1c2VyAHNlY3JldA==
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test938 b/tests/data/test938
    new file mode 100644
    index 0000000..7299d34
    --- /dev/null
    +++ b/tests/data/test938
    @@ -0,0 +1,63 @@
    +
    +
    +
    +SMTP
    +SASL
    +SASL AUTH PLAIN
    +connection re-use
    +RFC4616
    +RFC4954
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +AUTH PLAIN
    +REPLY AUTH 334 PLAIN supported
    +REPLY dXNlci5vbmUAdXNlci5vbmUAc2VjcmV0 235 Authenticated
    +REPLY dXNlci50d28AdXNlci50d28Ac2VjcmV0 235 Authenticated
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP multiple connection authentication
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/938001 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user.one:secret -T log/upload938 -: smtp://%HOSTIP:%SMTPPORT/938002 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user.two:secret -T log/upload938
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 938001
    +AUTH PLAIN
    +dXNlci5vbmUAdXNlci5vbmUAc2VjcmV0
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +EHLO 938002
    +AUTH PLAIN
    +dXNlci50d28AdXNlci50d28Ac2VjcmV0
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    diff --git a/tests/data/test939 b/tests/data/test939
    new file mode 100644
    index 0000000..34ba8a0
    --- /dev/null
    +++ b/tests/data/test939
    @@ -0,0 +1,50 @@
    +
    +
    +
    +SMTP
    +RFC821
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +REPLY EHLO 500 Command unrecognized
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +RFC821-only SMTP with username and password
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/939 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 939
    +HELO 939
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test940 b/tests/data/test940
    new file mode 100644
    index 0000000..4dfb72c
    --- /dev/null
    +++ b/tests/data/test940
    @@ -0,0 +1,45 @@
    +
    +
    +
    +SMTP
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with username and password but no AUTH capability
    + 
    +
    +mail body
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/940 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret -T -
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 940
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +mail body
    +.
    +
    +
    +
    diff --git a/tests/data/test941 b/tests/data/test941
    new file mode 100644
    index 0000000..fd69b87
    --- /dev/null
    +++ b/tests/data/test941
    @@ -0,0 +1,66 @@
    +
    +
    +
    +SMTP
    +--crlf
    +
    +
    +
    +#
    +# Server-side
    +
    +
    +
    +#
    +# Client-side
    +
    +
    +smtp
    +
    + 
    +SMTP with --crlf
    + 
    +
    +From: different
    +To: another
    +
    +email
    +headers and body
    +with unix newlines
    +meant to be
    +converted
    +with
    +the
    +--crlf option
    +
    + 
    +smtp://%HOSTIP:%SMTPPORT/941 --mail-rcpt recipient@example.com --mail-from sender@example.com -T log/upload941 --crlf
    +
    +
    +
    +#
    +# Verify data after the test has been "shot"
    +
    +
    +EHLO 941
    +MAIL FROM:
    +RCPT TO:
    +DATA
    +QUIT
    +
    +
    +From: different
    +To: another
    +
    +email
    +headers and body
    +with unix newlines
    +meant to be
    +converted
    +with
    +the
    +--crlf option
    +.
    +
    +
    +
    diff --git a/tests/data/test96 b/tests/data/test96
    index 865aff9..3d9a933 100644
    --- a/tests/data/test96
    +++ b/tests/data/test96
    @@ -30,9 +30,11 @@ curl memory tracking operational
     #
     # Verify data after the test has been "shot"
     
    -
    +
     MEM tool_paramhlp.c
     MEM tool_cfgable.c
    +MEM tool_cfgable.c
    +MEM tool_cfgable.c
     
     
     $_ = '' if (($_ !~ /tool_paramhlp/) && ($_ !~ /tool_cfgable/))
    diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
    index c32165b..4807a1f 100755
    --- a/tests/ftpserver.pl
    +++ b/tests/ftpserver.pl
    @@ -6,7 +6,7 @@
     #                            | (__| |_| |  _ <| |___
     #                             \___|\___/|_| \_\_____|
     #
    -# Copyright (C) 1998 - 2013, Daniel Stenberg, , et al.
    +# Copyright (C) 1998 - 2014, 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
    @@ -52,6 +52,7 @@ BEGIN {
     use strict;
     use warnings;
     use IPC::Open2;
    +use Digest::MD5;
     
     require "getpart.pm";
     require "ftp.pm";
    @@ -77,7 +78,7 @@ my $ipvnum = 4;     # server IPv number (4 or 6)
     my $proto = 'ftp';  # default server protocol
     my $srcdir;         # directory where ftpserver.pl is located
     my $srvrname;       # server name for presentation purposes
    -
    +my $cwd_testno;     # test case numbers extracted from CWD command
     my $path   = '.';
     my $logdir = $path .'/log';
     
    @@ -122,8 +123,8 @@ my $sockfilt_timeout = 5;  # default timeout for sockfilter eXsysreads
     #**********************************************************************
     # global vars which depend on server protocol selection
     #
    -my %commandfunc;  # protocol command specific function callbacks
    -my %displaytext;  # text returned to client before callback runs
    +my %commandfunc;   # protocol command specific function callbacks
    +my %displaytext;   # text returned to client before callback runs
     
     #**********************************************************************
     # global vars customized for each test from the server commands file
    @@ -138,9 +139,10 @@ my $nodataconn;    # set if ftp srvr doesn't establish or accepts data channel
     my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
     my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
     my $nodataconn150; # set if ftp srvr doesn't establish data ch and replies 150
    -my $support_capa;  # set if server supports capability command
    -my $support_auth;  # set if server supports authentication command
    -my %customreply;   #
    +my @capabilities;  # set if server supports capability commands
    +my @auth_mechs;    # set if server supports authentication commands
    +my %fulltextreply; #
    +my %commandreply;  #
     my %customcount;   #
     my %delayreply;    #
     
    @@ -150,7 +152,7 @@ my %delayreply;    #
     # $ftptargetdir is keeping the fake "name" of LIST directory.
     #
     my $ftplistparserstate;
    -my $ftptargetdir;
    +my $ftptargetdir="";
     
     #**********************************************************************
     # global variables used when running a ftp server to keep state info
    @@ -170,6 +172,13 @@ my $got_exit_signal = 0; # set if program should finish execution ASAP
     my $exit_signal;         # first signal handled in exit_signal_handler
     
     #**********************************************************************
    +# Mail related definitions
    +#
    +my $TEXT_USERNAME = "user";
    +my $TEXT_PASSWORD = "secret";
    +my $POP3_TIMESTAMP = "<1972.987654321\@curl>";
    +
    +#**********************************************************************
     # exit_signal_handler will be triggered to indicate that the program
     # should finish its execution in a controlled way as soon as possible.
     # For now, program will also terminate from within this handler.
    @@ -427,6 +436,28 @@ sub startsf {
         }
     }
     
    +#**********************************************************************
    +# Returns the given test's reply data
    +#
    +sub getreplydata {
    +    my ($testno) = @_;
    +    my $testpart = "";
    +
    +    $testno =~ s/^([^0-9]*)//;
    +    if($testno > 10000) {
    +       $testpart = $testno % 10000;
    +       $testno = int($testno / 10000);
    +    }
    +
    +    loadtest("$srcdir/data/test$testno");
    +
    +    my @data = getpart("reply", "data$testpart");
    +    if((!@data) && ($testpart ne "")) {
    +        @data = getpart("reply", "data");
    +    }
    +
    +    return @data;
    +}
     
     sub sockfilt {
         my $l;
    @@ -436,7 +467,6 @@ sub sockfilt {
         }
     }
     
    -
     sub sockfiltsecondary {
         my $l;
         foreach $l (@_) {
    @@ -445,10 +475,10 @@ sub sockfiltsecondary {
         }
     }
     
    -
    +#**********************************************************************
     # Send data to the client on the control stream, which happens to be plain
     # stdout.
    -
    +#
     sub sendcontrol {
         if(!$ctrldelay) {
             # spit it all out at once
    @@ -487,18 +517,19 @@ sub senddata {
             }
             return;
         }
    +
         foreach $l (@_) {
    -      if(!$datadelay) {
    -        # spit it all out at once
    -        sockfiltsecondary $l;
    -      }
    -      else {
    -          # pause between each byte
    -          for (split(//,$l)) {
    -              sockfiltsecondary $_;
    -              select(undef, undef, undef, 0.01);
    -          }
    -      }
    +        if(!$datadelay) {
    +            # spit it all out at once
    +            sockfiltsecondary $l;
    +        }
    +        else {
    +            # pause between each byte
    +            for (split(//,$l)) {
    +                sockfiltsecondary $_;
    +                select(undef, undef, undef, 0.01);
    +            }
    +        }
         }
     }
     
    @@ -550,49 +581,67 @@ sub protocolsetup {
                 '220-        _   _ ____  _     '."\r\n",
                 '220-    ___| | | |  _ \| |    '."\r\n",
                 '220-   / __| | | | |_) | |    '."\r\n",
    -            '220-  | (__| |_| |  _ <| |___ '."\r\n",
    +            '220-  | (__| |_| |  _ {| |___ '."\r\n",
                 '220    \___|\___/|_| \_\_____|'."\r\n")
             );
         }
         elsif($proto eq 'pop3') {
             %commandfunc = (
    -            'CAPA' => \&CAPA_pop3,
    +            'APOP' => \&APOP_pop3,
                 'AUTH' => \&AUTH_pop3,
    -            'RETR' => \&RETR_pop3,
    +            'CAPA' => \&CAPA_pop3,
    +            'DELE' => \&DELE_pop3,
                 'LIST' => \&LIST_pop3,
    +            'NOOP' => \&NOOP_pop3,
    +            'PASS' => \&PASS_pop3,
    +            'QUIT' => \&QUIT_pop3,
    +            'RETR' => \&RETR_pop3,
    +            'RSET' => \&RSET_pop3,
    +            'STAT' => \&STAT_pop3,
    +            'TOP'  => \&TOP_pop3,
    +            'UIDL' => \&UIDL_pop3,
    +            'USER' => \&USER_pop3,
             );
             %displaytext = (
    -            'USER' => '+OK We are happy you popped in!',
    -            'PASS' => '+OK Access granted',
    -            'QUIT' => '+OK byebye',
                 'welcome' => join("",
                 '        _   _ ____  _     '."\r\n",
                 '    ___| | | |  _ \| |    '."\r\n",
                 '   / __| | | | |_) | |    '."\r\n",
    -            '  | (__| |_| |  _ <| |___ '."\r\n",
    +            '  | (__| |_| |  _ {| |___ '."\r\n",
                 '   \___|\___/|_| \_\_____|'."\r\n",
    -            '+OK cURL POP3 server ready to serve'."\r\n")
    +            '+OK cURL POP3 server ready to serve '."\r\n")
             );
         }
         elsif($proto eq 'imap') {
             %commandfunc = (
    -            'APPEND' => \&APPEND_imap,
    +            'APPEND'     => \&APPEND_imap,
                 'CAPABILITY' => \&CAPABILITY_imap,
    -            'EXAMINE' => \&EXAMINE_imap,
    -            'FETCH'  => \&FETCH_imap,
    -            'LIST'   => \&LIST_imap,
    -            'LOGOUT'   => \&LOGOUT_imap,
    -            'SELECT' => \&SELECT_imap,
    -            'STATUS'  => \&STATUS_imap,
    -            'STORE'  => \&STORE_imap
    +            'CHECK'      => \&CHECK_imap,
    +            'CLOSE'      => \&CLOSE_imap,
    +            'COPY'       => \©_imap,
    +            'CREATE'     => \&CREATE_imap,
    +            'DELETE'     => \&DELETE_imap,
    +            'EXAMINE'    => \&EXAMINE_imap,
    +            'EXPUNGE'    => \&EXPUNGE_imap,
    +            'FETCH'      => \&FETCH_imap,
    +            'LIST'       => \&LIST_imap,
    +            'LSUB'       => \&LSUB_imap,
    +            'LOGIN'      => \&LOGIN_imap,
    +            'LOGOUT'     => \&LOGOUT_imap,
    +            'NOOP'       => \&NOOP_imap,
    +            'RENAME'     => \&RENAME_imap,
    +            'SEARCH'     => \&SEARCH_imap,
    +            'SELECT'     => \&SELECT_imap,
    +            'STATUS'     => \&STATUS_imap,
    +            'STORE'      => \&STORE_imap,
    +            'UID'        => \&UID_imap,
             );
             %displaytext = (
    -            'LOGIN'  => ' OK LOGIN completed',
                 'welcome' => join("",
                 '        _   _ ____  _     '."\r\n",
                 '    ___| | | |  _ \| |    '."\r\n",
                 '   / __| | | | |_) | |    '."\r\n",
    -            '  | (__| |_| |  _ <| |___ '."\r\n",
    +            '  | (__| |_| |  _ {| |___ '."\r\n",
                 '   \___|\___/|_| \_\_____|'."\r\n",
                 '* OK cURL IMAP server ready to serve'."\r\n")
             );
    @@ -600,18 +649,23 @@ sub protocolsetup {
         elsif($proto eq 'smtp') {
             %commandfunc = (
                 'DATA' => \&DATA_smtp,
    +            'EHLO' => \&EHLO_smtp,
    +            'EXPN' => \&EXPN_smtp,
    +            'HELO' => \&HELO_smtp,
    +            'HELP' => \&HELP_smtp,
    +            'MAIL' => \&MAIL_smtp,
    +            'NOOP' => \&NOOP_smtp,
    +            'RSET' => \&RSET_smtp,
                 'RCPT' => \&RCPT_smtp,
    +            'VRFY' => \&VRFY_smtp,
    +            'QUIT' => \&QUIT_smtp,
             );
             %displaytext = (
    -            'EHLO' => "250-SIZE\r\n250 Welcome visitor, stay a while staaaaaay forever",
    -            'MAIL' => '200 Note taken',
    -            'RCPT' => '200 Receivers accepted',
    -            'QUIT' => '200 byebye',
                 'welcome' => join("",
                 '220-        _   _ ____  _     '."\r\n",
                 '220-    ___| | | |  _ \| |    '."\r\n",
                 '220-   / __| | | | |_) | |    '."\r\n",
    -            '220-  | (__| |_| |  _ <| |___ '."\r\n",
    +            '220-  | (__| |_| |  _ {| |___ '."\r\n",
                 '220    \___|\___/|_| \_\_____|'."\r\n")
             );
         }
    @@ -662,93 +716,355 @@ sub close_dataconn {
     ################ SMTP commands
     ################
     
    -# what set by "RCPT"
    -my $smtp_rcpt;
    +# The type of server (SMTP or ESMTP)
    +my $smtp_type;
     
    -sub DATA_smtp {
    -    my $testno;
    +# The client (which normally contains the test number)
    +my $smtp_client;
     
    -    if($smtp_rcpt =~ /^TO:(.*)/) {
    -        $testno = $1;
    +sub EHLO_smtp {
    +    my ($client) = @_;
    +    my @data;
    +
    +    # TODO: Get the IP address of the client connection to use in the
    +    # EHLO response when the client doesn't specify one but for now use
    +    # 127.0.0.1
    +    if(!$client) {
    +        $client = "[127.0.0.1]";
    +    }
    +
    +    # Set the server type to ESMTP
    +    $smtp_type = "ESMTP";
    +
    +    # Calculate the EHLO response
    +    push @data, "$smtp_type pingpong test server Hello $client";
    +
    +    if((@capabilities) || (@auth_mechs)) {
    +        my $mechs;
    +
    +        for my $c (@capabilities) {
    +            push @data, $c;
    +        }
    +
    +        for my $am (@auth_mechs) {
    +            if(!$mechs) {
    +                $mechs = "$am";
    +            }
    +            else {
    +                $mechs .= " $am";
    +            }
    +        }
    +
    +        if($mechs) {
    +            push @data, "AUTH $mechs";
    +        }
    +    }
    +
    +    # Send the EHLO response
    +    for(my $i = 0; $i < @data; $i++) {
    +        my $d = $data[$i];
    +
    +        if($i < @data - 1) {
    +            sendcontrol "250-$d\r\n";
    +        }
    +        else {
    +            sendcontrol "250 $d\r\n";
    +        }
    +    }
    +
    +    # Store the client (as it may contain the test number)
    +    $smtp_client = $client;
    +
    +    return 0;
    +}
    +
    +sub HELO_smtp {
    +    my ($client) = @_;
    +
    +    # TODO: Get the IP address of the client connection to use in the HELO
    +    # response when the client doesn't specify one but for now use 127.0.0.1
    +    if(!$client) {
    +        $client = "[127.0.0.1]";
    +    }
    +
    +    # Set the server type to SMTP
    +    $smtp_type = "SMTP";
    +
    +    # Send the HELO response
    +    sendcontrol "250 $smtp_type pingpong test server Hello $client\r\n";
    +
    +    # Store the client (as it may contain the test number)
    +    $smtp_client = $client;
    +
    +    return 0;
    +}
    +
    +sub MAIL_smtp {
    +    my ($args) = @_;
    +
    +    logmsg "MAIL_smtp got $args\n";
    +
    +    if (!$args) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
         }
         else {
    -        return; # failure
    +        my $from;
    +        my $size;
    +        my @elements = split(/ /, $args);
    +
    +        # Get the FROM and SIZE parameters
    +        for my $e (@elements) {
    +            if($e =~ /^FROM:(.*)$/) {
    +                $from = $1;
    +            }
    +            elsif($e =~ /^SIZE=(\d+)$/) {
    +                $size = $1;
    +            }
    +        }
    +
    +        # Validate the from address (only <> and a valid email address inside
    +        # <> are allowed, such as )
    +        if ((!$from) || (($from ne "<>") && ($from !~
    +            /^<([a-zA-Z0-9._%+-]+)\@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})>$/))) {
    +            sendcontrol "501 Invalid address\r\n";
    +        }
    +        else {
    +            my @found;
    +            my $valid = 1;
    +
    +            # Check the capabilities for SIZE and if the specified size is
    +            # greater than the message size then reject it
    +            if (@found = grep /^SIZE (\d+)$/, @capabilities) {
    +                if ($found[0] =~ /^SIZE (\d+)$/) {
    +                    if ($size > $1) {
    +                        $valid = 0;
    +                    }
    +                }
    +            }
    +
    +            if(!$valid) {
    +                sendcontrol "552 Message size too large\r\n";
    +            }
    +            else {
    +                sendcontrol "250 Sender OK\r\n";
    +            }
    +        }
         }
     
    -    if($testno eq "") {
    -        sendcontrol "554 WE ROOLZ: $$\r\n";
    -        return 0; # don't wait for data now
    +    return 0;
    +}
    +
    +sub RCPT_smtp {
    +    my ($args) = @_;
    +
    +    logmsg "RCPT_smtp got $args\n";
    +
    +    # Get the TO parameter
    +    if($args !~ /^TO:(.*)/) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
         }
         else {
    -        $testno =~ s/^([^0-9]*)([0-9]+).*/$2/;
    -        sendcontrol "354 Show me the mail\r\n";
    +        my $to = $1;
    +
    +        # Validate the to address (only a valid email address inside <> is
    +        # allowed, such as )
    +        if ($to !~
    +            /^<([a-zA-Z0-9._%+-]+)\@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})>$/) {
    +            sendcontrol "501 Invalid address\r\n";
    +        }
    +        else {
    +            sendcontrol "250 Recipient OK\r\n";
    +        }
         }
     
    -    logmsg "===> rcpt $testno was $smtp_rcpt\n";
    +    return 0;
    +}
     
    -    my $filename = "log/upload.$testno";
    +sub DATA_smtp {
    +    my ($args) = @_;
     
    -    logmsg "Store test number $testno in $filename\n";
    +    if ($args) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
    +    }
    +    elsif ($smtp_client !~ /^(\d*)$/) {
    +        sendcontrol "501 Invalid arguments\r\n";
    +    }
    +    else {
    +        sendcontrol "354 Show me the mail\r\n";
     
    -    open(FILE, ">$filename") ||
    -        return 0; # failed to open output
    +        my $testno = $smtp_client;
    +        my $filename = "log/upload.$testno";
     
    -    my $line;
    -    my $ulsize=0;
    -    my $disc=0;
    -    my $raw;
    -    while (5 == (sysread \*SFREAD, $line, 5)) {
    -        if($line eq "DATA\n") {
    -            my $i;
    -            my $eob;
    -            sysread \*SFREAD, $i, 5;
    +        logmsg "Store test number $testno in $filename\n";
     
    -            my $size = 0;
    -            if($i =~ /^([0-9a-fA-F]{4})\n/) {
    -                $size = hex($1);
    -            }
    +        open(FILE, ">$filename") ||
    +            return 0; # failed to open output
     
    -            read_mainsockf(\$line, $size);
    +        my $line;
    +        my $ulsize=0;
    +        my $disc=0;
    +        my $raw;
    +        while (5 == (sysread \*SFREAD, $line, 5)) {
    +            if($line eq "DATA\n") {
    +                my $i;
    +                my $eob;
    +                sysread \*SFREAD, $i, 5;
     
    -            $ulsize += $size;
    -            print FILE $line if(!$nosave);
    +                my $size = 0;
    +                if($i =~ /^([0-9a-fA-F]{4})\n/) {
    +                    $size = hex($1);
    +                }
    +
    +                read_mainsockf(\$line, $size);
    +
    +                $ulsize += $size;
    +                print FILE $line if(!$nosave);
    +
    +                $raw .= $line;
    +                if($raw =~ /\x0d\x0a\x2e\x0d\x0a/) {
    +                    # end of data marker!
    +                    $eob = 1;
    +                }
    +
    +                logmsg "> Appending $size bytes to file\n";
     
    -            $raw .= $line;
    -            if($raw =~ /\x0d\x0a\x2e\x0d\x0a/) {
    -                # end of data marker!
    -                $eob = 1;
    +                if($eob) {
    +                    logmsg "Found SMTP EOB marker\n";
    +                    last;
    +                }
                 }
    -            logmsg "> Appending $size bytes to file\n";
    -            if($eob) {
    -                logmsg "Found SMTP EOB marker\n";
    +            elsif($line eq "DISC\n") {
    +                # disconnect!
    +                $disc=1;
    +                last;
    +            }
    +            else {
    +                logmsg "No support for: $line";
                     last;
                 }
             }
    -        elsif($line eq "DISC\n") {
    -            # disconnect!
    -            $disc=1;
    -            last;
    +
    +        if($nosave) {
    +            print FILE "$ulsize bytes would've been stored here\n";
             }
    -        else {
    -            logmsg "No support for: $line";
    -            last;
    +
    +        close(FILE);
    +
    +        logmsg "received $ulsize bytes upload\n";
    +
    +        sendcontrol "250 OK, data received!\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub NOOP_smtp {
    +    my ($args) = @_;
    +
    +    if($args) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
    +    }
    +    else {
    +        sendcontrol "250 OK\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub RSET_smtp {
    +    my ($args) = @_;
    +
    +    if($args) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
    +    }
    +    else {
    +        sendcontrol "250 Resetting\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub HELP_smtp {
    +    my ($args) = @_;
    +
    +    # One argument is optional
    +    if($args) {
    +        logmsg "HELP_smtp got $args\n";
    +    }
    +
    +    if($smtp_client eq "verifiedserver") {
    +        # This is the secret command that verifies that this actually is
    +        # the curl test server
    +        sendcontrol "214 WE ROOLZ: $$\r\n";
    +
    +        if($verbose) {
    +            print STDERR "FTPD: We returned proof we are the test server\n";
             }
    +
    +        logmsg "return proof we are we\n";
         }
    -    if($nosave) {
    -        print FILE "$ulsize bytes would've been stored here\n";
    +    else {
    +        sendcontrol "214-This server supports the following commands:\r\n";
    +
    +        if(@auth_mechs) {
    +            sendcontrol "214 HELO EHLO RCPT DATA RSET MAIL VRFY EXPN QUIT HELP AUTH\r\n";
    +        }
    +        else {
    +            sendcontrol "214 HELO EHLO RCPT DATA RSET MAIL VRFY EXPN QUIT HELP\r\n";
    +        }
         }
    -    close(FILE);
    -    sendcontrol "250 OK, data received!\r\n";
    -    logmsg "received $ulsize bytes upload\n";
     
    +    return 0;
     }
     
    -sub RCPT_smtp {
    +sub VRFY_smtp {
         my ($args) = @_;
    +    my ($username, $address) = split(/ /, $args, 2);
    +
    +    logmsg "VRFY_smtp got $args\n";
    +
    +    if($username eq "") {
    +        sendcontrol "501 Unrecognized parameter\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($smtp_client);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +    }
     
    -    $smtp_rcpt = $args;
    +    return 0;
     }
     
    +sub EXPN_smtp {
    +    my ($list_name) = @_;
    +
    +    logmsg "EXPN_smtp got $list_name\n";
    +
    +    if(!$list_name) {
    +        sendcontrol "501 Unrecognized parameter\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($smtp_client);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +    }
    +
    +    return 0;
    +}
    +
    +sub QUIT_smtp {
    +    sendcontrol "221 cURL $smtp_type server signing off\r\n";
    +
    +    return 0;
    +}
    +
    +# What was deleted by IMAP STORE / POP3 DELE commands
    +my @deleted;
    +
     ################
     ################ IMAP commands
     ################
    @@ -767,389 +1083,867 @@ sub fix_imap_params {
         }
     }
     
    -sub CAPABILITY_imap {
    -    my ($testno) = @_;
    -    my $data;
    +sub CAPABILITY_imap {
    +    if((!@capabilities) && (!@auth_mechs)) {
    +        sendcontrol "$cmdid BAD Command\r\n";
    +    }
    +    else {
    +        my $data;
    +
    +        # Calculate the CAPABILITY response
    +        $data = "* CAPABILITY IMAP4";
    +
    +        for my $c (@capabilities) {
    +            $data .= " $c";
    +        }
    +
    +        for my $am (@auth_mechs) {
    +            $data .= " AUTH=$am";
    +        }
    +
    +        $data .= " pingpong test server\r\n";
    +
    +        # Send the CAPABILITY response
    +        sendcontrol $data;
    +        sendcontrol "$cmdid OK CAPABILITY completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub LOGIN_imap {
    +    my ($args) = @_;
    +    my ($user, $password) = split(/ /, $args, 2);
    +    fix_imap_params($user, $password);
    +
    +    logmsg "LOGIN_imap got $args\n";
    +
    +    if ($user eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    elsif (($user ne $TEXT_USERNAME) || ($password ne $TEXT_PASSWORD)) {
    +        sendcontrol "$cmdid NO LOGIN failed\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK LOGIN completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub SELECT_imap {
    +    my ($mailbox) = @_;
    +    fix_imap_params($mailbox);
    +
    +    logmsg "SELECT_imap got test $mailbox\n";
    +
    +    if($mailbox eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        # Example from RFC 3501, 6.3.1. SELECT Command
    +        sendcontrol "* 172 EXISTS\r\n";
    +        sendcontrol "* 1 RECENT\r\n";
    +        sendcontrol "* OK [UNSEEN 12] Message 12 is first unseen\r\n";
    +        sendcontrol "* OK [UIDVALIDITY 3857529045] UIDs valid\r\n";
    +        sendcontrol "* OK [UIDNEXT 4392] Predicted next UID\r\n";
    +        sendcontrol "* FLAGS (\\Answered \\Flagged \\Deleted \\Seen \\Draft)\r\n";
    +        sendcontrol "* OK [PERMANENTFLAGS (\\Deleted \\Seen \\*)] Limited\r\n";
    +        sendcontrol "$cmdid OK [READ-WRITE] SELECT completed\r\n";
    +
    +        $selected = $mailbox;
    +    }
    +
    +    return 0;
    +}
    +
    +sub FETCH_imap {
    +    my ($args) = @_;
    +    my ($uid, $how) = split(/ /, $args, 2);
    +    fix_imap_params($uid, $how);
    +
    +    logmsg "FETCH_imap got $args\n";
    +
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    else {
    +        my @data;
    +        my $size;
    +
    +        if($selected eq "verifiedserver") {
    +            # this is the secret command that verifies that this actually is
    +            # the curl test server
    +            my $response = "WE ROOLZ: $$\r\n";
    +            if($verbose) {
    +                print STDERR "FTPD: We returned proof we are the test server\n";
    +            }
    +            $data[0] = $response;
    +            logmsg "return proof we are we\n";
    +        }
    +        else {
    +            # send mail content
    +            logmsg "retrieve a mail\n";
    +
    +            @data = getreplydata($selected);
    +        }
    +
    +        for (@data) {
    +            $size += length($_);
    +        }
    +
    +        sendcontrol "* $uid FETCH ($how {$size}\r\n";
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol ")\r\n";
    +        sendcontrol "$cmdid OK FETCH completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub APPEND_imap {
    +    my ($args) = @_;
    +
    +    logmsg "APPEND_imap got $args\r\n";
    +
    +    $args =~ /^([^ ]+) [^{]*\{(\d+)\}$/;
    +    my ($mailbox, $size) = ($1, $2);
    +    fix_imap_params($mailbox);
    +
    +    if($mailbox eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "+ Ready for literal data\r\n";
    +
    +        my $testno = $mailbox;
    +        my $filename = "log/upload.$testno";
    +
    +        logmsg "Store test number $testno in $filename\n";
    +
    +        open(FILE, ">$filename") ||
    +            return 0; # failed to open output
    +
    +        my $received = 0;
    +        my $line;
    +        while(5 == (sysread \*SFREAD, $line, 5)) {
    +            if($line eq "DATA\n") {
    +                sysread \*SFREAD, $line, 5;
    +
    +                my $chunksize = 0;
    +                if($line =~ /^([0-9a-fA-F]{4})\n/) {
    +                    $chunksize = hex($1);
    +                }
    +
    +                read_mainsockf(\$line, $chunksize);
    +
    +                my $left = $size - $received;
    +                my $datasize = ($left > $chunksize) ? $chunksize : $left;
    +
    +                if($datasize > 0) {
    +                    logmsg "> Appending $datasize bytes to file\n";
    +                    print FILE substr($line, 0, $datasize) if(!$nosave);
    +                    $line = substr($line, $datasize);
    +
    +                    $received += $datasize;
    +                    if($received == $size) {
    +                        logmsg "Received all data, waiting for final CRLF.\n";
    +                    }
    +                }
    +
    +                if($received == $size && $line eq "\r\n") {
    +                    last;
    +                }
    +            }
    +            elsif($line eq "DISC\n") {
    +                logmsg "Unexpected disconnect!\n";
    +                last;
    +            }
    +            else {
    +                logmsg "No support for: $line";
    +                last;
    +            }
    +        }
    +
    +        if($nosave) {
    +            print FILE "$size bytes would've been stored here\n";
    +        }
    +
    +        close(FILE);
    +
    +        logmsg "received $size bytes upload\n";
    +
    +        sendcontrol "$cmdid OK APPEND completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub STORE_imap {
    +    my ($args) = @_;
    +    my ($uid, $what, $value) = split(/ /, $args, 3);
    +    fix_imap_params($uid);
    +
    +    logmsg "STORE_imap got $args\n";
    +
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    elsif (($uid eq "") || ($what ne "+Flags") || ($value eq "")) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        if($value eq "\\Deleted") {
    +            push(@deleted, $uid);
    +        }
    +
    +        sendcontrol "* $uid FETCH (FLAGS (\\Seen $value))\r\n";
    +        sendcontrol "$cmdid OK STORE completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub LIST_imap {
    +    my ($args) = @_;
    +    my ($reference, $mailbox) = split(/ /, $args, 2);
    +    fix_imap_params($reference, $mailbox);
    +
    +    logmsg "LIST_imap got $args\n";
    +
    +    if ($reference eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    elsif ($reference eq "verifiedserver") {
    +        # this is the secret command that verifies that this actually is
    +        # the curl test server
    +        sendcontrol "* LIST () \"/\" \"WE ROOLZ: $$\"\r\n";
    +        sendcontrol "$cmdid OK LIST Completed\r\n";
    +
    +        if($verbose) {
    +            print STDERR "FTPD: We returned proof we are the test server\n";
    +        }
    +
    +        logmsg "return proof we are we\n";
    +    }
    +    else {
    +        my @data = getreplydata($reference);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol "$cmdid OK LIST Completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub LSUB_imap {
    +    my ($args) = @_;
    +    my ($reference, $mailbox) = split(/ /, $args, 2);
    +    fix_imap_params($reference, $mailbox);
    +
    +    logmsg "LSUB_imap got $args\n";
    +
    +    if ($reference eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($reference);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol "$cmdid OK LSUB Completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub EXAMINE_imap {
    +    my ($mailbox) = @_;
    +    fix_imap_params($mailbox);
    +
    +    logmsg "EXAMINE_imap got $mailbox\n";
    +
    +    if ($mailbox eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($mailbox);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol "$cmdid OK [READ-ONLY] EXAMINE completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub STATUS_imap {
    +    my ($args) = @_;
    +    my ($mailbox, $what) = split(/ /, $args, 2);
    +    fix_imap_params($mailbox);
    +
    +    logmsg "STATUS_imap got $args\n";
    +
    +    if ($mailbox eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($mailbox);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol "$cmdid OK STATUS completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub SEARCH_imap {
    +    my ($what) = @_;
    +    fix_imap_params($what);
    +
    +    logmsg "SEARCH_imap got $what\n";
    +
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    elsif ($what eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        my @data = getreplydata($selected);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        sendcontrol "$cmdid OK SEARCH completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub CREATE_imap {
    +    my ($args) = @_;
    +    fix_imap_params($args);
    +
    +    logmsg "CREATE_imap got $args\n";
    +
    +    if ($args eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK CREATE completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub DELETE_imap {
    +    my ($args) = @_;
    +    fix_imap_params($args);
    +
    +    logmsg "DELETE_imap got $args\n";
    +
    +    if ($args eq "") {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK DELETE completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub RENAME_imap {
    +    my ($args) = @_;
    +    my ($from_mailbox, $to_mailbox) = split(/ /, $args, 2);
    +    fix_imap_params($from_mailbox, $to_mailbox);
    +
    +    logmsg "RENAME_imap got $args\n";
    +
    +    if (($from_mailbox eq "") || ($to_mailbox eq "")) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK RENAME completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub CHECK_imap {
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK CHECK completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub CLOSE_imap {
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    elsif (!@deleted) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK CLOSE completed\r\n";
    +
    +        @deleted = ();
    +    }
    +
    +    return 0;
    +}
    +
    +sub EXPUNGE_imap {
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    else {
    +        if (!@deleted) {
    +            # Report the number of existing messages as per the SELECT
    +            # command
    +            sendcontrol "* 172 EXISTS\r\n";
    +        }
    +        else {
    +            # Report the message UIDs being deleted
    +            for my $d (@deleted) {
    +                sendcontrol "* $d EXPUNGE\r\n";
    +            }
    +
    +            @deleted = ();
    +        }
    +
    +        sendcontrol "$cmdid OK EXPUNGE completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub COPY_imap {
    +    my ($args) = @_;
    +    my ($uid, $mailbox) = split(/ /, $args, 2);
    +    fix_imap_params($uid, $mailbox);
    +
    +    logmsg "COPY_imap got $args\n";
    +
    +    if (($uid eq "") || ($mailbox eq "")) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        sendcontrol "$cmdid OK COPY completed\r\n";
    +    }
    +
    +    return 0;
    +}
    +
    +sub UID_imap {
    +    my ($args) = @_;
    +    my ($command) = split(/ /, $args, 1);
    +    fix_imap_params($command);
    +
    +    logmsg "UID_imap got $args\n";
     
    -    if(!$support_capa) {
    -        sendcontrol "$cmdid BAD Command\r\n";
    +    if ($selected eq "") {
    +        sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
    +    }
    +    elsif (($command ne "COPY") && ($command ne "FETCH") &&
    +           ($command ne "STORE") && ($command ne "SEARCH")) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
         }
         else {
    -        $data = "* CAPABILITY IMAP4";
    -        if($support_auth) {
    -            $data .= " AUTH=UNKNOWN";
    +        my @data = getreplydata($selected);
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
             }
    -        $data .= " pingpong test server\r\n";
     
    -        sendcontrol $data;
    -        sendcontrol "$cmdid OK CAPABILITY completed\r\n";
    +        sendcontrol "$cmdid OK $command completed\r\n";
         }
     
         return 0;
     }
     
    -sub SELECT_imap {
    -    my ($testno) = @_;
    -    fix_imap_params($testno);
    +sub NOOP_imap {
    +    my ($args) = @_;
    +    my @data = (
    +        "* 22 EXPUNGE\r\n",
    +        "* 23 EXISTS\r\n",
    +        "* 3 RECENT\r\n",
    +        "* 14 FETCH (FLAGS (\\Seen \\Deleted))\r\n",
    +    );
    +
    +    if ($args) {
    +        sendcontrol "$cmdid BAD Command Argument\r\n";
    +    }
    +    else {
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
     
    -    logmsg "SELECT_imap got test $testno\n";
    +        sendcontrol "$cmdid OK NOOP completed\r\n";
    +    }
     
    -    # Example from RFC 3501, 6.3.1. SELECT Command
    -    sendcontrol "* 172 EXISTS\r\n";
    -    sendcontrol "* 1 RECENT\r\n";
    -    sendcontrol "* OK [UNSEEN 12] Message 12 is first unseen\r\n";
    -    sendcontrol "* OK [UIDVALIDITY 3857529045] UIDs valid\r\n";
    -    sendcontrol "* OK [UIDNEXT 4392] Predicted next UID\r\n";
    -    sendcontrol "* FLAGS (\\Answered \\Flagged \\Deleted \\Seen \\Draft)\r\n";
    -    sendcontrol "* OK [PERMANENTFLAGS (\\Deleted \\Seen \\*)] Limited\r\n";
    -    sendcontrol "$cmdid OK [READ-WRITE] SELECT completed\r\n";
    +    return 0;
    +}
     
    -    $selected = $testno;
    +sub LOGOUT_imap {
    +    sendcontrol "* BYE cURL IMAP server signing off\r\n";
    +    sendcontrol "$cmdid OK LOGOUT completed\r\n";
     
         return 0;
     }
     
    -sub FETCH_imap {
    -    my ($args) = @_;
    -    my ($uid, $how) = split(/ /, $args, 2);
    -    my @data;
    -    my $size;
    -    fix_imap_params($uid, $how);
    +################
    +################ POP3 commands
    +################
     
    -    logmsg "FETCH_imap got $args\n";
    +# Who is attempting to log in
    +my $username;
     
    -    if($selected eq "verifiedserver") {
    -        # this is the secret command that verifies that this actually is
    -        # the curl test server
    -        my $response = "WE ROOLZ: $$\r\n";
    -        if($verbose) {
    -            print STDERR "FTPD: We returned proof we are the test server\n";
    -        }
    -        $data[0] = $response;
    -        logmsg "return proof we are we\n";
    +sub CAPA_pop3 {
    +    my @list = ();
    +    my $mechs;
    +
    +    # Calculate the capability list based on the specified capabilities
    +    # (except APOP) and any authentication mechanisms
    +    for my $c (@capabilities) {
    +        push @list, "$c\r\n" unless $c eq "APOP";
         }
    -    else {
    -        logmsg "retrieve a mail\n";
     
    -        my $testno = $selected;
    -        $testno =~ s/^([^0-9]*)//;
    -        my $testpart = "";
    -        if ($testno > 10000) {
    -            $testpart = $testno % 10000;
    -            $testno = int($testno / 10000);
    +    for my $am (@auth_mechs) {
    +        if(!$mechs) {
    +            $mechs = "$am";
             }
    +        else {
    +            $mechs .= " $am";
    +        }
    +    }
     
    -        # send mail content
    -        loadtest("$srcdir/data/test$testno");
    -
    -        @data = getpart("reply", "data$testpart");
    +    if($mechs) {
    +        push @list, "SASL $mechs\r\n";
         }
     
    -    for (@data) {
    -        $size += length($_);
    +    if(!@list) {
    +        sendcontrol "-ERR Unrecognized command\r\n";
         }
    +    else {
    +        my @data = ();
     
    -    sendcontrol "* $uid FETCH ($how {$size}\r\n";
    +        # Calculate the CAPA response
    +        push @data, "+OK List of capabilities follows\r\n";
     
    -    for my $d (@data) {
    -        sendcontrol $d;
    -    }
    +        for my $l (@list) {
    +            push @data, "$l\r\n";
    +        }
    +
    +        push @data, "IMPLEMENTATION POP3 pingpong test server\r\n";
    +
    +        # Send the CAPA response
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
     
    -    sendcontrol ")\r\n";
    -    sendcontrol "$cmdid OK FETCH completed\r\n";
    +        # End with the magic 3-byte end of listing marker
    +        sendcontrol ".\r\n";
    +    }
     
         return 0;
     }
     
    -sub APPEND_imap {
    +sub APOP_pop3 {
         my ($args) = @_;
    +    my ($user, $secret) = split(/ /, $args, 2);
     
    -    logmsg "APPEND_imap got $args\r\n";
    -
    -    $args =~ /^([^ ]+) [^{]*\{(\d+)\}$/;
    -    my ($folder, $size) = ($1, $2);
    -    fix_imap_params($folder);
    +    if (!grep /^APOP$/, @capabilities) {
    +        sendcontrol "-ERR Unrecognized command\r\n";
    +    }
    +    elsif (($user eq "") || ($secret eq "")) {
    +        sendcontrol "-ERR Protocol error\r\n";
    +    }
    +    else {
    +        my $digest = Digest::MD5::md5_hex($POP3_TIMESTAMP, $TEXT_PASSWORD);
     
    -    sendcontrol "+ Ready for literal data\r\n";
    +        if (($user ne $TEXT_USERNAME) || ($secret ne $digest)) {
    +            sendcontrol "-ERR Login failure\r\n";
    +        }
    +        else {
    +            sendcontrol "+OK Login successful\r\n";
    +        }
    +    }
     
    -    my $testno = $folder;
    -    my $filename = "log/upload.$testno";
    +    return 0;
    +}
     
    -    logmsg "Store test number $testno in $filename\n";
    +sub AUTH_pop3 {
    +    if(!@auth_mechs) {
    +        sendcontrol "-ERR Unrecognized command\r\n";
    +    }
    +    else {
    +        my @data = ();
     
    -    open(FILE, ">$filename") ||
    -        return 0; # failed to open output
    +        # Calculate the AUTH response
    +        push @data, "+OK List of supported mechanisms follows\r\n";
     
    -    my $received = 0;
    -    my $line;
    -    while(5 == (sysread \*SFREAD, $line, 5)) {
    -        if($line eq "DATA\n") {
    -            sysread \*SFREAD, $line, 5;
    +        for my $am (@auth_mechs) {
    +            push @data, "$am\r\n";
    +        }
     
    -            my $chunksize = 0;
    -            if($line =~ /^([0-9a-fA-F]{4})\n/) {
    -                $chunksize = hex($1);
    -            }
    +        # Send the AUTH response
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
     
    -            read_mainsockf(\$line, $chunksize);
    +        # End with the magic 3-byte end of listing marker
    +        sendcontrol ".\r\n";
    +    }
     
    -            my $left = $size - $received;
    -            my $datasize = ($left > $chunksize) ? $chunksize : $left;
    +    return 0;
    +}
     
    -            if($datasize > 0) {
    -                logmsg "> Appending $datasize bytes to file\n";
    -                print FILE substr($line, 0, $datasize) if(!$nosave);
    -                $line = substr($line, $datasize);
    +sub USER_pop3 {
    +    my ($user) = @_;
     
    -                $received += $datasize;
    -                if($received == $size) {
    -                    logmsg "Received all data, waiting for final CRLF.\n";
    -                }
    -            }
    +    logmsg "USER_pop3 got $user\n";
     
    -            if($received == $size && $line eq "\r\n") {
    -                last;
    -            }
    -        }
    -        elsif($line eq "DISC\n") {
    -            logmsg "Unexpected disconnect!\n";
    -            last;
    -        }
    -        else {
    -            logmsg "No support for: $line";
    -            last;
    -        }
    +    if (!$user) {
    +        sendcontrol "-ERR Protocol error\r\n";
         }
    +    else {
    +        $username = $user;
     
    -    if($nosave) {
    -        print FILE "$size bytes would've been stored here\n";
    +        sendcontrol "+OK\r\n";
         }
    -    close(FILE);
    -
    -    logmsg "received $size bytes upload\n";
    -
    -    sendcontrol "$cmdid OK APPEND completed\r\n";
     
         return 0;
     }
     
    -sub STORE_imap {
    -    my ($args) = @_;
    -    my ($uid, $what) = split(/ /, $args, 2);
    -    fix_imap_params($uid);
    +sub PASS_pop3 {
    +    my ($password) = @_;
     
    -    logmsg "STORE_imap got $args\n";
    +    logmsg "PASS_pop3 got $password\n";
     
    -    sendcontrol "* $uid FETCH (FLAGS (\\Seen \\Deleted))\r\n";
    -    sendcontrol "$cmdid OK STORE completed\r\n";
    +    if (($username ne $TEXT_USERNAME) || ($password ne $TEXT_PASSWORD)) {
    +        sendcontrol "-ERR Login failure\r\n";
    +    }
    +    else {
    +        sendcontrol "+OK Login successful\r\n";
    +    }
     
         return 0;
     }
     
    -sub LIST_imap {
    -    my ($args) = @_;
    -    my ($reference, $mailbox) = split(/ /, $args, 2);
    +sub RETR_pop3 {
    +    my ($msgid) = @_;
         my @data;
    -    fix_imap_params($reference, $mailbox);
    -
    -    logmsg "LIST_imap got $args\n";
     
    -    if ($reference eq "verifiedserver") {
    -         # this is the secret command that verifies that this actually is
    -         # the curl test server
    -         @data = ("* LIST () \"/\" \"WE ROOLZ: $$\"\r\n");
    -         if($verbose) {
    -             print STDERR "FTPD: We returned proof we are the test server\n";
    -         }
    -         logmsg "return proof we are we\n";
    +    if($msgid =~ /^verifiedserver$/) {
    +        # this is the secret command that verifies that this actually is
    +        # the curl test server
    +        my $response = "WE ROOLZ: $$\r\n";
    +        if($verbose) {
    +            print STDERR "FTPD: We returned proof we are the test server\n";
    +        }
    +        $data[0] = $response;
    +        logmsg "return proof we are we\n";
         }
         else {
    -        my $testno = $reference;
    -        $testno =~ s/^([^0-9]*)//;
    -        my $testpart = "";
    -        if ($testno > 10000) {
    -            $testpart = $testno % 10000;
    -            $testno = int($testno / 10000);
    -        }
    -    
    -        loadtest("$srcdir/data/test$testno");
    +        # send mail content
    +        logmsg "retrieve a mail\n";
     
    -        @data = getpart("reply", "data$testpart");
    +        @data = getreplydata($msgid);
         }
     
    +    sendcontrol "+OK Mail transfer starts\r\n";
    +
         for my $d (@data) {
             sendcontrol $d;
         }
     
    -    sendcontrol "$cmdid OK LIST Completed\r\n";
    +    # end with the magic 3-byte end of mail marker, assumes that the
    +    # mail body ends with a CRLF!
    +    sendcontrol ".\r\n";
     
         return 0;
     }
     
    -sub EXAMINE_imap {
    -    my ($testno) = @_;
    -    fix_imap_params($testno);
    +sub LIST_pop3 {
    +    # This is a built-in fake-message list
    +    my @data = (
    +        "1 100\r\n",
    +        "2 4294967400\r\n",	# > 4 GB
    +        "3 200\r\n",
    +    );
    +
    +    logmsg "retrieve a message list\n";
    +
    +    sendcontrol "+OK Listing starts\r\n";
     
    -    logmsg "EXAMINE_imap got test $testno\n";
    +    for my $d (@data) {
    +        sendcontrol $d;
    +    }
     
    -    # Example from RFC 3501, 6.3.2. EXAMINE Command
    -    sendcontrol "* 17 EXISTS\r\n";
    -    sendcontrol "* 2 RECENT\r\n";
    -    sendcontrol "* OK [UNSEEN 8] Message 8 is first unseen\r\n";
    -    sendcontrol "* OK [UIDVALIDITY 3857529045] UIDs valid\r\n";
    -    sendcontrol "* OK [UIDNEXT 4392] Predicted next UID\r\n";
    -    sendcontrol "* FLAGS (\\Answered \\Flagged \\Deleted \\Seen \\Draft)\r\n";
    -    sendcontrol "* OK [PERMANENTFLAGS ()] No permanent flags permitted\r\n";
    -    sendcontrol "$cmdid OK [READ-ONLY] EXAMINE completed\r\n";
    +    # End with the magic 3-byte end of listing marker
    +    sendcontrol ".\r\n";
     
         return 0;
     }
     
    -sub STATUS_imap {
    -    my ($testno) = @_;
    -    fix_imap_params($testno);
    +sub DELE_pop3 {
    +    my ($msgid) = @_;
     
    -    logmsg "STATUS_imap got test $testno\n";
    +    logmsg "DELE_pop3 got $msgid\n";
     
    -    $testno =~ s/[^0-9]//g;
    -    my $testpart = "";
    -    if ($testno > 10000) {
    -        $testpart = $testno % 10000;
    -        $testno = int($testno / 10000);
    +    if (!$msgid) {
    +        sendcontrol "-ERR Protocol error\r\n";
         }
    +    else {
    +        push (@deleted, $msgid);
     
    -    loadtest("$srcdir/data/test$testno");
    -
    -    my @data = getpart("reply", "data$testpart");
    -
    -    for my $d (@data) {
    -        sendcontrol $d;
    +        sendcontrol "+OK\r\n";
         }
     
    -    sendcontrol "$cmdid OK STATUS completed\r\n";
    -
         return 0;
     }
     
    -sub LOGOUT_imap {
    -    sendcontrol "* BYE cURL IMAP server signing off\r\n";
    -    sendcontrol "$cmdid OK LOGOUT completed\r\n";
    +sub STAT_pop3 {
    +    my ($args) = @_;
    +
    +    if ($args) {
    +        sendcontrol "-ERR Protocol error\r\n";
    +    }
    +    else {
    +        # Send statistics for the built-in fake message list as
    +        # detailed in the LIST_pop3 function above
    +        sendcontrol "+OK 3 4294967800\r\n";
    +    }
     
         return 0;
     }
     
    -################
    -################ POP3 commands
    -################
    -
    -sub CAPA_pop3 {
    -    my ($testno) = @_;
    -    my @data = ();
    +sub NOOP_pop3 {
    +    my ($args) = @_;
     
    -    if(!$support_capa) {
    -        push @data, "-ERR Unsupported command: 'CAPA'\r\n";
    +    if ($args) {
    +        sendcontrol "-ERR Protocol error\r\n";
         }
         else {
    -        push @data, "+OK List of capabilities follows\r\n";
    -        push @data, "USER\r\n";
    -        if($support_auth) {
    -            push @data, "SASL UNKNOWN\r\n";
    -        }
    -        push @data, "IMPLEMENTATION POP3 pingpong test server\r\n";
    -        push @data, ".\r\n";
    -    }
    -
    -    for my $d (@data) {
    -        sendcontrol $d;
    +        sendcontrol "+OK\r\n";
         }
     
         return 0;
     }
     
    -sub AUTH_pop3 {
    -    my ($testno) = @_;
    -    my @data = ();
    +sub UIDL_pop3 {
    +    # This is a built-in fake-message UID list
    +    my @data = (
    +        "1 1\r\n",
    +        "2 2\r\n",
    +        "3 4\r\n", # Note that UID 3 is a simulated "deleted" message
    +    );
     
    -    if(!$support_auth) {
    -        push @data, "-ERR Unsupported command: 'AUTH'\r\n";
    +    if (!grep /^UIDL$/, @capabilities) {
    +        sendcontrol "-ERR Unrecognized command\r\n";
         }
         else {
    -        push @data, "+OK List of supported mechanisms follows\r\n";
    -        push @data, "UNKNOWN\r\n";
    -        push @data, ".\r\n";
    -    }
    +        logmsg "retrieve a message UID list\n";
     
    -    for my $d (@data) {
    -        sendcontrol $d;
    +        sendcontrol "+OK Listing starts\r\n";
    +
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
    +
    +        # End with the magic 3-byte end of listing marker
    +        sendcontrol ".\r\n";
         }
     
         return 0;
     }
     
    -sub RETR_pop3 {
    -     my ($testno) = @_;
    -     my @data;
    -
    -     if($testno =~ /^verifiedserver$/) {
    -         # this is the secret command that verifies that this actually is
    -         # the curl test server
    -         my $response = "WE ROOLZ: $$\r\n";
    -         if($verbose) {
    -             print STDERR "FTPD: We returned proof we are the test server\n";
    -         }
    -         $data[0] = $response;
    -         logmsg "return proof we are we\n";
    -     }
    -     else {
    -         logmsg "retrieve a mail\n";
    +sub TOP_pop3 {
    +    my ($args) = @_;
    +    my ($msgid, $lines) = split(/ /, $args, 2);
     
    -         $testno =~ s/^([^0-9]*)//;
    -         my $testpart = "";
    -         if ($testno > 10000) {
    -             $testpart = $testno % 10000;
    -             $testno = int($testno / 10000);
    -         }
    +    logmsg "TOP_pop3 got $args\n";
     
    -         # send mail content
    -         loadtest("$srcdir/data/test$testno");
    +    if (!grep /^TOP$/, @capabilities) {
    +        sendcontrol "-ERR Unrecognized command\r\n";
    +    }
    +    elsif (($msgid eq "") || ($lines eq "")) {
    +        sendcontrol "-ERR Protocol error\r\n";
    +    }
    +    else {
    +        if ($lines == "0") {
    +            logmsg "retrieve header of mail\n";
    +        }
    +        else {
    +            logmsg "retrieve top $lines lines of mail\n";
    +        }
     
    -         @data = getpart("reply", "data$testpart");
    -     }
    +        my @data = getreplydata($msgid);
     
    -     sendcontrol "+OK Mail transfer starts\r\n";
    +        sendcontrol "+OK Mail transfer starts\r\n";
     
    -     for my $d (@data) {
    -         sendcontrol $d;
    -     }
    +        # Send mail content
    +        for my $d (@data) {
    +            sendcontrol $d;
    +        }
     
    -     # end with the magic 3-byte end of mail marker, assumes that the
    -     # mail body ends with a CRLF!
    -     sendcontrol ".\r\n";
    +        # End with the magic 3-byte end of mail marker, assumes that the
    +        # mail body ends with a CRLF!
    +        sendcontrol ".\r\n";
    +    }
     
    -     return 0;
    +    return 0;
     }
     
    -sub LIST_pop3 {
    +sub RSET_pop3 {
    +    my ($args) = @_;
    +
    +    if ($args) {
    +        sendcontrol "-ERR Protocol error\r\n";
    +    }
    +    else {
    +        if (@deleted) {
    +            logmsg "resetting @deleted message(s)\n";
    +
    +            @deleted = ();
    +        }
     
    -# this is a built-in fake-message list
    -my @pop3list=(
    -"1 100\r\n",
    -"2 4294967400\r\n",	# > 4 GB
    -"4 200\r\n", # Note that message 3 is a simulated "deleted" message
    -);
    +        sendcontrol "+OK\r\n";
    +    }
     
    -     logmsg "retrieve a message list\n";
    +    return 0;
    +}
     
    -     sendcontrol "+OK Listing starts\r\n";
    +sub QUIT_pop3 {
    +    if(@deleted) {
    +        logmsg "deleting @deleted message(s)\n";
     
    -     for my $d (@pop3list) {
    -         sendcontrol $d;
    -     }
    +        @deleted = ();
    +    }
     
    -     # end with the magic 3-byte end of listing marker
    -     sendcontrol ".\r\n";
    +    sendcontrol "+OK cURL POP3 server signing off\r\n";
     
    -     return 0;
    +    return 0;
     }
     
     ################
    @@ -1187,7 +1981,10 @@ sub switch_directory_goto {
     sub switch_directory {
         my $target_dir = $_[0];
     
    -    if($target_dir eq "/") {
    +    if($target_dir =~ /^test-(\d+)/) {
    +        $cwd_testno = $1;
    +    }
    +    elsif($target_dir eq "/") {
             $ftptargetdir = "/";
         }
         else {
    @@ -1220,7 +2017,7 @@ sub PWD_ftp {
     }
     
     sub LIST_ftp {
    -  #  print "150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0 bytes)\r\n";
    +    #  print "150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0 bytes)\r\n";
     
     # this is a built-in fake-dir ;-)
     my @ftpdir=("total 20\r\n",
    @@ -1259,8 +2056,26 @@ my @ftpdir=("total 20\r\n",
         }
     
         logmsg "pass LIST data on data connection\n";
    -    for(@ftpdir) {
    -        senddata $_;
    +
    +    if($cwd_testno) {
    +        loadtest("$srcdir/data/test$cwd_testno");
    +
    +        my @data = getpart("reply", "data");
    +        for(@data) {
    +            my $send = $_;
    +            # convert all \n to \r\n for ASCII transfer
    +            $send =~ s/\r\n/\n/g;
    +            $send =~ s/\n/\r\n/g;
    +            logmsg "send $send as data\n";
    +            senddata $send;
    +        }
    +        $cwd_testno = 0; # forget it again
    +    }
    +    else {
    +        # old hard-coded style
    +        for(@ftpdir) {
    +            senddata $_;
    +        }
         }
         close_dataconn(0);
         sendcontrol "226 ASCII transfer complete\r\n";
    @@ -1932,9 +2747,10 @@ sub customize {
         $nodataconn425 = 0; # default is to not send 425 without data channel
         $nodataconn421 = 0; # default is to not send 421 without data channel
         $nodataconn150 = 0; # default is to not send 150 without data channel
    -    $support_capa = 0;  # default is to not support capability command
    -    $support_auth = 0;  # default is to not support authentication command
    -    %customreply = ();  #
    +    @capabilities = (); # default is to not support capability commands
    +    @auth_mechs = ();   # default is to not support authentication commands
    +    %fulltextreply = ();#
    +    %commandreply = (); #
         %customcount = ();  #
         %delayreply = ();   #
     
    @@ -1944,15 +2760,24 @@ sub customize {
         logmsg "FTPD: Getting commands from log/ftpserver.cmd\n";
     
         while() {
    -        if($_ =~ /REPLY ([A-Za-z0-9+\/=]+) (.*)/) {
    -            $customreply{$1}=eval "qq{$2}";
    +        if($_ =~ /REPLY \"([A-Z]+ [A-Za-z0-9+-\/=\*. ]+)\" (.*)/) {
    +            $fulltextreply{$1}=eval "qq{$2}";
                 logmsg "FTPD: set custom reply for $1\n";
             }
    +        elsif($_ =~ /REPLY ([A-Za-z0-9+\/=\*]*) (.*)/) {
    +            $commandreply{$1}=eval "qq{$2}";
    +            if($1 eq "") {
    +                logmsg "FTPD: set custom reply for empty command\n";
    +            }
    +            else {
    +                logmsg "FTPD: set custom reply for $1 command\n";
    +            }
    +        }
             elsif($_ =~ /COUNT ([A-Z]+) (.*)/) {
    -            # we blank the customreply for this command when having
    +            # we blank the custom reply for this command when having
                 # been used this number of times
                 $customcount{$1}=$2;
    -            logmsg "FTPD: blank custom reply for $1 after $2 uses\n";
    +            logmsg "FTPD: blank custom reply for $1 command after $2 uses\n";
             }
             elsif($_ =~ /DELAY ([A-Z]+) (\d*)/) {
                 $delayreply{$1}=$2;
    @@ -1998,13 +2823,16 @@ sub customize {
                 logmsg "FTPD: instructed to use NODATACONN\n";
                 $nodataconn=1;
             }
    -        elsif($_ =~ /SUPPORTCAPA/) {
    +        elsif($_ =~ /CAPA (.*)/) {
                 logmsg "FTPD: instructed to support CAPABILITY command\n";
    -            $support_capa=1;
    +            @capabilities = split(/ (?!(?:[^" ]|[^"] [^"])+")/, $1);
    +            foreach (@capabilities) {
    +                $_ = $1 if /^"(.*)"$/;
    +            }
             }
    -        elsif($_ =~ /SUPPORTAUTH/) {
    +        elsif($_ =~ /AUTH (.*)/) {
                 logmsg "FTPD: instructed to support AUTHENTICATION command\n";
    -            $support_auth=1;
    +            @auth_mechs = split(/ /, $1);
             }
             elsif($_ =~ /NOSAVE/) {
                 # don't actually store the file we upload - to be used when
    @@ -2186,13 +3014,13 @@ while(1) {
     
         &customize(); # read test control instructions
     
    -    my $welcome = $customreply{"welcome"};
    +    my $welcome = $commandreply{"welcome"};
         if(!$welcome) {
             $welcome = $displaytext{"welcome"};
         }
         else {
             # clear it after use
    -        $customreply{"welcome"}="";
    +        $commandreply{"welcome"}="";
             if($welcome !~ /\r\n\z/) {
                 $welcome .= "\r\n";
             }
    @@ -2256,26 +3084,67 @@ while(1) {
             my $FTPARG;
             if($proto eq "imap") {
                 # IMAP is different with its identifier first on the command line
    -            unless(($full =~ /^([^ ]+) ([^ ]+) (.*)/) ||
    -                   ($full =~ /^([^ ]+) ([^ ]+)/)) {
    -                sendcontrol "$1 '$full': command not understood.\r\n";
    +            if(($full =~ /^([^ ]+) ([^ ]+) (.*)/) ||
    +               ($full =~ /^([^ ]+) ([^ ]+)/)) {
    +                $cmdid=$1; # set the global variable
    +                $FTPCMD=$2;
    +                $FTPARG=$3;
    +            }
    +            # IMAP authentication cancellation
    +            elsif($full =~ /^\*$/) {
    +                # Command id has already been set
    +                $FTPCMD="*";
    +                $FTPARG="";
    +            }
    +            # IMAP long "commands" are base64 authentication data
    +            elsif($full =~ /^[A-Z0-9+\/]*={0,2}$/i) {
    +                # Command id has already been set
    +                $FTPCMD=$full;
    +                $FTPARG="";
    +            }
    +            else {
    +                sendcontrol "$full BAD Command\r\n";
                     last;
                 }
    -            $cmdid=$1; # set the global variable
    -            $FTPCMD=$2;
    -            $FTPARG=$3;
             }
             elsif($full =~ /^([A-Z]{3,4})(\s(.*))?$/i) {
                 $FTPCMD=$1;
                 $FTPARG=$3;
             }
    -        elsif(($proto eq "smtp") && ($full =~ /^[A-Z0-9+\/]{0,512}={0,2}$/i)) {
    -            # SMTP long "commands" are base64 authentication data.
    -            $FTPCMD=$full;
    -            $FTPARG="";
    +        elsif($proto eq "pop3") {
    +            # POP3 authentication cancellation
    +            if($full =~ /^\*$/) {
    +                $FTPCMD="*";
    +                $FTPARG="";
    +            }
    +            # POP3 long "commands" are base64 authentication data
    +            elsif($full =~ /^[A-Z0-9+\/]*={0,2}$/i) {
    +                $FTPCMD=$full;
    +                $FTPARG="";
    +            }
    +            else {
    +                sendcontrol "-ERR Unrecognized command\r\n";
    +                last;
    +            }
    +        }
    +        elsif($proto eq "smtp") {
    +            # SMTP authentication cancellation
    +            if($full =~ /^\*$/) {
    +                $FTPCMD="*";
    +                $FTPARG="";
    +            }
    +            # SMTP long "commands" are base64 authentication data
    +            elsif($full =~ /^[A-Z0-9+\/]{0,512}={0,2}$/i) {
    +                $FTPCMD=$full;
    +                $FTPARG="";
    +            }
    +            else {
    +                sendcontrol "500 Unrecognized command\r\n";
    +                last;
    +            }
             }
             else {
    -            sendcontrol "500 '$full': command not understood.\r\n";
    +            sendcontrol "500 Unrecognized command\r\n";
                 last;
             }
     
    @@ -2297,38 +3166,47 @@ while(1) {
                 }
             }
     
    -        my $text;
    -        $text = $customreply{$FTPCMD};
    -        my $fake = $text;
    +        my $check = 1; # no response yet
     
    +        # See if there is a custom reply for the full text
    +        my $fulltext = $FTPARG ? $FTPCMD . " " . $FTPARG : $FTPCMD;
    +        my $text = $fulltextreply{$fulltext};
             if($text && ($text ne "")) {
    -            if($customcount{$FTPCMD} && (!--$customcount{$FTPCMD})) {
    -                # used enough number of times, now blank the customreply
    -                $customreply{$FTPCMD}="";
    -            }
    +            sendcontrol "$text\r\n";
    +            $check = 0;
             }
             else {
    -            $text = $displaytext{$FTPCMD};
    -        }
    -        my $check;
    -        if($text && ($text ne "")) {
    -            if($cmdid && ($cmdid ne "")) {
    -                sendcontrol "$cmdid$text\r\n";
    -            }
    -            else {
    +            # See if there is a custom reply for the command
    +            $text = $commandreply{$FTPCMD};
    +            if($text && ($text ne "")) {
    +                if($customcount{$FTPCMD} && (!--$customcount{$FTPCMD})) {
    +                    # used enough times so blank the custom command reply
    +                    $commandreply{$FTPCMD}="";
    +                }
    +
                     sendcontrol "$text\r\n";
    +                $check = 0;
                 }
    -        }
    -        else {
    -            $check=1; # no response yet
    -        }
    +            else {
    +                # See if there is any display text for the command
    +                $text = $displaytext{$FTPCMD};
    +                if($text && ($text ne "")) {
    +                    if($proto eq 'imap') {
    +                        sendcontrol "$cmdid $text\r\n";
    +                    }
    +                    else {
    +                        sendcontrol "$text\r\n";
    +                    }
    +
    +                    $check = 0;
    +                }
     
    -        unless($fake && ($fake ne "")) {
    -            # only perform this if we're not faking a reply
    -            my $func = $commandfunc{$FTPCMD};
    -            if($func) {
    -                &$func($FTPARG, $FTPCMD);
    -                $check=0; # taken care of
    +                # only perform this if we're not faking a reply
    +                my $func = $commandfunc{$FTPCMD};
    +                if($func) {
    +                    &$func($FTPARG, $FTPCMD);
    +                    $check = 0;
    +                }
                 }
             }
     
    diff --git a/tests/getpart.pm b/tests/getpart.pm
    index 92a2378..0729cf4 100644
    --- a/tests/getpart.pm
    +++ b/tests/getpart.pm
    @@ -239,7 +239,7 @@ sub writearray {
     }
     
     #
    -# Load a specified file an return it as an array
    +# Load a specified file and return it as an array
     #
     sub loadarray {
         my ($filename)=@_;
    @@ -264,13 +264,21 @@ sub showdiff {
     
         open(TEMP, ">$file1");
         for(@$firstref) {
    -        print TEMP $_;
    +        my $l = $_;
    +        $l =~ s/\r/[CR]/g;
    +        $l =~ s/\n/[LF]/g;
    +        print TEMP $l;
    +        print TEMP "\n";
         }
         close(TEMP);
     
         open(TEMP, ">$file2");
         for(@$secondref) {
    -        print TEMP $_;
    +        my $l = $_;
    +        $l =~ s/\r/[CR]/g;
    +        $l =~ s/\n/[LF]/g;
    +        print TEMP $l;
    +        print TEMP "\n";
         }
         close(TEMP);
         my @out = `diff -u $file2 $file1 2>/dev/null`;
    diff --git a/tests/http_pipe.py b/tests/http_pipe.py
    index 67185be..19ebec7 100755
    --- a/tests/http_pipe.py
    +++ b/tests/http_pipe.py
    @@ -17,7 +17,10 @@
     # Modified by Linus Nielsen Feltzing for inclusion in the libcurl test
     # framework
     #
    -import SocketServer
    +try:
    +    import socketserver
    +except:
    +    import SocketServer as socketserver
     import argparse
     import re
     import select
    @@ -251,24 +254,21 @@ class ResponseBuilder(object):
             self._processed_end = True
     
           elif path == '/1k.txt':
    -        str = '0123456789abcdef'
    -        body = ''.join([str for num in xrange(64)])
    +        body = '0123456789abcdef' * 64
             result += self._BuildResponse(
                 '200 OK', ['Server: Apache',
                            'Content-Length: 1024',
                            'Cache-Control: max-age=60'], body)
     
           elif path == '/10k.txt':
    -        str = '0123456789abcdef'
    -        body = ''.join([str for num in xrange(640)])
    +        body = '0123456789abcdef' * 640
             result += self._BuildResponse(
                 '200 OK', ['Server: Apache',
                            'Content-Length: 10240',
                            'Cache-Control: max-age=60'], body)
     
           elif path == '/100k.txt':
    -        str = '0123456789abcdef'
    -        body = ''.join([str for num in xrange(6400)])
    +        body = '0123456789abcdef' * 6400
             result += self._BuildResponse(
                 '200 OK',
                 ['Server: Apache',
    @@ -277,9 +277,7 @@ class ResponseBuilder(object):
                 body)
     
           elif path == '/100k_chunked.txt':
    -        str = '0123456789abcdef'
    -        moo = ''.join([str for num in xrange(6400)])
    -        body = self.Chunkify(moo, 20480)
    +        body = self.Chunkify('0123456789abcdef' * 6400, 20480)
             body.append('0\r\n\r\n')
             body = ''.join(body)
     
    @@ -337,7 +335,7 @@ class ResponseBuilder(object):
                 '%s' % (status, '\r\n'.join(headers), body))
     
     
    -class PipelineRequestHandler(SocketServer.BaseRequestHandler):
    +class PipelineRequestHandler(socketserver.BaseRequestHandler):
       """Called on an incoming TCP connection."""
     
       def _GetTimeUntilTimeout(self):
    @@ -357,22 +355,19 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
         self._send_buffer = ""
         self._start_time = time.time()
         try:
    -      poller = select.epoll(sizehint=1)
    -      poller.register(self.request.fileno(), select.EPOLLIN)
           while not self._response_builder.processed_end or self._send_buffer:
     
             time_left = self._GetTimeUntilTimeout()
             time_until_next_send = self._GetTimeUntilNextSend()
             max_poll_time = min(time_left, time_until_next_send) + MIN_POLL_TIME
     
    -        events = None
    +        rlist, wlist, xlist = [], [], []
    +        fileno = self.request.fileno()
             if max_poll_time > 0:
    +          rlist.append(fileno)
               if self._send_buffer:
    -            poller.modify(self.request.fileno(),
    -                          select.EPOLLIN | select.EPOLLOUT)
    -          else:
    -            poller.modify(self.request.fileno(), select.EPOLLIN)
    -          events = poller.poll(timeout=max_poll_time)
    +            wlist.append(fileno)
    +          rlist, wlist, xlist = select.select(rlist, wlist, xlist, max_poll_time)
     
             if self._GetTimeUntilTimeout() <= 0:
               return
    @@ -382,22 +377,21 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
               self._num_written = self._num_queued
               self._last_queued_time = 0
     
    -        for fd, mode in events:
    -          if mode & select.EPOLLIN:
    -            new_data = self.request.recv(MAX_REQUEST_SIZE, socket.MSG_DONTWAIT)
    -            if not new_data:
    -              return
    -            new_requests = self._request_parser.ParseAdditionalData(new_data)
    -            self._response_builder.QueueRequests(
    -                new_requests, self._request_parser.were_all_requests_http_1_1)
    -            self._num_queued += len(new_requests)
    -            self._last_queued_time = time.time()
    -          elif mode & select.EPOLLOUT:
    -            num_bytes_sent = self.request.send(self._send_buffer[0:4096])
    -            self._send_buffer = self._send_buffer[num_bytes_sent:]
    -            time.sleep(0.05)
    -          else:
    +        if fileno in rlist:
    +          self.request.setblocking(False)
    +          new_data = self.request.recv(MAX_REQUEST_SIZE)
    +          self.request.setblocking(True)
    +          if not new_data:
                 return
    +          new_requests = self._request_parser.ParseAdditionalData(new_data)
    +          self._response_builder.QueueRequests(
    +              new_requests, self._request_parser.were_all_requests_http_1_1)
    +          self._num_queued += len(new_requests)
    +          self._last_queued_time = time.time()
    +        elif fileno in wlist:
    +          num_bytes_sent = self.request.send(self._send_buffer[0:4096])
    +          self._send_buffer = self._send_buffer[num_bytes_sent:]
    +          time.sleep(0.05)
     
         except RequestTooLargeError as e:
           self.request.send(self._response_builder.WriteError(
    @@ -411,11 +405,11 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
           self.request.send(self._response_builder.WriteError(
               '200 OK', INFO_MESSAGE))
         except Exception as e:
    -      print e
    +      print(e)
         self.request.close()
     
     
    -class PipelineServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
    +class PipelineServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
       pass
     
     
    diff --git a/tests/httpserver.pl b/tests/httpserver.pl
    index a38c3ce..b60dadc 100755
    --- a/tests/httpserver.pl
    +++ b/tests/httpserver.pl
    @@ -36,6 +36,7 @@ use serverhelp qw(
     
     my $verbose = 0;     # set to 1 for debugging
     my $port = 8990;     # just a default
    +my $unix_socket;     # location to place a listening Unix socket
     my $ipvnum = 4;      # default IP version of http server
     my $idnum = 1;       # dafault http server instance number
     my $proto = 'http';  # protocol the http server speaks
    @@ -74,6 +75,13 @@ while(@ARGV) {
         elsif($ARGV[0] eq '--ipv6') {
             $ipvnum = 6;
         }
    +    elsif($ARGV[0] eq '--unix-socket') {
    +        $ipvnum = 'unix';
    +        if($ARGV[1]) {
    +            $unix_socket = $ARGV[1];
    +            shift @ARGV;
    +        }
    +    }
         elsif($ARGV[0] eq '--gopher') {
             $gopher = 1;
         }
    @@ -117,7 +125,12 @@ if(!$logfile) {
     $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
     $flags .= "--gopher " if($gopher);
     $flags .= "--connect $connect " if($connect);
    -$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
    +if($ipvnum eq 'unix') {
    +    $flags .= "--unix-socket '$unix_socket' ";
    +} else {
    +    $flags .= "--ipv$ipvnum --port $port ";
    +}
    +$flags .= "--srcdir \"$srcdir\"";
     
     if($verbose) {
         print STDERR "RUN: server/sws $flags\n";
    diff --git a/tests/libtest/Makefile.in b/tests/libtest/Makefile.in
    index b14ca78..bc276f5 100644
    --- a/tests/libtest/Makefile.in
    +++ b/tests/libtest/Makefile.in
    @@ -1,4 +1,4 @@
    -# Makefile.in generated by automake 1.13.3 from Makefile.am.
    +# Makefile.in generated by automake 1.14.1 from Makefile.am.
     # @configure_input@
     
     # Copyright (C) 1994-2013 Free Software Foundation, Inc.
    @@ -113,7 +113,10 @@ noinst_PROGRAMS = chkhostname$(EXEEXT) libauthretry$(EXEEXT) \
     	lib1503$(EXEEXT) lib1504$(EXEEXT) lib1505$(EXEEXT) \
     	lib1506$(EXEEXT) lib1507$(EXEEXT) lib1508$(EXEEXT) \
     	lib1509$(EXEEXT) lib1510$(EXEEXT) lib1511$(EXEEXT) \
    -	lib1512$(EXEEXT) lib1900$(EXEEXT) lib2033$(EXEEXT)
    +	lib1512$(EXEEXT) lib1513$(EXEEXT) lib1514$(EXEEXT) \
    +	lib1515$(EXEEXT) lib1520$(EXEEXT) lib1525$(EXEEXT) \
    +	lib1526$(EXEEXT) lib1527$(EXEEXT) lib1528$(EXEEXT) \
    +	lib1529$(EXEEXT) lib1900$(EXEEXT) lib2033$(EXEEXT)
     @USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_1 = -DCURL_STATICLIB
     @CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_2 = -no-undefined
     @CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_3 = -mimpure-text
    @@ -158,8 +161,9 @@ libhostname_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
     	$(LDFLAGS) -o $@
     @BUILD_LIBHOSTNAME_TRUE@am_libhostname_la_rpath =
     PROGRAMS = $(noinst_PROGRAMS)
    +am__dirstamp = $(am__leading_dot)dirstamp
     am_chkhostname_OBJECTS = chkhostname-chkhostname.$(OBJEXT) \
    -	chkhostname-curl_gethostname.$(OBJEXT)
    +	../../lib/chkhostname-curl_gethostname.$(OBJEXT)
     chkhostname_OBJECTS = $(am_chkhostname_OBJECTS)
     am__objects_1 = lib1500-first.$(OBJEXT)
     am__objects_2 = lib1500-testutil.$(OBJEXT)
    @@ -173,553 +177,616 @@ lib1500_OBJECTS = $(am_lib1500_OBJECTS)
     lib1500_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_3 = lib1501-first.$(OBJEXT)
     am__objects_4 = lib1501-testutil.$(OBJEXT)
    -am__objects_5 = lib1501-warnless.$(OBJEXT)
    +am__objects_5 = ../../lib/lib1501-warnless.$(OBJEXT)
     am_lib1501_OBJECTS = lib1501-lib1501.$(OBJEXT) $(am__objects_3) \
     	$(am__objects_4) $(am__objects_5)
     lib1501_OBJECTS = $(am_lib1501_OBJECTS)
     lib1501_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_6 = lib1502-first.$(OBJEXT)
     am__objects_7 = lib1502-testutil.$(OBJEXT)
    -am__objects_8 = lib1502-warnless.$(OBJEXT)
    +am__objects_8 = ../../lib/lib1502-warnless.$(OBJEXT)
     am_lib1502_OBJECTS = lib1502-lib1502.$(OBJEXT) $(am__objects_6) \
     	$(am__objects_7) $(am__objects_8)
     lib1502_OBJECTS = $(am_lib1502_OBJECTS)
     lib1502_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_9 = lib1503-first.$(OBJEXT)
     am__objects_10 = lib1503-testutil.$(OBJEXT)
    -am__objects_11 = lib1503-warnless.$(OBJEXT)
    +am__objects_11 = ../../lib/lib1503-warnless.$(OBJEXT)
     am_lib1503_OBJECTS = lib1503-lib1502.$(OBJEXT) $(am__objects_9) \
     	$(am__objects_10) $(am__objects_11)
     lib1503_OBJECTS = $(am_lib1503_OBJECTS)
     lib1503_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_12 = lib1504-first.$(OBJEXT)
     am__objects_13 = lib1504-testutil.$(OBJEXT)
    -am__objects_14 = lib1504-warnless.$(OBJEXT)
    +am__objects_14 = ../../lib/lib1504-warnless.$(OBJEXT)
     am_lib1504_OBJECTS = lib1504-lib1502.$(OBJEXT) $(am__objects_12) \
     	$(am__objects_13) $(am__objects_14)
     lib1504_OBJECTS = $(am_lib1504_OBJECTS)
     lib1504_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_15 = lib1505-first.$(OBJEXT)
     am__objects_16 = lib1505-testutil.$(OBJEXT)
    -am__objects_17 = lib1505-warnless.$(OBJEXT)
    +am__objects_17 = ../../lib/lib1505-warnless.$(OBJEXT)
     am_lib1505_OBJECTS = lib1505-lib1502.$(OBJEXT) $(am__objects_15) \
     	$(am__objects_16) $(am__objects_17)
     lib1505_OBJECTS = $(am_lib1505_OBJECTS)
     lib1505_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_18 = lib1506-first.$(OBJEXT)
     am__objects_19 = lib1506-testutil.$(OBJEXT)
    -am__objects_20 = lib1506-warnless.$(OBJEXT)
    +am__objects_20 = ../../lib/lib1506-warnless.$(OBJEXT)
     am_lib1506_OBJECTS = lib1506-lib1506.$(OBJEXT) $(am__objects_18) \
     	$(am__objects_19) $(am__objects_20)
     lib1506_OBJECTS = $(am_lib1506_OBJECTS)
     lib1506_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_21 = lib1507-first.$(OBJEXT)
     am__objects_22 = lib1507-testutil.$(OBJEXT)
    -am__objects_23 = lib1507-warnless.$(OBJEXT)
    +am__objects_23 = ../../lib/lib1507-warnless.$(OBJEXT)
     am_lib1507_OBJECTS = lib1507-lib1507.$(OBJEXT) $(am__objects_21) \
     	$(am__objects_22) $(am__objects_23)
     lib1507_OBJECTS = $(am_lib1507_OBJECTS)
     lib1507_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_24 = lib1508-first.$(OBJEXT)
     am__objects_25 = lib1508-testutil.$(OBJEXT)
    -am__objects_26 = lib1508-warnless.$(OBJEXT)
    +am__objects_26 = ../../lib/lib1508-warnless.$(OBJEXT)
     am_lib1508_OBJECTS = lib1508-lib1508.$(OBJEXT) $(am__objects_24) \
     	$(am__objects_25) $(am__objects_26)
     lib1508_OBJECTS = $(am_lib1508_OBJECTS)
     lib1508_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_27 = lib1509-first.$(OBJEXT)
     am__objects_28 = lib1509-testutil.$(OBJEXT)
    -am__objects_29 = lib1509-warnless.$(OBJEXT)
    +am__objects_29 = ../../lib/lib1509-warnless.$(OBJEXT)
     am_lib1509_OBJECTS = lib1509-lib1509.$(OBJEXT) $(am__objects_27) \
     	$(am__objects_28) $(am__objects_29)
     lib1509_OBJECTS = $(am_lib1509_OBJECTS)
     lib1509_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_30 = lib1510-first.$(OBJEXT)
     am__objects_31 = lib1510-testutil.$(OBJEXT)
    -am__objects_32 = lib1510-warnless.$(OBJEXT)
    +am__objects_32 = ../../lib/lib1510-warnless.$(OBJEXT)
     am_lib1510_OBJECTS = lib1510-lib1510.$(OBJEXT) $(am__objects_30) \
     	$(am__objects_31) $(am__objects_32)
     lib1510_OBJECTS = $(am_lib1510_OBJECTS)
     lib1510_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_33 = lib1511-first.$(OBJEXT)
     am__objects_34 = lib1511-testutil.$(OBJEXT)
    -am__objects_35 = lib1511-warnless.$(OBJEXT)
    +am__objects_35 = ../../lib/lib1511-warnless.$(OBJEXT)
     am_lib1511_OBJECTS = lib1511-lib1511.$(OBJEXT) $(am__objects_33) \
     	$(am__objects_34) $(am__objects_35)
     lib1511_OBJECTS = $(am_lib1511_OBJECTS)
     lib1511_DEPENDENCIES = $(am__DEPENDENCIES_1)
     am__objects_36 = lib1512-first.$(OBJEXT)
     am__objects_37 = lib1512-testutil.$(OBJEXT)
    -am__objects_38 = lib1512-warnless.$(OBJEXT)
    +am__objects_38 = ../../lib/lib1512-warnless.$(OBJEXT)
     am_lib1512_OBJECTS = lib1512-lib1512.$(OBJEXT) $(am__objects_36) \
     	$(am__objects_37) $(am__objects_38)
     lib1512_OBJECTS = $(am_lib1512_OBJECTS)
     lib1512_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_39 = lib1900-first.$(OBJEXT)
    -am__objects_40 = lib1900-testutil.$(OBJEXT)
    -am__objects_41 = lib1900-warnless.$(OBJEXT)
    -am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_39) \
    +am__objects_39 = lib1513-first.$(OBJEXT)
    +am__objects_40 = lib1513-testutil.$(OBJEXT)
    +am__objects_41 = ../../lib/lib1513-warnless.$(OBJEXT)
    +am_lib1513_OBJECTS = lib1513-lib1513.$(OBJEXT) $(am__objects_39) \
     	$(am__objects_40) $(am__objects_41)
    +lib1513_OBJECTS = $(am_lib1513_OBJECTS)
    +lib1513_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_42 = lib1514-first.$(OBJEXT)
    +am__objects_43 = lib1514-testutil.$(OBJEXT)
    +am__objects_44 = ../../lib/lib1514-warnless.$(OBJEXT)
    +am_lib1514_OBJECTS = lib1514-lib1514.$(OBJEXT) $(am__objects_42) \
    +	$(am__objects_43) $(am__objects_44)
    +lib1514_OBJECTS = $(am_lib1514_OBJECTS)
    +lib1514_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_45 = lib1515-first.$(OBJEXT)
    +am__objects_46 = lib1515-testutil.$(OBJEXT)
    +am__objects_47 = ../../lib/lib1515-warnless.$(OBJEXT)
    +am_lib1515_OBJECTS = lib1515-lib1515.$(OBJEXT) $(am__objects_45) \
    +	$(am__objects_46) $(am__objects_47)
    +lib1515_OBJECTS = $(am_lib1515_OBJECTS)
    +lib1515_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_48 = lib1520-first.$(OBJEXT)
    +am_lib1520_OBJECTS = lib1520-lib1520.$(OBJEXT) $(am__objects_48)
    +lib1520_OBJECTS = $(am_lib1520_OBJECTS)
    +lib1520_LDADD = $(LDADD)
    +lib1520_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_49 = lib1525-first.$(OBJEXT)
    +am__objects_50 = lib1525-testutil.$(OBJEXT)
    +am__objects_51 = ../../lib/lib1525-warnless.$(OBJEXT)
    +am_lib1525_OBJECTS = lib1525-lib1525.$(OBJEXT) $(am__objects_49) \
    +	$(am__objects_50) $(am__objects_51)
    +lib1525_OBJECTS = $(am_lib1525_OBJECTS)
    +lib1525_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_52 = lib1526-first.$(OBJEXT)
    +am__objects_53 = lib1526-testutil.$(OBJEXT)
    +am__objects_54 = ../../lib/lib1526-warnless.$(OBJEXT)
    +am_lib1526_OBJECTS = lib1526-lib1526.$(OBJEXT) $(am__objects_52) \
    +	$(am__objects_53) $(am__objects_54)
    +lib1526_OBJECTS = $(am_lib1526_OBJECTS)
    +lib1526_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_55 = lib1527-first.$(OBJEXT)
    +am__objects_56 = lib1527-testutil.$(OBJEXT)
    +am__objects_57 = ../../lib/lib1527-warnless.$(OBJEXT)
    +am_lib1527_OBJECTS = lib1527-lib1527.$(OBJEXT) $(am__objects_55) \
    +	$(am__objects_56) $(am__objects_57)
    +lib1527_OBJECTS = $(am_lib1527_OBJECTS)
    +lib1527_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_58 = lib1528-first.$(OBJEXT)
    +am__objects_59 = lib1528-testutil.$(OBJEXT)
    +am__objects_60 = ../../lib/lib1528-warnless.$(OBJEXT)
    +am_lib1528_OBJECTS = lib1528-lib1528.$(OBJEXT) $(am__objects_58) \
    +	$(am__objects_59) $(am__objects_60)
    +lib1528_OBJECTS = $(am_lib1528_OBJECTS)
    +lib1528_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_61 = lib1529-first.$(OBJEXT)
    +am__objects_62 = lib1529-testutil.$(OBJEXT)
    +am__objects_63 = ../../lib/lib1529-warnless.$(OBJEXT)
    +am_lib1529_OBJECTS = lib1529-lib1529.$(OBJEXT) $(am__objects_61) \
    +	$(am__objects_62) $(am__objects_63)
    +lib1529_OBJECTS = $(am_lib1529_OBJECTS)
    +lib1529_DEPENDENCIES = $(am__DEPENDENCIES_1)
    +am__objects_64 = lib1900-first.$(OBJEXT)
    +am__objects_65 = lib1900-testutil.$(OBJEXT)
    +am__objects_66 = ../../lib/lib1900-warnless.$(OBJEXT)
    +am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_64) \
    +	$(am__objects_65) $(am__objects_66)
     lib1900_OBJECTS = $(am_lib1900_OBJECTS)
     lib1900_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_42 = lib2033-first.$(OBJEXT)
    -am__objects_43 = lib2033-testutil.$(OBJEXT)
    -am__objects_44 = lib2033-warnless.$(OBJEXT)
    +am__objects_67 = lib2033-first.$(OBJEXT)
    +am__objects_68 = lib2033-testutil.$(OBJEXT)
    +am__objects_69 = ../../lib/lib2033-warnless.$(OBJEXT)
     am_lib2033_OBJECTS = lib2033-libntlmconnect.$(OBJEXT) \
    -	$(am__objects_42) $(am__objects_43) $(am__objects_44)
    +	$(am__objects_67) $(am__objects_68) $(am__objects_69)
     lib2033_OBJECTS = $(am_lib2033_OBJECTS)
     lib2033_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_45 = lib500-first.$(OBJEXT)
    -am__objects_46 = lib500-testutil.$(OBJEXT)
    -am__objects_47 = lib500-testtrace.$(OBJEXT)
    -am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_45) \
    -	$(am__objects_46) $(am__objects_47)
    +am__objects_70 = lib500-first.$(OBJEXT)
    +am__objects_71 = lib500-testutil.$(OBJEXT)
    +am__objects_72 = lib500-testtrace.$(OBJEXT)
    +am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_70) \
    +	$(am__objects_71) $(am__objects_72)
     lib500_OBJECTS = $(am_lib500_OBJECTS)
     lib500_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_48 = lib501-first.$(OBJEXT)
    -am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_48)
    +am__objects_73 = lib501-first.$(OBJEXT)
    +am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_73)
     lib501_OBJECTS = $(am_lib501_OBJECTS)
     lib501_LDADD = $(LDADD)
     lib501_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_49 = lib502-first.$(OBJEXT)
    -am__objects_50 = lib502-testutil.$(OBJEXT)
    -am__objects_51 = lib502-warnless.$(OBJEXT)
    -am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_49) \
    -	$(am__objects_50) $(am__objects_51)
    +am__objects_74 = lib502-first.$(OBJEXT)
    +am__objects_75 = lib502-testutil.$(OBJEXT)
    +am__objects_76 = ../../lib/lib502-warnless.$(OBJEXT)
    +am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_74) \
    +	$(am__objects_75) $(am__objects_76)
     lib502_OBJECTS = $(am_lib502_OBJECTS)
     lib502_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_52 = lib503-first.$(OBJEXT)
    -am__objects_53 = lib503-testutil.$(OBJEXT)
    -am__objects_54 = lib503-warnless.$(OBJEXT)
    -am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_52) \
    -	$(am__objects_53) $(am__objects_54)
    +am__objects_77 = lib503-first.$(OBJEXT)
    +am__objects_78 = lib503-testutil.$(OBJEXT)
    +am__objects_79 = ../../lib/lib503-warnless.$(OBJEXT)
    +am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_77) \
    +	$(am__objects_78) $(am__objects_79)
     lib503_OBJECTS = $(am_lib503_OBJECTS)
     lib503_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_55 = lib504-first.$(OBJEXT)
    -am__objects_56 = lib504-testutil.$(OBJEXT)
    -am__objects_57 = lib504-warnless.$(OBJEXT)
    -am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_55) \
    -	$(am__objects_56) $(am__objects_57)
    +am__objects_80 = lib504-first.$(OBJEXT)
    +am__objects_81 = lib504-testutil.$(OBJEXT)
    +am__objects_82 = ../../lib/lib504-warnless.$(OBJEXT)
    +am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_80) \
    +	$(am__objects_81) $(am__objects_82)
     lib504_OBJECTS = $(am_lib504_OBJECTS)
     lib504_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_58 = lib505-first.$(OBJEXT)
    -am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_58)
    +am__objects_83 = lib505-first.$(OBJEXT)
    +am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_83)
     lib505_OBJECTS = $(am_lib505_OBJECTS)
     lib505_LDADD = $(LDADD)
     lib505_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_59 = lib506-first.$(OBJEXT)
    -am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_59)
    +am__objects_84 = lib506-first.$(OBJEXT)
    +am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_84)
     lib506_OBJECTS = $(am_lib506_OBJECTS)
     lib506_LDADD = $(LDADD)
     lib506_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_60 = lib507-first.$(OBJEXT)
    -am__objects_61 = lib507-testutil.$(OBJEXT)
    -am__objects_62 = lib507-warnless.$(OBJEXT)
    -am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_60) \
    -	$(am__objects_61) $(am__objects_62)
    +am__objects_85 = lib507-first.$(OBJEXT)
    +am__objects_86 = lib507-testutil.$(OBJEXT)
    +am__objects_87 = ../../lib/lib507-warnless.$(OBJEXT)
    +am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_85) \
    +	$(am__objects_86) $(am__objects_87)
     lib507_OBJECTS = $(am_lib507_OBJECTS)
     lib507_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_63 = lib508-first.$(OBJEXT)
    -am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_63)
    +am__objects_88 = lib508-first.$(OBJEXT)
    +am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_88)
     lib508_OBJECTS = $(am_lib508_OBJECTS)
     lib508_LDADD = $(LDADD)
     lib508_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_64 = lib509-first.$(OBJEXT)
    -am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_64)
    +am__objects_89 = lib509-first.$(OBJEXT)
    +am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_89)
     lib509_OBJECTS = $(am_lib509_OBJECTS)
     lib509_LDADD = $(LDADD)
     lib509_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_65 = lib510-first.$(OBJEXT)
    -am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_65)
    +am__objects_90 = lib510-first.$(OBJEXT)
    +am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_90)
     lib510_OBJECTS = $(am_lib510_OBJECTS)
     lib510_LDADD = $(LDADD)
     lib510_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_66 = lib511-first.$(OBJEXT)
    -am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_66)
    +am__objects_91 = lib511-first.$(OBJEXT)
    +am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_91)
     lib511_OBJECTS = $(am_lib511_OBJECTS)
     lib511_LDADD = $(LDADD)
     lib511_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_67 = lib512-first.$(OBJEXT)
    -am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_67)
    +am__objects_92 = lib512-first.$(OBJEXT)
    +am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_92)
     lib512_OBJECTS = $(am_lib512_OBJECTS)
     lib512_LDADD = $(LDADD)
     lib512_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_68 = lib513-first.$(OBJEXT)
    -am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_68)
    +am__objects_93 = lib513-first.$(OBJEXT)
    +am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_93)
     lib513_OBJECTS = $(am_lib513_OBJECTS)
     lib513_LDADD = $(LDADD)
     lib513_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_69 = lib514-first.$(OBJEXT)
    -am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_69)
    +am__objects_94 = lib514-first.$(OBJEXT)
    +am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_94)
     lib514_OBJECTS = $(am_lib514_OBJECTS)
     lib514_LDADD = $(LDADD)
     lib514_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_70 = lib515-first.$(OBJEXT)
    -am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_70)
    +am__objects_95 = lib515-first.$(OBJEXT)
    +am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_95)
     lib515_OBJECTS = $(am_lib515_OBJECTS)
     lib515_LDADD = $(LDADD)
     lib515_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_71 = lib516-first.$(OBJEXT)
    -am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_71)
    +am__objects_96 = lib516-first.$(OBJEXT)
    +am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_96)
     lib516_OBJECTS = $(am_lib516_OBJECTS)
     lib516_LDADD = $(LDADD)
     lib516_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_72 = lib517-first.$(OBJEXT)
    -am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_72)
    +am__objects_97 = lib517-first.$(OBJEXT)
    +am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_97)
     lib517_OBJECTS = $(am_lib517_OBJECTS)
     lib517_LDADD = $(LDADD)
     lib517_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_73 = lib518-first.$(OBJEXT)
    -am__objects_74 = lib518-warnless.$(OBJEXT)
    -am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_73) \
    -	$(am__objects_74)
    +am__objects_98 = lib518-first.$(OBJEXT)
    +am__objects_99 = ../../lib/lib518-warnless.$(OBJEXT)
    +am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_98) \
    +	$(am__objects_99)
     lib518_OBJECTS = $(am_lib518_OBJECTS)
     lib518_LDADD = $(LDADD)
     lib518_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_75 = lib519-first.$(OBJEXT)
    -am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_75)
    +am__objects_100 = lib519-first.$(OBJEXT)
    +am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_100)
     lib519_OBJECTS = $(am_lib519_OBJECTS)
     lib519_LDADD = $(LDADD)
     lib519_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_76 = lib520-first.$(OBJEXT)
    -am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_76)
    +am__objects_101 = lib520-first.$(OBJEXT)
    +am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_101)
     lib520_OBJECTS = $(am_lib520_OBJECTS)
     lib520_LDADD = $(LDADD)
     lib520_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_77 = lib521-first.$(OBJEXT)
    -am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_77)
    +am__objects_102 = lib521-first.$(OBJEXT)
    +am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_102)
     lib521_OBJECTS = $(am_lib521_OBJECTS)
     lib521_LDADD = $(LDADD)
     lib521_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_78 = lib523-first.$(OBJEXT)
    -am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_78)
    +am__objects_103 = lib523-first.$(OBJEXT)
    +am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_103)
     lib523_OBJECTS = $(am_lib523_OBJECTS)
     lib523_LDADD = $(LDADD)
     lib523_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_79 = lib524-first.$(OBJEXT)
    -am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_79)
    +am__objects_104 = lib524-first.$(OBJEXT)
    +am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_104)
     lib524_OBJECTS = $(am_lib524_OBJECTS)
     lib524_LDADD = $(LDADD)
     lib524_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_80 = lib525-first.$(OBJEXT)
    -am__objects_81 = lib525-testutil.$(OBJEXT)
    -am__objects_82 = lib525-warnless.$(OBJEXT)
    -am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_80) \
    -	$(am__objects_81) $(am__objects_82)
    +am__objects_105 = lib525-first.$(OBJEXT)
    +am__objects_106 = lib525-testutil.$(OBJEXT)
    +am__objects_107 = ../../lib/lib525-warnless.$(OBJEXT)
    +am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_105) \
    +	$(am__objects_106) $(am__objects_107)
     lib525_OBJECTS = $(am_lib525_OBJECTS)
     lib525_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_83 = lib526-first.$(OBJEXT)
    -am__objects_84 = lib526-testutil.$(OBJEXT)
    -am__objects_85 = lib526-warnless.$(OBJEXT)
    -am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_83) \
    -	$(am__objects_84) $(am__objects_85)
    +am__objects_108 = lib526-first.$(OBJEXT)
    +am__objects_109 = lib526-testutil.$(OBJEXT)
    +am__objects_110 = ../../lib/lib526-warnless.$(OBJEXT)
    +am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_108) \
    +	$(am__objects_109) $(am__objects_110)
     lib526_OBJECTS = $(am_lib526_OBJECTS)
     lib526_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_86 = lib527-first.$(OBJEXT)
    -am__objects_87 = lib527-testutil.$(OBJEXT)
    -am__objects_88 = lib527-warnless.$(OBJEXT)
    -am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_86) \
    -	$(am__objects_87) $(am__objects_88)
    +am__objects_111 = lib527-first.$(OBJEXT)
    +am__objects_112 = lib527-testutil.$(OBJEXT)
    +am__objects_113 = ../../lib/lib527-warnless.$(OBJEXT)
    +am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_111) \
    +	$(am__objects_112) $(am__objects_113)
     lib527_OBJECTS = $(am_lib527_OBJECTS)
     lib527_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_89 = lib529-first.$(OBJEXT)
    -am__objects_90 = lib529-testutil.$(OBJEXT)
    -am__objects_91 = lib529-warnless.$(OBJEXT)
    -am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_89) \
    -	$(am__objects_90) $(am__objects_91)
    +am__objects_114 = lib529-first.$(OBJEXT)
    +am__objects_115 = lib529-testutil.$(OBJEXT)
    +am__objects_116 = ../../lib/lib529-warnless.$(OBJEXT)
    +am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_114) \
    +	$(am__objects_115) $(am__objects_116)
     lib529_OBJECTS = $(am_lib529_OBJECTS)
     lib529_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_92 = lib530-first.$(OBJEXT)
    -am__objects_93 = lib530-testutil.$(OBJEXT)
    -am__objects_94 = lib530-warnless.$(OBJEXT)
    -am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_92) \
    -	$(am__objects_93) $(am__objects_94)
    +am__objects_117 = lib530-first.$(OBJEXT)
    +am__objects_118 = lib530-testutil.$(OBJEXT)
    +am__objects_119 = ../../lib/lib530-warnless.$(OBJEXT)
    +am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_117) \
    +	$(am__objects_118) $(am__objects_119)
     lib530_OBJECTS = $(am_lib530_OBJECTS)
     lib530_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_95 = lib532-first.$(OBJEXT)
    -am__objects_96 = lib532-testutil.$(OBJEXT)
    -am__objects_97 = lib532-warnless.$(OBJEXT)
    -am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_95) \
    -	$(am__objects_96) $(am__objects_97)
    +am__objects_120 = lib532-first.$(OBJEXT)
    +am__objects_121 = lib532-testutil.$(OBJEXT)
    +am__objects_122 = ../../lib/lib532-warnless.$(OBJEXT)
    +am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_120) \
    +	$(am__objects_121) $(am__objects_122)
     lib532_OBJECTS = $(am_lib532_OBJECTS)
     lib532_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_98 = lib533-first.$(OBJEXT)
    -am__objects_99 = lib533-testutil.$(OBJEXT)
    -am__objects_100 = lib533-warnless.$(OBJEXT)
    -am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_98) \
    -	$(am__objects_99) $(am__objects_100)
    +am__objects_123 = lib533-first.$(OBJEXT)
    +am__objects_124 = lib533-testutil.$(OBJEXT)
    +am__objects_125 = ../../lib/lib533-warnless.$(OBJEXT)
    +am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_123) \
    +	$(am__objects_124) $(am__objects_125)
     lib533_OBJECTS = $(am_lib533_OBJECTS)
     lib533_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_101 = lib536-first.$(OBJEXT)
    -am__objects_102 = lib536-testutil.$(OBJEXT)
    -am__objects_103 = lib536-warnless.$(OBJEXT)
    -am_lib536_OBJECTS = lib536-lib536.$(OBJEXT) $(am__objects_101) \
    -	$(am__objects_102) $(am__objects_103)
    +am__objects_126 = lib536-first.$(OBJEXT)
    +am__objects_127 = lib536-testutil.$(OBJEXT)
    +am__objects_128 = ../../lib/lib536-warnless.$(OBJEXT)
    +am_lib536_OBJECTS = lib536-lib536.$(OBJEXT) $(am__objects_126) \
    +	$(am__objects_127) $(am__objects_128)
     lib536_OBJECTS = $(am_lib536_OBJECTS)
     lib536_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_104 = lib537-first.$(OBJEXT)
    -am__objects_105 = lib537-warnless.$(OBJEXT)
    -am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_104) \
    -	$(am__objects_105)
    +am__objects_129 = lib537-first.$(OBJEXT)
    +am__objects_130 = ../../lib/lib537-warnless.$(OBJEXT)
    +am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_129) \
    +	$(am__objects_130)
     lib537_OBJECTS = $(am_lib537_OBJECTS)
     lib537_LDADD = $(LDADD)
     lib537_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_106 = lib539-first.$(OBJEXT)
    -am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_106)
    +am__objects_131 = lib539-first.$(OBJEXT)
    +am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_131)
     lib539_OBJECTS = $(am_lib539_OBJECTS)
     lib539_LDADD = $(LDADD)
     lib539_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_107 = lib540-first.$(OBJEXT)
    -am__objects_108 = lib540-testutil.$(OBJEXT)
    -am__objects_109 = lib540-warnless.$(OBJEXT)
    -am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_107) \
    -	$(am__objects_108) $(am__objects_109)
    +am__objects_132 = lib540-first.$(OBJEXT)
    +am__objects_133 = lib540-testutil.$(OBJEXT)
    +am__objects_134 = ../../lib/lib540-warnless.$(OBJEXT)
    +am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_132) \
    +	$(am__objects_133) $(am__objects_134)
     lib540_OBJECTS = $(am_lib540_OBJECTS)
     lib540_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_110 = lib541-first.$(OBJEXT)
    -am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_110)
    +am__objects_135 = lib541-first.$(OBJEXT)
    +am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_135)
     lib541_OBJECTS = $(am_lib541_OBJECTS)
     lib541_LDADD = $(LDADD)
     lib541_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_111 = lib542-first.$(OBJEXT)
    -am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_111)
    +am__objects_136 = lib542-first.$(OBJEXT)
    +am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_136)
     lib542_OBJECTS = $(am_lib542_OBJECTS)
     lib542_LDADD = $(LDADD)
     lib542_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_112 = lib543-first.$(OBJEXT)
    -am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_112)
    +am__objects_137 = lib543-first.$(OBJEXT)
    +am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_137)
     lib543_OBJECTS = $(am_lib543_OBJECTS)
     lib543_LDADD = $(LDADD)
     lib543_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_113 = lib544-first.$(OBJEXT)
    -am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_113)
    +am__objects_138 = lib544-first.$(OBJEXT)
    +am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_138)
     lib544_OBJECTS = $(am_lib544_OBJECTS)
     lib544_LDADD = $(LDADD)
     lib544_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_114 = lib545-first.$(OBJEXT)
    -am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_114)
    +am__objects_139 = lib545-first.$(OBJEXT)
    +am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_139)
     lib545_OBJECTS = $(am_lib545_OBJECTS)
     lib545_LDADD = $(LDADD)
     lib545_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_115 = lib547-first.$(OBJEXT)
    -am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_115)
    +am__objects_140 = lib547-first.$(OBJEXT)
    +am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_140)
     lib547_OBJECTS = $(am_lib547_OBJECTS)
     lib547_LDADD = $(LDADD)
     lib547_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_116 = lib548-first.$(OBJEXT)
    -am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_116)
    +am__objects_141 = lib548-first.$(OBJEXT)
    +am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_141)
     lib548_OBJECTS = $(am_lib548_OBJECTS)
     lib548_LDADD = $(LDADD)
     lib548_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_117 = lib549-first.$(OBJEXT)
    -am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_117)
    +am__objects_142 = lib549-first.$(OBJEXT)
    +am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_142)
     lib549_OBJECTS = $(am_lib549_OBJECTS)
     lib549_LDADD = $(LDADD)
     lib549_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_118 = lib552-first.$(OBJEXT)
    -am__objects_119 = lib552-warnless.$(OBJEXT)
    -am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_118) \
    -	$(am__objects_119)
    +am__objects_143 = lib552-first.$(OBJEXT)
    +am__objects_144 = ../../lib/lib552-warnless.$(OBJEXT)
    +am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_143) \
    +	$(am__objects_144)
     lib552_OBJECTS = $(am_lib552_OBJECTS)
     lib552_LDADD = $(LDADD)
     lib552_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_120 = lib553-first.$(OBJEXT)
    -am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_120)
    +am__objects_145 = lib553-first.$(OBJEXT)
    +am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_145)
     lib553_OBJECTS = $(am_lib553_OBJECTS)
     lib553_LDADD = $(LDADD)
     lib553_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_121 = lib554-first.$(OBJEXT)
    -am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_121)
    +am__objects_146 = lib554-first.$(OBJEXT)
    +am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_146)
     lib554_OBJECTS = $(am_lib554_OBJECTS)
     lib554_LDADD = $(LDADD)
     lib554_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_122 = lib555-first.$(OBJEXT)
    -am__objects_123 = lib555-testutil.$(OBJEXT)
    -am__objects_124 = lib555-warnless.$(OBJEXT)
    -am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_122) \
    -	$(am__objects_123) $(am__objects_124)
    +am__objects_147 = lib555-first.$(OBJEXT)
    +am__objects_148 = lib555-testutil.$(OBJEXT)
    +am__objects_149 = ../../lib/lib555-warnless.$(OBJEXT)
    +am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_147) \
    +	$(am__objects_148) $(am__objects_149)
     lib555_OBJECTS = $(am_lib555_OBJECTS)
     lib555_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_125 = lib556-first.$(OBJEXT)
    -am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_125)
    +am__objects_150 = lib556-first.$(OBJEXT)
    +am__objects_151 = ../../lib/lib556-warnless.$(OBJEXT)
    +am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_150) \
    +	$(am__objects_151)
     lib556_OBJECTS = $(am_lib556_OBJECTS)
     lib556_LDADD = $(LDADD)
     lib556_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_126 = lib557-first.$(OBJEXT)
    -am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_126)
    +am__objects_152 = lib557-first.$(OBJEXT)
    +am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_152)
     lib557_OBJECTS = $(am_lib557_OBJECTS)
     lib557_LDADD = $(LDADD)
     lib557_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_127 = lib558-first.$(OBJEXT)
    -am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_127)
    +am__objects_153 = lib558-first.$(OBJEXT)
    +am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_153)
     lib558_OBJECTS = $(am_lib558_OBJECTS)
     lib558_LDADD = $(LDADD)
     lib558_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_128 = lib560-first.$(OBJEXT)
    -am__objects_129 = lib560-testutil.$(OBJEXT)
    -am__objects_130 = lib560-warnless.$(OBJEXT)
    -am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_128) \
    -	$(am__objects_129) $(am__objects_130)
    +am__objects_154 = lib560-first.$(OBJEXT)
    +am__objects_155 = lib560-testutil.$(OBJEXT)
    +am__objects_156 = ../../lib/lib560-warnless.$(OBJEXT)
    +am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_154) \
    +	$(am__objects_155) $(am__objects_156)
     lib560_OBJECTS = $(am_lib560_OBJECTS)
     lib560_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_131 = lib562-first.$(OBJEXT)
    -am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_131)
    +am__objects_157 = lib562-first.$(OBJEXT)
    +am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_157)
     lib562_OBJECTS = $(am_lib562_OBJECTS)
     lib562_LDADD = $(LDADD)
     lib562_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_132 = lib564-first.$(OBJEXT)
    -am__objects_133 = lib564-testutil.$(OBJEXT)
    -am__objects_134 = lib564-warnless.$(OBJEXT)
    -am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_132) \
    -	$(am__objects_133) $(am__objects_134)
    +am__objects_158 = lib564-first.$(OBJEXT)
    +am__objects_159 = lib564-testutil.$(OBJEXT)
    +am__objects_160 = ../../lib/lib564-warnless.$(OBJEXT)
    +am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_158) \
    +	$(am__objects_159) $(am__objects_160)
     lib564_OBJECTS = $(am_lib564_OBJECTS)
     lib564_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_135 = lib565-first.$(OBJEXT)
    -am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_135)
    +am__objects_161 = lib565-first.$(OBJEXT)
    +am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_161)
     lib565_OBJECTS = $(am_lib565_OBJECTS)
     lib565_LDADD = $(LDADD)
     lib565_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_136 = lib566-first.$(OBJEXT)
    -am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_136)
    +am__objects_162 = lib566-first.$(OBJEXT)
    +am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_162)
     lib566_OBJECTS = $(am_lib566_OBJECTS)
     lib566_LDADD = $(LDADD)
     lib566_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_137 = lib567-first.$(OBJEXT)
    -am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_137)
    +am__objects_163 = lib567-first.$(OBJEXT)
    +am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_163)
     lib567_OBJECTS = $(am_lib567_OBJECTS)
     lib567_LDADD = $(LDADD)
     lib567_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_138 = lib568-first.$(OBJEXT)
    -am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_138)
    +am__objects_164 = lib568-first.$(OBJEXT)
    +am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_164)
     lib568_OBJECTS = $(am_lib568_OBJECTS)
     lib568_LDADD = $(LDADD)
     lib568_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_139 = lib569-first.$(OBJEXT)
    -am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_139)
    +am__objects_165 = lib569-first.$(OBJEXT)
    +am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_165)
     lib569_OBJECTS = $(am_lib569_OBJECTS)
     lib569_LDADD = $(LDADD)
     lib569_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_140 = lib570-first.$(OBJEXT)
    -am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_140)
    +am__objects_166 = lib570-first.$(OBJEXT)
    +am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_166)
     lib570_OBJECTS = $(am_lib570_OBJECTS)
     lib570_LDADD = $(LDADD)
     lib570_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_141 = lib571-first.$(OBJEXT)
    -am__objects_142 = lib571-warnless.$(OBJEXT)
    -am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_141) \
    -	$(am__objects_142)
    +am__objects_167 = lib571-first.$(OBJEXT)
    +am__objects_168 = ../../lib/lib571-warnless.$(OBJEXT)
    +am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_167) \
    +	$(am__objects_168)
     lib571_OBJECTS = $(am_lib571_OBJECTS)
     lib571_LDADD = $(LDADD)
     lib571_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_143 = lib572-first.$(OBJEXT)
    -am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_143)
    +am__objects_169 = lib572-first.$(OBJEXT)
    +am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_169)
     lib572_OBJECTS = $(am_lib572_OBJECTS)
     lib572_LDADD = $(LDADD)
     lib572_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_144 = lib573-first.$(OBJEXT)
    -am__objects_145 = lib573-testutil.$(OBJEXT)
    -am__objects_146 = lib573-warnless.$(OBJEXT)
    -am__objects_147 = lib573-testtrace.$(OBJEXT)
    -am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_144) \
    -	$(am__objects_145) $(am__objects_146) $(am__objects_147)
    +am__objects_170 = lib573-first.$(OBJEXT)
    +am__objects_171 = lib573-testutil.$(OBJEXT)
    +am__objects_172 = ../../lib/lib573-warnless.$(OBJEXT)
    +am__objects_173 = lib573-testtrace.$(OBJEXT)
    +am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_170) \
    +	$(am__objects_171) $(am__objects_172) $(am__objects_173)
     lib573_OBJECTS = $(am_lib573_OBJECTS)
     lib573_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_148 = lib574-first.$(OBJEXT)
    -am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_148)
    +am__objects_174 = lib574-first.$(OBJEXT)
    +am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_174)
     lib574_OBJECTS = $(am_lib574_OBJECTS)
     lib574_LDADD = $(LDADD)
     lib574_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_149 = lib575-first.$(OBJEXT)
    -am__objects_150 = lib575-testutil.$(OBJEXT)
    -am__objects_151 = lib575-warnless.$(OBJEXT)
    -am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_149) \
    -	$(am__objects_150) $(am__objects_151)
    +am__objects_175 = lib575-first.$(OBJEXT)
    +am__objects_176 = lib575-testutil.$(OBJEXT)
    +am__objects_177 = ../../lib/lib575-warnless.$(OBJEXT)
    +am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_175) \
    +	$(am__objects_176) $(am__objects_177)
     lib575_OBJECTS = $(am_lib575_OBJECTS)
     lib575_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_152 = lib576-first.$(OBJEXT)
    -am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_152)
    +am__objects_178 = lib576-first.$(OBJEXT)
    +am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_178)
     lib576_OBJECTS = $(am_lib576_OBJECTS)
     lib576_LDADD = $(LDADD)
     lib576_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_153 = lib578-first.$(OBJEXT)
    -am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_153)
    +am__objects_179 = lib578-first.$(OBJEXT)
    +am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_179)
     lib578_OBJECTS = $(am_lib578_OBJECTS)
     lib578_LDADD = $(LDADD)
     lib578_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_154 = lib579-first.$(OBJEXT)
    -am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_154)
    +am__objects_180 = lib579-first.$(OBJEXT)
    +am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_180)
     lib579_OBJECTS = $(am_lib579_OBJECTS)
     lib579_LDADD = $(LDADD)
     lib579_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_155 = lib582-first.$(OBJEXT)
    -am__objects_156 = lib582-testutil.$(OBJEXT)
    -am__objects_157 = lib582-warnless.$(OBJEXT)
    -am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_155) \
    -	$(am__objects_156) $(am__objects_157)
    +am__objects_181 = lib582-first.$(OBJEXT)
    +am__objects_182 = lib582-testutil.$(OBJEXT)
    +am__objects_183 = ../../lib/lib582-warnless.$(OBJEXT)
    +am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_181) \
    +	$(am__objects_182) $(am__objects_183)
     lib582_OBJECTS = $(am_lib582_OBJECTS)
     lib582_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_158 = lib583-first.$(OBJEXT)
    -am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_158)
    +am__objects_184 = lib583-first.$(OBJEXT)
    +am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_184)
     lib583_OBJECTS = $(am_lib583_OBJECTS)
     lib583_LDADD = $(LDADD)
     lib583_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_159 = lib585-first.$(OBJEXT)
    -am__objects_160 = lib585-testutil.$(OBJEXT)
    -am__objects_161 = lib585-testtrace.$(OBJEXT)
    -am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_159) \
    -	$(am__objects_160) $(am__objects_161)
    +am__objects_185 = lib585-first.$(OBJEXT)
    +am__objects_186 = lib585-testutil.$(OBJEXT)
    +am__objects_187 = lib585-testtrace.$(OBJEXT)
    +am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_185) \
    +	$(am__objects_186) $(am__objects_187)
     lib585_OBJECTS = $(am_lib585_OBJECTS)
     lib585_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_162 = lib586-first.$(OBJEXT)
    -am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_162)
    +am__objects_188 = lib586-first.$(OBJEXT)
    +am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_188)
     lib586_OBJECTS = $(am_lib586_OBJECTS)
     lib586_LDADD = $(LDADD)
     lib586_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_163 = lib587-first.$(OBJEXT)
    -am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_163)
    +am__objects_189 = lib587-first.$(OBJEXT)
    +am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_189)
     lib587_OBJECTS = $(am_lib587_OBJECTS)
     lib587_LDADD = $(LDADD)
     lib587_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_164 = lib590-first.$(OBJEXT)
    -am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_164)
    +am__objects_190 = lib590-first.$(OBJEXT)
    +am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_190)
     lib590_OBJECTS = $(am_lib590_OBJECTS)
     lib590_LDADD = $(LDADD)
     lib590_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_165 = lib591-first.$(OBJEXT)
    -am__objects_166 = lib591-testutil.$(OBJEXT)
    -am__objects_167 = lib591-warnless.$(OBJEXT)
    -am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_165) \
    -	$(am__objects_166) $(am__objects_167)
    +am__objects_191 = lib591-first.$(OBJEXT)
    +am__objects_192 = lib591-testutil.$(OBJEXT)
    +am__objects_193 = ../../lib/lib591-warnless.$(OBJEXT)
    +am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_191) \
    +	$(am__objects_192) $(am__objects_193)
     lib591_OBJECTS = $(am_lib591_OBJECTS)
     lib591_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_168 = lib597-first.$(OBJEXT)
    -am__objects_169 = lib597-testutil.$(OBJEXT)
    -am__objects_170 = lib597-warnless.$(OBJEXT)
    -am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_168) \
    -	$(am__objects_169) $(am__objects_170)
    +am__objects_194 = lib597-first.$(OBJEXT)
    +am__objects_195 = lib597-testutil.$(OBJEXT)
    +am__objects_196 = ../../lib/lib597-warnless.$(OBJEXT)
    +am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_194) \
    +	$(am__objects_195) $(am__objects_196)
     lib597_OBJECTS = $(am_lib597_OBJECTS)
     lib597_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_171 = lib598-first.$(OBJEXT)
    -am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_171)
    +am__objects_197 = lib598-first.$(OBJEXT)
    +am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_197)
     lib598_OBJECTS = $(am_lib598_OBJECTS)
     lib598_LDADD = $(LDADD)
     lib598_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_172 = lib599-first.$(OBJEXT)
    -am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_172)
    +am__objects_198 = lib599-first.$(OBJEXT)
    +am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_198)
     lib599_OBJECTS = $(am_lib599_OBJECTS)
     lib599_LDADD = $(LDADD)
     lib599_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_173 = libauthretry-first.$(OBJEXT)
    +am__objects_199 = libauthretry-first.$(OBJEXT)
     am_libauthretry_OBJECTS = libauthretry-libauthretry.$(OBJEXT) \
    -	$(am__objects_173)
    +	$(am__objects_199)
     libauthretry_OBJECTS = $(am_libauthretry_OBJECTS)
     libauthretry_LDADD = $(LDADD)
     libauthretry_DEPENDENCIES = $(am__DEPENDENCIES_1)
    -am__objects_174 = libntlmconnect-first.$(OBJEXT)
    -am__objects_175 = libntlmconnect-testutil.$(OBJEXT)
    -am__objects_176 = libntlmconnect-warnless.$(OBJEXT)
    +am__objects_200 = libntlmconnect-first.$(OBJEXT)
    +am__objects_201 = libntlmconnect-testutil.$(OBJEXT)
    +am__objects_202 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
     am_libntlmconnect_OBJECTS = libntlmconnect-libntlmconnect.$(OBJEXT) \
    -	$(am__objects_174) $(am__objects_175) $(am__objects_176)
    +	$(am__objects_200) $(am__objects_201) $(am__objects_202)
     libntlmconnect_OBJECTS = $(am_libntlmconnect_OBJECTS)
     libntlmconnect_DEPENDENCIES = $(am__DEPENDENCIES_1)
     AM_V_P = $(am__v_P_@AM_V@)
    @@ -761,7 +828,10 @@ SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
     	$(lib1503_SOURCES) $(lib1504_SOURCES) $(lib1505_SOURCES) \
     	$(lib1506_SOURCES) $(lib1507_SOURCES) $(lib1508_SOURCES) \
     	$(lib1509_SOURCES) $(lib1510_SOURCES) $(lib1511_SOURCES) \
    -	$(lib1512_SOURCES) $(lib1900_SOURCES) $(lib2033_SOURCES) \
    +	$(lib1512_SOURCES) $(lib1513_SOURCES) $(lib1514_SOURCES) \
    +	$(lib1515_SOURCES) $(lib1520_SOURCES) $(lib1525_SOURCES) \
    +	$(lib1526_SOURCES) $(lib1527_SOURCES) $(lib1528_SOURCES) \
    +	$(lib1529_SOURCES) $(lib1900_SOURCES) $(lib2033_SOURCES) \
     	$(lib500_SOURCES) $(lib501_SOURCES) $(lib502_SOURCES) \
     	$(lib503_SOURCES) $(lib504_SOURCES) $(lib505_SOURCES) \
     	$(lib506_SOURCES) $(lib507_SOURCES) $(lib508_SOURCES) \
    @@ -794,7 +864,10 @@ DIST_SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
     	$(lib1503_SOURCES) $(lib1504_SOURCES) $(lib1505_SOURCES) \
     	$(lib1506_SOURCES) $(lib1507_SOURCES) $(lib1508_SOURCES) \
     	$(lib1509_SOURCES) $(lib1510_SOURCES) $(lib1511_SOURCES) \
    -	$(lib1512_SOURCES) $(lib1900_SOURCES) $(lib2033_SOURCES) \
    +	$(lib1512_SOURCES) $(lib1513_SOURCES) $(lib1514_SOURCES) \
    +	$(lib1515_SOURCES) $(lib1520_SOURCES) $(lib1525_SOURCES) \
    +	$(lib1526_SOURCES) $(lib1527_SOURCES) $(lib1528_SOURCES) \
    +	$(lib1529_SOURCES) $(lib1900_SOURCES) $(lib2033_SOURCES) \
     	$(lib500_SOURCES) $(lib501_SOURCES) $(lib502_SOURCES) \
     	$(lib503_SOURCES) $(lib504_SOURCES) $(lib505_SOURCES) \
     	$(lib506_SOURCES) $(lib507_SOURCES) $(lib508_SOURCES) \
    @@ -879,6 +952,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
     CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
     CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
     CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
    +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
     CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
     CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
     CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
    @@ -903,7 +977,6 @@ GREP = @GREP@
     HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
     HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
     HAVE_LIBZ = @HAVE_LIBZ@
    -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@
     HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@
     IDN_ENABLED = @IDN_ENABLED@
     INSTALL = @INSTALL@
    @@ -912,7 +985,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
     INSTALL_SCRIPT = @INSTALL_SCRIPT@
     INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
     IPV6_ENABLED = @IPV6_ENABLED@
    -KRB4_ENABLED = @KRB4_ENABLED@
     LD = @LD@
     LDFLAGS = @LDFLAGS@
     LIBCURL_LIBS = @LIBCURL_LIBS@
    @@ -935,6 +1007,7 @@ MKDIR_P = @MKDIR_P@
     NM = @NM@
     NMEDIT = @NMEDIT@
     NROFF = @NROFF@
    +NSS_LIBS = @NSS_LIBS@
     OBJDUMP = @OBJDUMP@
     OBJEXT = @OBJEXT@
     OTOOL = @OTOOL@
    @@ -970,11 +1043,13 @@ USE_GNUTLS = @USE_GNUTLS@
     USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
     USE_LIBRTMP = @USE_LIBRTMP@
     USE_LIBSSH2 = @USE_LIBSSH2@
    +USE_NGHTTP2 = @USE_NGHTTP2@
     USE_NSS = @USE_NSS@
     USE_OPENLDAP = @USE_OPENLDAP@
     USE_POLARSSL = @USE_POLARSSL@
     USE_SCHANNEL = @USE_SCHANNEL@
     USE_SSLEAY = @USE_SSLEAY@
    +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
     USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
     VERSION = @VERSION@
     VERSIONNUM = @VERSIONNUM@
    @@ -1222,7 +1297,7 @@ lib554_CPPFLAGS = $(AM_CPPFLAGS)
     lib555_SOURCES = lib555.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib555_LDADD = $(TESTUTIL_LIBS)
     lib555_CPPFLAGS = $(AM_CPPFLAGS)
    -lib556_SOURCES = lib556.c $(SUPPORTFILES)
    +lib556_SOURCES = lib556.c $(SUPPORTFILES) $(WARNLESS)
     lib556_CPPFLAGS = $(AM_CPPFLAGS)
     lib557_SOURCES = lib557.c $(SUPPORTFILES)
     lib557_CPPFLAGS = $(AM_CPPFLAGS)
    @@ -1329,6 +1404,32 @@ lib1511_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1511
     lib1512_SOURCES = lib1512.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib1512_LDADD = $(TESTUTIL_LIBS)
     lib1512_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1512
    +lib1513_SOURCES = lib1513.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1513_LDADD = $(TESTUTIL_LIBS)
    +lib1513_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1513
    +lib1514_SOURCES = lib1514.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1514_LDADD = $(TESTUTIL_LIBS)
    +lib1514_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1514
    +lib1515_SOURCES = lib1515.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1515_LDADD = $(TESTUTIL_LIBS)
    +lib1515_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1515
    +lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
    +lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
    +lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1525_LDADD = $(TESTUTIL_LIBS)
    +lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
    +lib1526_SOURCES = lib1526.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1526_LDADD = $(TESTUTIL_LIBS)
    +lib1526_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1526
    +lib1527_SOURCES = lib1527.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1527_LDADD = $(TESTUTIL_LIBS)
    +lib1527_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1527
    +lib1528_SOURCES = lib1528.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1528_LDADD = $(TESTUTIL_LIBS)
    +lib1528_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1528
    +lib1529_SOURCES = lib1529.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1529_LDADD = $(TESTUTIL_LIBS)
    +lib1529_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1529
     lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib1900_LDADD = $(TESTUTIL_LIBS)
     lib1900_CPPFLAGS = $(AM_CPPFLAGS)
    @@ -1413,6 +1514,14 @@ clean-noinstPROGRAMS:
     	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
     	echo " rm -f" $$list; \
     	rm -f $$list
    +../../lib/$(am__dirstamp):
    +	@$(MKDIR_P) ../../lib
    +	@: > ../../lib/$(am__dirstamp)
    +../../lib/$(DEPDIR)/$(am__dirstamp):
    +	@$(MKDIR_P) ../../lib/$(DEPDIR)
    +	@: > ../../lib/$(DEPDIR)/$(am__dirstamp)
    +../../lib/chkhostname-curl_gethostname.$(OBJEXT):  \
    +	../../lib/$(am__dirstamp) ../../lib/$(DEPDIR)/$(am__dirstamp)
     
     chkhostname$(EXEEXT): $(chkhostname_OBJECTS) $(chkhostname_DEPENDENCIES) $(EXTRA_chkhostname_DEPENDENCIES) 
     	@rm -f chkhostname$(EXEEXT)
    @@ -1421,58 +1530,138 @@ chkhostname$(EXEEXT): $(chkhostname_OBJECTS) $(chkhostname_DEPENDENCIES) $(EXTRA
     lib1500$(EXEEXT): $(lib1500_OBJECTS) $(lib1500_DEPENDENCIES) $(EXTRA_lib1500_DEPENDENCIES) 
     	@rm -f lib1500$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1500_OBJECTS) $(lib1500_LDADD) $(LIBS)
    +../../lib/lib1501-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1501$(EXEEXT): $(lib1501_OBJECTS) $(lib1501_DEPENDENCIES) $(EXTRA_lib1501_DEPENDENCIES) 
     	@rm -f lib1501$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1501_OBJECTS) $(lib1501_LDADD) $(LIBS)
    +../../lib/lib1502-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1502$(EXEEXT): $(lib1502_OBJECTS) $(lib1502_DEPENDENCIES) $(EXTRA_lib1502_DEPENDENCIES) 
     	@rm -f lib1502$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1502_OBJECTS) $(lib1502_LDADD) $(LIBS)
    +../../lib/lib1503-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1503$(EXEEXT): $(lib1503_OBJECTS) $(lib1503_DEPENDENCIES) $(EXTRA_lib1503_DEPENDENCIES) 
     	@rm -f lib1503$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1503_OBJECTS) $(lib1503_LDADD) $(LIBS)
    +../../lib/lib1504-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1504$(EXEEXT): $(lib1504_OBJECTS) $(lib1504_DEPENDENCIES) $(EXTRA_lib1504_DEPENDENCIES) 
     	@rm -f lib1504$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1504_OBJECTS) $(lib1504_LDADD) $(LIBS)
    +../../lib/lib1505-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1505$(EXEEXT): $(lib1505_OBJECTS) $(lib1505_DEPENDENCIES) $(EXTRA_lib1505_DEPENDENCIES) 
     	@rm -f lib1505$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1505_OBJECTS) $(lib1505_LDADD) $(LIBS)
    +../../lib/lib1506-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1506$(EXEEXT): $(lib1506_OBJECTS) $(lib1506_DEPENDENCIES) $(EXTRA_lib1506_DEPENDENCIES) 
     	@rm -f lib1506$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1506_OBJECTS) $(lib1506_LDADD) $(LIBS)
    +../../lib/lib1507-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1507$(EXEEXT): $(lib1507_OBJECTS) $(lib1507_DEPENDENCIES) $(EXTRA_lib1507_DEPENDENCIES) 
     	@rm -f lib1507$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1507_OBJECTS) $(lib1507_LDADD) $(LIBS)
    +../../lib/lib1508-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1508$(EXEEXT): $(lib1508_OBJECTS) $(lib1508_DEPENDENCIES) $(EXTRA_lib1508_DEPENDENCIES) 
     	@rm -f lib1508$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1508_OBJECTS) $(lib1508_LDADD) $(LIBS)
    +../../lib/lib1509-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1509$(EXEEXT): $(lib1509_OBJECTS) $(lib1509_DEPENDENCIES) $(EXTRA_lib1509_DEPENDENCIES) 
     	@rm -f lib1509$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1509_OBJECTS) $(lib1509_LDADD) $(LIBS)
    +../../lib/lib1510-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1510$(EXEEXT): $(lib1510_OBJECTS) $(lib1510_DEPENDENCIES) $(EXTRA_lib1510_DEPENDENCIES) 
     	@rm -f lib1510$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1510_OBJECTS) $(lib1510_LDADD) $(LIBS)
    +../../lib/lib1511-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1511$(EXEEXT): $(lib1511_OBJECTS) $(lib1511_DEPENDENCIES) $(EXTRA_lib1511_DEPENDENCIES) 
     	@rm -f lib1511$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1511_OBJECTS) $(lib1511_LDADD) $(LIBS)
    +../../lib/lib1512-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1512$(EXEEXT): $(lib1512_OBJECTS) $(lib1512_DEPENDENCIES) $(EXTRA_lib1512_DEPENDENCIES) 
     	@rm -f lib1512$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1512_OBJECTS) $(lib1512_LDADD) $(LIBS)
    +../../lib/lib1513-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1513$(EXEEXT): $(lib1513_OBJECTS) $(lib1513_DEPENDENCIES) $(EXTRA_lib1513_DEPENDENCIES) 
    +	@rm -f lib1513$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1513_OBJECTS) $(lib1513_LDADD) $(LIBS)
    +../../lib/lib1514-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1514$(EXEEXT): $(lib1514_OBJECTS) $(lib1514_DEPENDENCIES) $(EXTRA_lib1514_DEPENDENCIES) 
    +	@rm -f lib1514$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1514_OBJECTS) $(lib1514_LDADD) $(LIBS)
    +../../lib/lib1515-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1515$(EXEEXT): $(lib1515_OBJECTS) $(lib1515_DEPENDENCIES) $(EXTRA_lib1515_DEPENDENCIES) 
    +	@rm -f lib1515$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1515_OBJECTS) $(lib1515_LDADD) $(LIBS)
    +
    +lib1520$(EXEEXT): $(lib1520_OBJECTS) $(lib1520_DEPENDENCIES) $(EXTRA_lib1520_DEPENDENCIES) 
    +	@rm -f lib1520$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1520_OBJECTS) $(lib1520_LDADD) $(LIBS)
    +../../lib/lib1525-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1525$(EXEEXT): $(lib1525_OBJECTS) $(lib1525_DEPENDENCIES) $(EXTRA_lib1525_DEPENDENCIES) 
    +	@rm -f lib1525$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1525_OBJECTS) $(lib1525_LDADD) $(LIBS)
    +../../lib/lib1526-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1526$(EXEEXT): $(lib1526_OBJECTS) $(lib1526_DEPENDENCIES) $(EXTRA_lib1526_DEPENDENCIES) 
    +	@rm -f lib1526$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1526_OBJECTS) $(lib1526_LDADD) $(LIBS)
    +../../lib/lib1527-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1527$(EXEEXT): $(lib1527_OBJECTS) $(lib1527_DEPENDENCIES) $(EXTRA_lib1527_DEPENDENCIES) 
    +	@rm -f lib1527$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1527_OBJECTS) $(lib1527_LDADD) $(LIBS)
    +../../lib/lib1528-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1528$(EXEEXT): $(lib1528_OBJECTS) $(lib1528_DEPENDENCIES) $(EXTRA_lib1528_DEPENDENCIES) 
    +	@rm -f lib1528$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1528_OBJECTS) $(lib1528_LDADD) $(LIBS)
    +../../lib/lib1529-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
    +
    +lib1529$(EXEEXT): $(lib1529_OBJECTS) $(lib1529_DEPENDENCIES) $(EXTRA_lib1529_DEPENDENCIES) 
    +	@rm -f lib1529$(EXEEXT)
    +	$(AM_V_CCLD)$(LINK) $(lib1529_OBJECTS) $(lib1529_LDADD) $(LIBS)
    +../../lib/lib1900-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib1900$(EXEEXT): $(lib1900_OBJECTS) $(lib1900_DEPENDENCIES) $(EXTRA_lib1900_DEPENDENCIES) 
     	@rm -f lib1900$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib1900_OBJECTS) $(lib1900_LDADD) $(LIBS)
    +../../lib/lib2033-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib2033$(EXEEXT): $(lib2033_OBJECTS) $(lib2033_DEPENDENCIES) $(EXTRA_lib2033_DEPENDENCIES) 
     	@rm -f lib2033$(EXEEXT)
    @@ -1485,14 +1674,20 @@ lib500$(EXEEXT): $(lib500_OBJECTS) $(lib500_DEPENDENCIES) $(EXTRA_lib500_DEPENDE
     lib501$(EXEEXT): $(lib501_OBJECTS) $(lib501_DEPENDENCIES) $(EXTRA_lib501_DEPENDENCIES) 
     	@rm -f lib501$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib501_OBJECTS) $(lib501_LDADD) $(LIBS)
    +../../lib/lib502-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib502$(EXEEXT): $(lib502_OBJECTS) $(lib502_DEPENDENCIES) $(EXTRA_lib502_DEPENDENCIES) 
     	@rm -f lib502$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib502_OBJECTS) $(lib502_LDADD) $(LIBS)
    +../../lib/lib503-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib503$(EXEEXT): $(lib503_OBJECTS) $(lib503_DEPENDENCIES) $(EXTRA_lib503_DEPENDENCIES) 
     	@rm -f lib503$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib503_OBJECTS) $(lib503_LDADD) $(LIBS)
    +../../lib/lib504-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib504$(EXEEXT): $(lib504_OBJECTS) $(lib504_DEPENDENCIES) $(EXTRA_lib504_DEPENDENCIES) 
     	@rm -f lib504$(EXEEXT)
    @@ -1505,6 +1700,8 @@ lib505$(EXEEXT): $(lib505_OBJECTS) $(lib505_DEPENDENCIES) $(EXTRA_lib505_DEPENDE
     lib506$(EXEEXT): $(lib506_OBJECTS) $(lib506_DEPENDENCIES) $(EXTRA_lib506_DEPENDENCIES) 
     	@rm -f lib506$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib506_OBJECTS) $(lib506_LDADD) $(LIBS)
    +../../lib/lib507-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib507$(EXEEXT): $(lib507_OBJECTS) $(lib507_DEPENDENCIES) $(EXTRA_lib507_DEPENDENCIES) 
     	@rm -f lib507$(EXEEXT)
    @@ -1549,6 +1746,8 @@ lib516$(EXEEXT): $(lib516_OBJECTS) $(lib516_DEPENDENCIES) $(EXTRA_lib516_DEPENDE
     lib517$(EXEEXT): $(lib517_OBJECTS) $(lib517_DEPENDENCIES) $(EXTRA_lib517_DEPENDENCIES) 
     	@rm -f lib517$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib517_OBJECTS) $(lib517_LDADD) $(LIBS)
    +../../lib/lib518-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib518$(EXEEXT): $(lib518_OBJECTS) $(lib518_DEPENDENCIES) $(EXTRA_lib518_DEPENDENCIES) 
     	@rm -f lib518$(EXEEXT)
    @@ -1573,38 +1772,56 @@ lib523$(EXEEXT): $(lib523_OBJECTS) $(lib523_DEPENDENCIES) $(EXTRA_lib523_DEPENDE
     lib524$(EXEEXT): $(lib524_OBJECTS) $(lib524_DEPENDENCIES) $(EXTRA_lib524_DEPENDENCIES) 
     	@rm -f lib524$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib524_OBJECTS) $(lib524_LDADD) $(LIBS)
    +../../lib/lib525-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib525$(EXEEXT): $(lib525_OBJECTS) $(lib525_DEPENDENCIES) $(EXTRA_lib525_DEPENDENCIES) 
     	@rm -f lib525$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib525_OBJECTS) $(lib525_LDADD) $(LIBS)
    +../../lib/lib526-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib526$(EXEEXT): $(lib526_OBJECTS) $(lib526_DEPENDENCIES) $(EXTRA_lib526_DEPENDENCIES) 
     	@rm -f lib526$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib526_OBJECTS) $(lib526_LDADD) $(LIBS)
    +../../lib/lib527-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib527$(EXEEXT): $(lib527_OBJECTS) $(lib527_DEPENDENCIES) $(EXTRA_lib527_DEPENDENCIES) 
     	@rm -f lib527$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib527_OBJECTS) $(lib527_LDADD) $(LIBS)
    +../../lib/lib529-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib529$(EXEEXT): $(lib529_OBJECTS) $(lib529_DEPENDENCIES) $(EXTRA_lib529_DEPENDENCIES) 
     	@rm -f lib529$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib529_OBJECTS) $(lib529_LDADD) $(LIBS)
    +../../lib/lib530-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib530$(EXEEXT): $(lib530_OBJECTS) $(lib530_DEPENDENCIES) $(EXTRA_lib530_DEPENDENCIES) 
     	@rm -f lib530$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib530_OBJECTS) $(lib530_LDADD) $(LIBS)
    +../../lib/lib532-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib532$(EXEEXT): $(lib532_OBJECTS) $(lib532_DEPENDENCIES) $(EXTRA_lib532_DEPENDENCIES) 
     	@rm -f lib532$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib532_OBJECTS) $(lib532_LDADD) $(LIBS)
    +../../lib/lib533-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib533$(EXEEXT): $(lib533_OBJECTS) $(lib533_DEPENDENCIES) $(EXTRA_lib533_DEPENDENCIES) 
     	@rm -f lib533$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib533_OBJECTS) $(lib533_LDADD) $(LIBS)
    +../../lib/lib536-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib536$(EXEEXT): $(lib536_OBJECTS) $(lib536_DEPENDENCIES) $(EXTRA_lib536_DEPENDENCIES) 
     	@rm -f lib536$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib536_OBJECTS) $(lib536_LDADD) $(LIBS)
    +../../lib/lib537-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib537$(EXEEXT): $(lib537_OBJECTS) $(lib537_DEPENDENCIES) $(EXTRA_lib537_DEPENDENCIES) 
     	@rm -f lib537$(EXEEXT)
    @@ -1613,6 +1830,8 @@ lib537$(EXEEXT): $(lib537_OBJECTS) $(lib537_DEPENDENCIES) $(EXTRA_lib537_DEPENDE
     lib539$(EXEEXT): $(lib539_OBJECTS) $(lib539_DEPENDENCIES) $(EXTRA_lib539_DEPENDENCIES) 
     	@rm -f lib539$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib539_OBJECTS) $(lib539_LDADD) $(LIBS)
    +../../lib/lib540-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib540$(EXEEXT): $(lib540_OBJECTS) $(lib540_DEPENDENCIES) $(EXTRA_lib540_DEPENDENCIES) 
     	@rm -f lib540$(EXEEXT)
    @@ -1649,6 +1868,8 @@ lib548$(EXEEXT): $(lib548_OBJECTS) $(lib548_DEPENDENCIES) $(EXTRA_lib548_DEPENDE
     lib549$(EXEEXT): $(lib549_OBJECTS) $(lib549_DEPENDENCIES) $(EXTRA_lib549_DEPENDENCIES) 
     	@rm -f lib549$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib549_OBJECTS) $(lib549_LDADD) $(LIBS)
    +../../lib/lib552-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib552$(EXEEXT): $(lib552_OBJECTS) $(lib552_DEPENDENCIES) $(EXTRA_lib552_DEPENDENCIES) 
     	@rm -f lib552$(EXEEXT)
    @@ -1661,10 +1882,14 @@ lib553$(EXEEXT): $(lib553_OBJECTS) $(lib553_DEPENDENCIES) $(EXTRA_lib553_DEPENDE
     lib554$(EXEEXT): $(lib554_OBJECTS) $(lib554_DEPENDENCIES) $(EXTRA_lib554_DEPENDENCIES) 
     	@rm -f lib554$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib554_OBJECTS) $(lib554_LDADD) $(LIBS)
    +../../lib/lib555-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib555$(EXEEXT): $(lib555_OBJECTS) $(lib555_DEPENDENCIES) $(EXTRA_lib555_DEPENDENCIES) 
     	@rm -f lib555$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib555_OBJECTS) $(lib555_LDADD) $(LIBS)
    +../../lib/lib556-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib556$(EXEEXT): $(lib556_OBJECTS) $(lib556_DEPENDENCIES) $(EXTRA_lib556_DEPENDENCIES) 
     	@rm -f lib556$(EXEEXT)
    @@ -1677,6 +1902,8 @@ lib557$(EXEEXT): $(lib557_OBJECTS) $(lib557_DEPENDENCIES) $(EXTRA_lib557_DEPENDE
     lib558$(EXEEXT): $(lib558_OBJECTS) $(lib558_DEPENDENCIES) $(EXTRA_lib558_DEPENDENCIES) 
     	@rm -f lib558$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib558_OBJECTS) $(lib558_LDADD) $(LIBS)
    +../../lib/lib560-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib560$(EXEEXT): $(lib560_OBJECTS) $(lib560_DEPENDENCIES) $(EXTRA_lib560_DEPENDENCIES) 
     	@rm -f lib560$(EXEEXT)
    @@ -1685,6 +1912,8 @@ lib560$(EXEEXT): $(lib560_OBJECTS) $(lib560_DEPENDENCIES) $(EXTRA_lib560_DEPENDE
     lib562$(EXEEXT): $(lib562_OBJECTS) $(lib562_DEPENDENCIES) $(EXTRA_lib562_DEPENDENCIES) 
     	@rm -f lib562$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib562_OBJECTS) $(lib562_LDADD) $(LIBS)
    +../../lib/lib564-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib564$(EXEEXT): $(lib564_OBJECTS) $(lib564_DEPENDENCIES) $(EXTRA_lib564_DEPENDENCIES) 
     	@rm -f lib564$(EXEEXT)
    @@ -1713,6 +1942,8 @@ lib569$(EXEEXT): $(lib569_OBJECTS) $(lib569_DEPENDENCIES) $(EXTRA_lib569_DEPENDE
     lib570$(EXEEXT): $(lib570_OBJECTS) $(lib570_DEPENDENCIES) $(EXTRA_lib570_DEPENDENCIES) 
     	@rm -f lib570$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib570_OBJECTS) $(lib570_LDADD) $(LIBS)
    +../../lib/lib571-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib571$(EXEEXT): $(lib571_OBJECTS) $(lib571_DEPENDENCIES) $(EXTRA_lib571_DEPENDENCIES) 
     	@rm -f lib571$(EXEEXT)
    @@ -1721,6 +1952,8 @@ lib571$(EXEEXT): $(lib571_OBJECTS) $(lib571_DEPENDENCIES) $(EXTRA_lib571_DEPENDE
     lib572$(EXEEXT): $(lib572_OBJECTS) $(lib572_DEPENDENCIES) $(EXTRA_lib572_DEPENDENCIES) 
     	@rm -f lib572$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib572_OBJECTS) $(lib572_LDADD) $(LIBS)
    +../../lib/lib573-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib573$(EXEEXT): $(lib573_OBJECTS) $(lib573_DEPENDENCIES) $(EXTRA_lib573_DEPENDENCIES) 
     	@rm -f lib573$(EXEEXT)
    @@ -1729,6 +1962,8 @@ lib573$(EXEEXT): $(lib573_OBJECTS) $(lib573_DEPENDENCIES) $(EXTRA_lib573_DEPENDE
     lib574$(EXEEXT): $(lib574_OBJECTS) $(lib574_DEPENDENCIES) $(EXTRA_lib574_DEPENDENCIES) 
     	@rm -f lib574$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib574_OBJECTS) $(lib574_LDADD) $(LIBS)
    +../../lib/lib575-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib575$(EXEEXT): $(lib575_OBJECTS) $(lib575_DEPENDENCIES) $(EXTRA_lib575_DEPENDENCIES) 
     	@rm -f lib575$(EXEEXT)
    @@ -1745,6 +1980,8 @@ lib578$(EXEEXT): $(lib578_OBJECTS) $(lib578_DEPENDENCIES) $(EXTRA_lib578_DEPENDE
     lib579$(EXEEXT): $(lib579_OBJECTS) $(lib579_DEPENDENCIES) $(EXTRA_lib579_DEPENDENCIES) 
     	@rm -f lib579$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib579_OBJECTS) $(lib579_LDADD) $(LIBS)
    +../../lib/lib582-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib582$(EXEEXT): $(lib582_OBJECTS) $(lib582_DEPENDENCIES) $(EXTRA_lib582_DEPENDENCIES) 
     	@rm -f lib582$(EXEEXT)
    @@ -1769,10 +2006,14 @@ lib587$(EXEEXT): $(lib587_OBJECTS) $(lib587_DEPENDENCIES) $(EXTRA_lib587_DEPENDE
     lib590$(EXEEXT): $(lib590_OBJECTS) $(lib590_DEPENDENCIES) $(EXTRA_lib590_DEPENDENCIES) 
     	@rm -f lib590$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib590_OBJECTS) $(lib590_LDADD) $(LIBS)
    +../../lib/lib591-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib591$(EXEEXT): $(lib591_OBJECTS) $(lib591_DEPENDENCIES) $(EXTRA_lib591_DEPENDENCIES) 
     	@rm -f lib591$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(lib591_OBJECTS) $(lib591_LDADD) $(LIBS)
    +../../lib/lib597-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
    +	../../lib/$(DEPDIR)/$(am__dirstamp)
     
     lib597$(EXEEXT): $(lib597_OBJECTS) $(lib597_DEPENDENCIES) $(EXTRA_lib597_DEPENDENCIES) 
     	@rm -f lib597$(EXEEXT)
    @@ -1789,6 +2030,8 @@ lib599$(EXEEXT): $(lib599_OBJECTS) $(lib599_DEPENDENCIES) $(EXTRA_lib599_DEPENDE
     libauthretry$(EXEEXT): $(libauthretry_OBJECTS) $(libauthretry_DEPENDENCIES) $(EXTRA_libauthretry_DEPENDENCIES) 
     	@rm -f libauthretry$(EXEEXT)
     	$(AM_V_CCLD)$(LINK) $(libauthretry_OBJECTS) $(libauthretry_LDADD) $(LIBS)
    +../../lib/libntlmconnect-warnless.$(OBJEXT):  \
    +	../../lib/$(am__dirstamp) ../../lib/$(DEPDIR)/$(am__dirstamp)
     
     libntlmconnect$(EXEEXT): $(libntlmconnect_OBJECTS) $(libntlmconnect_DEPENDENCIES) $(EXTRA_libntlmconnect_DEPENDENCIES) 
     	@rm -f libntlmconnect$(EXEEXT)
    @@ -1796,71 +2039,133 @@ libntlmconnect$(EXEEXT): $(libntlmconnect_OBJECTS) $(libntlmconnect_DEPENDENCIES
     
     mostlyclean-compile:
     	-rm -f *.$(OBJEXT)
    +	-rm -f ../../lib/*.$(OBJEXT)
     
     distclean-compile:
     	-rm -f *.tab.c
     
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1501-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1502-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1503-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1504-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1505-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1506-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1507-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1508-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1509-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1510-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1511-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1512-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1513-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1514-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1515-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1525-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1526-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1527-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1528-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1529-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1900-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib2033-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib502-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib503-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib504-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib507-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib518-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib525-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib526-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib527-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib529-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib530-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib532-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib533-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib536-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib537-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib540-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib552-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib555-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib556-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib560-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib564-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib571-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib573-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib575-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib582-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib591-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib597-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/libntlmconnect-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkhostname-chkhostname.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkhostname-curl_gethostname.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1500-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1500-lib1500.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1500-testutil.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1501-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1501-lib1501.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1501-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1501-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1502-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1502-lib1502.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1502-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1502-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1503-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1503-lib1502.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1503-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1503-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1504-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1504-lib1502.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1504-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1504-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1505-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1505-lib1502.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1505-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1505-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1506-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1506-lib1506.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1506-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1506-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1507-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1507-lib1507.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1507-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1507-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1508-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1508-lib1508.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1508-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1508-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1509-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1509-lib1509.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1509-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1509-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1510-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1510-lib1510.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1510-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1510-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1511-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1511-lib1511.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1511-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1511-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1512-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1512-lib1512.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1512-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1512-warnless.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1513-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1513-lib1513.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1513-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1514-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1514-lib1514.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1514-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1515-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1515-lib1515.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1515-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-lib1520.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-lib1525.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1526-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1526-lib1526.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1526-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1527-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1527-lib1527.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1527-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1528-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1528-lib1528.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1528-testutil.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1529-first.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1529-lib1529.Po@am__quote@
    +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1529-testutil.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-lib1900.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-libntlmconnect.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib500-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib500-lib500.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib500-testtrace.Po@am__quote@
    @@ -1870,15 +2175,12 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib502-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib502-lib502.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib502-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib502-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib503-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib503-lib503.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib503-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib503-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib504-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib504-lib504.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib504-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib504-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib505-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib505-lib505.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib506-first.Po@am__quote@
    @@ -1886,7 +2188,6 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib507-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib507-lib507.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib507-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib507-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib508-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib508-lib508.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib509-first.Po@am__quote@
    @@ -1909,7 +2210,6 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib517-lib517.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib518-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib518-lib518.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib518-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib519-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib519-lib519.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib520-first.Po@am__quote@
    @@ -1923,44 +2223,34 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib525-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib525-lib525.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib525-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib525-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib526-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib526-lib526.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib526-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib526-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib527-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib527-lib526.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib527-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib527-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib529-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib529-lib525.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib529-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib529-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib530-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib530-lib530.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib530-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib530-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib532-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib532-lib526.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib532-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib532-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-lib533.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-lib536.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib537-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib537-lib537.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib537-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib539-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib539-lib539.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib540-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib540-lib540.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib540-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib540-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib541-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib541-lib541.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib542-first.Po@am__quote@
    @@ -1979,7 +2269,6 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib549-lib549.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib552-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib552-lib552.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib552-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib553-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib553-lib553.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib554-first.Po@am__quote@
    @@ -1987,7 +2276,6 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib555-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib555-lib555.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib555-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib555-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib556-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib556-lib556.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib557-first.Po@am__quote@
    @@ -1997,13 +2285,11 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-lib560.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib562-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib562-lib562.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib564-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib564-lib564.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib564-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib564-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib565-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib565-lib510.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib566-first.Po@am__quote@
    @@ -2018,20 +2304,17 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib570-lib570.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib571-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib571-lib571.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib571-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib572-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib572-lib572.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib573-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib573-lib573.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib573-testtrace.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib573-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib573-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib574-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib574-lib574.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib575-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib575-lib575.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib575-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib575-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib576-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib576-lib576.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib578-first.Po@am__quote@
    @@ -2041,7 +2324,6 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib582-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib582-lib582.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib582-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib582-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib583-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib583-lib583.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib585-first.Po@am__quote@
    @@ -2057,11 +2339,9 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib591-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib591-lib591.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib591-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib591-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib597-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib597-lib597.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib597-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib597-warnless.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib598-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib598-lib598.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib599-first.Po@am__quote@
    @@ -2072,25 +2352,27 @@ distclean-compile:
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libntlmconnect-first.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libntlmconnect-libntlmconnect.Po@am__quote@
     @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libntlmconnect-testutil.Po@am__quote@
    -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libntlmconnect-warnless.Po@am__quote@
     
     .c.o:
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
    +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
    +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
    +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c $<
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
     
     .c.obj:
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
    +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
    +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
    +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
     
     .c.lo:
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
    +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
    +@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
    +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
    @@ -2116,19 +2398,19 @@ chkhostname-chkhostname.obj: chkhostname.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o chkhostname-chkhostname.obj `if test -f 'chkhostname.c'; then $(CYGPATH_W) 'chkhostname.c'; else $(CYGPATH_W) '$(srcdir)/chkhostname.c'; fi`
     
    -chkhostname-curl_gethostname.o: ../../lib/curl_gethostname.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT chkhostname-curl_gethostname.o -MD -MP -MF $(DEPDIR)/chkhostname-curl_gethostname.Tpo -c -o chkhostname-curl_gethostname.o `test -f '../../lib/curl_gethostname.c' || echo '$(srcdir)/'`../../lib/curl_gethostname.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/chkhostname-curl_gethostname.Tpo $(DEPDIR)/chkhostname-curl_gethostname.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/curl_gethostname.c' object='chkhostname-curl_gethostname.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/chkhostname-curl_gethostname.o: ../../lib/curl_gethostname.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/chkhostname-curl_gethostname.o -MD -MP -MF ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Tpo -c -o ../../lib/chkhostname-curl_gethostname.o `test -f '../../lib/curl_gethostname.c' || echo '$(srcdir)/'`../../lib/curl_gethostname.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Tpo ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/curl_gethostname.c' object='../../lib/chkhostname-curl_gethostname.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o chkhostname-curl_gethostname.o `test -f '../../lib/curl_gethostname.c' || echo '$(srcdir)/'`../../lib/curl_gethostname.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/chkhostname-curl_gethostname.o `test -f '../../lib/curl_gethostname.c' || echo '$(srcdir)/'`../../lib/curl_gethostname.c
     
    -chkhostname-curl_gethostname.obj: ../../lib/curl_gethostname.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT chkhostname-curl_gethostname.obj -MD -MP -MF $(DEPDIR)/chkhostname-curl_gethostname.Tpo -c -o chkhostname-curl_gethostname.obj `if test -f '../../lib/curl_gethostname.c'; then $(CYGPATH_W) '../../lib/curl_gethostname.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_gethostname.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/chkhostname-curl_gethostname.Tpo $(DEPDIR)/chkhostname-curl_gethostname.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/curl_gethostname.c' object='chkhostname-curl_gethostname.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/chkhostname-curl_gethostname.obj: ../../lib/curl_gethostname.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/chkhostname-curl_gethostname.obj -MD -MP -MF ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Tpo -c -o ../../lib/chkhostname-curl_gethostname.obj `if test -f '../../lib/curl_gethostname.c'; then $(CYGPATH_W) '../../lib/curl_gethostname.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_gethostname.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Tpo ../../lib/$(DEPDIR)/chkhostname-curl_gethostname.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/curl_gethostname.c' object='../../lib/chkhostname-curl_gethostname.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o chkhostname-curl_gethostname.obj `if test -f '../../lib/curl_gethostname.c'; then $(CYGPATH_W) '../../lib/curl_gethostname.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_gethostname.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chkhostname_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/chkhostname-curl_gethostname.obj `if test -f '../../lib/curl_gethostname.c'; then $(CYGPATH_W) '../../lib/curl_gethostname.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_gethostname.c'; fi`
     
     lib1500-lib1500.o: lib1500.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1500_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1500-lib1500.o -MD -MP -MF $(DEPDIR)/lib1500-lib1500.Tpo -c -o lib1500-lib1500.o `test -f 'lib1500.c' || echo '$(srcdir)/'`lib1500.c
    @@ -2214,19 +2496,19 @@ lib1501-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1501-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1501-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1501-warnless.o -MD -MP -MF $(DEPDIR)/lib1501-warnless.Tpo -c -o lib1501-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1501-warnless.Tpo $(DEPDIR)/lib1501-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1501-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1501-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1501-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1501-warnless.Tpo -c -o ../../lib/lib1501-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1501-warnless.Tpo ../../lib/$(DEPDIR)/lib1501-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1501-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1501-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1501-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1501-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1501-warnless.obj -MD -MP -MF $(DEPDIR)/lib1501-warnless.Tpo -c -o lib1501-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1501-warnless.Tpo $(DEPDIR)/lib1501-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1501-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1501-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1501-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1501-warnless.Tpo -c -o ../../lib/lib1501-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1501-warnless.Tpo ../../lib/$(DEPDIR)/lib1501-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1501-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1501-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1501_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1501-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1502-lib1502.o: lib1502.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1502-lib1502.o -MD -MP -MF $(DEPDIR)/lib1502-lib1502.Tpo -c -o lib1502-lib1502.o `test -f 'lib1502.c' || echo '$(srcdir)/'`lib1502.c
    @@ -2270,19 +2552,19 @@ lib1502-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1502-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1502-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1502-warnless.o -MD -MP -MF $(DEPDIR)/lib1502-warnless.Tpo -c -o lib1502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1502-warnless.Tpo $(DEPDIR)/lib1502-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1502-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1502-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1502-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1502-warnless.Tpo -c -o ../../lib/lib1502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1502-warnless.Tpo ../../lib/$(DEPDIR)/lib1502-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1502-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1502-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1502-warnless.obj -MD -MP -MF $(DEPDIR)/lib1502-warnless.Tpo -c -o lib1502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1502-warnless.Tpo $(DEPDIR)/lib1502-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1502-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1502-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1502-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1502-warnless.Tpo -c -o ../../lib/lib1502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1502-warnless.Tpo ../../lib/$(DEPDIR)/lib1502-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1502-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1503-lib1502.o: lib1502.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1503-lib1502.o -MD -MP -MF $(DEPDIR)/lib1503-lib1502.Tpo -c -o lib1503-lib1502.o `test -f 'lib1502.c' || echo '$(srcdir)/'`lib1502.c
    @@ -2326,19 +2608,19 @@ lib1503-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1503-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1503-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1503-warnless.o -MD -MP -MF $(DEPDIR)/lib1503-warnless.Tpo -c -o lib1503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1503-warnless.Tpo $(DEPDIR)/lib1503-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1503-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1503-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1503-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1503-warnless.Tpo -c -o ../../lib/lib1503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1503-warnless.Tpo ../../lib/$(DEPDIR)/lib1503-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1503-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1503-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1503-warnless.obj -MD -MP -MF $(DEPDIR)/lib1503-warnless.Tpo -c -o lib1503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1503-warnless.Tpo $(DEPDIR)/lib1503-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1503-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1503-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1503-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1503-warnless.Tpo -c -o ../../lib/lib1503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1503-warnless.Tpo ../../lib/$(DEPDIR)/lib1503-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1503-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1504-lib1502.o: lib1502.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1504-lib1502.o -MD -MP -MF $(DEPDIR)/lib1504-lib1502.Tpo -c -o lib1504-lib1502.o `test -f 'lib1502.c' || echo '$(srcdir)/'`lib1502.c
    @@ -2382,19 +2664,19 @@ lib1504-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1504-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1504-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1504-warnless.o -MD -MP -MF $(DEPDIR)/lib1504-warnless.Tpo -c -o lib1504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1504-warnless.Tpo $(DEPDIR)/lib1504-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1504-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1504-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1504-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1504-warnless.Tpo -c -o ../../lib/lib1504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1504-warnless.Tpo ../../lib/$(DEPDIR)/lib1504-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1504-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1504-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1504-warnless.obj -MD -MP -MF $(DEPDIR)/lib1504-warnless.Tpo -c -o lib1504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1504-warnless.Tpo $(DEPDIR)/lib1504-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1504-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1504-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1504-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1504-warnless.Tpo -c -o ../../lib/lib1504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1504-warnless.Tpo ../../lib/$(DEPDIR)/lib1504-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1504-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1505-lib1502.o: lib1502.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1505-lib1502.o -MD -MP -MF $(DEPDIR)/lib1505-lib1502.Tpo -c -o lib1505-lib1502.o `test -f 'lib1502.c' || echo '$(srcdir)/'`lib1502.c
    @@ -2438,19 +2720,19 @@ lib1505-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1505-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1505-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1505-warnless.o -MD -MP -MF $(DEPDIR)/lib1505-warnless.Tpo -c -o lib1505-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1505-warnless.Tpo $(DEPDIR)/lib1505-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1505-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1505-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1505-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1505-warnless.Tpo -c -o ../../lib/lib1505-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1505-warnless.Tpo ../../lib/$(DEPDIR)/lib1505-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1505-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1505-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1505-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1505-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1505-warnless.obj -MD -MP -MF $(DEPDIR)/lib1505-warnless.Tpo -c -o lib1505-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1505-warnless.Tpo $(DEPDIR)/lib1505-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1505-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1505-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1505-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1505-warnless.Tpo -c -o ../../lib/lib1505-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1505-warnless.Tpo ../../lib/$(DEPDIR)/lib1505-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1505-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1505-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1505-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1506-lib1506.o: lib1506.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1506-lib1506.o -MD -MP -MF $(DEPDIR)/lib1506-lib1506.Tpo -c -o lib1506-lib1506.o `test -f 'lib1506.c' || echo '$(srcdir)/'`lib1506.c
    @@ -2494,19 +2776,19 @@ lib1506-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1506-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1506-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1506-warnless.o -MD -MP -MF $(DEPDIR)/lib1506-warnless.Tpo -c -o lib1506-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1506-warnless.Tpo $(DEPDIR)/lib1506-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1506-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1506-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1506-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1506-warnless.Tpo -c -o ../../lib/lib1506-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1506-warnless.Tpo ../../lib/$(DEPDIR)/lib1506-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1506-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1506-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1506-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1506-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1506-warnless.obj -MD -MP -MF $(DEPDIR)/lib1506-warnless.Tpo -c -o lib1506-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1506-warnless.Tpo $(DEPDIR)/lib1506-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1506-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1506-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1506-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1506-warnless.Tpo -c -o ../../lib/lib1506-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1506-warnless.Tpo ../../lib/$(DEPDIR)/lib1506-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1506-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1506-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1506_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1506-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1507-lib1507.o: lib1507.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1507-lib1507.o -MD -MP -MF $(DEPDIR)/lib1507-lib1507.Tpo -c -o lib1507-lib1507.o `test -f 'lib1507.c' || echo '$(srcdir)/'`lib1507.c
    @@ -2550,19 +2832,19 @@ lib1507-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1507-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1507-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1507-warnless.o -MD -MP -MF $(DEPDIR)/lib1507-warnless.Tpo -c -o lib1507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1507-warnless.Tpo $(DEPDIR)/lib1507-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1507-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1507-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1507-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1507-warnless.Tpo -c -o ../../lib/lib1507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1507-warnless.Tpo ../../lib/$(DEPDIR)/lib1507-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1507-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1507-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1507-warnless.obj -MD -MP -MF $(DEPDIR)/lib1507-warnless.Tpo -c -o lib1507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1507-warnless.Tpo $(DEPDIR)/lib1507-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1507-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1507-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1507-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1507-warnless.Tpo -c -o ../../lib/lib1507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1507-warnless.Tpo ../../lib/$(DEPDIR)/lib1507-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1507-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1508-lib1508.o: lib1508.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1508-lib1508.o -MD -MP -MF $(DEPDIR)/lib1508-lib1508.Tpo -c -o lib1508-lib1508.o `test -f 'lib1508.c' || echo '$(srcdir)/'`lib1508.c
    @@ -2606,19 +2888,19 @@ lib1508-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1508-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1508-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1508-warnless.o -MD -MP -MF $(DEPDIR)/lib1508-warnless.Tpo -c -o lib1508-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1508-warnless.Tpo $(DEPDIR)/lib1508-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1508-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1508-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1508-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1508-warnless.Tpo -c -o ../../lib/lib1508-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1508-warnless.Tpo ../../lib/$(DEPDIR)/lib1508-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1508-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1508-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1508-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1508-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1508-warnless.obj -MD -MP -MF $(DEPDIR)/lib1508-warnless.Tpo -c -o lib1508-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1508-warnless.Tpo $(DEPDIR)/lib1508-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1508-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1508-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1508-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1508-warnless.Tpo -c -o ../../lib/lib1508-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1508-warnless.Tpo ../../lib/$(DEPDIR)/lib1508-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1508-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1508-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1508-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1509-lib1509.o: lib1509.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1509-lib1509.o -MD -MP -MF $(DEPDIR)/lib1509-lib1509.Tpo -c -o lib1509-lib1509.o `test -f 'lib1509.c' || echo '$(srcdir)/'`lib1509.c
    @@ -2662,19 +2944,19 @@ lib1509-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1509-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1509-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1509-warnless.o -MD -MP -MF $(DEPDIR)/lib1509-warnless.Tpo -c -o lib1509-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1509-warnless.Tpo $(DEPDIR)/lib1509-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1509-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1509-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1509-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1509-warnless.Tpo -c -o ../../lib/lib1509-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1509-warnless.Tpo ../../lib/$(DEPDIR)/lib1509-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1509-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1509-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1509-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1509-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1509-warnless.obj -MD -MP -MF $(DEPDIR)/lib1509-warnless.Tpo -c -o lib1509-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1509-warnless.Tpo $(DEPDIR)/lib1509-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1509-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1509-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1509-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1509-warnless.Tpo -c -o ../../lib/lib1509-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1509-warnless.Tpo ../../lib/$(DEPDIR)/lib1509-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1509-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1509-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1509_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1509-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1510-lib1510.o: lib1510.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1510-lib1510.o -MD -MP -MF $(DEPDIR)/lib1510-lib1510.Tpo -c -o lib1510-lib1510.o `test -f 'lib1510.c' || echo '$(srcdir)/'`lib1510.c
    @@ -2718,19 +3000,19 @@ lib1510-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1510-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1510-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1510-warnless.o -MD -MP -MF $(DEPDIR)/lib1510-warnless.Tpo -c -o lib1510-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1510-warnless.Tpo $(DEPDIR)/lib1510-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1510-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1510-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1510-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1510-warnless.Tpo -c -o ../../lib/lib1510-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1510-warnless.Tpo ../../lib/$(DEPDIR)/lib1510-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1510-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1510-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1510-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1510-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1510-warnless.obj -MD -MP -MF $(DEPDIR)/lib1510-warnless.Tpo -c -o lib1510-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1510-warnless.Tpo $(DEPDIR)/lib1510-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1510-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1510-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1510-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1510-warnless.Tpo -c -o ../../lib/lib1510-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1510-warnless.Tpo ../../lib/$(DEPDIR)/lib1510-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1510-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1510-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1510_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1510-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1511-lib1511.o: lib1511.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1511-lib1511.o -MD -MP -MF $(DEPDIR)/lib1511-lib1511.Tpo -c -o lib1511-lib1511.o `test -f 'lib1511.c' || echo '$(srcdir)/'`lib1511.c
    @@ -2774,19 +3056,19 @@ lib1511-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1511-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1511-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1511-warnless.o -MD -MP -MF $(DEPDIR)/lib1511-warnless.Tpo -c -o lib1511-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1511-warnless.Tpo $(DEPDIR)/lib1511-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1511-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1511-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1511-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1511-warnless.Tpo -c -o ../../lib/lib1511-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1511-warnless.Tpo ../../lib/$(DEPDIR)/lib1511-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1511-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1511-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1511-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1511-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1511-warnless.obj -MD -MP -MF $(DEPDIR)/lib1511-warnless.Tpo -c -o lib1511-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1511-warnless.Tpo $(DEPDIR)/lib1511-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1511-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1511-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1511-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1511-warnless.Tpo -c -o ../../lib/lib1511-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1511-warnless.Tpo ../../lib/$(DEPDIR)/lib1511-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1511-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1511-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1511_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1511-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1512-lib1512.o: lib1512.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1512-lib1512.o -MD -MP -MF $(DEPDIR)/lib1512-lib1512.Tpo -c -o lib1512-lib1512.o `test -f 'lib1512.c' || echo '$(srcdir)/'`lib1512.c
    @@ -2830,19 +3112,495 @@ lib1512-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1512-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1512-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1512-warnless.o -MD -MP -MF $(DEPDIR)/lib1512-warnless.Tpo -c -o lib1512-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1512-warnless.Tpo $(DEPDIR)/lib1512-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1512-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1512-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1512-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1512-warnless.Tpo -c -o ../../lib/lib1512-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1512-warnless.Tpo ../../lib/$(DEPDIR)/lib1512-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1512-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1512-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1512-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1512-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1512-warnless.Tpo -c -o ../../lib/lib1512-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1512-warnless.Tpo ../../lib/$(DEPDIR)/lib1512-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1512-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1512-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1513-lib1513.o: lib1513.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-lib1513.o -MD -MP -MF $(DEPDIR)/lib1513-lib1513.Tpo -c -o lib1513-lib1513.o `test -f 'lib1513.c' || echo '$(srcdir)/'`lib1513.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-lib1513.Tpo $(DEPDIR)/lib1513-lib1513.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1513.c' object='lib1513-lib1513.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-lib1513.o `test -f 'lib1513.c' || echo '$(srcdir)/'`lib1513.c
    +
    +lib1513-lib1513.obj: lib1513.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-lib1513.obj -MD -MP -MF $(DEPDIR)/lib1513-lib1513.Tpo -c -o lib1513-lib1513.obj `if test -f 'lib1513.c'; then $(CYGPATH_W) 'lib1513.c'; else $(CYGPATH_W) '$(srcdir)/lib1513.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-lib1513.Tpo $(DEPDIR)/lib1513-lib1513.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1513.c' object='lib1513-lib1513.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-lib1513.obj `if test -f 'lib1513.c'; then $(CYGPATH_W) 'lib1513.c'; else $(CYGPATH_W) '$(srcdir)/lib1513.c'; fi`
    +
    +lib1513-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-first.o -MD -MP -MF $(DEPDIR)/lib1513-first.Tpo -c -o lib1513-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-first.Tpo $(DEPDIR)/lib1513-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1513-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1513-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-first.obj -MD -MP -MF $(DEPDIR)/lib1513-first.Tpo -c -o lib1513-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-first.Tpo $(DEPDIR)/lib1513-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1513-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1513-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-testutil.o -MD -MP -MF $(DEPDIR)/lib1513-testutil.Tpo -c -o lib1513-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-testutil.Tpo $(DEPDIR)/lib1513-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1513-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1513-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1513-testutil.obj -MD -MP -MF $(DEPDIR)/lib1513-testutil.Tpo -c -o lib1513-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1513-testutil.Tpo $(DEPDIR)/lib1513-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1513-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1513-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1513-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1513-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1513-warnless.Tpo -c -o ../../lib/lib1513-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1513-warnless.Tpo ../../lib/$(DEPDIR)/lib1513-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1513-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1513-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1513-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1513-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1513-warnless.Tpo -c -o ../../lib/lib1513-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1513-warnless.Tpo ../../lib/$(DEPDIR)/lib1513-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1513-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1513_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1513-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1514-lib1514.o: lib1514.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-lib1514.o -MD -MP -MF $(DEPDIR)/lib1514-lib1514.Tpo -c -o lib1514-lib1514.o `test -f 'lib1514.c' || echo '$(srcdir)/'`lib1514.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-lib1514.Tpo $(DEPDIR)/lib1514-lib1514.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1514.c' object='lib1514-lib1514.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-lib1514.o `test -f 'lib1514.c' || echo '$(srcdir)/'`lib1514.c
    +
    +lib1514-lib1514.obj: lib1514.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-lib1514.obj -MD -MP -MF $(DEPDIR)/lib1514-lib1514.Tpo -c -o lib1514-lib1514.obj `if test -f 'lib1514.c'; then $(CYGPATH_W) 'lib1514.c'; else $(CYGPATH_W) '$(srcdir)/lib1514.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-lib1514.Tpo $(DEPDIR)/lib1514-lib1514.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1514.c' object='lib1514-lib1514.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-lib1514.obj `if test -f 'lib1514.c'; then $(CYGPATH_W) 'lib1514.c'; else $(CYGPATH_W) '$(srcdir)/lib1514.c'; fi`
    +
    +lib1514-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-first.o -MD -MP -MF $(DEPDIR)/lib1514-first.Tpo -c -o lib1514-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-first.Tpo $(DEPDIR)/lib1514-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1514-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1514-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-first.obj -MD -MP -MF $(DEPDIR)/lib1514-first.Tpo -c -o lib1514-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-first.Tpo $(DEPDIR)/lib1514-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1514-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1514-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-testutil.o -MD -MP -MF $(DEPDIR)/lib1514-testutil.Tpo -c -o lib1514-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-testutil.Tpo $(DEPDIR)/lib1514-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1514-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1514-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1514-testutil.obj -MD -MP -MF $(DEPDIR)/lib1514-testutil.Tpo -c -o lib1514-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1514-testutil.Tpo $(DEPDIR)/lib1514-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1514-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1514-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1514-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1514-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1514-warnless.Tpo -c -o ../../lib/lib1514-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1514-warnless.Tpo ../../lib/$(DEPDIR)/lib1514-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1514-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1514-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1514-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1514-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1514-warnless.Tpo -c -o ../../lib/lib1514-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1514-warnless.Tpo ../../lib/$(DEPDIR)/lib1514-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1514-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1514_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1514-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1515-lib1515.o: lib1515.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-lib1515.o -MD -MP -MF $(DEPDIR)/lib1515-lib1515.Tpo -c -o lib1515-lib1515.o `test -f 'lib1515.c' || echo '$(srcdir)/'`lib1515.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-lib1515.Tpo $(DEPDIR)/lib1515-lib1515.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1515.c' object='lib1515-lib1515.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-lib1515.o `test -f 'lib1515.c' || echo '$(srcdir)/'`lib1515.c
    +
    +lib1515-lib1515.obj: lib1515.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-lib1515.obj -MD -MP -MF $(DEPDIR)/lib1515-lib1515.Tpo -c -o lib1515-lib1515.obj `if test -f 'lib1515.c'; then $(CYGPATH_W) 'lib1515.c'; else $(CYGPATH_W) '$(srcdir)/lib1515.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-lib1515.Tpo $(DEPDIR)/lib1515-lib1515.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1515.c' object='lib1515-lib1515.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-lib1515.obj `if test -f 'lib1515.c'; then $(CYGPATH_W) 'lib1515.c'; else $(CYGPATH_W) '$(srcdir)/lib1515.c'; fi`
    +
    +lib1515-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-first.o -MD -MP -MF $(DEPDIR)/lib1515-first.Tpo -c -o lib1515-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-first.Tpo $(DEPDIR)/lib1515-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1515-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1515-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-first.obj -MD -MP -MF $(DEPDIR)/lib1515-first.Tpo -c -o lib1515-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-first.Tpo $(DEPDIR)/lib1515-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1515-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1515-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-testutil.o -MD -MP -MF $(DEPDIR)/lib1515-testutil.Tpo -c -o lib1515-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-testutil.Tpo $(DEPDIR)/lib1515-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1515-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1515-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1515-testutil.obj -MD -MP -MF $(DEPDIR)/lib1515-testutil.Tpo -c -o lib1515-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1515-testutil.Tpo $(DEPDIR)/lib1515-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1515-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1515-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1515-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1515-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1515-warnless.Tpo -c -o ../../lib/lib1515-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1515-warnless.Tpo ../../lib/$(DEPDIR)/lib1515-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1515-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1515-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1515-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1515-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1515-warnless.Tpo -c -o ../../lib/lib1515-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1515-warnless.Tpo ../../lib/$(DEPDIR)/lib1515-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1515-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1515_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1515-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1520-lib1520.o: lib1520.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1520-lib1520.o -MD -MP -MF $(DEPDIR)/lib1520-lib1520.Tpo -c -o lib1520-lib1520.o `test -f 'lib1520.c' || echo '$(srcdir)/'`lib1520.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1520-lib1520.Tpo $(DEPDIR)/lib1520-lib1520.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1520.c' object='lib1520-lib1520.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1520-lib1520.o `test -f 'lib1520.c' || echo '$(srcdir)/'`lib1520.c
    +
    +lib1520-lib1520.obj: lib1520.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1520-lib1520.obj -MD -MP -MF $(DEPDIR)/lib1520-lib1520.Tpo -c -o lib1520-lib1520.obj `if test -f 'lib1520.c'; then $(CYGPATH_W) 'lib1520.c'; else $(CYGPATH_W) '$(srcdir)/lib1520.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1520-lib1520.Tpo $(DEPDIR)/lib1520-lib1520.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1520.c' object='lib1520-lib1520.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1520-lib1520.obj `if test -f 'lib1520.c'; then $(CYGPATH_W) 'lib1520.c'; else $(CYGPATH_W) '$(srcdir)/lib1520.c'; fi`
    +
    +lib1520-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1520-first.o -MD -MP -MF $(DEPDIR)/lib1520-first.Tpo -c -o lib1520-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1520-first.Tpo $(DEPDIR)/lib1520-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1520-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1520-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1520-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1520-first.obj -MD -MP -MF $(DEPDIR)/lib1520-first.Tpo -c -o lib1520-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1520-first.Tpo $(DEPDIR)/lib1520-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1520-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1520-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1525-lib1525.o: lib1525.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-lib1525.o -MD -MP -MF $(DEPDIR)/lib1525-lib1525.Tpo -c -o lib1525-lib1525.o `test -f 'lib1525.c' || echo '$(srcdir)/'`lib1525.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-lib1525.Tpo $(DEPDIR)/lib1525-lib1525.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1525.c' object='lib1525-lib1525.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-lib1525.o `test -f 'lib1525.c' || echo '$(srcdir)/'`lib1525.c
    +
    +lib1525-lib1525.obj: lib1525.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-lib1525.obj -MD -MP -MF $(DEPDIR)/lib1525-lib1525.Tpo -c -o lib1525-lib1525.obj `if test -f 'lib1525.c'; then $(CYGPATH_W) 'lib1525.c'; else $(CYGPATH_W) '$(srcdir)/lib1525.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-lib1525.Tpo $(DEPDIR)/lib1525-lib1525.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1525.c' object='lib1525-lib1525.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-lib1525.obj `if test -f 'lib1525.c'; then $(CYGPATH_W) 'lib1525.c'; else $(CYGPATH_W) '$(srcdir)/lib1525.c'; fi`
    +
    +lib1525-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-first.o -MD -MP -MF $(DEPDIR)/lib1525-first.Tpo -c -o lib1525-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-first.Tpo $(DEPDIR)/lib1525-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1525-first.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1512-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
     
    -lib1512-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1512-warnless.obj -MD -MP -MF $(DEPDIR)/lib1512-warnless.Tpo -c -o lib1512-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1512-warnless.Tpo $(DEPDIR)/lib1512-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1512-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +lib1525-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-first.obj -MD -MP -MF $(DEPDIR)/lib1525-first.Tpo -c -o lib1525-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-first.Tpo $(DEPDIR)/lib1525-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1525-first.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1512_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1512-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1525-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-testutil.o -MD -MP -MF $(DEPDIR)/lib1525-testutil.Tpo -c -o lib1525-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-testutil.Tpo $(DEPDIR)/lib1525-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1525-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1525-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-testutil.obj -MD -MP -MF $(DEPDIR)/lib1525-testutil.Tpo -c -o lib1525-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-testutil.Tpo $(DEPDIR)/lib1525-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1525-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1525-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1525-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1525-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1525-warnless.Tpo -c -o ../../lib/lib1525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1525-warnless.Tpo ../../lib/$(DEPDIR)/lib1525-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1525-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1525-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1525-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1525-warnless.Tpo -c -o ../../lib/lib1525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1525-warnless.Tpo ../../lib/$(DEPDIR)/lib1525-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1525-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1526-lib1526.o: lib1526.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-lib1526.o -MD -MP -MF $(DEPDIR)/lib1526-lib1526.Tpo -c -o lib1526-lib1526.o `test -f 'lib1526.c' || echo '$(srcdir)/'`lib1526.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-lib1526.Tpo $(DEPDIR)/lib1526-lib1526.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1526.c' object='lib1526-lib1526.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-lib1526.o `test -f 'lib1526.c' || echo '$(srcdir)/'`lib1526.c
    +
    +lib1526-lib1526.obj: lib1526.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-lib1526.obj -MD -MP -MF $(DEPDIR)/lib1526-lib1526.Tpo -c -o lib1526-lib1526.obj `if test -f 'lib1526.c'; then $(CYGPATH_W) 'lib1526.c'; else $(CYGPATH_W) '$(srcdir)/lib1526.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-lib1526.Tpo $(DEPDIR)/lib1526-lib1526.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1526.c' object='lib1526-lib1526.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-lib1526.obj `if test -f 'lib1526.c'; then $(CYGPATH_W) 'lib1526.c'; else $(CYGPATH_W) '$(srcdir)/lib1526.c'; fi`
    +
    +lib1526-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-first.o -MD -MP -MF $(DEPDIR)/lib1526-first.Tpo -c -o lib1526-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-first.Tpo $(DEPDIR)/lib1526-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1526-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1526-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-first.obj -MD -MP -MF $(DEPDIR)/lib1526-first.Tpo -c -o lib1526-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-first.Tpo $(DEPDIR)/lib1526-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1526-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1526-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-testutil.o -MD -MP -MF $(DEPDIR)/lib1526-testutil.Tpo -c -o lib1526-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-testutil.Tpo $(DEPDIR)/lib1526-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1526-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1526-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1526-testutil.obj -MD -MP -MF $(DEPDIR)/lib1526-testutil.Tpo -c -o lib1526-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1526-testutil.Tpo $(DEPDIR)/lib1526-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1526-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1526-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1526-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1526-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1526-warnless.Tpo -c -o ../../lib/lib1526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1526-warnless.Tpo ../../lib/$(DEPDIR)/lib1526-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1526-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1526-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1526-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1526-warnless.Tpo -c -o ../../lib/lib1526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1526-warnless.Tpo ../../lib/$(DEPDIR)/lib1526-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1526-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1527-lib1527.o: lib1527.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-lib1527.o -MD -MP -MF $(DEPDIR)/lib1527-lib1527.Tpo -c -o lib1527-lib1527.o `test -f 'lib1527.c' || echo '$(srcdir)/'`lib1527.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-lib1527.Tpo $(DEPDIR)/lib1527-lib1527.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1527.c' object='lib1527-lib1527.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-lib1527.o `test -f 'lib1527.c' || echo '$(srcdir)/'`lib1527.c
    +
    +lib1527-lib1527.obj: lib1527.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-lib1527.obj -MD -MP -MF $(DEPDIR)/lib1527-lib1527.Tpo -c -o lib1527-lib1527.obj `if test -f 'lib1527.c'; then $(CYGPATH_W) 'lib1527.c'; else $(CYGPATH_W) '$(srcdir)/lib1527.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-lib1527.Tpo $(DEPDIR)/lib1527-lib1527.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1527.c' object='lib1527-lib1527.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-lib1527.obj `if test -f 'lib1527.c'; then $(CYGPATH_W) 'lib1527.c'; else $(CYGPATH_W) '$(srcdir)/lib1527.c'; fi`
    +
    +lib1527-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-first.o -MD -MP -MF $(DEPDIR)/lib1527-first.Tpo -c -o lib1527-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-first.Tpo $(DEPDIR)/lib1527-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1527-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1527-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-first.obj -MD -MP -MF $(DEPDIR)/lib1527-first.Tpo -c -o lib1527-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-first.Tpo $(DEPDIR)/lib1527-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1527-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1527-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-testutil.o -MD -MP -MF $(DEPDIR)/lib1527-testutil.Tpo -c -o lib1527-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-testutil.Tpo $(DEPDIR)/lib1527-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1527-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1527-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1527-testutil.obj -MD -MP -MF $(DEPDIR)/lib1527-testutil.Tpo -c -o lib1527-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1527-testutil.Tpo $(DEPDIR)/lib1527-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1527-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1527-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1527-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1527-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1527-warnless.Tpo -c -o ../../lib/lib1527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1527-warnless.Tpo ../../lib/$(DEPDIR)/lib1527-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1527-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1527-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1527-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1527-warnless.Tpo -c -o ../../lib/lib1527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1527-warnless.Tpo ../../lib/$(DEPDIR)/lib1527-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1527-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1528-lib1528.o: lib1528.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-lib1528.o -MD -MP -MF $(DEPDIR)/lib1528-lib1528.Tpo -c -o lib1528-lib1528.o `test -f 'lib1528.c' || echo '$(srcdir)/'`lib1528.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-lib1528.Tpo $(DEPDIR)/lib1528-lib1528.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1528.c' object='lib1528-lib1528.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-lib1528.o `test -f 'lib1528.c' || echo '$(srcdir)/'`lib1528.c
    +
    +lib1528-lib1528.obj: lib1528.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-lib1528.obj -MD -MP -MF $(DEPDIR)/lib1528-lib1528.Tpo -c -o lib1528-lib1528.obj `if test -f 'lib1528.c'; then $(CYGPATH_W) 'lib1528.c'; else $(CYGPATH_W) '$(srcdir)/lib1528.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-lib1528.Tpo $(DEPDIR)/lib1528-lib1528.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1528.c' object='lib1528-lib1528.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-lib1528.obj `if test -f 'lib1528.c'; then $(CYGPATH_W) 'lib1528.c'; else $(CYGPATH_W) '$(srcdir)/lib1528.c'; fi`
    +
    +lib1528-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-first.o -MD -MP -MF $(DEPDIR)/lib1528-first.Tpo -c -o lib1528-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-first.Tpo $(DEPDIR)/lib1528-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1528-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1528-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-first.obj -MD -MP -MF $(DEPDIR)/lib1528-first.Tpo -c -o lib1528-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-first.Tpo $(DEPDIR)/lib1528-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1528-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1528-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-testutil.o -MD -MP -MF $(DEPDIR)/lib1528-testutil.Tpo -c -o lib1528-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-testutil.Tpo $(DEPDIR)/lib1528-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1528-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1528-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1528-testutil.obj -MD -MP -MF $(DEPDIR)/lib1528-testutil.Tpo -c -o lib1528-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1528-testutil.Tpo $(DEPDIR)/lib1528-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1528-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1528-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1528-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1528-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1528-warnless.Tpo -c -o ../../lib/lib1528-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1528-warnless.Tpo ../../lib/$(DEPDIR)/lib1528-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1528-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1528-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1528-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1528-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1528-warnless.Tpo -c -o ../../lib/lib1528-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1528-warnless.Tpo ../../lib/$(DEPDIR)/lib1528-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1528-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1528_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1528-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
    +lib1529-lib1529.o: lib1529.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-lib1529.o -MD -MP -MF $(DEPDIR)/lib1529-lib1529.Tpo -c -o lib1529-lib1529.o `test -f 'lib1529.c' || echo '$(srcdir)/'`lib1529.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-lib1529.Tpo $(DEPDIR)/lib1529-lib1529.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1529.c' object='lib1529-lib1529.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-lib1529.o `test -f 'lib1529.c' || echo '$(srcdir)/'`lib1529.c
    +
    +lib1529-lib1529.obj: lib1529.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-lib1529.obj -MD -MP -MF $(DEPDIR)/lib1529-lib1529.Tpo -c -o lib1529-lib1529.obj `if test -f 'lib1529.c'; then $(CYGPATH_W) 'lib1529.c'; else $(CYGPATH_W) '$(srcdir)/lib1529.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-lib1529.Tpo $(DEPDIR)/lib1529-lib1529.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1529.c' object='lib1529-lib1529.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-lib1529.obj `if test -f 'lib1529.c'; then $(CYGPATH_W) 'lib1529.c'; else $(CYGPATH_W) '$(srcdir)/lib1529.c'; fi`
    +
    +lib1529-first.o: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-first.o -MD -MP -MF $(DEPDIR)/lib1529-first.Tpo -c -o lib1529-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-first.Tpo $(DEPDIR)/lib1529-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1529-first.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
    +
    +lib1529-first.obj: first.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-first.obj -MD -MP -MF $(DEPDIR)/lib1529-first.Tpo -c -o lib1529-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-first.Tpo $(DEPDIR)/lib1529-first.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1529-first.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
    +
    +lib1529-testutil.o: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-testutil.o -MD -MP -MF $(DEPDIR)/lib1529-testutil.Tpo -c -o lib1529-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-testutil.Tpo $(DEPDIR)/lib1529-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1529-testutil.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
    +
    +lib1529-testutil.obj: testutil.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1529-testutil.obj -MD -MP -MF $(DEPDIR)/lib1529-testutil.Tpo -c -o lib1529-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1529-testutil.Tpo $(DEPDIR)/lib1529-testutil.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1529-testutil.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1529-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
    +
    +../../lib/lib1529-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1529-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1529-warnless.Tpo -c -o ../../lib/lib1529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1529-warnless.Tpo ../../lib/$(DEPDIR)/lib1529-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1529-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib1529-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1529-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1529-warnless.Tpo -c -o ../../lib/lib1529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1529-warnless.Tpo ../../lib/$(DEPDIR)/lib1529-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1529-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib1900-lib1900.o: lib1900.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-lib1900.o -MD -MP -MF $(DEPDIR)/lib1900-lib1900.Tpo -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c
    @@ -2886,19 +3644,19 @@ lib1900-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1900-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib1900-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-warnless.o -MD -MP -MF $(DEPDIR)/lib1900-warnless.Tpo -c -o lib1900-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1900-warnless.Tpo $(DEPDIR)/lib1900-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1900-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1900-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1900-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1900-warnless.Tpo -c -o ../../lib/lib1900-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1900-warnless.Tpo ../../lib/$(DEPDIR)/lib1900-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1900-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1900-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1900-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib1900-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-warnless.obj -MD -MP -MF $(DEPDIR)/lib1900-warnless.Tpo -c -o lib1900-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1900-warnless.Tpo $(DEPDIR)/lib1900-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib1900-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib1900-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1900-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1900-warnless.Tpo -c -o ../../lib/lib1900-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1900-warnless.Tpo ../../lib/$(DEPDIR)/lib1900-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1900-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1900-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1900-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib2033-libntlmconnect.o: libntlmconnect.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib2033-libntlmconnect.o -MD -MP -MF $(DEPDIR)/lib2033-libntlmconnect.Tpo -c -o lib2033-libntlmconnect.o `test -f 'libntlmconnect.c' || echo '$(srcdir)/'`libntlmconnect.c
    @@ -2942,19 +3700,19 @@ lib2033-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib2033-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib2033-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib2033-warnless.o -MD -MP -MF $(DEPDIR)/lib2033-warnless.Tpo -c -o lib2033-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib2033-warnless.Tpo $(DEPDIR)/lib2033-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib2033-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib2033-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib2033-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib2033-warnless.Tpo -c -o ../../lib/lib2033-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib2033-warnless.Tpo ../../lib/$(DEPDIR)/lib2033-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib2033-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib2033-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib2033-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib2033-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib2033-warnless.obj -MD -MP -MF $(DEPDIR)/lib2033-warnless.Tpo -c -o lib2033-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib2033-warnless.Tpo $(DEPDIR)/lib2033-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib2033-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib2033-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib2033-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib2033-warnless.Tpo -c -o ../../lib/lib2033-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib2033-warnless.Tpo ../../lib/$(DEPDIR)/lib2033-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib2033-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib2033-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib2033-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib500-lib500.o: lib500.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib500_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib500-lib500.o -MD -MP -MF $(DEPDIR)/lib500-lib500.Tpo -c -o lib500-lib500.o `test -f 'lib500.c' || echo '$(srcdir)/'`lib500.c
    @@ -3082,19 +3840,19 @@ lib502-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib502-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib502-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib502-warnless.o -MD -MP -MF $(DEPDIR)/lib502-warnless.Tpo -c -o lib502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib502-warnless.Tpo $(DEPDIR)/lib502-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib502-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib502-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib502-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib502-warnless.Tpo -c -o ../../lib/lib502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib502-warnless.Tpo ../../lib/$(DEPDIR)/lib502-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib502-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib502-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib502-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib502-warnless.obj -MD -MP -MF $(DEPDIR)/lib502-warnless.Tpo -c -o lib502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib502-warnless.Tpo $(DEPDIR)/lib502-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib502-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib502-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib502-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib502-warnless.Tpo -c -o ../../lib/lib502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib502-warnless.Tpo ../../lib/$(DEPDIR)/lib502-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib502-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib502_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib502-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib503-lib503.o: lib503.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib503-lib503.o -MD -MP -MF $(DEPDIR)/lib503-lib503.Tpo -c -o lib503-lib503.o `test -f 'lib503.c' || echo '$(srcdir)/'`lib503.c
    @@ -3138,19 +3896,19 @@ lib503-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib503-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib503-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib503-warnless.o -MD -MP -MF $(DEPDIR)/lib503-warnless.Tpo -c -o lib503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib503-warnless.Tpo $(DEPDIR)/lib503-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib503-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib503-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib503-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib503-warnless.Tpo -c -o ../../lib/lib503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib503-warnless.Tpo ../../lib/$(DEPDIR)/lib503-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib503-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib503-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib503-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib503-warnless.obj -MD -MP -MF $(DEPDIR)/lib503-warnless.Tpo -c -o lib503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib503-warnless.Tpo $(DEPDIR)/lib503-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib503-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib503-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib503-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib503-warnless.Tpo -c -o ../../lib/lib503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib503-warnless.Tpo ../../lib/$(DEPDIR)/lib503-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib503-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib503_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib503-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib504-lib504.o: lib504.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib504-lib504.o -MD -MP -MF $(DEPDIR)/lib504-lib504.Tpo -c -o lib504-lib504.o `test -f 'lib504.c' || echo '$(srcdir)/'`lib504.c
    @@ -3194,19 +3952,19 @@ lib504-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib504-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib504-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib504-warnless.o -MD -MP -MF $(DEPDIR)/lib504-warnless.Tpo -c -o lib504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib504-warnless.Tpo $(DEPDIR)/lib504-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib504-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib504-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib504-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib504-warnless.Tpo -c -o ../../lib/lib504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib504-warnless.Tpo ../../lib/$(DEPDIR)/lib504-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib504-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib504-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib504-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib504-warnless.obj -MD -MP -MF $(DEPDIR)/lib504-warnless.Tpo -c -o lib504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib504-warnless.Tpo $(DEPDIR)/lib504-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib504-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib504-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib504-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib504-warnless.Tpo -c -o ../../lib/lib504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib504-warnless.Tpo ../../lib/$(DEPDIR)/lib504-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib504-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib504_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib504-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib505-lib505.o: lib505.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib505_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib505-lib505.o -MD -MP -MF $(DEPDIR)/lib505-lib505.Tpo -c -o lib505-lib505.o `test -f 'lib505.c' || echo '$(srcdir)/'`lib505.c
    @@ -3306,19 +4064,19 @@ lib507-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib507-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib507-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib507-warnless.o -MD -MP -MF $(DEPDIR)/lib507-warnless.Tpo -c -o lib507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib507-warnless.Tpo $(DEPDIR)/lib507-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib507-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib507-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib507-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib507-warnless.Tpo -c -o ../../lib/lib507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib507-warnless.Tpo ../../lib/$(DEPDIR)/lib507-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib507-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib507-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib507-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib507-warnless.obj -MD -MP -MF $(DEPDIR)/lib507-warnless.Tpo -c -o lib507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib507-warnless.Tpo $(DEPDIR)/lib507-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib507-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib507-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib507-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib507-warnless.Tpo -c -o ../../lib/lib507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib507-warnless.Tpo ../../lib/$(DEPDIR)/lib507-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib507-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib507_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib507-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib508-lib508.o: lib508.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib508_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib508-lib508.o -MD -MP -MF $(DEPDIR)/lib508-lib508.Tpo -c -o lib508-lib508.o `test -f 'lib508.c' || echo '$(srcdir)/'`lib508.c
    @@ -3628,19 +4386,19 @@ lib518-first.obj: first.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib518-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
     
    -lib518-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib518-warnless.o -MD -MP -MF $(DEPDIR)/lib518-warnless.Tpo -c -o lib518-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib518-warnless.Tpo $(DEPDIR)/lib518-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib518-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib518-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib518-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib518-warnless.Tpo -c -o ../../lib/lib518-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib518-warnless.Tpo ../../lib/$(DEPDIR)/lib518-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib518-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib518-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib518-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib518-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib518-warnless.obj -MD -MP -MF $(DEPDIR)/lib518-warnless.Tpo -c -o lib518-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib518-warnless.Tpo $(DEPDIR)/lib518-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib518-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib518-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib518-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib518-warnless.Tpo -c -o ../../lib/lib518-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib518-warnless.Tpo ../../lib/$(DEPDIR)/lib518-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib518-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib518-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib518-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib519-lib519.o: lib519.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib519_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib519-lib519.o -MD -MP -MF $(DEPDIR)/lib519-lib519.Tpo -c -o lib519-lib519.o `test -f 'lib519.c' || echo '$(srcdir)/'`lib519.c
    @@ -3824,19 +4582,19 @@ lib525-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib525-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib525-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib525-warnless.o -MD -MP -MF $(DEPDIR)/lib525-warnless.Tpo -c -o lib525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib525-warnless.Tpo $(DEPDIR)/lib525-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib525-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib525-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib525-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib525-warnless.Tpo -c -o ../../lib/lib525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib525-warnless.Tpo ../../lib/$(DEPDIR)/lib525-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib525-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib525-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib525-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib525-warnless.obj -MD -MP -MF $(DEPDIR)/lib525-warnless.Tpo -c -o lib525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib525-warnless.Tpo $(DEPDIR)/lib525-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib525-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib525-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib525-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib525-warnless.Tpo -c -o ../../lib/lib525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib525-warnless.Tpo ../../lib/$(DEPDIR)/lib525-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib525-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib525-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib526-lib526.o: lib526.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib526-lib526.o -MD -MP -MF $(DEPDIR)/lib526-lib526.Tpo -c -o lib526-lib526.o `test -f 'lib526.c' || echo '$(srcdir)/'`lib526.c
    @@ -3880,19 +4638,19 @@ lib526-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib526-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib526-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib526-warnless.o -MD -MP -MF $(DEPDIR)/lib526-warnless.Tpo -c -o lib526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib526-warnless.Tpo $(DEPDIR)/lib526-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib526-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib526-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib526-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib526-warnless.Tpo -c -o ../../lib/lib526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib526-warnless.Tpo ../../lib/$(DEPDIR)/lib526-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib526-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib526-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib526-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib526-warnless.obj -MD -MP -MF $(DEPDIR)/lib526-warnless.Tpo -c -o lib526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib526-warnless.Tpo $(DEPDIR)/lib526-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib526-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib526-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib526-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib526-warnless.Tpo -c -o ../../lib/lib526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib526-warnless.Tpo ../../lib/$(DEPDIR)/lib526-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib526-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib526_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib526-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib527-lib526.o: lib526.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib527-lib526.o -MD -MP -MF $(DEPDIR)/lib527-lib526.Tpo -c -o lib527-lib526.o `test -f 'lib526.c' || echo '$(srcdir)/'`lib526.c
    @@ -3936,19 +4694,19 @@ lib527-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib527-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib527-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib527-warnless.o -MD -MP -MF $(DEPDIR)/lib527-warnless.Tpo -c -o lib527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib527-warnless.Tpo $(DEPDIR)/lib527-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib527-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib527-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib527-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib527-warnless.Tpo -c -o ../../lib/lib527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib527-warnless.Tpo ../../lib/$(DEPDIR)/lib527-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib527-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib527-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib527-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib527-warnless.obj -MD -MP -MF $(DEPDIR)/lib527-warnless.Tpo -c -o lib527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib527-warnless.Tpo $(DEPDIR)/lib527-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib527-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib527-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib527-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib527-warnless.Tpo -c -o ../../lib/lib527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib527-warnless.Tpo ../../lib/$(DEPDIR)/lib527-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib527-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib527_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib527-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib529-lib525.o: lib525.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib529-lib525.o -MD -MP -MF $(DEPDIR)/lib529-lib525.Tpo -c -o lib529-lib525.o `test -f 'lib525.c' || echo '$(srcdir)/'`lib525.c
    @@ -3992,19 +4750,19 @@ lib529-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib529-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib529-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib529-warnless.o -MD -MP -MF $(DEPDIR)/lib529-warnless.Tpo -c -o lib529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib529-warnless.Tpo $(DEPDIR)/lib529-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib529-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib529-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib529-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib529-warnless.Tpo -c -o ../../lib/lib529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib529-warnless.Tpo ../../lib/$(DEPDIR)/lib529-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib529-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib529-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib529-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib529-warnless.obj -MD -MP -MF $(DEPDIR)/lib529-warnless.Tpo -c -o lib529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib529-warnless.Tpo $(DEPDIR)/lib529-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib529-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib529-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib529-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib529-warnless.Tpo -c -o ../../lib/lib529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib529-warnless.Tpo ../../lib/$(DEPDIR)/lib529-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib529-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib529_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib529-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib530-lib530.o: lib530.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib530-lib530.o -MD -MP -MF $(DEPDIR)/lib530-lib530.Tpo -c -o lib530-lib530.o `test -f 'lib530.c' || echo '$(srcdir)/'`lib530.c
    @@ -4048,19 +4806,19 @@ lib530-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib530-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib530-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib530-warnless.o -MD -MP -MF $(DEPDIR)/lib530-warnless.Tpo -c -o lib530-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib530-warnless.Tpo $(DEPDIR)/lib530-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib530-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib530-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib530-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib530-warnless.Tpo -c -o ../../lib/lib530-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib530-warnless.Tpo ../../lib/$(DEPDIR)/lib530-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib530-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib530-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib530-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib530-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib530-warnless.obj -MD -MP -MF $(DEPDIR)/lib530-warnless.Tpo -c -o lib530-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib530-warnless.Tpo $(DEPDIR)/lib530-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib530-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib530-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib530-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib530-warnless.Tpo -c -o ../../lib/lib530-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib530-warnless.Tpo ../../lib/$(DEPDIR)/lib530-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib530-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib530-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib530_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib530-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib532-lib526.o: lib526.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib532-lib526.o -MD -MP -MF $(DEPDIR)/lib532-lib526.Tpo -c -o lib532-lib526.o `test -f 'lib526.c' || echo '$(srcdir)/'`lib526.c
    @@ -4104,19 +4862,19 @@ lib532-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib532-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib532-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib532-warnless.o -MD -MP -MF $(DEPDIR)/lib532-warnless.Tpo -c -o lib532-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib532-warnless.Tpo $(DEPDIR)/lib532-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib532-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib532-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib532-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib532-warnless.Tpo -c -o ../../lib/lib532-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib532-warnless.Tpo ../../lib/$(DEPDIR)/lib532-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib532-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib532-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib532-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib532-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib532-warnless.obj -MD -MP -MF $(DEPDIR)/lib532-warnless.Tpo -c -o lib532-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib532-warnless.Tpo $(DEPDIR)/lib532-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib532-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib532-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib532-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib532-warnless.Tpo -c -o ../../lib/lib532-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib532-warnless.Tpo ../../lib/$(DEPDIR)/lib532-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib532-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib532-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib532_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib532-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib533-lib533.o: lib533.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib533-lib533.o -MD -MP -MF $(DEPDIR)/lib533-lib533.Tpo -c -o lib533-lib533.o `test -f 'lib533.c' || echo '$(srcdir)/'`lib533.c
    @@ -4160,19 +4918,19 @@ lib533-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib533-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib533-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib533-warnless.o -MD -MP -MF $(DEPDIR)/lib533-warnless.Tpo -c -o lib533-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib533-warnless.Tpo $(DEPDIR)/lib533-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib533-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib533-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib533-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib533-warnless.Tpo -c -o ../../lib/lib533-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib533-warnless.Tpo ../../lib/$(DEPDIR)/lib533-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib533-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib533-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib533-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib533-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib533-warnless.obj -MD -MP -MF $(DEPDIR)/lib533-warnless.Tpo -c -o lib533-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib533-warnless.Tpo $(DEPDIR)/lib533-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib533-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib533-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib533-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib533-warnless.Tpo -c -o ../../lib/lib533-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib533-warnless.Tpo ../../lib/$(DEPDIR)/lib533-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib533-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib533-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib533-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib536-lib536.o: lib536.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-lib536.o -MD -MP -MF $(DEPDIR)/lib536-lib536.Tpo -c -o lib536-lib536.o `test -f 'lib536.c' || echo '$(srcdir)/'`lib536.c
    @@ -4216,19 +4974,19 @@ lib536-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib536-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-warnless.o -MD -MP -MF $(DEPDIR)/lib536-warnless.Tpo -c -o lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib536-warnless.Tpo $(DEPDIR)/lib536-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib536-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib536-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib536-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib536-warnless.Tpo -c -o ../../lib/lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib536-warnless.Tpo ../../lib/$(DEPDIR)/lib536-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib536-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib536-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-warnless.obj -MD -MP -MF $(DEPDIR)/lib536-warnless.Tpo -c -o lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib536-warnless.Tpo $(DEPDIR)/lib536-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib536-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib536-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib536-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib536-warnless.Tpo -c -o ../../lib/lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib536-warnless.Tpo ../../lib/$(DEPDIR)/lib536-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib536-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib537-lib537.o: lib537.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib537-lib537.o -MD -MP -MF $(DEPDIR)/lib537-lib537.Tpo -c -o lib537-lib537.o `test -f 'lib537.c' || echo '$(srcdir)/'`lib537.c
    @@ -4258,19 +5016,19 @@ lib537-first.obj: first.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib537-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
     
    -lib537-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib537-warnless.o -MD -MP -MF $(DEPDIR)/lib537-warnless.Tpo -c -o lib537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib537-warnless.Tpo $(DEPDIR)/lib537-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib537-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib537-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib537-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib537-warnless.Tpo -c -o ../../lib/lib537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib537-warnless.Tpo ../../lib/$(DEPDIR)/lib537-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib537-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib537-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib537-warnless.obj -MD -MP -MF $(DEPDIR)/lib537-warnless.Tpo -c -o lib537-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib537-warnless.Tpo $(DEPDIR)/lib537-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib537-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib537-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib537-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib537-warnless.Tpo -c -o ../../lib/lib537-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib537-warnless.Tpo ../../lib/$(DEPDIR)/lib537-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib537-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib537-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib537-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib539-lib539.o: lib539.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib539_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib539-lib539.o -MD -MP -MF $(DEPDIR)/lib539-lib539.Tpo -c -o lib539-lib539.o `test -f 'lib539.c' || echo '$(srcdir)/'`lib539.c
    @@ -4342,19 +5100,19 @@ lib540-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib540-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib540-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib540-warnless.o -MD -MP -MF $(DEPDIR)/lib540-warnless.Tpo -c -o lib540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib540-warnless.Tpo $(DEPDIR)/lib540-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib540-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib540-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib540-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib540-warnless.Tpo -c -o ../../lib/lib540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib540-warnless.Tpo ../../lib/$(DEPDIR)/lib540-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib540-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib540-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib540-warnless.obj -MD -MP -MF $(DEPDIR)/lib540-warnless.Tpo -c -o lib540-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib540-warnless.Tpo $(DEPDIR)/lib540-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib540-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib540-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib540-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib540-warnless.Tpo -c -o ../../lib/lib540-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib540-warnless.Tpo ../../lib/$(DEPDIR)/lib540-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib540-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib540-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib540-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib541-lib541.o: lib541.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib541-lib541.o -MD -MP -MF $(DEPDIR)/lib541-lib541.Tpo -c -o lib541-lib541.o `test -f 'lib541.c' || echo '$(srcdir)/'`lib541.c
    @@ -4608,19 +5366,19 @@ lib552-first.obj: first.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib552-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
     
    -lib552-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib552-warnless.o -MD -MP -MF $(DEPDIR)/lib552-warnless.Tpo -c -o lib552-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib552-warnless.Tpo $(DEPDIR)/lib552-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib552-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib552-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib552-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib552-warnless.Tpo -c -o ../../lib/lib552-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib552-warnless.Tpo ../../lib/$(DEPDIR)/lib552-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib552-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib552-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib552-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib552-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib552-warnless.obj -MD -MP -MF $(DEPDIR)/lib552-warnless.Tpo -c -o lib552-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib552-warnless.Tpo $(DEPDIR)/lib552-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib552-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib552-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib552-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib552-warnless.Tpo -c -o ../../lib/lib552-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib552-warnless.Tpo ../../lib/$(DEPDIR)/lib552-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib552-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib552-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib552_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib552-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib553-lib553.o: lib553.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib553_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib553-lib553.o -MD -MP -MF $(DEPDIR)/lib553-lib553.Tpo -c -o lib553-lib553.o `test -f 'lib553.c' || echo '$(srcdir)/'`lib553.c
    @@ -4720,19 +5478,19 @@ lib555-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib555-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib555-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib555-warnless.o -MD -MP -MF $(DEPDIR)/lib555-warnless.Tpo -c -o lib555-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib555-warnless.Tpo $(DEPDIR)/lib555-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib555-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib555-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib555-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib555-warnless.Tpo -c -o ../../lib/lib555-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib555-warnless.Tpo ../../lib/$(DEPDIR)/lib555-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib555-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib555-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib555-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib555-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib555-warnless.obj -MD -MP -MF $(DEPDIR)/lib555-warnless.Tpo -c -o lib555-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib555-warnless.Tpo $(DEPDIR)/lib555-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib555-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib555-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib555-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib555-warnless.Tpo -c -o ../../lib/lib555-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib555-warnless.Tpo ../../lib/$(DEPDIR)/lib555-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib555-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib555-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib555_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib555-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib556-lib556.o: lib556.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib556-lib556.o -MD -MP -MF $(DEPDIR)/lib556-lib556.Tpo -c -o lib556-lib556.o `test -f 'lib556.c' || echo '$(srcdir)/'`lib556.c
    @@ -4762,6 +5520,20 @@ lib556-first.obj: first.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib556-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
     
    +../../lib/lib556-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib556-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib556-warnless.Tpo -c -o ../../lib/lib556-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib556-warnless.Tpo ../../lib/$(DEPDIR)/lib556-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib556-warnless.o' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib556-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +
    +../../lib/lib556-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib556-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib556-warnless.Tpo -c -o ../../lib/lib556-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib556-warnless.Tpo ../../lib/$(DEPDIR)/lib556-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib556-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib556_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib556-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +
     lib557-lib557.o: lib557.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib557_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib557-lib557.o -MD -MP -MF $(DEPDIR)/lib557-lib557.Tpo -c -o lib557-lib557.o `test -f 'lib557.c' || echo '$(srcdir)/'`lib557.c
     @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib557-lib557.Tpo $(DEPDIR)/lib557-lib557.Po
    @@ -4860,19 +5632,19 @@ lib560-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib560-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib560-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib560-warnless.o -MD -MP -MF $(DEPDIR)/lib560-warnless.Tpo -c -o lib560-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib560-warnless.Tpo $(DEPDIR)/lib560-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib560-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib560-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib560-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib560-warnless.Tpo -c -o ../../lib/lib560-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib560-warnless.Tpo ../../lib/$(DEPDIR)/lib560-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib560-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib560-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib560-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib560-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib560-warnless.obj -MD -MP -MF $(DEPDIR)/lib560-warnless.Tpo -c -o lib560-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib560-warnless.Tpo $(DEPDIR)/lib560-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib560-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib560-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib560-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib560-warnless.Tpo -c -o ../../lib/lib560-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib560-warnless.Tpo ../../lib/$(DEPDIR)/lib560-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib560-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib560-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib560-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib562-lib562.o: lib562.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib562_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib562-lib562.o -MD -MP -MF $(DEPDIR)/lib562-lib562.Tpo -c -o lib562-lib562.o `test -f 'lib562.c' || echo '$(srcdir)/'`lib562.c
    @@ -4944,19 +5716,19 @@ lib564-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib564-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib564-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib564-warnless.o -MD -MP -MF $(DEPDIR)/lib564-warnless.Tpo -c -o lib564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib564-warnless.Tpo $(DEPDIR)/lib564-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib564-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib564-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib564-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib564-warnless.Tpo -c -o ../../lib/lib564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib564-warnless.Tpo ../../lib/$(DEPDIR)/lib564-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib564-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib564-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib564-warnless.obj -MD -MP -MF $(DEPDIR)/lib564-warnless.Tpo -c -o lib564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib564-warnless.Tpo $(DEPDIR)/lib564-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib564-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib564-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib564-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib564-warnless.Tpo -c -o ../../lib/lib564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib564-warnless.Tpo ../../lib/$(DEPDIR)/lib564-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib564-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib565-lib510.o: lib510.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib565-lib510.o -MD -MP -MF $(DEPDIR)/lib565-lib510.Tpo -c -o lib565-lib510.o `test -f 'lib510.c' || echo '$(srcdir)/'`lib510.c
    @@ -5154,19 +5926,19 @@ lib571-first.obj: first.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib571-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
     
    -lib571-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib571-warnless.o -MD -MP -MF $(DEPDIR)/lib571-warnless.Tpo -c -o lib571-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib571-warnless.Tpo $(DEPDIR)/lib571-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib571-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib571-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib571-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib571-warnless.Tpo -c -o ../../lib/lib571-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib571-warnless.Tpo ../../lib/$(DEPDIR)/lib571-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib571-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib571-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib571-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib571-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib571-warnless.obj -MD -MP -MF $(DEPDIR)/lib571-warnless.Tpo -c -o lib571-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib571-warnless.Tpo $(DEPDIR)/lib571-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib571-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib571-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib571-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib571-warnless.Tpo -c -o ../../lib/lib571-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib571-warnless.Tpo ../../lib/$(DEPDIR)/lib571-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib571-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib571-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib571_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib571-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib572-lib572.o: lib572.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib572_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib572-lib572.o -MD -MP -MF $(DEPDIR)/lib572-lib572.Tpo -c -o lib572-lib572.o `test -f 'lib572.c' || echo '$(srcdir)/'`lib572.c
    @@ -5238,19 +6010,19 @@ lib573-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib573-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib573-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib573-warnless.o -MD -MP -MF $(DEPDIR)/lib573-warnless.Tpo -c -o lib573-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib573-warnless.Tpo $(DEPDIR)/lib573-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib573-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib573-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib573-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib573-warnless.Tpo -c -o ../../lib/lib573-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib573-warnless.Tpo ../../lib/$(DEPDIR)/lib573-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib573-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib573-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib573-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib573-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib573-warnless.obj -MD -MP -MF $(DEPDIR)/lib573-warnless.Tpo -c -o lib573-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib573-warnless.Tpo $(DEPDIR)/lib573-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib573-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib573-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib573-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib573-warnless.Tpo -c -o ../../lib/lib573-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib573-warnless.Tpo ../../lib/$(DEPDIR)/lib573-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib573-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib573-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib573-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib573-testtrace.o: testtrace.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib573_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib573-testtrace.o -MD -MP -MF $(DEPDIR)/lib573-testtrace.Tpo -c -o lib573-testtrace.o `test -f 'testtrace.c' || echo '$(srcdir)/'`testtrace.c
    @@ -5336,19 +6108,19 @@ lib575-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib575-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib575-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib575-warnless.o -MD -MP -MF $(DEPDIR)/lib575-warnless.Tpo -c -o lib575-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib575-warnless.Tpo $(DEPDIR)/lib575-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib575-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib575-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib575-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib575-warnless.Tpo -c -o ../../lib/lib575-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib575-warnless.Tpo ../../lib/$(DEPDIR)/lib575-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib575-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib575-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib575-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib575-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib575-warnless.obj -MD -MP -MF $(DEPDIR)/lib575-warnless.Tpo -c -o lib575-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib575-warnless.Tpo $(DEPDIR)/lib575-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib575-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib575-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib575-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib575-warnless.Tpo -c -o ../../lib/lib575-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib575-warnless.Tpo ../../lib/$(DEPDIR)/lib575-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib575-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib575-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib575_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib575-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib576-lib576.o: lib576.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib576_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib576-lib576.o -MD -MP -MF $(DEPDIR)/lib576-lib576.Tpo -c -o lib576-lib576.o `test -f 'lib576.c' || echo '$(srcdir)/'`lib576.c
    @@ -5476,19 +6248,19 @@ lib582-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib582-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib582-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib582-warnless.o -MD -MP -MF $(DEPDIR)/lib582-warnless.Tpo -c -o lib582-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib582-warnless.Tpo $(DEPDIR)/lib582-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib582-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib582-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib582-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib582-warnless.Tpo -c -o ../../lib/lib582-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib582-warnless.Tpo ../../lib/$(DEPDIR)/lib582-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib582-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib582-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib582-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib582-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib582-warnless.obj -MD -MP -MF $(DEPDIR)/lib582-warnless.Tpo -c -o lib582-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib582-warnless.Tpo $(DEPDIR)/lib582-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib582-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib582-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib582-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib582-warnless.Tpo -c -o ../../lib/lib582-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib582-warnless.Tpo ../../lib/$(DEPDIR)/lib582-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib582-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib582-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib582_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib582-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib583-lib583.o: lib583.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib583_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib583-lib583.o -MD -MP -MF $(DEPDIR)/lib583-lib583.Tpo -c -o lib583-lib583.o `test -f 'lib583.c' || echo '$(srcdir)/'`lib583.c
    @@ -5700,19 +6472,19 @@ lib591-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib591-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib591-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib591-warnless.o -MD -MP -MF $(DEPDIR)/lib591-warnless.Tpo -c -o lib591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib591-warnless.Tpo $(DEPDIR)/lib591-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib591-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib591-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib591-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib591-warnless.Tpo -c -o ../../lib/lib591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib591-warnless.Tpo ../../lib/$(DEPDIR)/lib591-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib591-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib591-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib591-warnless.obj -MD -MP -MF $(DEPDIR)/lib591-warnless.Tpo -c -o lib591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib591-warnless.Tpo $(DEPDIR)/lib591-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib591-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib591-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib591-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib591-warnless.Tpo -c -o ../../lib/lib591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib591-warnless.Tpo ../../lib/$(DEPDIR)/lib591-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib591-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib597-lib597.o: lib597.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib597-lib597.o -MD -MP -MF $(DEPDIR)/lib597-lib597.Tpo -c -o lib597-lib597.o `test -f 'lib597.c' || echo '$(srcdir)/'`lib597.c
    @@ -5756,19 +6528,19 @@ lib597-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib597-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -lib597-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib597-warnless.o -MD -MP -MF $(DEPDIR)/lib597-warnless.Tpo -c -o lib597-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib597-warnless.Tpo $(DEPDIR)/lib597-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib597-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib597-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib597-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib597-warnless.Tpo -c -o ../../lib/lib597-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib597-warnless.Tpo ../../lib/$(DEPDIR)/lib597-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib597-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib597-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib597-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -lib597-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib597-warnless.obj -MD -MP -MF $(DEPDIR)/lib597-warnless.Tpo -c -o lib597-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib597-warnless.Tpo $(DEPDIR)/lib597-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='lib597-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/lib597-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib597-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib597-warnless.Tpo -c -o ../../lib/lib597-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib597-warnless.Tpo ../../lib/$(DEPDIR)/lib597-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib597-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib597-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib597_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib597-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     lib598-lib598.o: lib598.c
     @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib598_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib598-lib598.o -MD -MP -MF $(DEPDIR)/lib598-lib598.Tpo -c -o lib598-lib598.o `test -f 'lib598.c' || echo '$(srcdir)/'`lib598.c
    @@ -5896,19 +6668,19 @@ libntlmconnect-testutil.obj: testutil.c
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libntlmconnect-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
     
    -libntlmconnect-warnless.o: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libntlmconnect-warnless.o -MD -MP -MF $(DEPDIR)/libntlmconnect-warnless.Tpo -c -o libntlmconnect-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libntlmconnect-warnless.Tpo $(DEPDIR)/libntlmconnect-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='libntlmconnect-warnless.o' libtool=no @AMDEPBACKSLASH@
    +../../lib/libntlmconnect-warnless.o: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/libntlmconnect-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/libntlmconnect-warnless.Tpo -c -o ../../lib/libntlmconnect-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/libntlmconnect-warnless.Tpo ../../lib/$(DEPDIR)/libntlmconnect-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/libntlmconnect-warnless.o' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libntlmconnect-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/libntlmconnect-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
     
    -libntlmconnect-warnless.obj: ../../lib/warnless.c
    -@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libntlmconnect-warnless.obj -MD -MP -MF $(DEPDIR)/libntlmconnect-warnless.Tpo -c -o libntlmconnect-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    -@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libntlmconnect-warnless.Tpo $(DEPDIR)/libntlmconnect-warnless.Po
    -@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='libntlmconnect-warnless.obj' libtool=no @AMDEPBACKSLASH@
    +../../lib/libntlmconnect-warnless.obj: ../../lib/warnless.c
    +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/libntlmconnect-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/libntlmconnect-warnless.Tpo -c -o ../../lib/libntlmconnect-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/libntlmconnect-warnless.Tpo ../../lib/$(DEPDIR)/libntlmconnect-warnless.Po
    +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/libntlmconnect-warnless.obj' libtool=no @AMDEPBACKSLASH@
     @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    -@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libntlmconnect-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
    +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libntlmconnect_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/libntlmconnect-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
     
     mostlyclean-libtool:
     	-rm -f *.lo
    @@ -6028,6 +6800,8 @@ clean-generic:
     distclean-generic:
     	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
     	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
    +	-rm -f ../../lib/$(DEPDIR)/$(am__dirstamp)
    +	-rm -f ../../lib/$(am__dirstamp)
     
     maintainer-clean-generic:
     	@echo "This command is intended for maintainers to use"
    @@ -6038,7 +6812,7 @@ clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
     	clean-noinstPROGRAMS mostlyclean-am
     
     distclean: distclean-am
    -	-rm -rf ./$(DEPDIR)
    +	-rm -rf ../../lib/$(DEPDIR) ./$(DEPDIR)
     	-rm -f Makefile
     distclean-am: clean-am distclean-compile distclean-generic \
     	distclean-tags
    @@ -6084,7 +6858,7 @@ install-ps-am:
     installcheck-am:
     
     maintainer-clean: maintainer-clean-am
    -	-rm -rf ./$(DEPDIR)
    +	-rm -rf ../../lib/$(DEPDIR) ./$(DEPDIR)
     	-rm -f Makefile
     maintainer-clean-am: distclean-am maintainer-clean-generic
     
    diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
    index cf62105..3508b80 100644
    --- a/tests/libtest/Makefile.inc
    +++ b/tests/libtest/Makefile.inc
    @@ -21,7 +21,9 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect                \
      lib571 lib572 lib573 lib574 lib575 lib576        lib578 lib579 lib582   \
      lib583 lib585 lib586 lib587        lib590 lib591 lib597 lib598 lib599   \
      lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
    - lib1509 lib1510 lib1511 lib1512 \
    + lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 \
    + lib1520 \
    + lib1525 lib1526 lib1527 lib1528 lib1529 \
      lib1900 \
      lib2033
     
    @@ -193,7 +195,7 @@ lib555_SOURCES = lib555.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib555_LDADD = $(TESTUTIL_LIBS)
     lib555_CPPFLAGS = $(AM_CPPFLAGS)
     
    -lib556_SOURCES = lib556.c $(SUPPORTFILES)
    +lib556_SOURCES = lib556.c $(SUPPORTFILES) $(WARNLESS)
     lib556_CPPFLAGS = $(AM_CPPFLAGS)
     
     lib557_SOURCES = lib557.c $(SUPPORTFILES)
    @@ -343,6 +345,41 @@ lib1512_SOURCES = lib1512.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib1512_LDADD = $(TESTUTIL_LIBS)
     lib1512_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1512
     
    +lib1513_SOURCES = lib1513.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1513_LDADD = $(TESTUTIL_LIBS)
    +lib1513_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1513
    +
    +lib1514_SOURCES = lib1514.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1514_LDADD = $(TESTUTIL_LIBS)
    +lib1514_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1514
    +
    +lib1515_SOURCES = lib1515.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1515_LDADD = $(TESTUTIL_LIBS)
    +lib1515_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1515
    +
    +lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
    +lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
    +
    +lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1525_LDADD = $(TESTUTIL_LIBS)
    +lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
    +
    +lib1526_SOURCES = lib1526.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1526_LDADD = $(TESTUTIL_LIBS)
    +lib1526_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1526
    +
    +lib1527_SOURCES = lib1527.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1527_LDADD = $(TESTUTIL_LIBS)
    +lib1527_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1527
    +
    +lib1528_SOURCES = lib1528.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1528_LDADD = $(TESTUTIL_LIBS)
    +lib1528_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1528
    +
    +lib1529_SOURCES = lib1529.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
    +lib1529_LDADD = $(TESTUTIL_LIBS)
    +lib1529_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1529
    +
     lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
     lib1900_LDADD = $(TESTUTIL_LIBS)
     lib1900_CPPFLAGS = $(AM_CPPFLAGS)
    diff --git a/tests/libtest/first.c b/tests/libtest/first.c
    index 253acb2..5851faf 100644
    --- a/tests/libtest/first.c
    +++ b/tests/libtest/first.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -22,7 +22,15 @@
     #include "test.h"
     
     #ifdef HAVE_LOCALE_H
    -#include  /* for setlocale() */
    +#  include  /* for setlocale() */
    +#endif
    +
    +#ifdef HAVE_IO_H
    +#  include  /* for setmode() */
    +#endif
    +
    +#ifdef HAVE_FCNTL_H
    +#  include  /* for setmode() */
     #endif
     
     #ifdef CURLDEBUG
    @@ -51,6 +59,15 @@ int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc,
       return select(nfds, rd, wr, exc, tv);
     }
     
    +void wait_ms(int ms)
    +{
    +  struct timeval t;
    +  t.tv_sec = ms/1000;
    +  ms -= (int)t.tv_sec * 1000;
    +  t.tv_usec = ms * 1000;
    +  select_wrapper(0, NULL, NULL , NULL, &t);
    +}
    +
     char *libtest_arg2=NULL;
     char *libtest_arg3=NULL;
     int test_argc;
    @@ -98,6 +115,14 @@ int main(int argc, char **argv)
     {
       char *URL;
     
    +#ifdef O_BINARY
    +#  ifdef __HIGHC__
    +  _setmode(stdout, O_BINARY);
    +#  else
    +  setmode(fileno(stdout), O_BINARY);
    +#  endif
    +#endif
    +
       memory_tracking_init();
     
       /*
    diff --git a/tests/libtest/lib1500.c b/tests/libtest/lib1500.c
    index 76e3d32..08b917f 100644
    --- a/tests/libtest/lib1500.c
    +++ b/tests/libtest/lib1500.c
    @@ -32,7 +32,7 @@ int test(char *URL)
       CURL* curls = NULL;
       CURLM* multi = NULL;
       int still_running;
    -  int i = -1;
    +  int i = TEST_ERR_FAILURE;
       int res = 0;
       CURLMsg *msg;
     
    @@ -58,7 +58,7 @@ int test(char *URL)
         res = curl_multi_wait(multi, NULL, 0, TEST_HANG_TIMEOUT, &num);
         if (res != CURLM_OK) {
           printf("curl_multi_wait() returned %d\n", res);
    -      res = -1;
    +      res = TEST_ERR_MAJOR_BAD;
           goto test_cleanup;
         }
     
    diff --git a/tests/libtest/lib1506.c b/tests/libtest/lib1506.c
    index 008a9ca..b61c4db 100644
    --- a/tests/libtest/lib1506.c
    +++ b/tests/libtest/lib1506.c
    @@ -32,13 +32,13 @@
     int test(char *URL)
     {
       int res = 0;
    -  CURL *curl[NUM_HANDLES];
    +  CURL *curl[NUM_HANDLES] = {0};
       int running;
       CURLM *m = NULL;
       int i;
       char target_url[256];
       char dnsentry[256];
    -  struct curl_slist *slist = NULL;
    +  struct curl_slist *slist = NULL, *slist2;
       char *port = libtest_arg3;
       char *address = libtest_arg2;
     
    @@ -48,12 +48,14 @@ int test(char *URL)
       for(i=0; i < NUM_HANDLES; i++) {
         sprintf(dnsentry, "server%d.example.com:%s:%s", i + 1, port, address);
         printf("%s\n", dnsentry);
    -    slist = curl_slist_append(slist, dnsentry);
    +    slist2 = curl_slist_append(slist, dnsentry);
    +    if(!slist2) {
    +      fprintf(stderr, "curl_slist_append() failed\n");
    +      goto test_cleanup;
    +    }
    +    slist = slist2;
       }
     
    -  for(i=0; i < NUM_HANDLES; i++)
    -    curl[i] = NULL;
    -
       start_test_timing();
     
       global_init(CURL_GLOBAL_ALL);
    @@ -112,6 +114,7 @@ int test(char *URL)
     
           abort_on_test_timeout();
         }
    +    wait_ms(1); /* to ensure different end times */
       }
     
     test_cleanup:
    diff --git a/tests/libtest/lib1507.c b/tests/libtest/lib1507.c
    index 7c4e6ed..5bb61b3 100644
    --- a/tests/libtest/lib1507.c
    +++ b/tests/libtest/lib1507.c
    @@ -63,21 +63,18 @@ static long tvdiff(struct timeval newer, struct timeval older)
     
     int test(char *URL)
     {
    -   CURL *curl;
    -   CURLM *mcurl;
    +   int res = 0;
    +   CURL *curl = NULL;
    +   CURLM *mcurl = NULL;
        int still_running = 1;
        struct timeval mp_start;
        struct curl_slist* rcpt_list = NULL;
     
        curl_global_init(CURL_GLOBAL_DEFAULT);
     
    -   curl = curl_easy_init();
    -   if(!curl)
    -     return 1;
    +   easy_init(curl);
     
    -   mcurl = curl_multi_init();
    -   if(!mcurl)
    -     return 2;
    +   multi_init(mcurl);
     
        rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
        /* more addresses can be added here
    @@ -89,11 +86,12 @@ int test(char *URL)
        curl_easy_setopt(curl, CURLOPT_USERNAME, USERNAME);
        curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD);
     #endif
    +   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM);
        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    -   curl_multi_add_handle(mcurl, curl);
    +   multi_add_handle(mcurl, curl);
     
        mp_start = tvnow();
     
    @@ -156,12 +154,15 @@ int test(char *URL)
         }
       }
     
    +test_cleanup:
    +
       curl_slist_free_all(rcpt_list);
       curl_multi_remove_handle(mcurl, curl);
       curl_multi_cleanup(mcurl);
       curl_easy_cleanup(curl);
       curl_global_cleanup();
    -  return 0;
    +
    +  return res;
     }
     
     
    diff --git a/tests/libtest/lib1509.c b/tests/libtest/lib1509.c
    index 3c86a36..f67c7d6 100644
    --- a/tests/libtest/lib1509.c
    +++ b/tests/libtest/lib1509.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -28,7 +28,7 @@
     size_t WriteOutput(void *ptr, size_t size, size_t nmemb, void *stream);
     size_t WriteHeader(void *ptr, size_t size, size_t nmemb, void *stream);
     
    -long realHeaderSize = 0;
    +unsigned long realHeaderSize = 0;
     
     int test(char *URL)
     {
    @@ -90,7 +90,8 @@ size_t WriteHeader(void *ptr, size_t size, size_t nmemb, void *stream)
     {
       (void)ptr;
       (void)stream;
    -  realHeaderSize += size * nmemb;
    +
    +  realHeaderSize += curlx_uztoul(size * nmemb);
     
       return nmemb * size;
     }
    diff --git a/tests/libtest/lib1510.c b/tests/libtest/lib1510.c
    index 1bcf216..d19a7b5 100644
    --- a/tests/libtest/lib1510.c
    +++ b/tests/libtest/lib1510.c
    @@ -36,7 +36,7 @@ int test(char *URL)
       int i;
       char target_url[256];
       char dnsentry[256];
    -  struct curl_slist *slist = NULL;
    +  struct curl_slist *slist = NULL, *slist2;
       char *port = libtest_arg3;
       char *address = libtest_arg2;
     
    @@ -46,7 +46,12 @@ int test(char *URL)
       for(i=0; i < NUM_URLS; i++) {
         sprintf(dnsentry, "server%d.example.com:%s:%s", i + 1, port, address);
         printf("%s\n", dnsentry);
    -    slist = curl_slist_append(slist, dnsentry);
    +    slist2 = curl_slist_append(slist, dnsentry);
    +    if(!slist2) {
    +      fprintf(stderr, "curl_slist_append() failed\n");
    +      goto test_cleanup;
    +    }
    +    slist = slist2;
       }
     
       start_test_timing();
    diff --git a/tests/libtest/lib1512.c b/tests/libtest/lib1512.c
    index 93d5ea9..86372aa 100644
    --- a/tests/libtest/lib1512.c
    +++ b/tests/libtest/lib1512.c
    @@ -34,7 +34,7 @@
     
     int test(char *URL)
     {
    -  CURLcode res;
    +  int res = 0;
       CURL *curl[NUM_HANDLES] = {NULL, NULL};
       char *port = libtest_arg3;
       char *address = libtest_arg2;
    @@ -44,7 +44,7 @@ int test(char *URL)
       char target_url[256];
       (void)URL; /* URL is setup in the code */
     
    -  if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
         fprintf(stderr, "curl_global_init() failed\n");
         return TEST_ERR_MAJOR_BAD;
       }
    @@ -84,6 +84,6 @@ test_cleanup:
       curl_slist_free_all(slist);
       curl_global_cleanup();
     
    -  return (int)res;
    +  return res;
     }
     
    diff --git a/tests/libtest/lib1513.c b/tests/libtest/lib1513.c
    new file mode 100644
    index 0000000..aefb577
    --- /dev/null
    +++ b/tests/libtest/lib1513.c
    @@ -0,0 +1,73 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +/*
    + * Test case converted from bug report #1318 by Petr Novak.
    + *
    + * Before the fix, this test program returned 52 (CURLE_GOT_NOTHING) instead
    + * of 42 (CURLE_ABORTED_BY_CALLBACK).
    + */
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +static int progressKiller(void *arg,
    +                          double dltotal,
    +                          double dlnow,
    +                          double ultotal,
    +                          double ulnow)
    +{
    +  (void)arg;
    +  (void)dltotal;
    +  (void)dlnow;
    +  (void)ultotal;
    +  (void)ulnow;
    +  return 1;
    +}
    +
    +int test(char *URL)
    +{
    +  CURL *curl;
    +  int res=0;
    +
    +  global_init(CURL_GLOBAL_ALL);
    +
    +  easy_init(curl);
    +
    +  easy_setopt(curl, CURLOPT_URL, URL);
    +  easy_setopt(curl, CURLOPT_TIMEOUT, (long)7);
    +  easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1);
    +  easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressKiller);
    +  easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
    +  easy_setopt(curl, CURLOPT_NOPROGRESS, (long)0);
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  /* undocumented cleanup sequence - type UA */
    +
    +  curl_easy_cleanup(curl);
    +  curl_global_cleanup();
    +
    +  return res;
    +}
    diff --git a/tests/libtest/lib1514.c b/tests/libtest/lib1514.c
    new file mode 100644
    index 0000000..ec8f8a3
    --- /dev/null
    +++ b/tests/libtest/lib1514.c
    @@ -0,0 +1,80 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +/*
    + * Make sure libcurl does not send a `Content-Length: -1` header when HTTP POST
    + * size is unknown.
    + */
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +static char data[]="dummy";
    +
    +struct WriteThis {
    +  char *readptr;
    +  size_t sizeleft;
    +};
    +
    +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
    +{
    +  struct WriteThis *pooh = (struct WriteThis *)userp;
    +
    +  if(size*nmemb < 1)
    +    return 0;
    +
    +  if(pooh->sizeleft) {
    +    *(char *)ptr = pooh->readptr[0]; /* copy one single byte */
    +    pooh->readptr++;                 /* advance pointer */
    +    pooh->sizeleft--;                /* less data left */
    +    return 1;                        /* we return 1 byte at a time! */
    +  }
    +
    +  return 0;                         /* no more data left to deliver */
    +}
    +
    +int test(char *URL)
    +{
    +  CURL *curl;
    +  CURLcode result = CURLE_OK;
    +  int res = 0;
    +  struct WriteThis pooh = { data, sizeof(data)-1 };
    +
    +  global_init(CURL_GLOBAL_ALL);
    +
    +  easy_init(curl);
    +
    +  easy_setopt(curl, CURLOPT_URL, URL);
    +  easy_setopt(curl, CURLOPT_POST, 1L);
    +  /* Purposely omit to set CURLOPT_POSTFIELDSIZE */
    +  easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    +  easy_setopt(curl, CURLOPT_READDATA, &pooh);
    +
    +  result = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +  curl_global_cleanup();
    +
    +  return (int)result;
    +}
    diff --git a/tests/libtest/lib1515.c b/tests/libtest/lib1515.c
    new file mode 100644
    index 0000000..4ac9fcf
    --- /dev/null
    +++ b/tests/libtest/lib1515.c
    @@ -0,0 +1,151 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +/*
    + * Check for bugs #1303 and #1327: libcurl should never remove DNS entries
    + * created via CURLOPT_RESOLVE, neither after DNS_CACHE_TIMEOUT elapses
    + * (test1515) nor a dead connection is detected (test1616).
    + */
    +
    +#include "test.h"
    +#include "testutil.h"
    +#include "warnless.h"
    +#include "memdebug.h"
    +
    +#define TEST_HANG_TIMEOUT 60 * 1000
    +
    +#define DNS_TIMEOUT 1
    +
    +#if defined(WIN32) || defined(_WIN32)
    +#define sleep(s) Sleep(s * 1000)
    +#endif
    +
    +#define _MPRINTF_REPLACE
    +#include 
    +
    +static int debug_callback(CURL *curl, curl_infotype info, char *msg, size_t len, void *ptr)
    +{
    +  (void)curl;
    +  (void)ptr;
    +
    +  if(info == CURLINFO_TEXT)
    +    fprintf(stderr, "debug: %.*s", (int) len, msg);
    +
    +  return 0;
    +}
    +
    +static int do_one_request(CURLM *m, char *URL, char *resolve)
    +{
    +  CURL *curls;
    +  struct curl_slist *resolve_list = NULL;
    +  int still_running;
    +  int res = 0;
    +  CURLMsg *msg;
    +  int msgs_left;
    +
    +  resolve_list = curl_slist_append(resolve_list, resolve);
    +
    +  easy_init(curls);
    +
    +  easy_setopt(curls, CURLOPT_URL, URL);
    +  easy_setopt(curls, CURLOPT_RESOLVE, resolve_list);
    +  easy_setopt(curls, CURLOPT_DEBUGFUNCTION, debug_callback);
    +  easy_setopt(curls, CURLOPT_VERBOSE, 1);
    +  easy_setopt(curls, CURLOPT_DNS_CACHE_TIMEOUT, DNS_TIMEOUT);
    +
    +  multi_add_handle(m, curls);
    +  multi_perform(m, &still_running);
    +
    +  abort_on_test_timeout();
    +
    +  while(still_running) {
    +    struct timeval timeout;
    +    fd_set fdread, fdwrite, fdexcep;
    +    int maxfd = -99;
    +
    +    FD_ZERO(&fdread);
    +    FD_ZERO(&fdwrite);
    +    FD_ZERO(&fdexcep);
    +    timeout.tv_sec = 1;
    +    timeout.tv_usec = 0;
    +
    +    multi_fdset(m, &fdread, &fdwrite, &fdexcep, &maxfd);
    +    select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
    +
    +    abort_on_test_timeout();
    +    multi_perform(m, &still_running);
    +
    +    abort_on_test_timeout();
    +  }
    +
    +  while((msg = curl_multi_info_read(m, &msgs_left))) {
    +    if(msg->msg == CURLMSG_DONE && msg->easy_handle == curls) {
    +      res = msg->data.result;
    +      break;
    +    }
    +  }
    +
    +test_cleanup:
    +
    +  curl_multi_remove_handle(m, curls);
    +  curl_easy_cleanup(curls);
    +  curl_slist_free_all(resolve_list);
    +
    +  return res;
    +}
    +
    +int test(char *URL)
    +{
    +  CURLM* multi = NULL;
    +  int res = 0;
    +  char *address = libtest_arg2;
    +  char *port = libtest_arg3;
    +  char *path = URL;
    +  char dns_entry[256];
    +  int i;
    +  int count = 2;
    +
    +  snprintf(dns_entry, sizeof(dns_entry), "testserver.example.com:%s:%s", port, address);
    +
    +  start_test_timing();
    +
    +  global_init(CURL_GLOBAL_ALL);
    +  multi_init(multi);
    +
    +  for(i = 1; i <= count; i++) {
    +    char target_url[256];
    +    snprintf(target_url, sizeof(target_url), "http://testserver.example.com:%s%s%04d", port, path, i);
    +
    +    /* second request must succeed like the first one */
    +    if((res = do_one_request(multi, target_url, dns_entry)))
    +      goto test_cleanup;
    +
    +    if(i < count)
    +      sleep(DNS_TIMEOUT + 1);
    +  }
    +
    +test_cleanup:
    +
    +  curl_multi_cleanup(multi);
    +
    +  return (int) res;
    +}
    diff --git a/tests/libtest/lib1520.c b/tests/libtest/lib1520.c
    new file mode 100644
    index 0000000..c6d2e82
    --- /dev/null
    +++ b/tests/libtest/lib1520.c
    @@ -0,0 +1,114 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 2014, Steve Holme, .
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +/*
    + * This is the list of basic details you need to tweak to get things right.
    + */
    +#define TO ""
    +#define FROM ""
    +
    +static const char *payload_text[] = {
    +  "From: different\r\n",
    +  "To: another\r\n",
    +  "\r\n",
    +  "\r\n",
    +  ".\r\n",
    +  ".\r\n",
    +  "\r\n",
    +  ".\r\n",
    +  "\r\n",
    +  "body",
    +  NULL
    +};
    +
    +struct upload_status {
    +  int lines_read;
    +};
    +
    +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
    +{
    +  struct upload_status *upload_ctx = (struct upload_status *)userp;
    +  const char *data;
    +
    +  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
    +    return 0;
    +  }
    +
    +  data = payload_text[upload_ctx->lines_read];
    +
    +  if(data) {
    +    size_t len = strlen(data);
    +    memcpy(ptr, data, len);
    +    upload_ctx->lines_read++;
    +
    +    return len;
    +  }
    +
    +  return 0;
    +}
    +
    +int test(char *URL)
    +{
    +  CURLcode res;
    +  CURL *curl;
    +  struct curl_slist *rcpt_list = NULL;
    +  struct upload_status upload_ctx = {0};
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  rcpt_list = curl_slist_append(rcpt_list, TO);
    +  /* more addresses can be added here
    +     rcpt_list = curl_slist_append(rcpt_list, "");
    +  */
    +
    +  test_setopt(curl, CURLOPT_URL, URL);
    +  test_setopt(curl, CURLOPT_UPLOAD, 1L);
    +  test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    +  test_setopt(curl, CURLOPT_READDATA, &upload_ctx);
    +  test_setopt(curl, CURLOPT_MAIL_FROM, FROM);
    +  test_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_slist_free_all(rcpt_list);
    +  curl_easy_cleanup(curl);
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    +
    +
    diff --git a/tests/libtest/lib1525.c b/tests/libtest/lib1525.c
    new file mode 100644
    index 0000000..957b429
    --- /dev/null
    +++ b/tests/libtest/lib1525.c
    @@ -0,0 +1,97 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, Daniel Stenberg, , et al.
    + * Copyright (C) 2014, Vijay Panghal, , et al.
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +/*
    + * This unit test PUT http data over proxy. Proxy header will be different
    + * from server http header
    + */
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +static char data [] = "Hello Cloud!\n";
    +
    +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
    +{
    +  size_t  amount = nmemb * size; /* Total bytes curl wants */
    +  if (amount < strlen(data)) {
    +    return strlen(data);
    +  }
    +  (void)stream;
    +  memcpy(ptr, data, strlen(data));
    +  return strlen(data);
    +}
    +
    +
    +int test(char *URL)
    +{
    +  CURL *curl = NULL;
    +  CURLcode res = CURLE_FAILED_INIT;
    +  /* http and proxy header list*/
    +  struct curl_slist *hhl = NULL;
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  hhl = curl_slist_append(hhl, "User-Agent: Http Agent");
    +
    +  if (!hhl) {
    +    goto test_cleanup;
    +  }
    +
    +  test_setopt(curl, CURLOPT_URL, URL);
    +  test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
    +  test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
    +  test_setopt(curl, CURLOPT_PROXYHEADER, hhl);
    +  test_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_UNIFIED);
    +  test_setopt(curl, CURLOPT_POST, 0L);
    +  test_setopt(curl, CURLOPT_UPLOAD, 1L);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +  test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    +  test_setopt(curl, CURLOPT_HEADER, 1L);
    +  test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    +  test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    +  test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
    +  test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +
    +  curl_slist_free_all(hhl);
    +
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    diff --git a/tests/libtest/lib1526.c b/tests/libtest/lib1526.c
    new file mode 100644
    index 0000000..ec21fb0
    --- /dev/null
    +++ b/tests/libtest/lib1526.c
    @@ -0,0 +1,103 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, Vijay Panghal, , et al.
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +/*
    + * This unit test PUT http data over proxy. Proxy header will be different
    + * from server http header
    + */
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +static char data [] = "Hello Cloud!\n";
    +
    +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
    +{
    +  size_t  amount = nmemb * size; /* Total bytes curl wants */
    +  if (amount < strlen(data)) {
    +    return strlen(data);
    +  }
    +  (void)stream;
    +  memcpy(ptr, data, strlen(data));
    +  return strlen(data);
    +}
    +
    +int test(char *URL)
    +{
    +  CURL *curl = NULL;
    +  CURLcode res = CURLE_FAILED_INIT;
    +  /* http and proxy header list*/
    +  struct curl_slist *hhl = NULL, *phl = NULL, *tmp = NULL;
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  hhl = curl_slist_append(hhl, "User-Agent: Http Agent");
    +  phl = curl_slist_append(phl, "User-Agent: Proxy Agent");
    +  if (!hhl || !phl) {
    +    goto test_cleanup;
    +  }
    +  tmp = curl_slist_append(phl, "Expect:");
    +  if (!tmp) {
    +    goto test_cleanup;
    +  }
    +  phl = tmp;
    +
    +  test_setopt(curl, CURLOPT_URL, URL);
    +  test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
    +  test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
    +  test_setopt(curl, CURLOPT_PROXYHEADER, phl);
    +  test_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE);
    +  test_setopt(curl, CURLOPT_POST, 0L);
    +  test_setopt(curl, CURLOPT_UPLOAD, 1L);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +  test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    +  test_setopt(curl, CURLOPT_HEADER, 1L);
    +  test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    +  test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    +  test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
    +  test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +
    +  curl_slist_free_all(hhl);
    +
    +  curl_slist_free_all(phl);
    +
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    +
    diff --git a/tests/libtest/lib1527.c b/tests/libtest/lib1527.c
    new file mode 100644
    index 0000000..280c947
    --- /dev/null
    +++ b/tests/libtest/lib1527.c
    @@ -0,0 +1,98 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, Vijay Panghal, , et al.
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +/*
    + * This unit test PUT http data over proxy. Same  http header will be generated
    + * for server and proxy
    + */
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +static char data [] = "Hello Cloud!\n";
    +
    +static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
    +{
    +  size_t  amount = nmemb * size; /* Total bytes curl wants */
    +  if (amount < strlen(data)) {
    +    return strlen(data);
    +  }
    +  (void)stream;
    +  memcpy(ptr, data, strlen(data));
    +  return strlen(data);
    +}
    +
    +
    +int test(char *URL)
    +{
    +  CURL *curl = NULL;
    +  CURLcode res = CURLE_FAILED_INIT;
    +  /* http header list*/
    +  struct curl_slist *hhl = NULL, *tmp = NULL;
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  hhl = curl_slist_append(hhl, "User-Agent: Http Agent");
    +  if (!hhl) {
    +    goto test_cleanup;
    +  }
    +  tmp = curl_slist_append(hhl, "Expect: 100-continue");
    +  if (!tmp) {
    +    goto test_cleanup;
    +  }
    +  hhl = tmp;
    +
    +  test_setopt(curl, CURLOPT_URL, URL);
    +  test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
    +  test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
    +  test_setopt(curl, CURLOPT_POST, 0L);
    +  test_setopt(curl, CURLOPT_UPLOAD, 1L);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +  test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    +  test_setopt(curl, CURLOPT_HEADER, 1L);
    +  test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    +  test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    +  test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
    +  test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +
    +  curl_slist_free_all(hhl);
    +
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    diff --git a/tests/libtest/lib1528.c b/tests/libtest/lib1528.c
    new file mode 100644
    index 0000000..94a7cd0
    --- /dev/null
    +++ b/tests/libtest/lib1528.c
    @@ -0,0 +1,72 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +int test(char *URL)
    +{
    +  CURL *curl = NULL;
    +  CURLcode res = CURLE_FAILED_INIT;
    +  /* http header list*/
    +  struct curl_slist *hhl = NULL;
    +  struct curl_slist *phl = NULL;
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  hhl = curl_slist_append(hhl, "User-Agent: Http Agent");
    +  phl = curl_slist_append(phl, "Proxy-User-Agent: Http Agent2");
    +
    +  if (!hhl) {
    +    goto test_cleanup;
    +  }
    +
    +  test_setopt(curl, CURLOPT_URL, URL);
    +  test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
    +  test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
    +  test_setopt(curl, CURLOPT_PROXYHEADER, phl);
    +  test_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +  test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    +  test_setopt(curl, CURLOPT_HEADER, 1L);
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +  curl_slist_free_all(hhl);
    +  curl_slist_free_all(phl);
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    diff --git a/tests/libtest/lib1529.c b/tests/libtest/lib1529.c
    new file mode 100644
    index 0000000..3def142
    --- /dev/null
    +++ b/tests/libtest/lib1529.c
    @@ -0,0 +1,59 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +#include "test.h"
    +
    +#include "memdebug.h"
    +
    +int test(char *URL)
    +{
    +  CURL *curl = NULL;
    +  CURLcode res = CURLE_FAILED_INIT;
    +  char bURL[512];
    +  snprintf(bURL, sizeof(bURL), "%s HTTP/1.1\r\nGET http://1529.com/1529", URL);
    +
    +  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    +    fprintf(stderr, "curl_global_init() failed\n");
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  if((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +
    +  test_setopt(curl, CURLOPT_URL, bURL);
    +  test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
    +  test_setopt(curl, CURLOPT_VERBOSE, 1L);
    +  test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    +  test_setopt(curl, CURLOPT_HEADER, 1L);
    +
    +  res = curl_easy_perform(curl);
    +
    +test_cleanup:
    +
    +  curl_easy_cleanup(curl);
    +  curl_global_cleanup();
    +
    +  return (int)res;
    +}
    diff --git a/tests/libtest/lib1900.c b/tests/libtest/lib1900.c
    index 74a0e6f..2f64742 100644
    --- a/tests/libtest/lib1900.c
    +++ b/tests/libtest/lib1900.c
    @@ -38,12 +38,6 @@ int num_handles;
     int blacklist_num_servers;
     int blacklist_num_sites;
     
    -int parse_url_file(const char *filename);
    -void free_urls(void);
    -int create_handles(void);
    -void setup_handle(char *base_url, CURLM *m, int handlenum);
    -void remove_handles(void);
    -
     static size_t
     write_callback(void *contents, size_t size, size_t nmemb, void *userp)
     {
    @@ -54,7 +48,7 @@ write_callback(void *contents, size_t size, size_t nmemb, void *userp)
       return realsize;
     }
     
    -int parse_url_file(const char *filename)
    +static int parse_url_file(const char *filename)
     {
       FILE *f;
       int filetime;
    @@ -91,21 +85,21 @@ int parse_url_file(const char *filename)
       return num_handles;
     }
     
    -void free_urls(void)
    +static void free_urls(void)
     {
       int i;
       for(i = 0;i < num_handles;i++) {
    -    free(urlstring[i]);
    +    Curl_safefree(urlstring[i]);
       }
       for(i = 0;i < blacklist_num_servers;i++) {
    -    free(server_blacklist[i]);
    +    Curl_safefree(server_blacklist[i]);
       }
       for(i = 0;i < blacklist_num_sites;i++) {
    -    free(site_blacklist[i]);
    +    Curl_safefree(site_blacklist[i]);
       }
     }
     
    -int create_handles(void)
    +static int create_handles(void)
     {
       int i;
     
    @@ -115,7 +109,7 @@ int create_handles(void)
       return 0;
     }
     
    -void setup_handle(char *base_url, CURLM *m, int handlenum)
    +static void setup_handle(char *base_url, CURLM *m, int handlenum)
     {
       char urlbuf[256];
     
    @@ -128,7 +122,7 @@ void setup_handle(char *base_url, CURLM *m, int handlenum)
       curl_multi_add_handle(m, handles[handlenum]);
     }
     
    -void remove_handles(void)
    +static void remove_handles(void)
     {
       int i;
     
    @@ -155,7 +149,7 @@ int test(char *URL)
     
       curl_global_init(CURL_GLOBAL_ALL);
     
    -  m = curl_multi_init();
    +  multi_init(m);
     
       create_handles();
     
    @@ -185,7 +179,7 @@ int test(char *URL)
           now = tutil_tvnow();
           msnow = now.tv_sec * 1000 + now.tv_usec / 1000;
           mslast = last_handle_add.tv_sec * 1000 + last_handle_add.tv_usec / 1000;
    -      if(msnow - mslast >= urltime[handlenum] && handlenum < num_handles) {
    +      if((msnow - mslast) >= urltime[handlenum]) {
             fprintf(stdout, "Adding handle %d\n", handlenum);
             setup_handle(URL, m, handlenum);
             last_handle_add = now;
    diff --git a/tests/libtest/lib500.c b/tests/libtest/lib500.c
    index dda1d7f..4d62208 100644
    --- a/tests/libtest/lib500.c
    +++ b/tests/libtest/lib500.c
    @@ -91,43 +91,44 @@ int test(char *URL)
       res = curl_easy_perform(curl);
     
       if(!res) {
    -    FILE *moo;
         res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ipstr);
    -    moo = fopen(libtest_arg2, "wb");
    -    if(moo) {
    -      double time_namelookup;
    -      double time_connect;
    -      double time_pretransfer;
    -      double time_starttransfer;
    -      double time_total;
    -      fprintf(moo, "IP: %s\n", ipstr);
    -      curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &time_namelookup);
    -      curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &time_connect);
    -      curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &time_pretransfer);
    -      curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME,
    -                        &time_starttransfer);
    -      curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &time_total);
    -
    -      /* since the timing will always vary we only compare relative differences
    -         between these 5 times */
    -      if(time_namelookup >= time_connect) {
    -        fprintf(moo, "namelookup vs connect: %f %f\n",
    -                time_namelookup, time_connect);
    +    if (libtest_arg2) {
    +      FILE *moo = fopen(libtest_arg2, "wb");
    +      if(moo) {
    +	double time_namelookup;
    +	double time_connect;
    +	double time_pretransfer;
    +	double time_starttransfer;
    +	double time_total;
    +	fprintf(moo, "IP: %s\n", ipstr);
    +	curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &time_namelookup);
    +	curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &time_connect);
    +	curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &time_pretransfer);
    +	curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME,
    +			  &time_starttransfer);
    +	curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &time_total);
    +
    +	/* since the timing will always vary we only compare relative differences
    +	   between these 5 times */
    +	if(time_namelookup > time_connect) {
    +	  fprintf(moo, "namelookup vs connect: %f %f\n",
    +		  time_namelookup, time_connect);
    +	}
    +	if(time_connect > time_pretransfer) {
    +	  fprintf(moo, "connect vs pretransfer: %f %f\n",
    +		  time_connect, time_pretransfer);
    +	}
    +	if(time_pretransfer > time_starttransfer) {
    +	  fprintf(moo, "pretransfer vs starttransfer: %f %f\n",
    +		  time_pretransfer, time_starttransfer);
    +	}
    +	if(time_starttransfer > time_total) {
    +	  fprintf(moo, "starttransfer vs total: %f %f\n",
    +		  time_starttransfer, time_total);
    +	}
    +
    +	fclose(moo);
           }
    -      if(time_connect >= time_pretransfer) {
    -        fprintf(moo, "connect vs pretransfer: %f %f\n",
    -                time_connect, time_pretransfer);
    -      }
    -      if(time_pretransfer >= time_starttransfer) {
    -        fprintf(moo, "pretransfer vs starttransfer: %f %f\n",
    -                time_pretransfer, time_starttransfer);
    -      }
    -      if(time_starttransfer >= time_total) {
    -        fprintf(moo, "starttransfer vs total: %f %f\n",
    -                time_starttransfer, time_total);
    -      }
    -
    -      fclose(moo);
         }
       }
     
    diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c
    index 99b3a0a..9592e0f 100644
    --- a/tests/libtest/lib505.c
    +++ b/tests/libtest/lib505.c
    @@ -50,7 +50,7 @@ int test(char *URL)
     
       if (!libtest_arg2) {
         fprintf(stderr, "Usage:  \n");
    -    return -1;
    +    return TEST_ERR_USAGE;
       }
     
       hd_src = fopen(libtest_arg2, "rb");
    @@ -59,7 +59,7 @@ int test(char *URL)
         fprintf(stderr, "fopen() failed with error: %d %s\n",
                 error, strerror(error));
         fprintf(stderr, "Error opening file: %s\n", libtest_arg2);
    -    return -2; /* if this happens things are major weird */
    +    return TEST_ERR_MAJOR_BAD; /* if this happens things are major weird */
       }
     
       /* get the file size of the local file */
    @@ -71,13 +71,13 @@ int test(char *URL)
                 error, strerror(error));
         fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
         fclose(hd_src);
    -    return -1;
    +    return TEST_ERR_MAJOR_BAD;
       }
     
       if(! file_info.st_size) {
         fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
         fclose(hd_src);
    -    return -4;
    +    return TEST_ERR_MAJOR_BAD;
       }
     
       if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    @@ -126,7 +126,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
     
       /* now specify which file to upload */
    -  test_setopt(curl, CURLOPT_INFILE, hd_src);
    +  test_setopt(curl, CURLOPT_READDATA, hd_src);
     
       /* and give the size of the upload (optional) */
       test_setopt(curl, CURLOPT_INFILESIZE_LARGE,
    diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c
    index 4d2864d..4dad0d9 100644
    --- a/tests/libtest/lib506.c
    +++ b/tests/libtest/lib506.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -40,12 +40,15 @@ struct userdata {
       int counter;
     };
     
    +int lock[3];
    +
     /* lock callback */
     static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
               void *useptr )
     {
       const char *what;
       struct userdata *user = (struct userdata *)useptr;
    +  int locknum;
     
       (void)handle;
       (void)laccess;
    @@ -53,17 +56,28 @@ static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
       switch ( data ) {
         case CURL_LOCK_DATA_SHARE:
           what = "share";
    +      locknum = 0;
           break;
         case CURL_LOCK_DATA_DNS:
           what = "dns";
    +      locknum = 1;
           break;
         case CURL_LOCK_DATA_COOKIE:
           what = "cookie";
    +      locknum = 2;
           break;
         default:
           fprintf(stderr, "lock: no such data: %d\n", (int)data);
           return;
       }
    +
    +  /* detect locking of locked locks */
    +  if(lock[locknum]) {
    +    printf("lock: double locked %s\n", what);
    +    return;
    +  }
    +  lock[locknum]++;
    +
       printf("lock:   %-6s [%s]: %d\n", what, user->text, user->counter);
       user->counter++;
     }
    @@ -73,21 +87,33 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr )
     {
       const char *what;
       struct userdata *user = (struct userdata *)useptr;
    +  int locknum;
       (void)handle;
       switch ( data ) {
         case CURL_LOCK_DATA_SHARE:
           what = "share";
    +      locknum = 0;
           break;
         case CURL_LOCK_DATA_DNS:
           what = "dns";
    +      locknum = 1;
           break;
         case CURL_LOCK_DATA_COOKIE:
           what = "cookie";
    +      locknum = 2;
           break;
         default:
           fprintf(stderr, "unlock: no such data: %d\n", (int)data);
           return;
       }
    +
    +  /* detect unlocking of unlocked locks */
    +  if(!lock[locknum]) {
    +    printf("unlock: double unlocked %s\n", what);
    +    return;
    +  }
    +  lock[locknum]--;
    +
       printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
       user->counter++;
     }
    @@ -149,11 +175,14 @@ int test(char *URL)
     {
       int res;
       CURLSHcode scode = CURLSHE_OK;
    +  CURLcode code = CURLE_OK;
       char *url = NULL;
       struct Tdata tdata;
       CURL *curl;
       CURLSH *share;
       struct curl_slist *headers = NULL;
    +  struct curl_slist *cookies = NULL;
    +  struct curl_slist *next_cookie = NULL;
       int i;
       struct userdata user;
     
    @@ -270,6 +299,55 @@ int test(char *URL)
       printf( "PERFORM\n" );
       curl_easy_perform( curl );
     
    +  printf( "CLEANUP\n" );
    +  curl_easy_cleanup( curl );
    +  curl_free(url);
    +  curl_slist_free_all( headers );
    +
    +  /* load cookies */
    +  if ((curl = curl_easy_init()) == NULL) {
    +    fprintf(stderr, "curl_easy_init() failed\n");
    +    curl_share_cleanup(share);
    +    curl_global_cleanup();
    +    return TEST_ERR_MAJOR_BAD;
    +  }
    +  url = suburl( URL, i );
    +  headers = sethost( NULL );
    +  test_setopt( curl, CURLOPT_HTTPHEADER, headers );
    +  test_setopt( curl, CURLOPT_URL,        url );
    +  printf( "CURLOPT_SHARE\n" );
    +  test_setopt( curl, CURLOPT_SHARE,      share );
    +  printf( "CURLOPT_COOKIELIST ALL\n" );
    +  test_setopt( curl, CURLOPT_COOKIELIST, "ALL" );
    +  printf( "CURLOPT_COOKIEJAR\n" );
    +  test_setopt( curl, CURLOPT_COOKIEFILE, JAR );
    +  printf( "CURLOPT_COOKIELIST RELOAD\n" );
    +  test_setopt( curl, CURLOPT_COOKIELIST, "RELOAD" );
    +
    +  code = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
    +  if ( code != CURLE_OK )
    +  {
    +    fprintf(stderr, "curl_easy_getinfo() failed\n");
    +    res = TEST_ERR_MAJOR_BAD;
    +    goto test_cleanup;
    +  }
    +  printf("loaded cookies:\n");
    +  if ( !cookies )
    +  {
    +    fprintf(stderr, "  reloading cookies from '%s' failed\n", JAR);
    +    res = TEST_ERR_MAJOR_BAD;
    +    goto test_cleanup;
    +  }
    +  printf("-----------------\n");
    +  next_cookie = cookies;
    +  while ( next_cookie )
    +  {
    +    printf( "  %s\n", next_cookie->data );
    +    next_cookie = next_cookie->next;
    +  }
    +  printf("-----------------\n");
    +  curl_slist_free_all( cookies );
    +
       /* try to free share, expect to fail because share is in use*/
       printf( "try SHARE_CLEANUP...\n" );
       scode = curl_share_cleanup( share );
    @@ -286,12 +364,8 @@ test_cleanup:
       /* clean up last handle */
       printf( "CLEANUP\n" );
       curl_easy_cleanup( curl );
    -
    -  if ( headers )
    -    curl_slist_free_all( headers );
    -
    -  if ( url )
    -    curl_free(url);
    +  curl_slist_free_all( headers );
    +  curl_free(url);
     
       /* free share */
       printf( "SHARE_CLEANUP\n" );
    diff --git a/tests/libtest/lib508.c b/tests/libtest/lib508.c
    index 1aca064..7f37309 100644
    --- a/tests/libtest/lib508.c
    +++ b/tests/libtest/lib508.c
    @@ -86,7 +86,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
     
       /* pointer to pass to our read function */
    -  test_setopt(curl, CURLOPT_INFILE, &pooh);
    +  test_setopt(curl, CURLOPT_READDATA, &pooh);
     
       /* get verbose debug output please */
       test_setopt(curl, CURLOPT_VERBOSE, 1L);
    diff --git a/tests/libtest/lib510.c b/tests/libtest/lib510.c
    index 8278631..c60b2ca 100644
    --- a/tests/libtest/lib510.c
    +++ b/tests/libtest/lib510.c
    @@ -97,7 +97,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
     
       /* pointer to pass to our read function */
    -  test_setopt(curl, CURLOPT_INFILE, &pooh);
    +  test_setopt(curl, CURLOPT_READDATA, &pooh);
     
       /* get verbose debug output please */
       test_setopt(curl, CURLOPT_VERBOSE, 1L);
    diff --git a/tests/libtest/lib513.c b/tests/libtest/lib513.c
    index c013ac2..7aab3b1 100644
    --- a/tests/libtest/lib513.c
    +++ b/tests/libtest/lib513.c
    @@ -61,7 +61,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
     
       /* pointer to pass to our read function */
    -  test_setopt(curl, CURLOPT_INFILE, NULL);
    +  test_setopt(curl, CURLOPT_READDATA, NULL);
     
       /* get verbose debug output please */
       test_setopt(curl, CURLOPT_VERBOSE, 1L);
    diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c
    index 5fe8dd8..6015d2f 100644
    --- a/tests/libtest/lib541.c
    +++ b/tests/libtest/lib541.c
    @@ -36,13 +36,13 @@ int test(char *URL)
       CURL *curl;
       CURLcode res = CURLE_OK;
       FILE *hd_src ;
    -  int hd ;
    +  int hd;
       struct_stat file_info;
       int error;
     
       if (!libtest_arg2) {
         fprintf(stderr, "Usage:  \n");
    -    return -1;
    +    return TEST_ERR_USAGE;
       }
     
       hd_src = fopen(libtest_arg2, "rb");
    @@ -63,13 +63,13 @@ int test(char *URL)
                 error, strerror(error));
         fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
         fclose(hd_src);
    -    return -1;
    +    return TEST_ERR_MAJOR_BAD;
       }
     
       if(! file_info.st_size) {
         fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
         fclose(hd_src);
    -    return -4;
    +    return TEST_ERR_MAJOR_BAD;
       }
     
       if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    @@ -96,7 +96,7 @@ int test(char *URL)
       test_setopt(curl,CURLOPT_URL, URL);
     
       /* now specify which file to upload */
    -  test_setopt(curl, CURLOPT_INFILE, hd_src);
    +  test_setopt(curl, CURLOPT_READDATA, hd_src);
     
       /* Now run off and do what you've been told! */
       res = curl_easy_perform(curl);
    diff --git a/tests/libtest/lib544.c b/tests/libtest/lib544.c
    index b766187..7e2f735 100644
    --- a/tests/libtest/lib544.c
    +++ b/tests/libtest/lib544.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -30,7 +30,10 @@ static char teststring[] =
       "\x72\x79\x20\x64\x61\x74\x61\x20\x77\x69\x74\x68\x20\x61\x6e\x20\x65\x6d"
       "\x62\x65\x64\x64\x65\x64\x20\x4e\x55\x4c\x20\x62\x79\x74\x65\x0a";
     #else
    -  "This\0 is test binary data with an embedded NUL byte\n";
    +{   'T', 'h', 'i', 's', '\0', ' ', 'i', 's', ' ', 't', 'e', 's', 't', ' ',
    +    'b', 'i', 'n', 'a', 'r', 'y', ' ', 'd', 'a', 't', 'a', ' ',
    +    'w', 'i', 't', 'h', ' ', 'a', 'n', ' ',
    +    'e', 'm', 'b', 'e', 'd', 'd', 'e', 'd', ' ', 'N', 'U', 'L'};
     #endif
     
     
    @@ -54,7 +57,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_URL, URL);
     
     #ifdef LIB545
    -  test_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) sizeof teststring - 1);
    +  test_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) sizeof teststring);
     #endif
     
       test_setopt(curl, CURLOPT_COPYPOSTFIELDS, teststring);
    @@ -65,6 +68,16 @@ int test(char *URL)
       /* Update the original data to detect non-copy. */
       strcpy(teststring, "FAIL");
     
    +#ifdef LIB545
    +  {
    +    CURL *handle2;
    +    handle2 = curl_easy_duphandle(curl);
    +    curl_easy_cleanup(curl);
    +
    +    curl = handle2;
    +  }
    +#endif
    +
       /* Now, this is a POST request with binary 0 embedded in POST data. */
       res = curl_easy_perform(curl);
     
    diff --git a/tests/libtest/lib556.c b/tests/libtest/lib556.c
    index 9806220..a4b4b93 100644
    --- a/tests/libtest/lib556.c
    +++ b/tests/libtest/lib556.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -21,6 +21,7 @@
      ***************************************************************************/
     #include "test.h"
     
    +#include "warnless.h"
     #include "memdebug.h"
     
     /* For Windows, mainly (may be moved in a config file?) */
    diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c
    index dc3bcae..7e5f9e9 100644
    --- a/tests/libtest/lib557.c
    +++ b/tests/libtest/lib557.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2013, 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
    @@ -1354,7 +1354,7 @@ static int test_curl_off_t_formatting(void)
           co_test[i].result[j] = 'X';
         co_test[i].result[BUFSZ-1] = '\0';
     
    -    (void)curl_msprintf(co_test[i].result, "%" FORMAT_OFF_T, co_test[i].num);
    +    (void)curl_msprintf(co_test[i].result, "%" CURL_FORMAT_CURL_OFF_T, co_test[i].num);
     
         if(memcmp(co_test[i].result,
                    co_test[i].expected,
    diff --git a/tests/libtest/lib579.c b/tests/libtest/lib579.c
    index c5cf603..0e8bd2f 100644
    --- a/tests/libtest/lib579.c
    +++ b/tests/libtest/lib579.c
    @@ -126,7 +126,7 @@ int test(char *URL)
       test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
     
       /* pointer to pass to our read function */
    -  test_setopt(curl, CURLOPT_INFILE, &pooh);
    +  test_setopt(curl, CURLOPT_READDATA, &pooh);
     
       /* get verbose debug output please */
       test_setopt(curl, CURLOPT_VERBOSE, 1L);
    diff --git a/tests/libtest/lib599.c b/tests/libtest/lib599.c
    index 6b09267..08c536c 100644
    --- a/tests/libtest/lib599.c
    +++ b/tests/libtest/lib599.c
    @@ -43,6 +43,7 @@ int test(char *URL)
     {
       CURL *curl;
       CURLcode res=CURLE_OK;
    +  double content_length = 0.0;
     
       if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
         fprintf(stderr, "curl_global_init() failed\n");
    @@ -74,6 +75,17 @@ int test(char *URL)
       /* Perform the request, res will get the return code */
       res = curl_easy_perform(curl);
     
    +  if (!res) {
    +    FILE *moo;
    +    res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
    +                            &content_length);
    +    moo = fopen(libtest_arg2, "wb");
    +    if (moo) {
    +      fprintf(moo, "CL: %.0f\n", content_length);
    +      fclose(moo);
    +    }
    +  }
    +
     test_cleanup:
     
       /* always cleanup */
    diff --git a/tests/libtest/libauthretry.c b/tests/libtest/libauthretry.c
    index 9576132..103a89c 100644
    --- a/tests/libtest/libauthretry.c
    +++ b/tests/libtest/libauthretry.c
    @@ -35,8 +35,7 @@ static CURLcode send_request(CURL *curl, const char *url, int seq,
       char* full_url = malloc(strlen(url) + 4 + 1);
       if (!full_url) {
         fprintf(stderr, "Not enough memory for full url\n");
    -    res = CURLE_OUT_OF_MEMORY;
    -    goto test_cleanup;
    +    return CURLE_OUT_OF_MEMORY;
       }
     
       sprintf(full_url, "%s%04d", url, seq);
    diff --git a/tests/libtest/sethostname.h b/tests/libtest/sethostname.h
    index 192f037..032eaa0 100644
    --- a/tests/libtest/sethostname.h
    +++ b/tests/libtest/sethostname.h
    @@ -23,12 +23,8 @@
     #ifdef CURL_STATICLIB
     #  define LIBHOSTNAME_EXTERN
     #elif defined(WIN32) || defined(__SYMBIAN32__)
    -#  if defined(BUILDING_LIBCURL)
    -#    define LIBHOSTNAME_EXTERN  __declspec(dllexport)
    -#  else
    -#    define LIBHOSTNAME_EXTERN  __declspec(dllimport)
    -#  endif
    -#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS)
    +#  define LIBHOSTNAME_EXTERN  __declspec(dllexport)
    +#elif defined(CURL_HIDDEN_SYMBOLS)
     #  define LIBHOSTNAME_EXTERN CURL_EXTERN_SYMBOL
     #else
     #  define LIBHOSTNAME_EXTERN
    diff --git a/tests/libtest/test.h b/tests/libtest/test.h
    index 5de8c7c..4186c4f 100644
    --- a/tests/libtest/test.h
    +++ b/tests/libtest/test.h
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2014, 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
    @@ -58,6 +58,8 @@ extern struct timeval tv_test_start; /* for test timing */
     extern int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc,
                               struct timeval *tv);
     
    +extern void wait_ms(int ms); /* wait this many milliseconds */
    +
     extern int test(char *URL); /* the actual test function provided by each
                                    individual libXXX.c file */
     
    diff --git a/tests/libtest/test1013.pl b/tests/libtest/test1013.pl
    index 15e1214..b680273 100755
    --- a/tests/libtest/test1013.pl
    +++ b/tests/libtest/test1013.pl
    @@ -23,7 +23,7 @@ $curl_protocols =~ /\w+: (.*)$/;
     @curl = split / /,$1;
     
     # These features are not supported by curl-config
    -@curl = grep(!/^(Debug|TrackMemory|Metalink|Largefile|CharConv|GSS-Negotiate|SPNEGO)$/i, @curl);
    +@curl = grep(!/^(Debug|TrackMemory|Metalink|Largefile|CharConv)$/i, @curl);
     @curl = sort @curl;
     
     # Read the output of curl-config
    @@ -32,6 +32,7 @@ open(CURLCONFIG, "sh $ARGV[0] --$what|") || die "Can't get curl-config $what lis
     while(  )
     {
         chomp;
    +    # ignore curl-config --features not in curl's feature list
         push @curl_config, lc($_);
     }
     close CURLCONFIG;
    diff --git a/tests/runtests.1 b/tests/runtests.1
    index 45f8783..cb765a6 100644
    --- a/tests/runtests.1
    +++ b/tests/runtests.1
    @@ -5,7 +5,7 @@
     .\" *                            | (__| |_| |  _ <| |___
     .\" *                             \___|\___/|_| \_\_____|
     .\" *
    -.\" * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al.
    +.\" * Copyright (C) 1998 - 2013, 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
    @@ -49,10 +49,14 @@ default, the test script stops as soon as an error is detected.
     .IP "-bN"
     Use N as the base TCP/UDP port number on which to start the test servers.
     .IP "-c "
    -Provide a custom curl binary to run the tests with. Default is the curl
    -executable in the build tree.
    +Provide a path to a custom curl binary to run the tests with. Default is the
    +curl executable in the build tree.
     .IP "-d"
     Enable protocol debug: have the servers display protocol output.
    +.IP "-e"
    +Run the test event-based (if possible). This will make runtests invoke curl
    +with --test-event option. This option only works if both curl and libcurl were
    +built debug-enabled.
     .IP "-g"
     Run the given test(s) with gdb. This is best used on a single test case and
     curl built --disable-shared. This then fires up gdb with command line set to
    @@ -88,6 +92,10 @@ through everyone, which is very handy when debugging and then often in
     combination with \fI-g\fP.
     .IP "-v"
     Enable verbose output. Speaks more than default.
    +.IP "-vc "
    +Provide a path to a custom curl binary to run when verifying that the servers
    +running are indeed our test servers. Default is the curl executable in the
    +build tree.
     .SH "RUNNING TESTS"
     Many tests have conditions that must be met before the test case can run
     fine. They could depend on built-in features in libcurl or features present in
    diff --git a/tests/runtests.html b/tests/runtests.html
    index b8eb475..6a02b92 100644
    --- a/tests/runtests.html
    +++ b/tests/runtests.html
    @@ -57,9 +57,11 @@ p.roffit {
     

    -bN

    Use N as the base TCP/UDP port number on which to start the test servers.

    -c <curl> -

    Provide a custom curl binary to run the tests with. Default is the curl executable in the build tree. +

    Provide a path to a custom curl binary to run the tests with. Default is the curl executable in the build tree.

    -d

    Enable protocol debug: have the servers display protocol output. +

    -e +

    Run the test event-based (if possible). This will make runtests invoke curl with --test-event option. This option only works if both curl and libcurl were built debug-enabled.

    -g

    Run the given test(s) with gdb. This is best used on a single test case and curl built --disable-shared. This then fires up gdb with command line set to run the specified test case. Simply (set a break-point and) type 'run' to start.

    -h @@ -81,7 +83,9 @@ p.roffit {

    -t[num]

    Selects a torture test for the given tests. This makes runtests.pl first run the tests once and count the number of memory allocations made. It then reruns the test that number of times, each time forcing one of the allocations to fail until all allocs have been tested. By setting num you can force the allocation with that number to be set to fail at once instead of looping through everyone, which is very handy when debugging and then often in combination with -g.

    -v -

    Enable verbose output. Speaks more than default.

    RUNNING TESTS

    +

    Enable verbose output. Speaks more than default. +

    -vc <curl> +

    Provide a path to a custom curl binary to run when verifying that the servers running are indeed our test servers. Default is the curl executable in the build tree.

    RUNNING TESTS

    Many tests have conditions that must be met before the test case can run fine. They could depend on built-in features in libcurl or features present in the operating system or even in third-party libraries that curl may or may not use.

    The test script checks most of these by itself to determine when it is safe to attempt to run each test. Those which cannot be run due to failed requirements will simply be skipped and listed at the completion of all test cases. In some unusual configurations, the test script cannot make the correct determination for all tests. In these cases, the problematic tests can be skipped using the "!keyword" skip feature documented earlier.

    WRITING TESTS

    The simplest way to write test cases is to start with a similar existing test, save it with a new number and then adjust it to fit. There's an attempt to document the test case file format in the tests/FILEFORMAT.

    diff --git a/tests/runtests.pdf b/tests/runtests.pdf index df94a5ef6f327d5d48c8c50b8bfc9a9d2cfea6e3..994123a521801d282eac67b76484d2f7fca40324 100644 GIT binary patch delta 5230 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, et al. +# Copyright (C) 1998 - 2014, 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 @@ -141,6 +141,7 @@ my $HTTPTLSPORT; # HTTP TLS (non-stunnel) server port my $HTTPTLS6PORT; # HTTP TLS (non-stunnel) IPv6 server port my $HTTPPROXYPORT; # HTTP proxy port, when using CONNECT my $HTTPPIPEPORT; # HTTP pipelining port +my $HTTPUNIXPATH; # HTTP server Unix domain socket path my $srcdir = $ENV{'srcdir'} || '.'; my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests @@ -191,44 +192,60 @@ my $pwd = getcwd(); # current working directory my $start; my $ftpchecktime=1; # time it took to verify our test FTP server -my $stunnel = checkcmd("stunnel4") || checkcmd("stunnel"); +my $stunnel = checkcmd("stunnel4") || checkcmd("tstunnel") || checkcmd("stunnel"); my $valgrind = checktestcmd("valgrind"); my $valgrind_logfile="--logfile"; my $valgrind_tool; my $gdb = checktestcmd("gdb"); my $httptlssrv = find_httptlssrv(); -my $ssl_version; # set if libcurl is built with SSL support -my $large_file; # set if libcurl is built with large file support -my $has_idn; # set if libcurl is built with IDN support -my $http_ipv6; # set if HTTP server has IPv6 support -my $ftp_ipv6; # set if FTP server has IPv6 support -my $tftp_ipv6; # set if TFTP server has IPv6 support -my $gopher_ipv6; # set if Gopher server has IPv6 support -my $has_ipv6; # set if libcurl is built with IPv6 support -my $has_libz; # set if libcurl is built with libz support +my $ssl_version; # set if libcurl is built with SSL support +my $large_file; # set if libcurl is built with large file support +my $has_idn; # set if libcurl is built with IDN support +my $http_ipv6; # set if HTTP server has IPv6 support +my $http_unix; # set if HTTP server has Unix sockets support +my $ftp_ipv6; # set if FTP server has IPv6 support +my $tftp_ipv6; # set if TFTP server has IPv6 support +my $gopher_ipv6; # set if Gopher server has IPv6 support +my $has_ipv6; # set if libcurl is built with IPv6 support +my $has_unix; # set if libcurl is built with Unix sockets support +my $has_libz; # set if libcurl is built with libz support my $has_getrlimit; # set if system has getrlimit() -my $has_ntlm; # set if libcurl is built with NTLM support -my $has_ntlm_wb; # set if libcurl is built with NTLM delegation to winbind -my $has_charconv;# set if libcurl is built with CharConv support -my $has_tls_srp; # set if libcurl is built with TLS-SRP support -my $has_metalink;# set if curl is built with Metalink support - -my $has_openssl; # built with a lib using an OpenSSL-like API -my $has_gnutls; # built with GnuTLS -my $has_nss; # built with NSS -my $has_yassl; # built with yassl -my $has_polarssl; # built with polarssl -my $has_axtls; # built with axTLS -my $has_winssl; # built with WinSSL (Schannel/SSPI) -my $has_darwinssl;# build with DarwinSSL (Secure Transport) +my $has_ntlm; # set if libcurl is built with NTLM support +my $has_ntlm_wb; # set if libcurl is built with NTLM delegation to winbind +my $has_sspi; # set if libcurl is built with Windows SSPI +my $has_gssapi; # set if libcurl is built with a GSS-API library +my $has_kerberos; # set if libcurl is built with Kerberos support +my $has_spnego; # set if libcurl is built with SPNEGO support +my $has_charconv; # set if libcurl is built with CharConv support +my $has_tls_srp; # set if libcurl is built with TLS-SRP support +my $has_metalink; # set if curl is built with Metalink support +my $has_http2; # set if libcurl is built with HTTP2 support +my $has_crypto; # set if libcurl is built with cryptographic support +my $has_cares; # set if built with c-ares +my $has_threadedres;# set if built with threaded resolver + +# this version is decided by the particular nghttp2 library that is being used +my $h2cver = "h2c-14"; + +my $has_openssl; # built with a lib using an OpenSSL-like API +my $has_gnutls; # built with GnuTLS +my $has_nss; # built with NSS +my $has_yassl; # built with yassl +my $has_polarssl; # built with polarssl +my $has_axtls; # built with axTLS +my $has_winssl; # built with WinSSL (Secure Channel aka Schannel) +my $has_darwinssl; # build with DarwinSSL (Secure Transport) + +my $has_sslpinning; # built with a TLS backend that supports pinning my $has_shared = "unknown"; # built shared -my $ssllib; # name of the lib we use (for human presentation) -my $has_crypto; # set if libcurl is built with cryptographic support -my $has_textaware; # set if running on a system that has a text mode concept - # on files. Windows for example +my $resolver; # name of the resolver backend (for human presentation) +my $ssllib; # name of the SSL library we use (for human presentation) + +my $has_textaware; # set if running on a system that has a text mode concept + # on files. Windows for example my @protocols; # array of lowercase supported protocol servers @@ -274,6 +291,7 @@ my $gdbxwin; # use windowed gdb when using gdb my $keepoutfiles; # keep stdout and stderr files after tests my $listonly; # only list the tests my $postmortem; # display detailed info about failed tests +my $run_event_based; # run curl with --test-event to test the event API my %run; # running server my %doesntrun; # servers that don't work, identified by pidfile @@ -299,12 +317,14 @@ my $USER = $ENV{USER}; # Linux if (!$USER) { $USER = $ENV{USERNAME}; # Windows if (!$USER) { - $USER = $ENV{LOGNAME}; # Some UNIX (I think) + $USER = $ENV{LOGNAME}; # Some Unix (I think) } } # enable memory debugging if curl is compiled with it $ENV{'CURL_MEMDEBUG'} = $memdump; +$ENV{'CURL_ENTROPY'}="12345678"; +$ENV{'CURL_FORCETIME'}=1; # for debug NTLM magic $ENV{'HOME'}=$pwd; sub catch_zap { @@ -340,7 +360,7 @@ delete $ENV{'CURL_CA_BUNDLE'} if($ENV{'CURL_CA_BUNDLE'}); # Load serverpidfile hash with pidfile names for all possible servers. # sub init_serverpidfile_hash { - for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp', 'http')) { + for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp')) { for my $ssl (('', 's')) { for my $ipvnum ((4, 6)) { for my $idnum ((1, 2, 3)) { @@ -360,6 +380,13 @@ sub init_serverpidfile_hash { } } } + for my $proto (('http', 'imap', 'pop3', 'smtp')) { + for my $ssl (('', 's')) { + my $serv = servername_id("$proto$ssl", "unix", 1); + my $pidf = server_pidfilename("$proto$ssl", "unix", 1); + $serverpidfile{$serv} = $pidf; + } + } } ####################################################################### @@ -495,7 +522,7 @@ sub checktestcmd { sub runclient { my ($cmd)=@_; my $ret = system($cmd); - print "CMD ($ret): $cmd\n" if($verbose); + print "CMD ($ret): $cmd\n" if($verbose && !$torture); return $ret; # This is one way to test curl on a remote machine @@ -579,7 +606,7 @@ sub torture { else { $ret = runclient($testcmd); } - #logmsg "$_ Returned " . $ret >> 8 . "\n"; + #logmsg "$_ Returned " . ($ret >> 8) . "\n"; # Now clear the variable again delete $ENV{'CURL_MEMLIMIT'} if($ENV{'CURL_MEMLIMIT'}); @@ -593,7 +620,7 @@ sub torture { # verify that it returns a proper error code, doesn't leak memory # and doesn't core dump - if($ret & 255) { + if(($ret & 255) || ($ret >> 8) >= 128) { logmsg " system() returned $ret\n"; $fail=1; } @@ -645,11 +672,11 @@ sub stopserver { # All servers relative to the given one must be stopped also # my @killservers; - if($server =~ /^(ftp|http|imap|pop3|smtp|httppipe)s((\d*)(-ipv6|))$/) { + if($server =~ /^(ftp|http|imap|pop3|smtp|httppipe)s((\d*)(-ipv6|-unix|))$/) { # given a stunnel based ssl server, also kill non-ssl underlying one push @killservers, "${1}${2}"; } - elsif($server =~ /^(ftp|http|imap|pop3|smtp|httppipe)((\d*)(-ipv6|))$/) { + elsif($server =~ /^(ftp|http|imap|pop3|smtp|httppipe)((\d*)(-ipv6|-unix|))$/) { # given a non-ssl server, also kill stunnel based ssl piggybacking one push @killservers, "${1}s${2}"; } @@ -695,10 +722,12 @@ sub stopserver { # assign requested address") # sub verifyhttp { - my ($proto, $ipvnum, $idnum, $ip, $port) = @_; + my ($proto, $ipvnum, $idnum, $ip, $port_or_path) = @_; my $server = servername_id($proto, $ipvnum, $idnum); my $pid = 0; my $bonus=""; + # $port_or_path contains a path for Unix sockets, sws ignores the port + my $port = ($ipvnum eq "unix") ? 80 : $port_or_path; my $verifyout = "$LOGDIR/". servername_canon($proto, $ipvnum, $idnum) .'_verify.out'; @@ -718,6 +747,7 @@ sub verifyhttp { $flags .= "--silent "; $flags .= "--verbose "; $flags .= "--globoff "; + $flags .= "--unix-socket '$port_or_path' " if $ipvnum eq "unix"; $flags .= "-1 " if($has_axtls); $flags .= "--insecure " if($proto eq 'https'); $flags .= "\"$proto://$ip:$port/${bonus}verifiedserver\""; @@ -788,14 +818,6 @@ sub verifyftp { if($proto eq "ftps") { $extra .= "--insecure --ftp-ssl-control "; } - elsif($proto eq "smtp") { - # SMTP is a bit different since it requires more options and it - # has _no_ output! - $extra .= "--mail-rcpt verifiedserver "; - $extra .= "--mail-from fake "; - $extra .= "--upload /dev/null "; - $extra .= "--stderr - "; # move stderr to parse the verbose stuff - } my $flags = "--max-time $server_response_maxtime "; $flags .= "--silent "; @@ -962,7 +984,7 @@ sub verifysftp { } # Connect to sftp server, authenticate and run a remote pwd # command using our generated configuration and key files - my $cmd = "$sftp -b $sftpcmds -F $sftpconfig -S $ssh $ip > $sftplog 2>&1"; + my $cmd = "\"$sftp\" -b $sftpcmds -F $sftpconfig -S \"$ssh\" $ip > $sftplog 2>&1"; my $res = runclient($cmd); # Search for pwd command response in log file if(open(SFTPLOGFILE, "<$sftplog")) { @@ -1037,7 +1059,7 @@ sub verifyhttptls { close(FILE); } - if($data && ($data =~ /GNUTLS/) && open(FILE, "<$pidfile")) { + if($data && ($data =~ /(GNUTLS|GnuTLS)/) && open(FILE, "<$pidfile")) { $pid=0+; close(FILE); if($pid > 0) { @@ -1165,7 +1187,7 @@ sub responsiveserver { # start the http server # sub runhttpserver { - my ($proto, $verbose, $alt, $port) = @_; + my ($proto, $verbose, $alt, $port_or_path) = @_; my $ip = $HOSTIP; my $ipvnum = 4; my $idnum = 1; @@ -1192,6 +1214,10 @@ sub runhttpserver { $exe = "python $srcdir/http_pipe.py"; $verbose_flag .= "1 "; } + elsif($alt eq "unix") { + # IP (protocol) is mutually exclusive with Unix sockets + $ipvnum = "unix"; + } $server = servername_id($proto, $ipvnum, $idnum); @@ -1217,7 +1243,12 @@ sub runhttpserver { $flags .= $verbose_flag if($debugprotocol); $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" "; $flags .= "--id $idnum " if($idnum > 1); - $flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\""; + if($ipvnum eq "unix") { + $flags .= "--unix-socket '$port_or_path' "; + } else { + $flags .= "--ipv$ipvnum --port $port_or_path "; + } + $flags .= "--srcdir \"$srcdir\""; my $cmd = "$exe $flags"; my ($httppid, $pid2) = startnew($cmd, $pidfile, 15, 0); @@ -1232,7 +1263,7 @@ sub runhttpserver { } # Server is up. Verify that we can speak to it. - my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port); + my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port_or_path); if(!$pid3) { logmsg "RUN: $srvrname server failed verification\n"; # failed to talk to it properly. Kill the server and return failure @@ -1452,6 +1483,7 @@ sub runhttptlsserver { $flags .= "--http "; $flags .= "--debug 1 " if($debugprotocol); $flags .= "--port $port "; + $flags .= "--priority NORMAL:+SRP "; $flags .= "--srppasswd $srcdir/certs/srp-verifier-db "; $flags .= "--srppasswdconf $srcdir/certs/srp-verifier-conf"; @@ -2034,7 +2066,7 @@ sub runsocksserver { $sshlog = server_logfilename($LOGDIR, 'socks', $ipvnum, $idnum); # start our socks server - my $cmd="$ssh -N -F $sshconfig $ip > $sshlog 2>&1"; + my $cmd="\"$ssh\" -N -F $sshconfig $ip > $sshlog 2>&1"; my ($sshpid, $pid2) = startnew($cmd, $pidfile, 30, 1); # fake pidfile if($sshpid <= 0 || !pidexists($sshpid)) { @@ -2072,7 +2104,7 @@ sub runsocksserver { # be used to verify that a server present in %run hash is still functional # sub responsive_http_server { - my ($proto, $verbose, $alt, $port) = @_; + my ($proto, $verbose, $alt, $port_or_path) = @_; my $ip = $HOSTIP; my $ipvnum = 4; my $idnum = 1; @@ -2085,8 +2117,12 @@ sub responsive_http_server { elsif($alt eq "proxy") { $idnum = 2; } + elsif($alt eq "unix") { + # IP (protocol) is mutually exclusive with Unix sockets + $ipvnum = "unix"; + } - return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port); + return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port_or_path); } ####################################################################### @@ -2207,37 +2243,10 @@ sub cleardir { } ####################################################################### -# filter out the specified pattern from the given input file and store the -# results in the given output file -# -sub filteroff { - my $infile=$_[0]; - my $filter=$_[1]; - my $ofile=$_[2]; - - open(IN, "<$infile") - || return 1; - - open(OUT, ">$ofile") - || return 1; - - # logmsg "FILTER: off $filter from $infile to $ofile\n"; - - while() { - $_ =~ s/$filter//; - print OUT $_; - } - close(IN); - close(OUT); - return 0; -} - -####################################################################### # compare test results with the expected output, we might filter off # some pattern that is allowed to differ, output test results # sub compare { - # filter off patterns _before_ this comparison! my ($testnum, $testname, $subject, $firstref, $secondref)=@_; my $result = compareparts($firstref, $secondref); @@ -2289,6 +2298,7 @@ sub checksystem { @version = ; close(VERSOUT); + $resolver="stock"; for(@version) { chomp; @@ -2324,10 +2334,12 @@ sub checksystem { } elsif ($libcurl =~ /openssl/i) { $has_openssl=1; + $has_sslpinning=1; $ssllib="OpenSSL"; } elsif ($libcurl =~ /gnutls/i) { $has_gnutls=1; + $has_sslpinning=1; $ssllib="GnuTLS"; } elsif ($libcurl =~ /nss/i) { @@ -2350,15 +2362,20 @@ sub checksystem { $has_darwinssl=1; $ssllib="DarwinSSL"; } + if ($libcurl =~ /ares/i) { + $has_cares=1; + $resolver="c-ares"; + } } elsif($_ =~ /^Protocols: (.*)/i) { # these are the protocols compiled in to this libcurl @protocols = split(' ', lc($1)); # Generate a "proto-ipv6" version of each protocol to match the - # IPv6 name. This works even if IPv6 support isn't + # IPv6 name and a "proto-unix" to match the variant which + # uses Unix domain sockets. This works even if support isn't # compiled in because the test will fail. - push @protocols, map($_ . '-ipv6', @protocols); + push @protocols, map(("$_-ipv6", "$_-unix"), @protocols); # 'http-proxy' is used in test cases to do CONNECT through push @protocols, 'http-proxy'; @@ -2394,17 +2411,45 @@ sub checksystem { if($feat =~ /IPv6/i) { $has_ipv6 = 1; } + if($feat =~ /UnixSockets/i) { + $has_unix = 1; + } if($feat =~ /libz/i) { $has_libz = 1; } if($feat =~ /NTLM/i) { # NTLM enabled $has_ntlm=1; + + # Use this as a proxy for any cryptographic authentication + $has_crypto=1; } if($feat =~ /NTLM_WB/i) { # NTLM delegation to winbind daemon ntlm_auth helper enabled $has_ntlm_wb=1; } + if($feat =~ /SSPI/i) { + # SSPI enabled + $has_sspi=1; + } + if($feat =~ /GSS-API/i) { + # GSS-API enabled + $has_gssapi=1; + } + if($feat =~ /Kerberos/i) { + # Kerberos enabled + $has_kerberos=1; + + # Use this as a proxy for any cryptographic authentication + $has_crypto=1; + } + if($feat =~ /SPNEGO/i) { + # SPNEGO enabled + $has_spnego=1; + + # Use this as a proxy for any cryptographic authentication + $has_crypto=1; + } if($feat =~ /CharConv/i) { # CharConv enabled $has_charconv=1; @@ -2417,6 +2462,17 @@ sub checksystem { # Metalink enabled $has_metalink=1; } + if($feat =~ /AsynchDNS/i) { + if(!$has_cares) { + # this means threaded resolver + $has_threadedres=1; + $resolver="threaded"; + } + } + if($feat =~ /HTTP2/) { + # http2 enabled + $has_http2=1; + } } # # Test harness currently uses a non-stunnel server in order to @@ -2473,12 +2529,12 @@ sub checksystem { } if($has_ipv6) { - # client has ipv6 support + # client has IPv6 support # check if the HTTP server has it! my @sws = `server/sws --version`; if($sws[0] =~ /IPv6/) { - # HTTP server has ipv6 support! + # HTTP server has IPv6 support! $http_ipv6 = 1; $gopher_ipv6 = 1; } @@ -2486,11 +2542,17 @@ sub checksystem { # check if the FTP server has it! @sws = `server/sockfilt --version`; if($sws[0] =~ /IPv6/) { - # FTP server has ipv6 support! + # FTP server has IPv6 support! $ftp_ipv6 = 1; } } + if($has_unix) { + # client has Unix sockets support, check whether the HTTP server has it + my @sws = `server/sws --version`; + $http_unix = 1 if($sws[0] =~ /unix/); + } + if(!$has_memory_tracking && $torture) { die "can't run torture tests since curl was built without ". "TrackMemory feature (--enable-curldebug)"; @@ -2499,10 +2561,6 @@ sub checksystem { $has_shared = `sh $CURLCONFIG --built-shared`; chomp $has_shared; - # curl doesn't list cryptographic support separately, so assume it's - # always available - $has_crypto=1; - my $hostname=join(' ', runclientoutput("hostname")); my $hosttype=join(' ', runclientoutput("uname -a")); @@ -2513,15 +2571,24 @@ sub checksystem { "* Host: $hostname", "* System: $hosttype"); + if($has_memory_tracking && $has_threadedres) { + $has_memory_tracking = 0; + logmsg("*\n", + "*** DISABLES memory tracking when using threaded resolver\n", + "*\n"); + } + logmsg sprintf("* Server SSL: %8s", $stunnel?"ON ":"OFF"); logmsg sprintf(" libcurl SSL: %s\n", $ssl_version?"ON ":"OFF"); logmsg sprintf("* debug build: %8s", $debug_build?"ON ":"OFF"); logmsg sprintf(" track memory: %s\n", $has_memory_tracking?"ON ":"OFF"); logmsg sprintf("* valgrind: %8s", $valgrind?"ON ":"OFF"); logmsg sprintf(" HTTP IPv6 %s\n", $http_ipv6?"ON ":"OFF"); + logmsg sprintf("* HTTP Unix %s\n", $http_unix?"ON ":"OFF"); logmsg sprintf("* FTP IPv6 %8s", $ftp_ipv6?"ON ":"OFF"); logmsg sprintf(" Libtool lib: %s\n", $libtool?"ON ":"OFF"); - logmsg sprintf("* Shared build: %s\n", $has_shared); + logmsg sprintf("* Shared build: %-3s", $has_shared); + logmsg sprintf(" Resolver: %s\n", $resolver); if($ssl_version) { logmsg sprintf("* SSL library: %13s\n", $ssllib); } @@ -2570,6 +2637,13 @@ sub checksystem { } logmsg sprintf("* HTTP-PIPE/%d \n", $HTTPPIPEPORT); + if($has_unix) { + logmsg "* Unix socket paths:\n"; + if($http_unix) { + logmsg sprintf("* HTTP-Unix:%s\n", $HTTPUNIXPATH); + } + } + $has_textaware = ($^O eq 'MSWin32') || ($^O eq 'msys'); logmsg "***************************************** \n"; @@ -2618,6 +2692,10 @@ sub subVariables { $$thing =~ s/%TFTP6PORT/$TFTP6PORT/g; $$thing =~ s/%TFTPPORT/$TFTPPORT/g; + # server Unix domain socket paths + + $$thing =~ s/%HTTPUNIXPATH/$HTTPUNIXPATH/g; + # client IP addresses $$thing =~ s/%CLIENT6IP/$CLIENT6IP/g; @@ -2645,6 +2723,10 @@ sub subVariables { $$thing =~ s/%FTPTIME2/$ftp2/g; $$thing =~ s/%FTPTIME3/$ftp3/g; + + # HTTP2 + + $$thing =~ s/%H2CVER/$h2cver/g; } sub fixarray { @@ -2710,7 +2792,11 @@ sub timestampskippedevents { # Run a single specified test case # sub singletest { - my ($testnum, $count, $total)=@_; + my ($evbased, # 1 means switch on if possible (and "curl" is tested) + # returns "not a test" if it can't be used for this test + $testnum, + $count, + $total)=@_; my @what; my $why; @@ -2726,7 +2812,7 @@ sub singletest { $timeprepini{$testnum} = Time::HiRes::time() if($timestats); if($disttests !~ /test$testnum\W/ ) { - logmsg "Warning: test$testnum not present in tests/data/Makefile.am\n"; + logmsg "Warning: test$testnum not present in tests/data/Makefile.inc\n"; } if($disabled{$testnum}) { logmsg "Warning: test$testnum is explicitly disabled\n"; @@ -2744,128 +2830,303 @@ sub singletest { @what = getpart("client", "features"); } + # We require a feature to be present for(@what) { my $f = $_; $f =~ s/\s//g; - $feature{$f}=$f; # we require this feature + if($f =~ /^([^!].*)$/) { + # Store the feature for later + $feature{$1} = $1; - if($f eq "SSL") { - if($ssl_version) { - next; + if($1 eq "SSL") { + if($ssl_version) { + next; + } } - } - elsif($f eq "OpenSSL") { - if($has_openssl) { - next; + elsif($1 eq "SSLpinning") { + if($has_sslpinning) { + next; + } } - } - elsif($f eq "GnuTLS") { - if($has_gnutls) { - next; + elsif($1 eq "OpenSSL") { + if($has_openssl) { + next; + } } - } - elsif($f eq "NSS") { - if($has_nss) { - next; + elsif($1 eq "GnuTLS") { + if($has_gnutls) { + next; + } } - } - elsif($f eq "axTLS") { - if($has_axtls) { - next; + elsif($1 eq "NSS") { + if($has_nss) { + next; + } } - } - elsif($f eq "WinSSL") { - if($has_winssl) { - next; + elsif($1 eq "axTLS") { + if($has_axtls) { + next; + } } - } - elsif($f eq "DarwinSSL") { - if($has_darwinssl) { - next; + elsif($1 eq "WinSSL") { + if($has_winssl) { + next; + } } - } - elsif($f eq "unittest") { - if($debug_build) { - next; + elsif($1 eq "DarwinSSL") { + if($has_darwinssl) { + next; + } } - } - elsif($f eq "debug") { - if($debug_build) { - next; + elsif($1 eq "unittest") { + if($debug_build) { + next; + } } - } - elsif($f eq "TrackMemory") { - if($has_memory_tracking) { - next; + elsif($1 eq "debug") { + if($debug_build) { + next; + } } - } - elsif($f eq "large_file") { - if($large_file) { - next; + elsif($1 eq "TrackMemory") { + if($has_memory_tracking) { + next; + } } - } - elsif($f eq "idn") { - if($has_idn) { - next; + elsif($1 eq "large_file") { + if($large_file) { + next; + } } - } - elsif($f eq "ipv6") { - if($has_ipv6) { - next; + elsif($1 eq "idn") { + if($has_idn) { + next; + } } - } - elsif($f eq "libz") { - if($has_libz) { - next; + elsif($1 eq "ipv6") { + if($has_ipv6) { + next; + } } - } - elsif($f eq "NTLM") { - if($has_ntlm) { - next; + elsif($1 eq "libz") { + if($has_libz) { + next; + } } - } - elsif($f eq "NTLM_WB") { - if($has_ntlm_wb) { - next; + elsif($1 eq "NTLM") { + if($has_ntlm) { + next; + } } - } - elsif($f eq "getrlimit") { - if($has_getrlimit) { - next; + elsif($1 eq "NTLM_WB") { + if($has_ntlm_wb) { + next; + } } - } - elsif($f eq "crypto") { - if($has_crypto) { + elsif($1 eq "SSPI") { + if($has_sspi) { + next; + } + } + elsif($1 eq "GSS-API") { + if($has_gssapi) { + next; + } + } + elsif($1 eq "Kerberos") { + if($has_kerberos) { + next; + } + } + elsif($1 eq "SPNEGO") { + if($has_spnego) { + next; + } + } + elsif($1 eq "getrlimit") { + if($has_getrlimit) { + next; + } + } + elsif($1 eq "crypto") { + if($has_crypto) { + next; + } + } + elsif($1 eq "TLS-SRP") { + if($has_tls_srp) { + next; + } + } + elsif($1 eq "Metalink") { + if($has_metalink) { + next; + } + } + elsif($1 eq "http2") { + if($has_http2) { + next; + } + } + elsif($1 eq "socks") { next; } - } - elsif($f eq "TLS-SRP") { - if($has_tls_srp) { + elsif($1 eq "unix-sockets") { + next if $has_unix; + } + # See if this "feature" is in the list of supported protocols + elsif (grep /^\Q$1\E$/i, @protocols) { next; } + + $why = "curl lacks $1 support"; + last; } - elsif($f eq "Metalink") { - if($has_metalink) { + } + + # We require a feature to not be present + if(!$why) { + for(@what) { + my $f = $_; + $f =~ s/\s//g; + + if($f =~ /^!(.*)$/) { + if($1 eq "SSL") { + if(!$ssl_version) { + next; + } + } + elsif($1 eq "OpenSSL") { + if(!$has_openssl) { + next; + } + } + elsif($1 eq "GnuTLS") { + if(!$has_gnutls) { + next; + } + } + elsif($1 eq "NSS") { + if(!$has_nss) { + next; + } + } + elsif($1 eq "axTLS") { + if(!$has_axtls) { + next; + } + } + elsif($1 eq "WinSSL") { + if(!$has_winssl) { + next; + } + } + elsif($1 eq "DarwinSSL") { + if(!$has_darwinssl) { + next; + } + } + elsif($1 eq "TrackMemory") { + if(!$has_memory_tracking) { + next; + } + } + elsif($1 eq "large_file") { + if(!$large_file) { + next; + } + } + elsif($1 eq "idn") { + if(!$has_idn) { + next; + } + } + elsif($1 eq "ipv6") { + if(!$has_ipv6) { + next; + } + } + elsif($1 eq "unix-sockets") { + next if !$has_unix; + } + elsif($1 eq "libz") { + if(!$has_libz) { + next; + } + } + elsif($1 eq "NTLM") { + if(!$has_ntlm) { + next; + } + } + elsif($1 eq "NTLM_WB") { + if(!$has_ntlm_wb) { + next; + } + } + elsif($1 eq "SSPI") { + if(!$has_sspi) { + next; + } + } + elsif($1 eq "GSS-API") { + if(!$has_gssapi) { + next; + } + } + elsif($1 eq "Kerberos") { + if(!$has_kerberos) { + next; + } + } + elsif($1 eq "SPNEGO") { + if(!$has_spnego) { + next; + } + } + elsif($1 eq "getrlimit") { + if(!$has_getrlimit) { + next; + } + } + elsif($1 eq "crypto") { + if(!$has_crypto) { + next; + } + } + elsif($1 eq "TLS-SRP") { + if(!$has_tls_srp) { + next; + } + } + elsif($1 eq "Metalink") { + if(!$has_metalink) { + next; + } + } + else { + next; + } + } + else { next; } - } - elsif($f eq "socks") { - next; - } - # See if this "feature" is in the list of supported protocols - elsif (grep /^\Q$f\E$/i, @protocols) { - next; - } - $why = "curl lacks $f support"; - last; + $why = "curl has $1 support"; + last; + } } if(!$why) { my @keywords = getpart("info", "keywords"); my $match; my $k; + + if(!$keywords[0]) { + $why = "missing the section!"; + } + for $k (@keywords) { chomp $k; if ($disabled_keywords{$k}) { @@ -2984,28 +3245,33 @@ sub singletest { if(!$short) { if($skipped{$why} <= 3) { # show only the first three skips for each reason - logmsg sprintf("test %03d SKIPPED: $why\n", $testnum); + logmsg sprintf("test %04d SKIPPED: $why\n", $testnum); } } timestampskippedevents($testnum); return -1; } - logmsg sprintf("test %03d...", $testnum) if(!$automakestyle); + logmsg sprintf("test %04d...", $testnum) if(!$automakestyle); # extract the reply data my @reply = getpart("reply", "data"); my @replycheck = getpart("reply", "datacheck"); + my %replyattr = getpartattr("reply", "data"); + my %replycheckattr = getpartattr("reply", "datacheck"); + if (@replycheck) { # we use this file instead to check the final output against - my %hash = getpartattr("reply", "datacheck"); - if($hash{'nonewline'}) { + if($replycheckattr{'nonewline'}) { # Yes, we must cut off the final newline from the final line # of the datacheck chomp($replycheck[$#replycheck]); } + if($replycheckattr{'mode'}) { + $replyattr{'mode'} = $replycheckattr{'mode'}; + } @reply=@replycheck; } @@ -3127,6 +3393,7 @@ sub singletest { my $CMDLINE; my $cmdargs; my $cmdtype = $cmdhash{'type'} || "default"; + my $fail_due_event_based = $evbased; if($cmdtype eq "perl") { # run the command line prepended with "perl" $cmdargs ="$cmd"; @@ -3142,15 +3409,22 @@ sub singletest { $disablevalgrind=1; } elsif(!$tool) { - # run curl, add --verbose for debug information output + # run curl, add suitable command line options $cmd = "-1 ".$cmd if(exists $feature{"SSL"} && ($has_axtls)); my $inc=""; if((!$cmdhash{'option'}) || ($cmdhash{'option'} !~ /no-include/)) { - $inc = "--include "; + $inc = " --include"; } - $cmdargs ="$out $inc--trace-ascii log/trace$testnum --trace-time $cmd"; + $cmdargs = "$out$inc "; + $cmdargs .= "--trace-ascii log/trace$testnum "; + $cmdargs .= "--trace-time "; + if($evbased) { + $cmdargs .= "--test-event "; + $fail_due_event_based--; + } + $cmdargs .= $cmd; } else { $cmdargs = " $cmd"; # $cmd is the command line for the test file @@ -3171,6 +3445,18 @@ sub singletest { $DBGCURL=$CMDLINE; } + if($gdbthis) { + # gdb is incompatible with valgrind, so disable it when debugging + # Perhaps a better approach would be to run it under valgrind anyway + # with --db-attach=yes or --vgdb=yes. + $disablevalgrind=1; + } + + if($fail_due_event_based) { + logmsg "This test cannot run event based\n"; + return -1; + } + my @stdintest = getpart("client", "stdin"); if(@stdintest) { @@ -3200,6 +3486,7 @@ sub singletest { $valgrindcmd .= "$valgrind_tool " if($valgrind_tool); $valgrindcmd .= "--leak-check=yes "; $valgrindcmd .= "--suppressions=$srcdir/valgrind.supp "; + # $valgrindcmd .= "--gen-suppressions=all "; $valgrindcmd .= "--num-callers=16 "; $valgrindcmd .= "${valgrind_logfile}=$LOGDIR/valgrind$testnum"; $CMDLINE = "$valgrindcmd $CMDLINE"; @@ -3334,11 +3621,11 @@ sub singletest { my @killservers; foreach my $server (@killtestservers) { chomp $server; - if($server =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|))$/) { + if($server =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) { # given a stunnel ssl server, also kill non-ssl underlying one push @killservers, "${1}${2}"; } - elsif($server =~ /^(ftp|http|imap|pop3|smtp)((\d*)(-ipv6|))$/) { + elsif($server =~ /^(ftp|http|imap|pop3|smtp)((\d*)(-ipv6|-unix|))$/) { # given a non-ssl server, also kill stunnel piggybacking one push @killservers, "${1}s${2}"; } @@ -3453,7 +3740,8 @@ sub singletest { my $filemode=$hash{'mode'}; if($filemode && ($filemode eq "text") && $has_textaware) { # text mode when running on windows: fix line endings - map s/\r\n/\n/g, @actual; + map s/\r\n/\n/g, @validstdout; + map s/\n/\r\n/g, @validstdout; } if($hash{'nonewline'}) { @@ -3472,41 +3760,6 @@ sub singletest { $ok .= "-"; # stdout not checked } - my %replyattr = getpartattr("reply", "data"); - if(!$replyattr{'nocheck'} && (@reply || $replyattr{'sendzero'})) { - # verify the received data - my @out = loadarray($CURLOUT); - my %hash = getpartattr("reply", "data"); - # get the mode attribute - my $filemode=$hash{'mode'}; - if($filemode && ($filemode eq "text") && $has_textaware) { - # text mode when running on windows: fix line endings - map s/\r\n/\n/g, @out; - } - - $res = compare($testnum, $testname, "data", \@out, \@reply); - if ($res) { - return 1; - } - $ok .= "d"; - } - else { - $ok .= "-"; # data not checked - } - - if(@upload) { - # verify uploaded data - my @out = loadarray("$LOGDIR/upload.$testnum"); - $res = compare($testnum, $testname, "upload", \@out, \@upload); - if ($res) { - return 1; - } - $ok .= "u"; - } - else { - $ok .= "-"; # upload not checked - } - if(@protocol) { # Verify the sent request my @out = loadarray($SERVERIN); @@ -3554,6 +3807,40 @@ sub singletest { $ok .= "-"; # protocol not checked } + if(!$replyattr{'nocheck'} && (@reply || $replyattr{'sendzero'})) { + # verify the received data + my @out = loadarray($CURLOUT); + # get the mode attribute + my $filemode=$replyattr{'mode'}; + if($filemode && ($filemode eq "text") && $has_textaware) { + # text mode when running on windows: fix line endings + map s/\r\n/\n/g, @reply; + map s/\n/\r\n/g, @reply; + } + + $res = compare($testnum, $testname, "data", \@out, \@reply); + if ($res) { + return 1; + } + $ok .= "d"; + } + else { + $ok .= "-"; # data not checked + } + + if(@upload) { + # verify uploaded data + my @out = loadarray("$LOGDIR/upload.$testnum"); + $res = compare($testnum, $testname, "upload", \@out, \@upload); + if ($res) { + return 1; + } + $ok .= "u"; + } + else { + $ok .= "-"; # upload not checked + } + if(@proxyprot) { # Verify the sent proxy request my @out = loadarray($PROXYIN); @@ -3625,17 +3912,24 @@ sub singletest { my $filemode=$hash{'mode'}; if($filemode && ($filemode eq "text") && $has_textaware) { - # text mode when running on windows means adding an extra - # strip expression - push @stripfile, "s/\r\n/\n/"; + # text mode when running on windows: fix line endings + map s/\r\n/\n/g, @outfile; + map s/\n/\r\n/g, @outfile; } my $strip; for $strip (@stripfile) { chomp $strip; + my @newgen; for(@generated) { eval $strip; + if($_) { + push @newgen, $_; + } } + # this is to get rid of array entries that vanished (zero + # length) because of replacements + @generated = @newgen; } @outfile = fixarray(@outfile); @@ -3755,6 +4049,8 @@ sub singletest { else { $ok .= "-"; # valgrind not checked } + # add 'E' for event-based + $ok .= $evbased ? "E" : "-"; logmsg "$ok " if(!$short); @@ -3843,7 +4139,7 @@ sub startservers { $what =~ s/[^a-z0-9-]//g; my $certfile; - if($what =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|))$/) { + if($what =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) { $certfile = ($whatlist[1]) ? $whatlist[1] : 'stunnel.pem'; } @@ -3961,7 +4257,7 @@ sub startservers { } elsif($what eq "http-ipv6") { if($torture && $run{'http-ipv6'} && - !responsive_http_server("http", $verbose, "IPv6", $HTTP6PORT)) { + !responsive_http_server("http", $verbose, "ipv6", $HTTP6PORT)) { stopserver('http-ipv6'); } if(!$run{'http-ipv6'}) { @@ -4008,11 +4304,11 @@ sub startservers { } elsif($what eq "rtsp-ipv6") { if($torture && $run{'rtsp-ipv6'} && - !responsive_rtsp_server($verbose, "IPv6")) { + !responsive_rtsp_server($verbose, "ipv6")) { stopserver('rtsp-ipv6'); } if(!$run{'rtsp-ipv6'}) { - ($pid, $pid2) = runrtspserver($verbose, "IPv6"); + ($pid, $pid2) = runrtspserver($verbose, "ipv6"); if($pid <= 0) { return "failed starting RTSP-IPv6 server"; } @@ -4120,11 +4416,11 @@ sub startservers { return "no gnutls-serv"; } if($torture && $run{'httptls-ipv6'} && - !responsive_httptls_server($verbose, "IPv6")) { + !responsive_httptls_server($verbose, "ipv6")) { stopserver('httptls-ipv6'); } if(!$run{'httptls-ipv6'}) { - ($pid, $pid2) = runhttptlsserver($verbose, "IPv6"); + ($pid, $pid2) = runhttptlsserver($verbose, "ipv6"); if($pid <= 0) { return "failed starting HTTPTLS-IPv6 server (gnutls-serv)"; } @@ -4149,11 +4445,11 @@ sub startservers { } elsif($what eq "tftp-ipv6") { if($torture && $run{'tftp-ipv6'} && - !responsive_tftp_server("", $verbose, "IPv6")) { + !responsive_tftp_server("", $verbose, "ipv6")) { stopserver('tftp-ipv6'); } if(!$run{'tftp-ipv6'}) { - ($pid, $pid2) = runtftpserver("", $verbose, "IPv6"); + ($pid, $pid2) = runtftpserver("", $verbose, "ipv6"); if($pid <= 0) { return "failed starting TFTP-IPv6 server"; } @@ -4198,6 +4494,22 @@ sub startservers { } } } + elsif($what eq "http-unix") { + if($torture && $run{'http-unix'} && + !responsive_http_server("http", $verbose, "unix", $HTTPUNIXPATH)) { + stopserver('http-unix'); + } + if(!$run{'http-unix'}) { + ($pid, $pid2) = runhttpserver("http", $verbose, "unix", + $HTTPUNIXPATH); + if($pid <= 0) { + return "failed starting HTTP-unix server"; + } + logmsg sprintf("* pid http-unix => %d %d\n", $pid, $pid2) + if($verbose); + $run{'http-unix'}="$pid $pid2"; + } + } elsif($what eq "none") { logmsg "* starts no server\n" if ($verbose); } @@ -4413,6 +4725,16 @@ while(@ARGV) { $DBGCURL=$CURL=$ARGV[1]; shift @ARGV; } + elsif ($ARGV[0] eq "-vc") { + # use this path to a curl used to verify servers + + # Particularly useful when you introduce a crashing bug somewhere in + # the development version as then it won't be able to run any tests + # since it can't verify the servers! + + $VCURL=$ARGV[1]; + shift @ARGV; + } elsif ($ARGV[0] eq "-d") { # have the servers display protocol output $debugprotocol=1; @@ -4454,6 +4776,10 @@ while(@ARGV) { # continue anyway, even if a test fail $anyway=1; } + elsif($ARGV[0] eq "-e") { + # run the tests cases event based if possible + $run_event_based=1; + } elsif($ARGV[0] eq "-p") { $postmortem=1; } @@ -4514,6 +4840,7 @@ Usage: runtests.pl [options] [test selection(s)] -am automake style output PASS/FAIL: [number] [name] -t[N] torture (simulate memory alloc failures); N means fail Nth alloc -v verbose output + -vc path use this curl only to verify the existing servers [num] like "5 6 9" or " 5 to 22 " to run those tests only [!num] like "!5 !6 !9" to disable those tests [keyword] like "IPv6" to select only tests containing the key word @@ -4606,7 +4933,7 @@ if ($gdbthis) { if($c eq "#! /") { # A shell script. This is typically when built with libtool, $libtool = 1; - $gdb = "libtool --mode=execute gdb"; + $gdb = "../libtool --mode=execute gdb"; } } @@ -4635,6 +4962,7 @@ $HTTPTLSPORT = $base++; # HTTP TLS (non-stunnel) server port $HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port $HTTPPROXYPORT = $base++; # HTTP proxy port, when using CONNECT $HTTPPIPEPORT = $base++; # HTTP pipelining port +$HTTPUNIXPATH = 'http.sock'; # HTTP server Unix domain socket path ####################################################################### # clear and create logging directory: @@ -4659,20 +4987,21 @@ if(!$listonly) { } ####################################################################### -# Fetch all disabled tests +# Fetch all disabled tests, if there are any # -open(D, "<$TESTDIR/DISABLED"); -while() { - if(/^ *\#/) { - # allow comments - next; - } - if($_ =~ /(\d+)/) { - $disabled{$1}=$1; # disable this test number +if(open(D, "<$TESTDIR/DISABLED")) { + while() { + if(/^ *\#/) { + # allow comments + next; + } + if($_ =~ /(\d+)/) { + $disabled{$1}=$1; # disable this test number + } } + close(D); } -close(D); ####################################################################### # If 'all' tests are requested, find out all test numbers @@ -4703,6 +5032,19 @@ if ( $TESTCASES eq "all") { $TESTCASES .= " $n"; } } +else { + my $verified=""; + map { + if (-e "$TESTDIR/test$_") { + $verified.="$_ "; + } + } split(" ", $TESTCASES); + if($verified eq "") { + print "No existing test cases were specified\n"; + exit; + } + $TESTCASES = $verified; +} ####################################################################### # Start the command line log @@ -4825,7 +5167,7 @@ foreach $testnum (@at) { $lasttest = $testnum if($testnum > $lasttest); $count++; - my $error = singletest($testnum, $count, scalar(@at)); + my $error = singletest($run_event_based, $testnum, $count, scalar(@at)); if($error < 0) { # not a test we can run next; diff --git a/tests/secureserver.pl b/tests/secureserver.pl index 36a902e..6276110 100755 --- a/tests/secureserver.pl +++ b/tests/secureserver.pl @@ -6,7 +6,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -33,6 +33,7 @@ BEGIN { use strict; use warnings; use Cwd; +use Cwd 'abs_path'; use serverhelp qw( server_pidfilename @@ -50,7 +51,9 @@ my $stuncert; my $ver_major; my $ver_minor; +my $fips_support; my $stunnel_version; +my $tstunnel_windows; my $socketopt; my $cmd; @@ -61,6 +64,7 @@ my $ipvnum = 4; # default IP version of stunneled server my $idnum = 1; # dafault stunneled server instance number my $proto = 'https'; # default secure server protocol my $conffile; # stunnel configuration file +my $capath; # certificate chain PEM folder my $certfile; # certificate chain PEM file #*************************************************************************** @@ -112,7 +116,12 @@ while(@ARGV) { } elsif($ARGV[0] eq '--stunnel') { if($ARGV[1]) { - $stunnel = $ARGV[1]; + if($ARGV[1] =~ /^([\w\/]+)$/) { + $stunnel = $ARGV[1]; + } + else { + $stunnel = "\"". $ARGV[1] ."\""; + } shift @ARGV; } } @@ -172,7 +181,9 @@ if(!$logfile) { $conffile = "$path/stunnel.conf"; +$capath = abs_path($path); $certfile = "$srcdir/". ($stuncert?"certs/$stuncert":"stunnel.pem"); +$certfile = abs_path($certfile); my $ssltext = uc($proto) ." SSL/TLS:"; @@ -184,7 +195,11 @@ foreach my $veropt (('-version', '-V')) { if($verstr =~ /^stunnel (\d+)\.(\d+) on /) { $ver_major = $1; $ver_minor = $2; - last; + } + elsif($verstr =~ /^sslVersion.*fips *= *yes/) { + # the fips option causes an error if stunnel doesn't support it + $fips_support = 1; + last } } last if($ver_major); @@ -201,7 +216,7 @@ if((!$ver_major) || (!$ver_minor)) { $stunnel_version = (100*$ver_major) + $ver_minor; #*************************************************************************** -# Verify minimmum stunnel required version +# Verify minimum stunnel required version # if($stunnel_version < 310) { print "$ssltext Unsupported stunnel version $ver_major.$ver_minor\n"; @@ -209,6 +224,17 @@ if($stunnel_version < 310) { } #*************************************************************************** +# Find out if we are running on Windows using the tstunnel binary +# +if($stunnel =~ /tstunnel(\.exe)?"?$/) { + $tstunnel_windows = 1; + + # replace Cygwin and MinGW drives within paths + $capath =~ s/^(\/cygdrive)?\/(\w)\//$2\:\//; + $certfile =~ s/^(\/cygdrive)?\/(\w)\//$2\:\//; +} + +#*************************************************************************** # Build command to execute for stunnel 3.X versions # if($stunnel_version < 400) { @@ -243,19 +269,24 @@ if($stunnel_version >= 400) { $SIG{TERM} = \&exit_signal_handler; # stunnel configuration file if(open(STUNCONF, ">$conffile")) { - print STUNCONF " - CApath = $path - cert = $certfile - pid = $pidfile - debug = $loglevel - output = $logfile - socket = $socketopt - foreground = yes - - [curltest] - accept = $accept_port - connect = $target_port - "; + print STUNCONF "CApath = $capath\n"; + print STUNCONF "cert = $certfile\n"; + print STUNCONF "debug = $loglevel\n"; + print STUNCONF "socket = $socketopt\n"; + if($fips_support) { + # disable fips in case OpenSSL doesn't support it + print STUNCONF "fips = no\n"; + } + if(!$tstunnel_windows) { + # do not use Linux-specific options on Windows + print STUNCONF "output = $logfile\n"; + print STUNCONF "pid = $pidfile\n"; + print STUNCONF "foreground = yes\n"; + } + print STUNCONF "\n"; + print STUNCONF "[curltest]\n"; + print STUNCONF "accept = $accept_port\n"; + print STUNCONF "connect = $target_port\n"; if(!close(STUNCONF)) { print "$ssltext Error closing file $conffile\n"; exit 1; @@ -268,13 +299,18 @@ if($stunnel_version >= 400) { if($verbose) { print uc($proto) ." server (stunnel $ver_major.$ver_minor)\n"; print "cmd: $cmd\n"; - print "CApath = $path\n"; + print "CApath = $capath\n"; print "cert = $certfile\n"; - print "pid = $pidfile\n"; print "debug = $loglevel\n"; - print "output = $logfile\n"; print "socket = $socketopt\n"; - print "foreground = yes\n"; + if($fips_support) { + print "fips = no\n"; + } + if(!$tstunnel_windows) { + print "pid = $pidfile\n"; + print "output = $logfile\n"; + print "foreground = yes\n"; + } print "\n"; print "[curltest]\n"; print "accept = $accept_port\n"; @@ -288,6 +324,25 @@ if($stunnel_version >= 400) { chmod(0600, $certfile) if(-f $certfile); #*************************************************************************** +# Run tstunnel on Windows. +# +if($tstunnel_windows) { + # Fake pidfile for tstunnel on Windows. + if(open(OUT, ">$pidfile")) { + print OUT $$ . "\n"; + close(OUT); + } + + # Put an "exec" in front of the command so that the child process + # keeps this child's process ID. + exec("exec $cmd") || die "Can't exec() $cmd: $!"; + + # exec() should never return back here to this process. We protect + # ourselves by calling die() just in case something goes really bad. + die "error: exec() has returned"; +} + +#*************************************************************************** # Run stunnel. # my $rc = system($cmd); diff --git a/tests/server/Makefile.in b/tests/server/Makefile.in index b30c599..f63718a 100644 --- a/tests/server/Makefile.in +++ b/tests/server/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -112,13 +112,17 @@ CONFIG_HEADER = $(top_builddir)/lib/curl_config.h \ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -am__objects_1 = fake_ntlm-mprintf.$(OBJEXT) \ - fake_ntlm-nonblock.$(OBJEXT) fake_ntlm-strequal.$(OBJEXT) \ - fake_ntlm-strtoofft.$(OBJEXT) fake_ntlm-timeval.$(OBJEXT) \ - fake_ntlm-warnless.$(OBJEXT) +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = ../../lib/fake_ntlm-mprintf.$(OBJEXT) \ + ../../lib/fake_ntlm-nonblock.$(OBJEXT) \ + ../../lib/fake_ntlm-strequal.$(OBJEXT) \ + ../../lib/fake_ntlm-strtoofft.$(OBJEXT) \ + ../../lib/fake_ntlm-timeval.$(OBJEXT) \ + ../../lib/fake_ntlm-warnless.$(OBJEXT) am__objects_2 = -am__objects_3 = fake_ntlm-getpart.$(OBJEXT) fake_ntlm-base64.$(OBJEXT) \ - fake_ntlm-memdebug.$(OBJEXT) +am__objects_3 = fake_ntlm-getpart.$(OBJEXT) \ + ../../lib/fake_ntlm-base64.$(OBJEXT) \ + ../../lib/fake_ntlm-memdebug.$(OBJEXT) am__objects_4 = fake_ntlm-util.$(OBJEXT) am_fake_ntlm_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) \ @@ -132,11 +136,15 @@ am__v_lt_1 = fake_ntlm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(fake_ntlm_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_5 = getpart-mprintf.$(OBJEXT) getpart-nonblock.$(OBJEXT) \ - getpart-strequal.$(OBJEXT) getpart-strtoofft.$(OBJEXT) \ - getpart-timeval.$(OBJEXT) getpart-warnless.$(OBJEXT) -am__objects_6 = getpart-getpart.$(OBJEXT) getpart-base64.$(OBJEXT) \ - getpart-memdebug.$(OBJEXT) +am__objects_5 = ../../lib/getpart-mprintf.$(OBJEXT) \ + ../../lib/getpart-nonblock.$(OBJEXT) \ + ../../lib/getpart-strequal.$(OBJEXT) \ + ../../lib/getpart-strtoofft.$(OBJEXT) \ + ../../lib/getpart-timeval.$(OBJEXT) \ + ../../lib/getpart-warnless.$(OBJEXT) +am__objects_6 = getpart-getpart.$(OBJEXT) \ + ../../lib/getpart-base64.$(OBJEXT) \ + ../../lib/getpart-memdebug.$(OBJEXT) am_getpart_OBJECTS = $(am__objects_5) $(am__objects_2) \ $(am__objects_6) getpart-testpart.$(OBJEXT) getpart_OBJECTS = $(am_getpart_OBJECTS) @@ -144,11 +152,15 @@ getpart_DEPENDENCIES = getpart_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(getpart_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_7 = resolve-mprintf.$(OBJEXT) resolve-nonblock.$(OBJEXT) \ - resolve-strequal.$(OBJEXT) resolve-strtoofft.$(OBJEXT) \ - resolve-timeval.$(OBJEXT) resolve-warnless.$(OBJEXT) -am__objects_8 = resolve-getpart.$(OBJEXT) resolve-base64.$(OBJEXT) \ - resolve-memdebug.$(OBJEXT) +am__objects_7 = ../../lib/resolve-mprintf.$(OBJEXT) \ + ../../lib/resolve-nonblock.$(OBJEXT) \ + ../../lib/resolve-strequal.$(OBJEXT) \ + ../../lib/resolve-strtoofft.$(OBJEXT) \ + ../../lib/resolve-timeval.$(OBJEXT) \ + ../../lib/resolve-warnless.$(OBJEXT) +am__objects_8 = resolve-getpart.$(OBJEXT) \ + ../../lib/resolve-base64.$(OBJEXT) \ + ../../lib/resolve-memdebug.$(OBJEXT) am__objects_9 = resolve-util.$(OBJEXT) am_resolve_OBJECTS = $(am__objects_7) $(am__objects_2) \ $(am__objects_8) $(am__objects_9) resolve-resolve.$(OBJEXT) @@ -157,11 +169,15 @@ resolve_DEPENDENCIES = resolve_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(resolve_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_10 = rtspd-mprintf.$(OBJEXT) rtspd-nonblock.$(OBJEXT) \ - rtspd-strequal.$(OBJEXT) rtspd-strtoofft.$(OBJEXT) \ - rtspd-timeval.$(OBJEXT) rtspd-warnless.$(OBJEXT) -am__objects_11 = rtspd-getpart.$(OBJEXT) rtspd-base64.$(OBJEXT) \ - rtspd-memdebug.$(OBJEXT) +am__objects_10 = ../../lib/rtspd-mprintf.$(OBJEXT) \ + ../../lib/rtspd-nonblock.$(OBJEXT) \ + ../../lib/rtspd-strequal.$(OBJEXT) \ + ../../lib/rtspd-strtoofft.$(OBJEXT) \ + ../../lib/rtspd-timeval.$(OBJEXT) \ + ../../lib/rtspd-warnless.$(OBJEXT) +am__objects_11 = rtspd-getpart.$(OBJEXT) \ + ../../lib/rtspd-base64.$(OBJEXT) \ + ../../lib/rtspd-memdebug.$(OBJEXT) am__objects_12 = rtspd-util.$(OBJEXT) am_rtspd_OBJECTS = $(am__objects_10) $(am__objects_2) \ $(am__objects_11) $(am__objects_12) rtspd-rtspd.$(OBJEXT) @@ -170,39 +186,51 @@ rtspd_DEPENDENCIES = rtspd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(rtspd_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_13 = sockfilt-mprintf.$(OBJEXT) \ - sockfilt-nonblock.$(OBJEXT) sockfilt-strequal.$(OBJEXT) \ - sockfilt-strtoofft.$(OBJEXT) sockfilt-timeval.$(OBJEXT) \ - sockfilt-warnless.$(OBJEXT) -am__objects_14 = sockfilt-getpart.$(OBJEXT) sockfilt-base64.$(OBJEXT) \ - sockfilt-memdebug.$(OBJEXT) +am__objects_13 = ../../lib/sockfilt-mprintf.$(OBJEXT) \ + ../../lib/sockfilt-nonblock.$(OBJEXT) \ + ../../lib/sockfilt-strequal.$(OBJEXT) \ + ../../lib/sockfilt-strtoofft.$(OBJEXT) \ + ../../lib/sockfilt-timeval.$(OBJEXT) \ + ../../lib/sockfilt-warnless.$(OBJEXT) +am__objects_14 = sockfilt-getpart.$(OBJEXT) \ + ../../lib/sockfilt-base64.$(OBJEXT) \ + ../../lib/sockfilt-memdebug.$(OBJEXT) am__objects_15 = sockfilt-util.$(OBJEXT) am_sockfilt_OBJECTS = $(am__objects_13) $(am__objects_2) \ $(am__objects_14) $(am__objects_15) \ - sockfilt-sockfilt.$(OBJEXT) sockfilt-inet_pton.$(OBJEXT) + sockfilt-sockfilt.$(OBJEXT) \ + ../../lib/sockfilt-inet_pton.$(OBJEXT) sockfilt_OBJECTS = $(am_sockfilt_OBJECTS) sockfilt_DEPENDENCIES = sockfilt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sockfilt_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_16 = sws-mprintf.$(OBJEXT) sws-nonblock.$(OBJEXT) \ - sws-strequal.$(OBJEXT) sws-strtoofft.$(OBJEXT) \ - sws-timeval.$(OBJEXT) sws-warnless.$(OBJEXT) -am__objects_17 = sws-getpart.$(OBJEXT) sws-base64.$(OBJEXT) \ - sws-memdebug.$(OBJEXT) +am__objects_16 = ../../lib/sws-mprintf.$(OBJEXT) \ + ../../lib/sws-nonblock.$(OBJEXT) \ + ../../lib/sws-strequal.$(OBJEXT) \ + ../../lib/sws-strtoofft.$(OBJEXT) \ + ../../lib/sws-timeval.$(OBJEXT) \ + ../../lib/sws-warnless.$(OBJEXT) +am__objects_17 = sws-getpart.$(OBJEXT) ../../lib/sws-base64.$(OBJEXT) \ + ../../lib/sws-memdebug.$(OBJEXT) am__objects_18 = sws-util.$(OBJEXT) am_sws_OBJECTS = $(am__objects_16) $(am__objects_2) $(am__objects_17) \ - $(am__objects_18) sws-sws.$(OBJEXT) sws-inet_pton.$(OBJEXT) + $(am__objects_18) sws-sws.$(OBJEXT) \ + ../../lib/sws-inet_pton.$(OBJEXT) sws_OBJECTS = $(am_sws_OBJECTS) sws_DEPENDENCIES = sws_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sws_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_19 = tftpd-mprintf.$(OBJEXT) tftpd-nonblock.$(OBJEXT) \ - tftpd-strequal.$(OBJEXT) tftpd-strtoofft.$(OBJEXT) \ - tftpd-timeval.$(OBJEXT) tftpd-warnless.$(OBJEXT) -am__objects_20 = tftpd-getpart.$(OBJEXT) tftpd-base64.$(OBJEXT) \ - tftpd-memdebug.$(OBJEXT) +am__objects_19 = ../../lib/tftpd-mprintf.$(OBJEXT) \ + ../../lib/tftpd-nonblock.$(OBJEXT) \ + ../../lib/tftpd-strequal.$(OBJEXT) \ + ../../lib/tftpd-strtoofft.$(OBJEXT) \ + ../../lib/tftpd-timeval.$(OBJEXT) \ + ../../lib/tftpd-warnless.$(OBJEXT) +am__objects_20 = tftpd-getpart.$(OBJEXT) \ + ../../lib/tftpd-base64.$(OBJEXT) \ + ../../lib/tftpd-memdebug.$(OBJEXT) am__objects_21 = tftpd-util.$(OBJEXT) am_tftpd_OBJECTS = $(am__objects_19) $(am__objects_2) \ $(am__objects_20) $(am__objects_21) tftpd-tftpd.$(OBJEXT) @@ -308,6 +336,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -332,7 +361,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -341,7 +369,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -364,6 +391,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -399,11 +427,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -628,30 +658,152 @@ clean-noinstPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list +../../lib/$(am__dirstamp): + @$(MKDIR_P) ../../lib + @: > ../../lib/$(am__dirstamp) +../../lib/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ../../lib/$(DEPDIR) + @: > ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/fake_ntlm-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) fake_ntlm$(EXEEXT): $(fake_ntlm_OBJECTS) $(fake_ntlm_DEPENDENCIES) $(EXTRA_fake_ntlm_DEPENDENCIES) @rm -f fake_ntlm$(EXEEXT) $(AM_V_CCLD)$(fake_ntlm_LINK) $(fake_ntlm_OBJECTS) $(fake_ntlm_LDADD) $(LIBS) +../../lib/getpart-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/getpart-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) getpart$(EXEEXT): $(getpart_OBJECTS) $(getpart_DEPENDENCIES) $(EXTRA_getpart_DEPENDENCIES) @rm -f getpart$(EXEEXT) $(AM_V_CCLD)$(getpart_LINK) $(getpart_OBJECTS) $(getpart_LDADD) $(LIBS) +../../lib/resolve-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/resolve-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) resolve$(EXEEXT): $(resolve_OBJECTS) $(resolve_DEPENDENCIES) $(EXTRA_resolve_DEPENDENCIES) @rm -f resolve$(EXEEXT) $(AM_V_CCLD)$(resolve_LINK) $(resolve_OBJECTS) $(resolve_LDADD) $(LIBS) +../../lib/rtspd-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/rtspd-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) rtspd$(EXEEXT): $(rtspd_OBJECTS) $(rtspd_DEPENDENCIES) $(EXTRA_rtspd_DEPENDENCIES) @rm -f rtspd$(EXEEXT) $(AM_V_CCLD)$(rtspd_LINK) $(rtspd_OBJECTS) $(rtspd_LDADD) $(LIBS) +../../lib/sockfilt-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sockfilt-inet_pton.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) sockfilt$(EXEEXT): $(sockfilt_OBJECTS) $(sockfilt_DEPENDENCIES) $(EXTRA_sockfilt_DEPENDENCIES) @rm -f sockfilt$(EXEEXT) $(AM_V_CCLD)$(sockfilt_LINK) $(sockfilt_OBJECTS) $(sockfilt_LDADD) $(LIBS) +../../lib/sws-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/sws-inet_pton.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) sws$(EXEEXT): $(sws_OBJECTS) $(sws_DEPENDENCIES) $(EXTRA_sws_DEPENDENCIES) @rm -f sws$(EXEEXT) $(AM_V_CCLD)$(sws_LINK) $(sws_OBJECTS) $(sws_LDADD) $(LIBS) +../../lib/tftpd-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-strequal.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-timeval.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) +../../lib/tftpd-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \ + ../../lib/$(DEPDIR)/$(am__dirstamp) tftpd$(EXEEXT): $(tftpd_OBJECTS) $(tftpd_DEPENDENCIES) $(EXTRA_tftpd_DEPENDENCIES) @rm -f tftpd$(EXEEXT) @@ -659,193 +811,197 @@ tftpd$(EXEEXT): $(tftpd_OBJECTS) $(tftpd_DEPENDENCIES) $(EXTRA_tftpd_DEPENDENCIE mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f ../../lib/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/fake_ntlm-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/getpart-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/resolve-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/rtspd-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-inet_pton.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-inet_pton.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-warnless.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-memdebug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-mprintf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-nonblock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-strequal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-strtoofft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-timeval.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-warnless.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-fake_ntlm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-strtoofft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-strtoofft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-testpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-timeval.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpart-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-nonblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-resolve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-strtoofft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-nonblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-rtspd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-strtoofft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtspd-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-inet_pton.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-nonblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-sockfilt.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-strtoofft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-inet_pton.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-strtoofft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-sws.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-warnless.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-getpart.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-memdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-mprintf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-strequal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-strtoofft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-tftpd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-timeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftpd-warnless.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -fake_ntlm-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-mprintf.o -MD -MP -MF $(DEPDIR)/fake_ntlm-mprintf.Tpo -c -o fake_ntlm-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-mprintf.Tpo $(DEPDIR)/fake_ntlm-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='fake_ntlm-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Tpo -c -o ../../lib/fake_ntlm-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Tpo ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/fake_ntlm-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -fake_ntlm-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-mprintf.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-mprintf.Tpo -c -o fake_ntlm-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-mprintf.Tpo $(DEPDIR)/fake_ntlm-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='fake_ntlm-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Tpo -c -o ../../lib/fake_ntlm-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Tpo ../../lib/$(DEPDIR)/fake_ntlm-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/fake_ntlm-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -fake_ntlm-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-nonblock.o -MD -MP -MF $(DEPDIR)/fake_ntlm-nonblock.Tpo -c -o fake_ntlm-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-nonblock.Tpo $(DEPDIR)/fake_ntlm-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='fake_ntlm-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Tpo -c -o ../../lib/fake_ntlm-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Tpo ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/fake_ntlm-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -fake_ntlm-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-nonblock.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-nonblock.Tpo -c -o fake_ntlm-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-nonblock.Tpo $(DEPDIR)/fake_ntlm-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='fake_ntlm-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Tpo -c -o ../../lib/fake_ntlm-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Tpo ../../lib/$(DEPDIR)/fake_ntlm-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/fake_ntlm-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -fake_ntlm-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-strequal.o -MD -MP -MF $(DEPDIR)/fake_ntlm-strequal.Tpo -c -o fake_ntlm-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-strequal.Tpo $(DEPDIR)/fake_ntlm-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='fake_ntlm-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-strequal.Tpo -c -o ../../lib/fake_ntlm-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-strequal.Tpo ../../lib/$(DEPDIR)/fake_ntlm-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/fake_ntlm-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -fake_ntlm-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-strequal.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-strequal.Tpo -c -o fake_ntlm-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-strequal.Tpo $(DEPDIR)/fake_ntlm-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='fake_ntlm-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-strequal.Tpo -c -o ../../lib/fake_ntlm-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-strequal.Tpo ../../lib/$(DEPDIR)/fake_ntlm-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/fake_ntlm-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -fake_ntlm-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-strtoofft.o -MD -MP -MF $(DEPDIR)/fake_ntlm-strtoofft.Tpo -c -o fake_ntlm-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-strtoofft.Tpo $(DEPDIR)/fake_ntlm-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='fake_ntlm-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Tpo -c -o ../../lib/fake_ntlm-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Tpo ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/fake_ntlm-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -fake_ntlm-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-strtoofft.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-strtoofft.Tpo -c -o fake_ntlm-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-strtoofft.Tpo $(DEPDIR)/fake_ntlm-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='fake_ntlm-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Tpo -c -o ../../lib/fake_ntlm-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Tpo ../../lib/$(DEPDIR)/fake_ntlm-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/fake_ntlm-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -fake_ntlm-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-timeval.o -MD -MP -MF $(DEPDIR)/fake_ntlm-timeval.Tpo -c -o fake_ntlm-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-timeval.Tpo $(DEPDIR)/fake_ntlm-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='fake_ntlm-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-timeval.Tpo -c -o ../../lib/fake_ntlm-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-timeval.Tpo ../../lib/$(DEPDIR)/fake_ntlm-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/fake_ntlm-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -fake_ntlm-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-timeval.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-timeval.Tpo -c -o fake_ntlm-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-timeval.Tpo $(DEPDIR)/fake_ntlm-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='fake_ntlm-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-timeval.Tpo -c -o ../../lib/fake_ntlm-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-timeval.Tpo ../../lib/$(DEPDIR)/fake_ntlm-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/fake_ntlm-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -fake_ntlm-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-warnless.o -MD -MP -MF $(DEPDIR)/fake_ntlm-warnless.Tpo -c -o fake_ntlm-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-warnless.Tpo $(DEPDIR)/fake_ntlm-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='fake_ntlm-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-warnless.Tpo -c -o ../../lib/fake_ntlm-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-warnless.Tpo ../../lib/$(DEPDIR)/fake_ntlm-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/fake_ntlm-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -fake_ntlm-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-warnless.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-warnless.Tpo -c -o fake_ntlm-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-warnless.Tpo $(DEPDIR)/fake_ntlm-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='fake_ntlm-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-warnless.Tpo -c -o ../../lib/fake_ntlm-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-warnless.Tpo ../../lib/$(DEPDIR)/fake_ntlm-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/fake_ntlm-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` fake_ntlm-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-getpart.o -MD -MP -MF $(DEPDIR)/fake_ntlm-getpart.Tpo -c -o fake_ntlm-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -861,33 +1017,33 @@ fake_ntlm-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -fake_ntlm-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-base64.o -MD -MP -MF $(DEPDIR)/fake_ntlm-base64.Tpo -c -o fake_ntlm-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-base64.Tpo $(DEPDIR)/fake_ntlm-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='fake_ntlm-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-base64.Tpo -c -o ../../lib/fake_ntlm-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-base64.Tpo ../../lib/$(DEPDIR)/fake_ntlm-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/fake_ntlm-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -fake_ntlm-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-base64.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-base64.Tpo -c -o fake_ntlm-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-base64.Tpo $(DEPDIR)/fake_ntlm-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='fake_ntlm-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-base64.Tpo -c -o ../../lib/fake_ntlm-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-base64.Tpo ../../lib/$(DEPDIR)/fake_ntlm-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/fake_ntlm-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -fake_ntlm-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-memdebug.o -MD -MP -MF $(DEPDIR)/fake_ntlm-memdebug.Tpo -c -o fake_ntlm-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-memdebug.Tpo $(DEPDIR)/fake_ntlm-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='fake_ntlm-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Tpo -c -o ../../lib/fake_ntlm-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Tpo ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/fake_ntlm-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -fake_ntlm-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-memdebug.obj -MD -MP -MF $(DEPDIR)/fake_ntlm-memdebug.Tpo -c -o fake_ntlm-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fake_ntlm-memdebug.Tpo $(DEPDIR)/fake_ntlm-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='fake_ntlm-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/fake_ntlm-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT ../../lib/fake_ntlm-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Tpo -c -o ../../lib/fake_ntlm-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Tpo ../../lib/$(DEPDIR)/fake_ntlm-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/fake_ntlm-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o ../../lib/fake_ntlm-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` fake_ntlm-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -MT fake_ntlm-util.o -MD -MP -MF $(DEPDIR)/fake_ntlm-util.Tpo -c -o fake_ntlm-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -917,89 +1073,89 @@ fake_ntlm-fake_ntlm.obj: fake_ntlm.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fake_ntlm_CFLAGS) $(CFLAGS) -c -o fake_ntlm-fake_ntlm.obj `if test -f 'fake_ntlm.c'; then $(CYGPATH_W) 'fake_ntlm.c'; else $(CYGPATH_W) '$(srcdir)/fake_ntlm.c'; fi` -getpart-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-mprintf.o -MD -MP -MF $(DEPDIR)/getpart-mprintf.Tpo -c -o getpart-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-mprintf.Tpo $(DEPDIR)/getpart-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='getpart-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-mprintf.Tpo -c -o ../../lib/getpart-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-mprintf.Tpo ../../lib/$(DEPDIR)/getpart-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/getpart-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -getpart-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-mprintf.obj -MD -MP -MF $(DEPDIR)/getpart-mprintf.Tpo -c -o getpart-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-mprintf.Tpo $(DEPDIR)/getpart-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='getpart-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-mprintf.Tpo -c -o ../../lib/getpart-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-mprintf.Tpo ../../lib/$(DEPDIR)/getpart-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/getpart-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -getpart-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-nonblock.o -MD -MP -MF $(DEPDIR)/getpart-nonblock.Tpo -c -o getpart-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-nonblock.Tpo $(DEPDIR)/getpart-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='getpart-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-nonblock.Tpo -c -o ../../lib/getpart-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-nonblock.Tpo ../../lib/$(DEPDIR)/getpart-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/getpart-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -getpart-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-nonblock.obj -MD -MP -MF $(DEPDIR)/getpart-nonblock.Tpo -c -o getpart-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-nonblock.Tpo $(DEPDIR)/getpart-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='getpart-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-nonblock.Tpo -c -o ../../lib/getpart-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-nonblock.Tpo ../../lib/$(DEPDIR)/getpart-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/getpart-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -getpart-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-strequal.o -MD -MP -MF $(DEPDIR)/getpart-strequal.Tpo -c -o getpart-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-strequal.Tpo $(DEPDIR)/getpart-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='getpart-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-strequal.Tpo -c -o ../../lib/getpart-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-strequal.Tpo ../../lib/$(DEPDIR)/getpart-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/getpart-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -getpart-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-strequal.obj -MD -MP -MF $(DEPDIR)/getpart-strequal.Tpo -c -o getpart-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-strequal.Tpo $(DEPDIR)/getpart-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='getpart-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-strequal.Tpo -c -o ../../lib/getpart-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-strequal.Tpo ../../lib/$(DEPDIR)/getpart-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/getpart-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -getpart-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-strtoofft.o -MD -MP -MF $(DEPDIR)/getpart-strtoofft.Tpo -c -o getpart-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-strtoofft.Tpo $(DEPDIR)/getpart-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='getpart-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-strtoofft.Tpo -c -o ../../lib/getpart-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-strtoofft.Tpo ../../lib/$(DEPDIR)/getpart-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/getpart-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -getpart-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-strtoofft.obj -MD -MP -MF $(DEPDIR)/getpart-strtoofft.Tpo -c -o getpart-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-strtoofft.Tpo $(DEPDIR)/getpart-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='getpart-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-strtoofft.Tpo -c -o ../../lib/getpart-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-strtoofft.Tpo ../../lib/$(DEPDIR)/getpart-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/getpart-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -getpart-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-timeval.o -MD -MP -MF $(DEPDIR)/getpart-timeval.Tpo -c -o getpart-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-timeval.Tpo $(DEPDIR)/getpart-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='getpart-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-timeval.Tpo -c -o ../../lib/getpart-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-timeval.Tpo ../../lib/$(DEPDIR)/getpart-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/getpart-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -getpart-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-timeval.obj -MD -MP -MF $(DEPDIR)/getpart-timeval.Tpo -c -o getpart-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-timeval.Tpo $(DEPDIR)/getpart-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='getpart-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-timeval.Tpo -c -o ../../lib/getpart-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-timeval.Tpo ../../lib/$(DEPDIR)/getpart-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/getpart-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -getpart-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-warnless.o -MD -MP -MF $(DEPDIR)/getpart-warnless.Tpo -c -o getpart-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-warnless.Tpo $(DEPDIR)/getpart-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='getpart-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-warnless.Tpo -c -o ../../lib/getpart-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-warnless.Tpo ../../lib/$(DEPDIR)/getpart-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/getpart-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -getpart-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-warnless.obj -MD -MP -MF $(DEPDIR)/getpart-warnless.Tpo -c -o getpart-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-warnless.Tpo $(DEPDIR)/getpart-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='getpart-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-warnless.Tpo -c -o ../../lib/getpart-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-warnless.Tpo ../../lib/$(DEPDIR)/getpart-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/getpart-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` getpart-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-getpart.o -MD -MP -MF $(DEPDIR)/getpart-getpart.Tpo -c -o getpart-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1015,33 +1171,33 @@ getpart-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -getpart-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-base64.o -MD -MP -MF $(DEPDIR)/getpart-base64.Tpo -c -o getpart-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-base64.Tpo $(DEPDIR)/getpart-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='getpart-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-base64.Tpo -c -o ../../lib/getpart-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-base64.Tpo ../../lib/$(DEPDIR)/getpart-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/getpart-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -getpart-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-base64.obj -MD -MP -MF $(DEPDIR)/getpart-base64.Tpo -c -o getpart-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-base64.Tpo $(DEPDIR)/getpart-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='getpart-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-base64.Tpo -c -o ../../lib/getpart-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-base64.Tpo ../../lib/$(DEPDIR)/getpart-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/getpart-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -getpart-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-memdebug.o -MD -MP -MF $(DEPDIR)/getpart-memdebug.Tpo -c -o getpart-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-memdebug.Tpo $(DEPDIR)/getpart-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='getpart-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/getpart-memdebug.Tpo -c -o ../../lib/getpart-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-memdebug.Tpo ../../lib/$(DEPDIR)/getpart-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/getpart-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -getpart-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-memdebug.obj -MD -MP -MF $(DEPDIR)/getpart-memdebug.Tpo -c -o getpart-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getpart-memdebug.Tpo $(DEPDIR)/getpart-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='getpart-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/getpart-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT ../../lib/getpart-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/getpart-memdebug.Tpo -c -o ../../lib/getpart-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/getpart-memdebug.Tpo ../../lib/$(DEPDIR)/getpart-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/getpart-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o ../../lib/getpart-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` getpart-testpart.o: testpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -MT getpart-testpart.o -MD -MP -MF $(DEPDIR)/getpart-testpart.Tpo -c -o getpart-testpart.o `test -f 'testpart.c' || echo '$(srcdir)/'`testpart.c @@ -1057,89 +1213,89 @@ getpart-testpart.obj: testpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getpart_CFLAGS) $(CFLAGS) -c -o getpart-testpart.obj `if test -f 'testpart.c'; then $(CYGPATH_W) 'testpart.c'; else $(CYGPATH_W) '$(srcdir)/testpart.c'; fi` -resolve-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-mprintf.o -MD -MP -MF $(DEPDIR)/resolve-mprintf.Tpo -c -o resolve-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-mprintf.Tpo $(DEPDIR)/resolve-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='resolve-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-mprintf.Tpo -c -o ../../lib/resolve-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-mprintf.Tpo ../../lib/$(DEPDIR)/resolve-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/resolve-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -resolve-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-mprintf.obj -MD -MP -MF $(DEPDIR)/resolve-mprintf.Tpo -c -o resolve-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-mprintf.Tpo $(DEPDIR)/resolve-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='resolve-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-mprintf.Tpo -c -o ../../lib/resolve-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-mprintf.Tpo ../../lib/$(DEPDIR)/resolve-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/resolve-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -resolve-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-nonblock.o -MD -MP -MF $(DEPDIR)/resolve-nonblock.Tpo -c -o resolve-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-nonblock.Tpo $(DEPDIR)/resolve-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='resolve-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-nonblock.Tpo -c -o ../../lib/resolve-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-nonblock.Tpo ../../lib/$(DEPDIR)/resolve-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/resolve-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -resolve-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-nonblock.obj -MD -MP -MF $(DEPDIR)/resolve-nonblock.Tpo -c -o resolve-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-nonblock.Tpo $(DEPDIR)/resolve-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='resolve-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-nonblock.Tpo -c -o ../../lib/resolve-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-nonblock.Tpo ../../lib/$(DEPDIR)/resolve-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/resolve-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -resolve-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-strequal.o -MD -MP -MF $(DEPDIR)/resolve-strequal.Tpo -c -o resolve-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-strequal.Tpo $(DEPDIR)/resolve-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='resolve-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-strequal.Tpo -c -o ../../lib/resolve-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-strequal.Tpo ../../lib/$(DEPDIR)/resolve-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/resolve-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -resolve-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-strequal.obj -MD -MP -MF $(DEPDIR)/resolve-strequal.Tpo -c -o resolve-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-strequal.Tpo $(DEPDIR)/resolve-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='resolve-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-strequal.Tpo -c -o ../../lib/resolve-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-strequal.Tpo ../../lib/$(DEPDIR)/resolve-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/resolve-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -resolve-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-strtoofft.o -MD -MP -MF $(DEPDIR)/resolve-strtoofft.Tpo -c -o resolve-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-strtoofft.Tpo $(DEPDIR)/resolve-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='resolve-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-strtoofft.Tpo -c -o ../../lib/resolve-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-strtoofft.Tpo ../../lib/$(DEPDIR)/resolve-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/resolve-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -resolve-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-strtoofft.obj -MD -MP -MF $(DEPDIR)/resolve-strtoofft.Tpo -c -o resolve-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-strtoofft.Tpo $(DEPDIR)/resolve-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='resolve-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-strtoofft.Tpo -c -o ../../lib/resolve-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-strtoofft.Tpo ../../lib/$(DEPDIR)/resolve-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/resolve-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -resolve-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-timeval.o -MD -MP -MF $(DEPDIR)/resolve-timeval.Tpo -c -o resolve-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-timeval.Tpo $(DEPDIR)/resolve-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='resolve-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-timeval.Tpo -c -o ../../lib/resolve-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-timeval.Tpo ../../lib/$(DEPDIR)/resolve-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/resolve-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -resolve-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-timeval.obj -MD -MP -MF $(DEPDIR)/resolve-timeval.Tpo -c -o resolve-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-timeval.Tpo $(DEPDIR)/resolve-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='resolve-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-timeval.Tpo -c -o ../../lib/resolve-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-timeval.Tpo ../../lib/$(DEPDIR)/resolve-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/resolve-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -resolve-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-warnless.o -MD -MP -MF $(DEPDIR)/resolve-warnless.Tpo -c -o resolve-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-warnless.Tpo $(DEPDIR)/resolve-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='resolve-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-warnless.Tpo -c -o ../../lib/resolve-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-warnless.Tpo ../../lib/$(DEPDIR)/resolve-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/resolve-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -resolve-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-warnless.obj -MD -MP -MF $(DEPDIR)/resolve-warnless.Tpo -c -o resolve-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-warnless.Tpo $(DEPDIR)/resolve-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='resolve-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-warnless.Tpo -c -o ../../lib/resolve-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-warnless.Tpo ../../lib/$(DEPDIR)/resolve-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/resolve-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` resolve-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-getpart.o -MD -MP -MF $(DEPDIR)/resolve-getpart.Tpo -c -o resolve-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1155,33 +1311,33 @@ resolve-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -resolve-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-base64.o -MD -MP -MF $(DEPDIR)/resolve-base64.Tpo -c -o resolve-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-base64.Tpo $(DEPDIR)/resolve-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='resolve-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-base64.Tpo -c -o ../../lib/resolve-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-base64.Tpo ../../lib/$(DEPDIR)/resolve-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/resolve-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -resolve-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-base64.obj -MD -MP -MF $(DEPDIR)/resolve-base64.Tpo -c -o resolve-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-base64.Tpo $(DEPDIR)/resolve-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='resolve-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-base64.Tpo -c -o ../../lib/resolve-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-base64.Tpo ../../lib/$(DEPDIR)/resolve-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/resolve-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -resolve-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-memdebug.o -MD -MP -MF $(DEPDIR)/resolve-memdebug.Tpo -c -o resolve-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-memdebug.Tpo $(DEPDIR)/resolve-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='resolve-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/resolve-memdebug.Tpo -c -o ../../lib/resolve-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-memdebug.Tpo ../../lib/$(DEPDIR)/resolve-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/resolve-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -resolve-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-memdebug.obj -MD -MP -MF $(DEPDIR)/resolve-memdebug.Tpo -c -o resolve-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resolve-memdebug.Tpo $(DEPDIR)/resolve-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='resolve-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/resolve-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT ../../lib/resolve-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/resolve-memdebug.Tpo -c -o ../../lib/resolve-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/resolve-memdebug.Tpo ../../lib/$(DEPDIR)/resolve-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/resolve-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o ../../lib/resolve-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` resolve-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -MT resolve-util.o -MD -MP -MF $(DEPDIR)/resolve-util.Tpo -c -o resolve-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -1211,89 +1367,89 @@ resolve-resolve.obj: resolve.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resolve_CFLAGS) $(CFLAGS) -c -o resolve-resolve.obj `if test -f 'resolve.c'; then $(CYGPATH_W) 'resolve.c'; else $(CYGPATH_W) '$(srcdir)/resolve.c'; fi` -rtspd-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-mprintf.o -MD -MP -MF $(DEPDIR)/rtspd-mprintf.Tpo -c -o rtspd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-mprintf.Tpo $(DEPDIR)/rtspd-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='rtspd-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-mprintf.Tpo -c -o ../../lib/rtspd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-mprintf.Tpo ../../lib/$(DEPDIR)/rtspd-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/rtspd-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -rtspd-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-mprintf.obj -MD -MP -MF $(DEPDIR)/rtspd-mprintf.Tpo -c -o rtspd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-mprintf.Tpo $(DEPDIR)/rtspd-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='rtspd-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-mprintf.Tpo -c -o ../../lib/rtspd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-mprintf.Tpo ../../lib/$(DEPDIR)/rtspd-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/rtspd-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -rtspd-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-nonblock.o -MD -MP -MF $(DEPDIR)/rtspd-nonblock.Tpo -c -o rtspd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-nonblock.Tpo $(DEPDIR)/rtspd-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='rtspd-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-nonblock.Tpo -c -o ../../lib/rtspd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-nonblock.Tpo ../../lib/$(DEPDIR)/rtspd-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/rtspd-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -rtspd-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-nonblock.obj -MD -MP -MF $(DEPDIR)/rtspd-nonblock.Tpo -c -o rtspd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-nonblock.Tpo $(DEPDIR)/rtspd-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='rtspd-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-nonblock.Tpo -c -o ../../lib/rtspd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-nonblock.Tpo ../../lib/$(DEPDIR)/rtspd-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/rtspd-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -rtspd-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-strequal.o -MD -MP -MF $(DEPDIR)/rtspd-strequal.Tpo -c -o rtspd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-strequal.Tpo $(DEPDIR)/rtspd-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='rtspd-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-strequal.Tpo -c -o ../../lib/rtspd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-strequal.Tpo ../../lib/$(DEPDIR)/rtspd-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/rtspd-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -rtspd-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-strequal.obj -MD -MP -MF $(DEPDIR)/rtspd-strequal.Tpo -c -o rtspd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-strequal.Tpo $(DEPDIR)/rtspd-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='rtspd-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-strequal.Tpo -c -o ../../lib/rtspd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-strequal.Tpo ../../lib/$(DEPDIR)/rtspd-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/rtspd-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -rtspd-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-strtoofft.o -MD -MP -MF $(DEPDIR)/rtspd-strtoofft.Tpo -c -o rtspd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-strtoofft.Tpo $(DEPDIR)/rtspd-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='rtspd-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-strtoofft.Tpo -c -o ../../lib/rtspd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-strtoofft.Tpo ../../lib/$(DEPDIR)/rtspd-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/rtspd-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -rtspd-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-strtoofft.obj -MD -MP -MF $(DEPDIR)/rtspd-strtoofft.Tpo -c -o rtspd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-strtoofft.Tpo $(DEPDIR)/rtspd-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='rtspd-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-strtoofft.Tpo -c -o ../../lib/rtspd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-strtoofft.Tpo ../../lib/$(DEPDIR)/rtspd-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/rtspd-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -rtspd-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-timeval.o -MD -MP -MF $(DEPDIR)/rtspd-timeval.Tpo -c -o rtspd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-timeval.Tpo $(DEPDIR)/rtspd-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='rtspd-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-timeval.Tpo -c -o ../../lib/rtspd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-timeval.Tpo ../../lib/$(DEPDIR)/rtspd-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/rtspd-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -rtspd-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-timeval.obj -MD -MP -MF $(DEPDIR)/rtspd-timeval.Tpo -c -o rtspd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-timeval.Tpo $(DEPDIR)/rtspd-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='rtspd-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-timeval.Tpo -c -o ../../lib/rtspd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-timeval.Tpo ../../lib/$(DEPDIR)/rtspd-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/rtspd-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -rtspd-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-warnless.o -MD -MP -MF $(DEPDIR)/rtspd-warnless.Tpo -c -o rtspd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-warnless.Tpo $(DEPDIR)/rtspd-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='rtspd-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-warnless.Tpo -c -o ../../lib/rtspd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-warnless.Tpo ../../lib/$(DEPDIR)/rtspd-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/rtspd-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -rtspd-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-warnless.obj -MD -MP -MF $(DEPDIR)/rtspd-warnless.Tpo -c -o rtspd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-warnless.Tpo $(DEPDIR)/rtspd-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='rtspd-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-warnless.Tpo -c -o ../../lib/rtspd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-warnless.Tpo ../../lib/$(DEPDIR)/rtspd-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/rtspd-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` rtspd-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-getpart.o -MD -MP -MF $(DEPDIR)/rtspd-getpart.Tpo -c -o rtspd-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1309,33 +1465,33 @@ rtspd-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -rtspd-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-base64.o -MD -MP -MF $(DEPDIR)/rtspd-base64.Tpo -c -o rtspd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-base64.Tpo $(DEPDIR)/rtspd-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='rtspd-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-base64.Tpo -c -o ../../lib/rtspd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-base64.Tpo ../../lib/$(DEPDIR)/rtspd-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/rtspd-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -rtspd-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-base64.obj -MD -MP -MF $(DEPDIR)/rtspd-base64.Tpo -c -o rtspd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-base64.Tpo $(DEPDIR)/rtspd-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='rtspd-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-base64.Tpo -c -o ../../lib/rtspd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-base64.Tpo ../../lib/$(DEPDIR)/rtspd-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/rtspd-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -rtspd-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-memdebug.o -MD -MP -MF $(DEPDIR)/rtspd-memdebug.Tpo -c -o rtspd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-memdebug.Tpo $(DEPDIR)/rtspd-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='rtspd-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-memdebug.Tpo -c -o ../../lib/rtspd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-memdebug.Tpo ../../lib/$(DEPDIR)/rtspd-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/rtspd-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -rtspd-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-memdebug.obj -MD -MP -MF $(DEPDIR)/rtspd-memdebug.Tpo -c -o rtspd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtspd-memdebug.Tpo $(DEPDIR)/rtspd-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='rtspd-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/rtspd-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT ../../lib/rtspd-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/rtspd-memdebug.Tpo -c -o ../../lib/rtspd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/rtspd-memdebug.Tpo ../../lib/$(DEPDIR)/rtspd-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/rtspd-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o ../../lib/rtspd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` rtspd-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -MT rtspd-util.o -MD -MP -MF $(DEPDIR)/rtspd-util.Tpo -c -o rtspd-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -1365,89 +1521,89 @@ rtspd-rtspd.obj: rtspd.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtspd_CFLAGS) $(CFLAGS) -c -o rtspd-rtspd.obj `if test -f 'rtspd.c'; then $(CYGPATH_W) 'rtspd.c'; else $(CYGPATH_W) '$(srcdir)/rtspd.c'; fi` -sockfilt-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-mprintf.o -MD -MP -MF $(DEPDIR)/sockfilt-mprintf.Tpo -c -o sockfilt-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-mprintf.Tpo $(DEPDIR)/sockfilt-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='sockfilt-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-mprintf.Tpo -c -o ../../lib/sockfilt-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-mprintf.Tpo ../../lib/$(DEPDIR)/sockfilt-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/sockfilt-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -sockfilt-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-mprintf.obj -MD -MP -MF $(DEPDIR)/sockfilt-mprintf.Tpo -c -o sockfilt-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-mprintf.Tpo $(DEPDIR)/sockfilt-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='sockfilt-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-mprintf.Tpo -c -o ../../lib/sockfilt-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-mprintf.Tpo ../../lib/$(DEPDIR)/sockfilt-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/sockfilt-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -sockfilt-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-nonblock.o -MD -MP -MF $(DEPDIR)/sockfilt-nonblock.Tpo -c -o sockfilt-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-nonblock.Tpo $(DEPDIR)/sockfilt-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='sockfilt-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-nonblock.Tpo -c -o ../../lib/sockfilt-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-nonblock.Tpo ../../lib/$(DEPDIR)/sockfilt-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/sockfilt-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -sockfilt-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-nonblock.obj -MD -MP -MF $(DEPDIR)/sockfilt-nonblock.Tpo -c -o sockfilt-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-nonblock.Tpo $(DEPDIR)/sockfilt-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='sockfilt-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-nonblock.Tpo -c -o ../../lib/sockfilt-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-nonblock.Tpo ../../lib/$(DEPDIR)/sockfilt-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/sockfilt-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -sockfilt-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-strequal.o -MD -MP -MF $(DEPDIR)/sockfilt-strequal.Tpo -c -o sockfilt-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-strequal.Tpo $(DEPDIR)/sockfilt-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='sockfilt-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-strequal.Tpo -c -o ../../lib/sockfilt-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-strequal.Tpo ../../lib/$(DEPDIR)/sockfilt-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/sockfilt-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -sockfilt-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-strequal.obj -MD -MP -MF $(DEPDIR)/sockfilt-strequal.Tpo -c -o sockfilt-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-strequal.Tpo $(DEPDIR)/sockfilt-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='sockfilt-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-strequal.Tpo -c -o ../../lib/sockfilt-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-strequal.Tpo ../../lib/$(DEPDIR)/sockfilt-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/sockfilt-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -sockfilt-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-strtoofft.o -MD -MP -MF $(DEPDIR)/sockfilt-strtoofft.Tpo -c -o sockfilt-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-strtoofft.Tpo $(DEPDIR)/sockfilt-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='sockfilt-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-strtoofft.Tpo -c -o ../../lib/sockfilt-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-strtoofft.Tpo ../../lib/$(DEPDIR)/sockfilt-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/sockfilt-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -sockfilt-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-strtoofft.obj -MD -MP -MF $(DEPDIR)/sockfilt-strtoofft.Tpo -c -o sockfilt-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-strtoofft.Tpo $(DEPDIR)/sockfilt-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='sockfilt-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-strtoofft.Tpo -c -o ../../lib/sockfilt-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-strtoofft.Tpo ../../lib/$(DEPDIR)/sockfilt-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/sockfilt-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -sockfilt-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-timeval.o -MD -MP -MF $(DEPDIR)/sockfilt-timeval.Tpo -c -o sockfilt-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-timeval.Tpo $(DEPDIR)/sockfilt-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='sockfilt-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-timeval.Tpo -c -o ../../lib/sockfilt-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-timeval.Tpo ../../lib/$(DEPDIR)/sockfilt-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/sockfilt-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -sockfilt-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-timeval.obj -MD -MP -MF $(DEPDIR)/sockfilt-timeval.Tpo -c -o sockfilt-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-timeval.Tpo $(DEPDIR)/sockfilt-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='sockfilt-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-timeval.Tpo -c -o ../../lib/sockfilt-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-timeval.Tpo ../../lib/$(DEPDIR)/sockfilt-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/sockfilt-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -sockfilt-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-warnless.o -MD -MP -MF $(DEPDIR)/sockfilt-warnless.Tpo -c -o sockfilt-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-warnless.Tpo $(DEPDIR)/sockfilt-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='sockfilt-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-warnless.Tpo -c -o ../../lib/sockfilt-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-warnless.Tpo ../../lib/$(DEPDIR)/sockfilt-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/sockfilt-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -sockfilt-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-warnless.obj -MD -MP -MF $(DEPDIR)/sockfilt-warnless.Tpo -c -o sockfilt-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-warnless.Tpo $(DEPDIR)/sockfilt-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='sockfilt-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-warnless.Tpo -c -o ../../lib/sockfilt-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-warnless.Tpo ../../lib/$(DEPDIR)/sockfilt-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/sockfilt-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` sockfilt-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-getpart.o -MD -MP -MF $(DEPDIR)/sockfilt-getpart.Tpo -c -o sockfilt-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1463,33 +1619,33 @@ sockfilt-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -sockfilt-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-base64.o -MD -MP -MF $(DEPDIR)/sockfilt-base64.Tpo -c -o sockfilt-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-base64.Tpo $(DEPDIR)/sockfilt-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='sockfilt-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-base64.Tpo -c -o ../../lib/sockfilt-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-base64.Tpo ../../lib/$(DEPDIR)/sockfilt-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/sockfilt-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -sockfilt-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-base64.obj -MD -MP -MF $(DEPDIR)/sockfilt-base64.Tpo -c -o sockfilt-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-base64.Tpo $(DEPDIR)/sockfilt-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='sockfilt-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-base64.Tpo -c -o ../../lib/sockfilt-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-base64.Tpo ../../lib/$(DEPDIR)/sockfilt-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/sockfilt-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -sockfilt-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-memdebug.o -MD -MP -MF $(DEPDIR)/sockfilt-memdebug.Tpo -c -o sockfilt-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-memdebug.Tpo $(DEPDIR)/sockfilt-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='sockfilt-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-memdebug.Tpo -c -o ../../lib/sockfilt-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-memdebug.Tpo ../../lib/$(DEPDIR)/sockfilt-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/sockfilt-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -sockfilt-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-memdebug.obj -MD -MP -MF $(DEPDIR)/sockfilt-memdebug.Tpo -c -o sockfilt-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-memdebug.Tpo $(DEPDIR)/sockfilt-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='sockfilt-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-memdebug.Tpo -c -o ../../lib/sockfilt-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-memdebug.Tpo ../../lib/$(DEPDIR)/sockfilt-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/sockfilt-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` sockfilt-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-util.o -MD -MP -MF $(DEPDIR)/sockfilt-util.Tpo -c -o sockfilt-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -1519,103 +1675,103 @@ sockfilt-sockfilt.obj: sockfilt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-sockfilt.obj `if test -f 'sockfilt.c'; then $(CYGPATH_W) 'sockfilt.c'; else $(CYGPATH_W) '$(srcdir)/sockfilt.c'; fi` -sockfilt-inet_pton.o: ../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-inet_pton.o -MD -MP -MF $(DEPDIR)/sockfilt-inet_pton.Tpo -c -o sockfilt-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-inet_pton.Tpo $(DEPDIR)/sockfilt-inet_pton.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='sockfilt-inet_pton.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-inet_pton.o: ../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-inet_pton.o -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-inet_pton.Tpo -c -o ../../lib/sockfilt-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-inet_pton.Tpo ../../lib/$(DEPDIR)/sockfilt-inet_pton.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/sockfilt-inet_pton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c -sockfilt-inet_pton.obj: ../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT sockfilt-inet_pton.obj -MD -MP -MF $(DEPDIR)/sockfilt-inet_pton.Tpo -c -o sockfilt-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sockfilt-inet_pton.Tpo $(DEPDIR)/sockfilt-inet_pton.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='sockfilt-inet_pton.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sockfilt-inet_pton.obj: ../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -MT ../../lib/sockfilt-inet_pton.obj -MD -MP -MF ../../lib/$(DEPDIR)/sockfilt-inet_pton.Tpo -c -o ../../lib/sockfilt-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sockfilt-inet_pton.Tpo ../../lib/$(DEPDIR)/sockfilt-inet_pton.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/sockfilt-inet_pton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o sockfilt-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` -sws-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-mprintf.o -MD -MP -MF $(DEPDIR)/sws-mprintf.Tpo -c -o sws-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-mprintf.Tpo $(DEPDIR)/sws-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='sws-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-mprintf.Tpo -c -o ../../lib/sws-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-mprintf.Tpo ../../lib/$(DEPDIR)/sws-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/sws-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -sws-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-mprintf.obj -MD -MP -MF $(DEPDIR)/sws-mprintf.Tpo -c -o sws-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-mprintf.Tpo $(DEPDIR)/sws-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='sws-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-mprintf.Tpo -c -o ../../lib/sws-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-mprintf.Tpo ../../lib/$(DEPDIR)/sws-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/sws-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -sws-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-nonblock.o -MD -MP -MF $(DEPDIR)/sws-nonblock.Tpo -c -o sws-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-nonblock.Tpo $(DEPDIR)/sws-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='sws-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-nonblock.Tpo -c -o ../../lib/sws-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-nonblock.Tpo ../../lib/$(DEPDIR)/sws-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/sws-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -sws-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-nonblock.obj -MD -MP -MF $(DEPDIR)/sws-nonblock.Tpo -c -o sws-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-nonblock.Tpo $(DEPDIR)/sws-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='sws-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-nonblock.Tpo -c -o ../../lib/sws-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-nonblock.Tpo ../../lib/$(DEPDIR)/sws-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/sws-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -sws-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-strequal.o -MD -MP -MF $(DEPDIR)/sws-strequal.Tpo -c -o sws-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-strequal.Tpo $(DEPDIR)/sws-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='sws-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-strequal.Tpo -c -o ../../lib/sws-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-strequal.Tpo ../../lib/$(DEPDIR)/sws-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/sws-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -sws-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-strequal.obj -MD -MP -MF $(DEPDIR)/sws-strequal.Tpo -c -o sws-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-strequal.Tpo $(DEPDIR)/sws-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='sws-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-strequal.Tpo -c -o ../../lib/sws-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-strequal.Tpo ../../lib/$(DEPDIR)/sws-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/sws-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -sws-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-strtoofft.o -MD -MP -MF $(DEPDIR)/sws-strtoofft.Tpo -c -o sws-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-strtoofft.Tpo $(DEPDIR)/sws-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='sws-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-strtoofft.Tpo -c -o ../../lib/sws-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-strtoofft.Tpo ../../lib/$(DEPDIR)/sws-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/sws-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -sws-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-strtoofft.obj -MD -MP -MF $(DEPDIR)/sws-strtoofft.Tpo -c -o sws-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-strtoofft.Tpo $(DEPDIR)/sws-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='sws-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-strtoofft.Tpo -c -o ../../lib/sws-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-strtoofft.Tpo ../../lib/$(DEPDIR)/sws-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/sws-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -sws-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-timeval.o -MD -MP -MF $(DEPDIR)/sws-timeval.Tpo -c -o sws-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-timeval.Tpo $(DEPDIR)/sws-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='sws-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-timeval.Tpo -c -o ../../lib/sws-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-timeval.Tpo ../../lib/$(DEPDIR)/sws-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/sws-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -sws-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-timeval.obj -MD -MP -MF $(DEPDIR)/sws-timeval.Tpo -c -o sws-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-timeval.Tpo $(DEPDIR)/sws-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='sws-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-timeval.Tpo -c -o ../../lib/sws-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-timeval.Tpo ../../lib/$(DEPDIR)/sws-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/sws-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -sws-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-warnless.o -MD -MP -MF $(DEPDIR)/sws-warnless.Tpo -c -o sws-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-warnless.Tpo $(DEPDIR)/sws-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='sws-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-warnless.Tpo -c -o ../../lib/sws-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-warnless.Tpo ../../lib/$(DEPDIR)/sws-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/sws-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -sws-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-warnless.obj -MD -MP -MF $(DEPDIR)/sws-warnless.Tpo -c -o sws-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-warnless.Tpo $(DEPDIR)/sws-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='sws-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-warnless.Tpo -c -o ../../lib/sws-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-warnless.Tpo ../../lib/$(DEPDIR)/sws-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/sws-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` sws-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-getpart.o -MD -MP -MF $(DEPDIR)/sws-getpart.Tpo -c -o sws-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1631,33 +1787,33 @@ sws-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -sws-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-base64.o -MD -MP -MF $(DEPDIR)/sws-base64.Tpo -c -o sws-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-base64.Tpo $(DEPDIR)/sws-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='sws-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-base64.Tpo -c -o ../../lib/sws-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-base64.Tpo ../../lib/$(DEPDIR)/sws-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/sws-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -sws-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-base64.obj -MD -MP -MF $(DEPDIR)/sws-base64.Tpo -c -o sws-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-base64.Tpo $(DEPDIR)/sws-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='sws-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-base64.Tpo -c -o ../../lib/sws-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-base64.Tpo ../../lib/$(DEPDIR)/sws-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/sws-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -sws-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-memdebug.o -MD -MP -MF $(DEPDIR)/sws-memdebug.Tpo -c -o sws-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-memdebug.Tpo $(DEPDIR)/sws-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='sws-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-memdebug.Tpo -c -o ../../lib/sws-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-memdebug.Tpo ../../lib/$(DEPDIR)/sws-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/sws-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -sws-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-memdebug.obj -MD -MP -MF $(DEPDIR)/sws-memdebug.Tpo -c -o sws-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-memdebug.Tpo $(DEPDIR)/sws-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='sws-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-memdebug.Tpo -c -o ../../lib/sws-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-memdebug.Tpo ../../lib/$(DEPDIR)/sws-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/sws-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` sws-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-util.o -MD -MP -MF $(DEPDIR)/sws-util.Tpo -c -o sws-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -1687,103 +1843,103 @@ sws-sws.obj: sws.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-sws.obj `if test -f 'sws.c'; then $(CYGPATH_W) 'sws.c'; else $(CYGPATH_W) '$(srcdir)/sws.c'; fi` -sws-inet_pton.o: ../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-inet_pton.o -MD -MP -MF $(DEPDIR)/sws-inet_pton.Tpo -c -o sws-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-inet_pton.Tpo $(DEPDIR)/sws-inet_pton.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='sws-inet_pton.o' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-inet_pton.o: ../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-inet_pton.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-inet_pton.Tpo -c -o ../../lib/sws-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-inet_pton.Tpo ../../lib/$(DEPDIR)/sws-inet_pton.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/sws-inet_pton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c -sws-inet_pton.obj: ../../lib/inet_pton.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT sws-inet_pton.obj -MD -MP -MF $(DEPDIR)/sws-inet_pton.Tpo -c -o sws-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sws-inet_pton.Tpo $(DEPDIR)/sws-inet_pton.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='sws-inet_pton.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/sws-inet_pton.obj: ../../lib/inet_pton.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-inet_pton.obj -MD -MP -MF ../../lib/$(DEPDIR)/sws-inet_pton.Tpo -c -o ../../lib/sws-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-inet_pton.Tpo ../../lib/$(DEPDIR)/sws-inet_pton.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/sws-inet_pton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o sws-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -c -o ../../lib/sws-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi` -tftpd-mprintf.o: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-mprintf.o -MD -MP -MF $(DEPDIR)/tftpd-mprintf.Tpo -c -o tftpd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-mprintf.Tpo $(DEPDIR)/tftpd-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='tftpd-mprintf.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-mprintf.o: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-mprintf.Tpo -c -o ../../lib/tftpd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-mprintf.Tpo ../../lib/$(DEPDIR)/tftpd-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/tftpd-mprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c -tftpd-mprintf.obj: ../../lib/mprintf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-mprintf.obj -MD -MP -MF $(DEPDIR)/tftpd-mprintf.Tpo -c -o tftpd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-mprintf.Tpo $(DEPDIR)/tftpd-mprintf.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='tftpd-mprintf.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-mprintf.obj: ../../lib/mprintf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-mprintf.Tpo -c -o ../../lib/tftpd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-mprintf.Tpo ../../lib/$(DEPDIR)/tftpd-mprintf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/tftpd-mprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi` -tftpd-nonblock.o: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-nonblock.o -MD -MP -MF $(DEPDIR)/tftpd-nonblock.Tpo -c -o tftpd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-nonblock.Tpo $(DEPDIR)/tftpd-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='tftpd-nonblock.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-nonblock.o: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-nonblock.Tpo -c -o ../../lib/tftpd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-nonblock.Tpo ../../lib/$(DEPDIR)/tftpd-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/tftpd-nonblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c -tftpd-nonblock.obj: ../../lib/nonblock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-nonblock.obj -MD -MP -MF $(DEPDIR)/tftpd-nonblock.Tpo -c -o tftpd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-nonblock.Tpo $(DEPDIR)/tftpd-nonblock.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='tftpd-nonblock.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-nonblock.obj: ../../lib/nonblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-nonblock.Tpo -c -o ../../lib/tftpd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-nonblock.Tpo ../../lib/$(DEPDIR)/tftpd-nonblock.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/tftpd-nonblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi` -tftpd-strequal.o: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-strequal.o -MD -MP -MF $(DEPDIR)/tftpd-strequal.Tpo -c -o tftpd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-strequal.Tpo $(DEPDIR)/tftpd-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='tftpd-strequal.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-strequal.o: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-strequal.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-strequal.Tpo -c -o ../../lib/tftpd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-strequal.Tpo ../../lib/$(DEPDIR)/tftpd-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/tftpd-strequal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-strequal.o `test -f '../../lib/strequal.c' || echo '$(srcdir)/'`../../lib/strequal.c -tftpd-strequal.obj: ../../lib/strequal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-strequal.obj -MD -MP -MF $(DEPDIR)/tftpd-strequal.Tpo -c -o tftpd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-strequal.Tpo $(DEPDIR)/tftpd-strequal.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='tftpd-strequal.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-strequal.obj: ../../lib/strequal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-strequal.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-strequal.Tpo -c -o ../../lib/tftpd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-strequal.Tpo ../../lib/$(DEPDIR)/tftpd-strequal.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strequal.c' object='../../lib/tftpd-strequal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-strequal.obj `if test -f '../../lib/strequal.c'; then $(CYGPATH_W) '../../lib/strequal.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strequal.c'; fi` -tftpd-strtoofft.o: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-strtoofft.o -MD -MP -MF $(DEPDIR)/tftpd-strtoofft.Tpo -c -o tftpd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-strtoofft.Tpo $(DEPDIR)/tftpd-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='tftpd-strtoofft.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-strtoofft.o: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-strtoofft.Tpo -c -o ../../lib/tftpd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-strtoofft.Tpo ../../lib/$(DEPDIR)/tftpd-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/tftpd-strtoofft.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c -tftpd-strtoofft.obj: ../../lib/strtoofft.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-strtoofft.obj -MD -MP -MF $(DEPDIR)/tftpd-strtoofft.Tpo -c -o tftpd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-strtoofft.Tpo $(DEPDIR)/tftpd-strtoofft.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='tftpd-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-strtoofft.obj: ../../lib/strtoofft.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-strtoofft.Tpo -c -o ../../lib/tftpd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-strtoofft.Tpo ../../lib/$(DEPDIR)/tftpd-strtoofft.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/tftpd-strtoofft.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi` -tftpd-timeval.o: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-timeval.o -MD -MP -MF $(DEPDIR)/tftpd-timeval.Tpo -c -o tftpd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-timeval.Tpo $(DEPDIR)/tftpd-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='tftpd-timeval.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-timeval.o: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-timeval.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-timeval.Tpo -c -o ../../lib/tftpd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-timeval.Tpo ../../lib/$(DEPDIR)/tftpd-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/tftpd-timeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-timeval.o `test -f '../../lib/timeval.c' || echo '$(srcdir)/'`../../lib/timeval.c -tftpd-timeval.obj: ../../lib/timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-timeval.obj -MD -MP -MF $(DEPDIR)/tftpd-timeval.Tpo -c -o tftpd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-timeval.Tpo $(DEPDIR)/tftpd-timeval.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='tftpd-timeval.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-timeval.obj: ../../lib/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-timeval.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-timeval.Tpo -c -o ../../lib/tftpd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-timeval.Tpo ../../lib/$(DEPDIR)/tftpd-timeval.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/timeval.c' object='../../lib/tftpd-timeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-timeval.obj `if test -f '../../lib/timeval.c'; then $(CYGPATH_W) '../../lib/timeval.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/timeval.c'; fi` -tftpd-warnless.o: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-warnless.o -MD -MP -MF $(DEPDIR)/tftpd-warnless.Tpo -c -o tftpd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-warnless.Tpo $(DEPDIR)/tftpd-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='tftpd-warnless.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-warnless.o: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-warnless.Tpo -c -o ../../lib/tftpd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-warnless.Tpo ../../lib/$(DEPDIR)/tftpd-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/tftpd-warnless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c -tftpd-warnless.obj: ../../lib/warnless.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-warnless.obj -MD -MP -MF $(DEPDIR)/tftpd-warnless.Tpo -c -o tftpd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-warnless.Tpo $(DEPDIR)/tftpd-warnless.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='tftpd-warnless.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-warnless.obj: ../../lib/warnless.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-warnless.Tpo -c -o ../../lib/tftpd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-warnless.Tpo ../../lib/$(DEPDIR)/tftpd-warnless.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/tftpd-warnless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi` tftpd-getpart.o: getpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-getpart.o -MD -MP -MF $(DEPDIR)/tftpd-getpart.Tpo -c -o tftpd-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c @@ -1799,33 +1955,33 @@ tftpd-getpart.obj: getpart.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi` -tftpd-base64.o: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-base64.o -MD -MP -MF $(DEPDIR)/tftpd-base64.Tpo -c -o tftpd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-base64.Tpo $(DEPDIR)/tftpd-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='tftpd-base64.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-base64.o: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-base64.Tpo -c -o ../../lib/tftpd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-base64.Tpo ../../lib/$(DEPDIR)/tftpd-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/tftpd-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c -tftpd-base64.obj: ../../lib/base64.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-base64.obj -MD -MP -MF $(DEPDIR)/tftpd-base64.Tpo -c -o tftpd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-base64.Tpo $(DEPDIR)/tftpd-base64.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='tftpd-base64.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-base64.obj: ../../lib/base64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-base64.Tpo -c -o ../../lib/tftpd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-base64.Tpo ../../lib/$(DEPDIR)/tftpd-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/base64.c' object='../../lib/tftpd-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi` -tftpd-memdebug.o: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-memdebug.o -MD -MP -MF $(DEPDIR)/tftpd-memdebug.Tpo -c -o tftpd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-memdebug.Tpo $(DEPDIR)/tftpd-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='tftpd-memdebug.o' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-memdebug.o: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-memdebug.Tpo -c -o ../../lib/tftpd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-memdebug.Tpo ../../lib/$(DEPDIR)/tftpd-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/tftpd-memdebug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c -tftpd-memdebug.obj: ../../lib/memdebug.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-memdebug.obj -MD -MP -MF $(DEPDIR)/tftpd-memdebug.Tpo -c -o tftpd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tftpd-memdebug.Tpo $(DEPDIR)/tftpd-memdebug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='tftpd-memdebug.obj' libtool=no @AMDEPBACKSLASH@ +../../lib/tftpd-memdebug.obj: ../../lib/memdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT ../../lib/tftpd-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/tftpd-memdebug.Tpo -c -o ../../lib/tftpd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/tftpd-memdebug.Tpo ../../lib/$(DEPDIR)/tftpd-memdebug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/tftpd-memdebug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o tftpd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -c -o ../../lib/tftpd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi` tftpd-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tftpd_CFLAGS) $(CFLAGS) -MT tftpd-util.o -MD -MP -MF $(DEPDIR)/tftpd-util.Tpo -c -o tftpd-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @@ -1973,6 +2129,8 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f ../../lib/$(DEPDIR)/$(am__dirstamp) + -rm -f ../../lib/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1983,7 +2141,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../../lib/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -2029,7 +2187,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../../lib/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/tests/server/getpart.c b/tests/server/getpart.c index b00e852..fb86596 100644 --- a/tests/server/getpart.c +++ b/tests/server/getpart.c @@ -152,46 +152,27 @@ static int appenddata(char **dst_buf, /* dest buffer */ char *src_buf, /* source buffer */ int src_b64) /* != 0 if source is base64 encoded */ { - size_t need_alloc, src_len; - union { - unsigned char *as_uchar; - char *as_char; - } buf64; + size_t need_alloc = 0; + size_t src_len = strlen(src_buf); - src_len = strlen(src_buf); if(!src_len) return GPE_OK; - buf64.as_char = NULL; + need_alloc = src_len + *dst_len + 1; if(src_b64) { - /* base64 decode the given buffer */ - int error = (int) Curl_base64_decode(src_buf, &buf64.as_uchar, &src_len); - if(error) - return GPE_OUT_OF_MEMORY; - src_buf = buf64.as_char; - if(!src_len || !src_buf) { - /* - ** currently there is no way to tell apart an OOM condition in - ** Curl_base64_decode() from zero length decoded data. For now, - ** let's just assume it is an OOM condition, currently we have - ** no input for this function that decodes to zero length data. - */ - if(buf64.as_char) - free(buf64.as_char); - return GPE_OUT_OF_MEMORY; - } - } + if(src_buf[src_len - 1] == '\r') + src_len--; - need_alloc = src_len + *dst_len + 1; + if(src_buf[src_len - 1] == '\n') + src_len--; + } /* enlarge destination buffer if required */ if(need_alloc > *dst_alloc) { size_t newsize = need_alloc * 2; char *newptr = realloc(*dst_buf, newsize); if(!newptr) { - if(buf64.as_char) - free(buf64.as_char); return GPE_OUT_OF_MEMORY; } *dst_alloc = newsize; @@ -203,8 +184,43 @@ static int appenddata(char **dst_buf, /* dest buffer */ *dst_len += src_len; *(*dst_buf + *dst_len) = '\0'; - if(buf64.as_char) - free(buf64.as_char); + return GPE_OK; +} + +static int decodedata(char **buf, /* dest buffer */ + size_t *len) /* dest buffer data length */ +{ + int error = 0; + unsigned char *buf64 = NULL; + size_t src_len = 0; + + if(!*len) + return GPE_OK; + + /* base64 decode the given buffer */ + error = (int) Curl_base64_decode(*buf, &buf64, &src_len); + if(error) + return GPE_OUT_OF_MEMORY; + + if(!src_len) { + /* + ** currently there is no way to tell apart an OOM condition in + ** Curl_base64_decode() from zero length decoded data. For now, + ** let's just assume it is an OOM condition, currently we have + ** no input for this function that decodes to zero length data. + */ + if(buf64) + free(buf64); + + return GPE_OUT_OF_MEMORY; + } + + /* memcpy to support binary blobs */ + memcpy(*buf, buf64, src_len); + *len = src_len; + *(*buf + src_len) = '\0'; + + free(buf64); return GPE_OK; } @@ -308,6 +324,13 @@ int getpart(char **outbuf, size_t *outlen, if(in_wanted_part) { /* end of wanted part */ in_wanted_part = 0; + + /* Do we need to base64 decode the data? */ + if(base64) { + error = decodedata(outbuf, outlen); + if(error) + return error; + } break; } } @@ -318,6 +341,13 @@ int getpart(char **outbuf, size_t *outlen, if(in_wanted_part) { /* end of wanted part */ in_wanted_part = 0; + + /* Do we need to base64 decode the data? */ + if(base64) { + error = decodedata(outbuf, outlen); + if(error) + return error; + } break; } } diff --git a/tests/server/resolve.c b/tests/server/resolve.c index d060988..39849e7 100644 --- a/tests/server/resolve.c +++ b/tests/server/resolve.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -120,7 +120,7 @@ int main(int argc, char *argv[]) /* Check that the system has IPv6 enabled before checking the resolver */ curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); if(s == CURL_SOCKET_BAD) - /* an ipv6 address was requested and we can't get/use one */ + /* an IPv6 address was requested and we can't get/use one */ rc = -1; else { sclose(s); @@ -135,9 +135,11 @@ int main(int argc, char *argv[]) hints.ai_family = PF_INET6; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_CANONNAME; - /* Use parenthesis around function to stop it from being replaced by - the macro in memdebug.h */ + /* Use parenthesis around functions to stop them from being replaced by + the macro in memdebug.h */ rc = (getaddrinfo)(host, "80", &hints, &ai); + if (rc == 0) + (freeaddrinfo)(ai); } #else diff --git a/tests/server/server_sockaddr.h b/tests/server/server_sockaddr.h index 6a17fe0..3f4cd67 100644 --- a/tests/server/server_sockaddr.h +++ b/tests/server/server_sockaddr.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,12 +23,19 @@ ***************************************************************************/ #include "server_setup.h" +#ifdef HAVE_SYS_UN_H +#include /* for sockaddr_un */ +#endif + typedef union { struct sockaddr sa; struct sockaddr_in sa4; #ifdef ENABLE_IPV6 struct sockaddr_in6 sa6; #endif +#ifdef USE_UNIX_SOCKETS + struct sockaddr_un sau; +#endif } srvr_sockaddr_union_t; #endif /* HEADER_CURL_SERVER_SOCKADDR_H */ diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index d924331..a4496e0 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -23,7 +23,7 @@ /* Purpose * - * 1. Accept a TCP connection on a custom port (ipv4 or ipv6), or connect + * 1. Accept a TCP connection on a custom port (IPv4 or IPv6), or connect * to a given (localhost) port. * * 2. Get commands on STDIN. Pass data on to the TCP stream. @@ -92,9 +92,6 @@ #ifdef HAVE_NETDB_H #include #endif -#ifdef USE_WINSOCK -#include /* for _kbhit() used in select_ws() */ -#endif #define ENABLE_CURLX_PRINTF /* make the curlx header define all printf() functions to use the curlx_* @@ -288,10 +285,10 @@ static ssize_t read_wincon(int fd, void *buf, size_t count) } if(GetConsoleMode(handle, &mode)) { - success = ReadConsole(handle, buf, count, &rcount, NULL); + success = ReadConsole(handle, buf, curlx_uztoul(count), &rcount, NULL); } else { - success = ReadFile(handle, buf, count, &rcount, NULL); + success = ReadFile(handle, buf, curlx_uztoul(count), &rcount, NULL); } if(success) { return rcount; @@ -300,6 +297,7 @@ static ssize_t read_wincon(int fd, void *buf, size_t count) errno = GetLastError(); return -1; } +#undef read #define read(a,b,c) read_wincon(a,b,c) /* @@ -322,10 +320,10 @@ static ssize_t write_wincon(int fd, const void *buf, size_t count) } if(GetConsoleMode(handle, &mode)) { - success = WriteConsole(handle, buf, count, &wcount, NULL); + success = WriteConsole(handle, buf, curlx_uztoul(count), &wcount, NULL); } else { - success = WriteFile(handle, buf, count, &wcount, NULL); + success = WriteFile(handle, buf, curlx_uztoul(count), &wcount, NULL); } if(success) { return wcount; @@ -334,6 +332,7 @@ static ssize_t write_wincon(int fd, const void *buf, size_t count) errno = GetLastError(); return -1; } +#undef write #define write(a,b,c) write_wincon(a,b,c) #endif @@ -507,25 +506,185 @@ static void lograw(unsigned char *buffer, ssize_t len) * to re-create a select() function with support for other handle types. * * select() function with support for WINSOCK2 sockets and all - * other handle types supported by WaitForMultipleObjectsEx(). - * - * TODO: Differentiate between read/write/except for non-SOCKET handles. + * other handle types supported by WaitForMultipleObjectsEx() as + * well as disk files, anonymous and names pipes, and character input. * * http://msdn.microsoft.com/en-us/library/windows/desktop/ms687028.aspx * http://msdn.microsoft.com/en-us/library/windows/desktop/ms741572.aspx */ +struct select_ws_wait_data { + HANDLE handle; /* actual handle to wait for during select */ + HANDLE event; /* internal event to abort waiting thread */ +}; +static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter) +{ + struct select_ws_wait_data *data; + HANDLE handle, handles[2]; + INPUT_RECORD inputrecord; + LARGE_INTEGER size, pos; + DWORD type, length; + + /* retrieve handles from internal structure */ + data = (struct select_ws_wait_data *) lpParameter; + if(data) { + handle = data->handle; + handles[0] = data->event; + handles[1] = handle; + free(data); + } + else + return -1; + + /* retrieve the type of file to wait on */ + type = GetFileType(handle); + switch(type) { + case FILE_TYPE_DISK: + /* The handle represents a file on disk, this means: + * - WaitForMultipleObjectsEx will always be signalled for it. + * - comparison of current position in file and total size of + * the file can be used to check if we reached the end yet. + * + * Approach: Loop till either the internal event is signalled + * or if the end of the file has already been reached. + */ + while(WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE) + == WAIT_OBJECT_0 + 1) { + /* get total size of file */ + length = 0; + size.QuadPart = 0; + size.LowPart = GetFileSize(handle, &length); + if((size.LowPart != INVALID_FILE_SIZE) || + (GetLastError() == NO_ERROR)) { + size.HighPart = length; + /* get the current position within the file */ + pos.QuadPart = 0; + pos.LowPart = SetFilePointer(handle, 0, &pos.HighPart, FILE_CURRENT); + if((pos.LowPart != INVALID_SET_FILE_POINTER) || + (GetLastError() == NO_ERROR)) { + /* compare position with size, abort if not equal */ + if(size.QuadPart == pos.QuadPart) { + /* sleep and continue waiting */ + SleepEx(0, FALSE); + continue; + } + } + } + /* there is some data available, stop waiting */ + break; + } + break; + + case FILE_TYPE_CHAR: + /* The handle represents a character input, this means: + * - WaitForMultipleObjectsEx will be signalled on any kind of input, + * including mouse and window size events we do not care about. + * + * Approach: Loop till either the internal event is signalled + * or we get signalled for an actual key-event. + */ + while(WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE) + == WAIT_OBJECT_0 + 1) { + /* check if this is an actual console handle */ + length = 0; + if(GetConsoleMode(handle, &length)) { + /* retrieve an event from the console buffer */ + length = 0; + if(PeekConsoleInput(handle, &inputrecord, 1, &length)) { + /* check if the event is not an actual key-event */ + if(length == 1 && inputrecord.EventType != KEY_EVENT) { + /* purge the non-key-event and continue waiting */ + ReadConsoleInput(handle, &inputrecord, 1, &length); + continue; + } + } + } + /* there is some data available, stop waiting */ + break; + } + break; + + case FILE_TYPE_PIPE: + /* The handle represents an anonymous or named pipe, this means: + * - WaitForMultipleObjectsEx will always be signalled for it. + * - peek into the pipe and retrieve the amount of data available. + * + * Approach: Loop till either the internal event is signalled + * or there is data in the pipe available for reading. + */ + while(WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE) + == WAIT_OBJECT_0 + 1) { + /* peek into the pipe and retrieve the amount of data available */ + length = 0; + if(PeekNamedPipe(handle, NULL, 0, NULL, &length, NULL)) { + /* if there is no data available, sleep and continue waiting */ + if(length == 0) { + SleepEx(0, FALSE); + continue; + } + } + else { + /* if the pipe has been closed, sleep and continue waiting */ + if(GetLastError() == ERROR_BROKEN_PIPE) { + SleepEx(0, FALSE); + continue; + } + } + /* there is some data available, stop waiting */ + break; + } + break; + + default: + /* The handle has an unknown type, try to wait on it */ + WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE); + break; + } + + return 0; +} +static HANDLE select_ws_wait(HANDLE handle, HANDLE event) +{ + struct select_ws_wait_data *data; + HANDLE thread = NULL; + + /* allocate internal waiting data structure */ + data = malloc(sizeof(struct select_ws_wait_data)); + if(data) { + data->handle = handle; + data->event = event; + + /* launch waiting thread */ + thread = CreateThread(NULL, 0, + &select_ws_wait_thread, + data, 0, NULL); + + /* free data if thread failed to launch */ + if(!thread) { + free(data); + } + } + + return thread; +} +struct select_ws_data { + curl_socket_t fd; /* the original input handle (indexed by fds) */ + curl_socket_t wsasock; /* the internal socket handle (indexed by wsa) */ + WSAEVENT wsaevent; /* the internal WINSOCK2 event (indexed by wsa) */ + HANDLE thread; /* the internal threads handle (indexed by thd) */ +}; static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { - long networkevents; - DWORD milliseconds, wait, idx, mode, avail, events, inputs; - WSAEVENT wsaevent, *wsaevents; + DWORD milliseconds, wait, idx; WSANETWORKEVENTS wsanetevents; - INPUT_RECORD *inputrecords; + struct select_ws_data *data; HANDLE handle, *handles; - curl_socket_t sock, *fdarr, *wsasocks; + curl_socket_t sock; + long networkevents; + WSAEVENT wsaevent; int error, fds; - DWORD nfd = 0, wsa = 0; + HANDLE waitevent = NULL; + DWORD nfd = 0, thd = 0, wsa = 0; int ret = 0; /* check if the input value is valid */ @@ -540,33 +699,31 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, return 0; } - /* allocate internal array for the original input handles */ - fdarr = malloc(nfds * sizeof(curl_socket_t)); - if(fdarr == NULL) { + /* create internal event to signal waiting threads */ + waitevent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(!waitevent) { errno = ENOMEM; return -1; } - /* allocate internal array for the internal event handles */ - handles = malloc(nfds * sizeof(HANDLE)); - if(handles == NULL) { + /* allocate internal array for the internal data */ + data = malloc(nfds * sizeof(struct select_ws_data)); + if(data == NULL) { errno = ENOMEM; return -1; } - /* allocate internal array for the internal socket handles */ - wsasocks = malloc(nfds * sizeof(curl_socket_t)); - if(wsasocks == NULL) { + /* allocate internal array for the internal event handles */ + handles = malloc(nfds * sizeof(HANDLE)); + if(handles == NULL) { + free(data); errno = ENOMEM; return -1; } - /* allocate internal array for the internal WINSOCK2 events */ - wsaevents = malloc(nfds * sizeof(WSAEVENT)); - if(wsaevents == NULL) { - errno = ENOMEM; - return -1; - } + /* clear internal arrays */ + memset(data, 0, nfds * sizeof(struct select_ws_data)); + memset(handles, 0, nfds * sizeof(HANDLE)); /* loop over the handles in the input descriptor sets */ for(fds = 0; fds < nfds; fds++) { @@ -584,9 +741,13 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, /* only wait for events for which we actually care */ if(networkevents) { - fdarr[nfd] = curlx_sitosk(fds); + data[nfd].fd = curlx_sitosk(fds); if(fds == fileno(stdin)) { - handles[nfd] = GetStdHandle(STD_INPUT_HANDLE); + handle = GetStdHandle(STD_INPUT_HANDLE); + handle = select_ws_wait(handle, waitevent); + handles[nfd] = handle; + data[thd].thread = handle; + thd++; } else if(fds == fileno(stdout)) { handles[nfd] = GetStdHandle(STD_OUTPUT_HANDLE); @@ -599,14 +760,19 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, if(wsaevent != WSA_INVALID_EVENT) { error = WSAEventSelect(fds, wsaevent, networkevents); if(error != SOCKET_ERROR) { - handles[nfd] = wsaevent; - wsasocks[wsa] = curlx_sitosk(fds); - wsaevents[wsa] = wsaevent; + handle = (HANDLE) wsaevent; + handles[nfd] = handle; + data[wsa].wsasock = curlx_sitosk(fds); + data[wsa].wsaevent = wsaevent; wsa++; } else { - handles[nfd] = (HANDLE) curlx_sitosk(fds); WSACloseEvent(wsaevent); + handle = (HANDLE) curlx_sitosk(fds); + handle = select_ws_wait(handle, waitevent); + handles[nfd] = handle; + data[thd].thread = handle; + thd++; } } } @@ -625,55 +791,20 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, /* wait for one of the internal handles to trigger */ wait = WaitForMultipleObjectsEx(nfd, handles, FALSE, milliseconds, FALSE); + /* signal the event handle for the waiting threads */ + SetEvent(waitevent); + /* loop over the internal handles returned in the descriptors */ for(idx = 0; idx < nfd; idx++) { handle = handles[idx]; - sock = fdarr[idx]; + sock = data[idx].fd; fds = curlx_sktosi(sock); /* check if the current internal handle was triggered */ if(wait != WAIT_FAILED && (wait - WAIT_OBJECT_0) <= idx && WaitForSingleObjectEx(handle, 0, FALSE) == WAIT_OBJECT_0) { - /* try to handle the event with STD* handle functions */ + /* first handle stdin, stdout and stderr */ if(fds == fileno(stdin)) { - /* check if there is no data in the input buffer */ - if(!stdin->_cnt) { - /* check if we are getting data from a PIPE */ - if(!GetConsoleMode(handle, &mode)) { - /* check if there is no data from PIPE input */ - if(!PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL)) - avail = 0; - if(!avail) { - FD_CLR(sock, readfds); - /* reduce CPU load */ - Sleep(10); - } - } /* check if there is no data from keyboard input */ - else if (!_kbhit()) { - /* check if there are INPUT_RECORDs in the input buffer */ - if(GetNumberOfConsoleInputEvents(handle, &events)) { - if(events > 0) { - /* remove INPUT_RECORDs from the input buffer */ - inputrecords = (INPUT_RECORD*)malloc(events * - sizeof(INPUT_RECORD)); - if(inputrecords) { - if(!ReadConsoleInput(handle, inputrecords, - events, &inputs)) - inputs = 0; - free(inputrecords); - } - - /* check if we got all inputs, otherwise clear buffer */ - if(events != inputs) - FlushConsoleInputBuffer(handle); - } - } - - /* remove from descriptor set since there is no real data */ - FD_CLR(sock, readfds); - } - } - /* stdin is never ready for write or exceptional */ FD_CLR(sock, writefds); FD_CLR(sock, exceptfds); @@ -685,6 +816,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, } else { /* try to handle the event with the WINSOCK2 functions */ + wsanetevents.lNetworkEvents = 0; error = WSAEnumNetworkEvents(fds, handle, &wsanetevents); if(error != SOCKET_ERROR) { /* remove from descriptor set if not ready for read/accept/close */ @@ -725,14 +857,19 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, } for(idx = 0; idx < wsa; idx++) { - WSAEventSelect(wsasocks[idx], NULL, 0); - WSACloseEvent(wsaevents[idx]); + WSAEventSelect(data[idx].wsasock, NULL, 0); + WSACloseEvent(data[idx].wsaevent); } - free(wsaevents); - free(wsasocks); + for(idx = 0; idx < thd; idx++) { + WaitForSingleObject(data[idx].thread, INFINITE); + CloseHandle(data[idx].thread); + } + + CloseHandle(waitevent); + free(handles); - free(fdarr); + free(data); return ret; } diff --git a/tests/server/sws.c b/tests/server/sws.c index 38658cb..8cd30c5 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -65,11 +65,16 @@ #define ERANGE 34 /* errno.h value */ #endif +static enum { + socket_domain_inet = AF_INET #ifdef ENABLE_IPV6 -static bool use_ipv6 = FALSE; + , socket_domain_inet6 = AF_INET6 #endif +#ifdef USE_UNIX_SOCKETS + , socket_domain_unix = AF_UNIX +#endif +} socket_domain = AF_INET; static bool use_gopher = FALSE; -static const char *ipv_inuse = "IPv4"; static int serverlogslocked = 0; static bool is_proxy = FALSE; @@ -114,6 +119,8 @@ struct httprequest { bool pipelining; /* true if request is pipelined */ int callcount; /* times ProcessRequest() gets called */ bool connmon; /* monitor the state of the connection, log disconnects */ + bool upgrade; /* test case allows upgrade to http2 */ + bool upgrade_request; /* upgrade request found and allowed */ int done_processing; }; @@ -164,6 +171,9 @@ const char *serverlogfile = DEFAULT_LOGFILE; proper point - like with NTLM */ #define CMD_CONNECTIONMONITOR "connection-monitor" +/* upgrade to http2 */ +#define CMD_UPGRADE "upgrade" + #define END_OF_HEADERS "\r\n\r\n" enum { @@ -319,6 +329,21 @@ static void restore_signal_handlers(void) #endif } +/* returns true if the current socket is an IP one */ +static bool socket_domain_is_ip(void) +{ + switch(socket_domain) { + case AF_INET: +#ifdef ENABLE_IPV6 + case AF_INET6: +#endif + return true; + default: + /* case AF_UNIX: */ + return false; + } +} + /* based on the testno, parse the correct server commands */ static int parse_servercmd(struct httprequest *req) { @@ -376,6 +401,10 @@ static int parse_servercmd(struct httprequest *req) logmsg("enabled connection monitoring"); req->connmon = TRUE; } + else if(!strncmp(CMD_UPGRADE, cmd, strlen(CMD_UPGRADE))) { + logmsg("enabled upgrade to http2"); + req->upgrade = TRUE; + } else if(1 == sscanf(cmd, "pipe: %d", &num)) { logmsg("instructed to allow a pipe size of %d", num); if(num < 0) @@ -789,6 +818,12 @@ static int ProcessRequest(struct httprequest *req) return 1; /* done */ } + if(req->upgrade && strstr(req->reqbuf, "Upgrade:")) { + /* we allow upgrade and there was one! */ + logmsg("Found Upgrade: in request and allows it"); + req->upgrade_request = TRUE; + } + if(req->cl > 0) { if(req->cl <= req->offset - (end - req->reqbuf) - strlen(end_of_headers)) return 1; /* done */ @@ -1266,15 +1301,12 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port) srvr_sockaddr_union_t serveraddr; curl_socket_t serverfd; int error; - int rc; + int rc = 0; const char *op_br = ""; const char *cl_br = ""; -#ifdef TCP_NODELAY - curl_socklen_t flag; -#endif #ifdef ENABLE_IPV6 - if(use_ipv6) { + if(socket_domain == AF_INET6) { op_br = "["; cl_br = "]"; } @@ -1286,14 +1318,8 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port) logmsg("about to connect to %s%s%s:%hu", op_br, ipaddr, cl_br, port); -#ifdef ENABLE_IPV6 - if(!use_ipv6) -#endif - serverfd = socket(AF_INET, SOCK_STREAM, 0); -#ifdef ENABLE_IPV6 - else - serverfd = socket(AF_INET6, SOCK_STREAM, 0); -#endif + + serverfd = socket(socket_domain, SOCK_STREAM, 0); if(CURL_SOCKET_BAD == serverfd) { error = SOCKERRNO; logmsg("Error creating socket for server conection: (%d) %s", @@ -1302,18 +1328,19 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port) } #ifdef TCP_NODELAY - /* Disable the Nagle algorithm */ - flag = 1; - if(0 != setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY, - (void *)&flag, sizeof(flag))) - logmsg("====> TCP_NODELAY for server conection failed"); - else - logmsg("TCP_NODELAY set for server conection"); + if(socket_domain_is_ip()) { + /* Disable the Nagle algorithm */ + curl_socklen_t flag = 1; + if(0 != setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY, + (void *)&flag, sizeof(flag))) + logmsg("====> TCP_NODELAY for server conection failed"); + else + logmsg("TCP_NODELAY set for server conection"); + } #endif -#ifdef ENABLE_IPV6 - if(!use_ipv6) { -#endif + switch(socket_domain) { + case AF_INET: memset(&serveraddr.sa4, 0, sizeof(serveraddr.sa4)); serveraddr.sa4.sin_family = AF_INET; serveraddr.sa4.sin_port = htons(port); @@ -1324,9 +1351,9 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port) } rc = connect(serverfd, &serveraddr.sa, sizeof(serveraddr.sa4)); + break; #ifdef ENABLE_IPV6 - } - else { + case AF_INET6: memset(&serveraddr.sa6, 0, sizeof(serveraddr.sa6)); serveraddr.sa6.sin6_family = AF_INET6; serveraddr.sa6.sin6_port = htons(port); @@ -1337,8 +1364,14 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port) } rc = connect(serverfd, &serveraddr.sa, sizeof(serveraddr.sa6)); - } + break; #endif /* ENABLE_IPV6 */ +#ifdef USE_UNIX_SOCKETS + case AF_UNIX: + logmsg("Proxying through Unix socket is not (yet?) supported."); + return CURL_SOCKET_BAD; +#endif /* USE_UNIX_SOCKETS */ + } if(got_exit_signal) { sclose(serverfd); @@ -1391,9 +1424,6 @@ static void http_connect(curl_socket_t *infdp, bool poll_server_rd[2] = { TRUE, TRUE }; bool poll_client_wr[2] = { TRUE, TRUE }; bool poll_server_wr[2] = { TRUE, TRUE }; -#ifdef TCP_NODELAY - curl_socklen_t flag; -#endif bool primary = FALSE; bool secondary = FALSE; int max_tunnel_idx; /* CTRL or DATA */ @@ -1507,13 +1537,15 @@ static void http_connect(curl_socket_t *infdp, memset(&req2, 0, sizeof(req2)); logmsg("====> Client connect DATA"); #ifdef TCP_NODELAY - /* Disable the Nagle algorithm */ - flag = 1; - if(0 != setsockopt(datafd, IPPROTO_TCP, TCP_NODELAY, - (void *)&flag, sizeof(flag))) - logmsg("====> TCP_NODELAY for client DATA conection failed"); - else - logmsg("TCP_NODELAY set for client DATA conection"); + if(socket_domain_is_ip()) { + /* Disable the Nagle algorithm */ + curl_socklen_t flag = 1; + if(0 != setsockopt(datafd, IPPROTO_TCP, TCP_NODELAY, + (void *)&flag, sizeof(flag))) + logmsg("====> TCP_NODELAY for client DATA conection failed"); + else + logmsg("TCP_NODELAY set for client DATA conection"); + } #endif req2.pipelining = FALSE; init_httprequest(&req2); @@ -1754,6 +1786,14 @@ http_connect_cleanup: *infdp = CURL_SOCKET_BAD; } +static void http2(struct httprequest *req) +{ + (void)req; + logmsg("switched to http2"); + /* left to implement */ +} + + /* returns a socket handle, or 0 if there are no more waiting sockets, or < 0 if there was an error */ static curl_socket_t accept_connection(curl_socket_t sock) @@ -1819,15 +1859,17 @@ static curl_socket_t accept_connection(curl_socket_t sock) num_sockets += 1; #ifdef TCP_NODELAY - /* - * Disable the Nagle algorithm to make it easier to send out a large - * response in many small segments to torture the clients more. - */ - if(0 != setsockopt(msgsock, IPPROTO_TCP, TCP_NODELAY, - (void *)&flag, sizeof(flag))) - logmsg("====> TCP_NODELAY failed"); - else - logmsg("TCP_NODELAY set"); + if(socket_domain_is_ip()) { + /* + * Disable the Nagle algorithm to make it easier to send out a large + * response in many small segments to torture the clients more. + */ + if(0 != setsockopt(msgsock, IPPROTO_TCP, TCP_NODELAY, + (void *)&flag, sizeof(flag))) + logmsg("====> TCP_NODELAY failed"); + else + logmsg("TCP_NODELAY set"); + } #endif return msgsock; @@ -1889,6 +1931,12 @@ static int service_connection(curl_socket_t msgsock, struct httprequest *req, } } + if(req->upgrade_request) { + /* an upgrade request, switch to http2 here */ + http2(req); + return -1; + } + /* if we got a CONNECT, loop and get another request as well! */ if(req->open) { @@ -1906,13 +1954,20 @@ int main(int argc, char *argv[]) int wrotepidfile = 0; int flag; unsigned short port = DEFAULT_PORT; +#ifdef USE_UNIX_SOCKETS + const char *unix_socket = NULL; + bool unlink_socket = false; +#endif char *pidname= (char *)".http.pid"; struct httprequest req; - int rc; + int rc = 0; int error; int arg=1; long pid; const char *connecthost = "127.0.0.1"; + const char *socket_type = "IPv4"; + char port_str[11]; + const char *location_str = port_str; /* a default CONNECT port is basically pointless but still ... */ size_t socket_idx; @@ -1921,15 +1976,14 @@ int main(int argc, char *argv[]) while(argc>arg) { if(!strcmp("--version", argv[arg])) { - printf("sws IPv4%s" - "\n" - , + puts("sws IPv4" #ifdef ENABLE_IPV6 "/IPv6" -#else - "" #endif - ); +#ifdef USE_UNIX_SOCKETS + "/unix" +#endif + ); return 0; } else if(!strcmp("--pidfile", argv[arg])) { @@ -1948,19 +2002,36 @@ int main(int argc, char *argv[]) end_of_headers = "\r\n"; /* gopher style is much simpler */ } else if(!strcmp("--ipv4", argv[arg])) { -#ifdef ENABLE_IPV6 - ipv_inuse = "IPv4"; - use_ipv6 = FALSE; -#endif + socket_type = "IPv4"; + socket_domain = AF_INET; + location_str = port_str; arg++; } else if(!strcmp("--ipv6", argv[arg])) { #ifdef ENABLE_IPV6 - ipv_inuse = "IPv6"; - use_ipv6 = TRUE; + socket_type = "IPv6"; + socket_domain = AF_INET6; + location_str = port_str; #endif arg++; } + else if(!strcmp("--unix-socket", argv[arg])) { + arg++; + if(argc>arg) { +#ifdef USE_UNIX_SOCKETS + unix_socket = argv[arg]; + if(strlen(unix_socket) >= sizeof(me.sau.sun_path)) { + fprintf(stderr, "sws: socket path must be shorter than %zu chars\n", + sizeof(me.sau.sun_path)); + return 0; + } + socket_type = "unix"; + socket_domain = AF_UNIX; + location_str = unix_socket; +#endif + arg++; + } + } else if(!strcmp("--port", argv[arg])) { arg++; if(argc>arg) { @@ -2002,6 +2073,7 @@ int main(int argc, char *argv[]) " --pidfile [file]\n" " --ipv4\n" " --ipv6\n" + " --unix-socket [file]\n" " --port [port]\n" " --srcdir [path]\n" " --connect [ip4-addr]\n" @@ -2010,6 +2082,8 @@ int main(int argc, char *argv[]) } } + snprintf(port_str, sizeof(port_str), "port %hu", port); + #ifdef WIN32 win32_init(); atexit(win32_cleanup); @@ -2019,14 +2093,7 @@ int main(int argc, char *argv[]) pid = (long)getpid(); -#ifdef ENABLE_IPV6 - if(!use_ipv6) -#endif - sock = socket(AF_INET, SOCK_STREAM, 0); -#ifdef ENABLE_IPV6 - else - sock = socket(AF_INET6, SOCK_STREAM, 0); -#endif + sock = socket(socket_domain, SOCK_STREAM, 0); all_sockets[0] = sock; num_sockets = 1; @@ -2053,33 +2120,83 @@ int main(int argc, char *argv[]) goto sws_cleanup; } -#ifdef ENABLE_IPV6 - if(!use_ipv6) { -#endif + switch(socket_domain) { + case AF_INET: memset(&me.sa4, 0, sizeof(me.sa4)); me.sa4.sin_family = AF_INET; me.sa4.sin_addr.s_addr = INADDR_ANY; me.sa4.sin_port = htons(port); rc = bind(sock, &me.sa, sizeof(me.sa4)); + break; #ifdef ENABLE_IPV6 - } - else { + case AF_INET6: memset(&me.sa6, 0, sizeof(me.sa6)); me.sa6.sin6_family = AF_INET6; me.sa6.sin6_addr = in6addr_any; me.sa6.sin6_port = htons(port); rc = bind(sock, &me.sa, sizeof(me.sa6)); - } + break; #endif /* ENABLE_IPV6 */ +#ifdef USE_UNIX_SOCKETS + case AF_UNIX: + memset(&me.sau, 0, sizeof(me.sau)); + me.sau.sun_family = AF_UNIX; + strncpy(me.sau.sun_path, unix_socket, sizeof(me.sau.sun_path)); + rc = bind(sock, &me.sa, sizeof(me.sau)); + if(0 != rc && errno == EADDRINUSE) { + struct stat statbuf; + /* socket already exists. Perhaps it is stale? */ + int unixfd = socket(AF_UNIX, SOCK_STREAM, 0); + if(CURL_SOCKET_BAD == unixfd) { + error = SOCKERRNO; + logmsg("Error binding socket, failed to create socket at %s: (%d) %s", + unix_socket, error, strerror(error)); + goto sws_cleanup; + } + /* check whether the server is alive */ + rc = connect(unixfd, &me.sa, sizeof(me.sau)); + error = errno; + close(unixfd); + if(ECONNREFUSED != error) { + logmsg("Error binding socket, failed to connect to %s: (%d) %s", + unix_socket, error, strerror(error)); + goto sws_cleanup; + } + /* socket server is not alive, now check if it was actually a socket. + * Systems which have Unix sockets will also have lstat */ + rc = lstat(unix_socket, &statbuf); + if (0 != rc) { + logmsg("Error binding socket, failed to stat %s: (%d) %s", + unix_socket, errno, strerror(errno)); + goto sws_cleanup; + } + if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) { + logmsg("Error binding socket, failed to stat %s: (%d) %s", + unix_socket, error, strerror(error)); + goto sws_cleanup; + } + /* dead socket, cleanup and retry bind */ + rc = unlink(unix_socket); + if(0 != rc) { + logmsg("Error binding socket, failed to unlink %s: (%d) %s", + unix_socket, errno, strerror(errno)); + goto sws_cleanup; + } + /* stale socket is gone, retry bind */ + rc = bind(sock, &me.sa, sizeof(me.sau)); + } + break; +#endif /* USE_UNIX_SOCKETS */ + } if(0 != rc) { error = SOCKERRNO; - logmsg("Error binding socket on port %hu: (%d) %s", - port, error, strerror(error)); + logmsg("Error binding socket on %s: (%d) %s", + location_str, error, strerror(error)); goto sws_cleanup; } - logmsg("Running %s %s version on port %d", - use_gopher?"GOPHER":"HTTP", ipv_inuse, (int)port); + logmsg("Running %s %s version on %s", + use_gopher?"GOPHER":"HTTP", socket_type, location_str); /* start accepting connections */ rc = listen(sock, 5); @@ -2090,6 +2207,11 @@ int main(int argc, char *argv[]) goto sws_cleanup; } +#ifdef USE_UNIX_SOCKETS + /* listen succeeds, so let's assume a valid listening Unix socket */ + unlink_socket = true; +#endif + /* ** As soon as this server writes its pid file the test harness will ** attempt to connect to this server and initiate its verification. @@ -2230,6 +2352,13 @@ sws_cleanup: if(sock != CURL_SOCKET_BAD) sclose(sock); +#ifdef USE_UNIX_SOCKETS + if(unlink_socket && socket_domain == AF_UNIX) { + rc = unlink(unix_socket); + logmsg("unlink(%s) = %d (%s)", unix_socket, rc, strerror(rc)); + } +#endif + if(got_exit_signal) logmsg("signalled to die"); @@ -2244,8 +2373,8 @@ sws_cleanup: restore_signal_handlers(); if(got_exit_signal) { - logmsg("========> %s sws (port: %d pid: %ld) exits with signal (%d)", - ipv_inuse, (int)port, pid, exit_signal); + logmsg("========> %s sws (%s pid: %ld) exits with signal (%d)", + socket_type, location_str, pid, exit_signal); /* * To properly set the return status of the process we * must raise the same signal SIGINT or SIGTERM that we diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c index 10f88a1..2555793 100644 --- a/tests/server/tftpd.c +++ b/tests/server/tftpd.c @@ -107,8 +107,10 @@ struct testcase { size_t bufsize; /* size of the data in buffer */ char *rptr; /* read pointer into the buffer */ size_t rcount; /* amount of data left to read of the file */ - long num; /* test case number */ + long testno; /* test case number */ int ofile; /* file descriptor for output file when uploading to us */ + + int writedelay; /* number of seconds between each packet */ }; struct formats { @@ -200,14 +202,6 @@ static curl_socket_t peer = CURL_SOCKET_BAD; static int timeout; static int maxtimeout = 5 * TIMEOUT; -static unsigned short sendblock; /* block count used by sendtftp() */ -static struct tftphdr *sdp; /* data buffer used by sendtftp() */ -static struct tftphdr *sap; /* ack buffer used by sendtftp() */ - -static unsigned short recvblock; /* block count used by recvtftp() */ -static struct tftphdr *rdp; /* data buffer used by recvtftp() */ -static struct tftphdr *rap; /* ack buffer used by recvtftp() */ - #ifdef ENABLE_IPV6 static bool use_ipv6 = FALSE; #endif @@ -274,15 +268,6 @@ static struct tftphdr *w_init(void); static struct tftphdr *r_init(void); -static int readit(struct testcase *test, - struct tftphdr **dpp, - int convert); - -static int writeit(struct testcase *test, - struct tftphdr **dpp, - int ct, - int convert); - static void read_ahead(struct testcase *test, int convert); static ssize_t write_behind(struct testcase *test, int convert); @@ -545,7 +530,7 @@ static void read_ahead(struct testcase *test, /* Update count associated with the buffer, get new buffer from the queue. Calls write_behind only if next buffer not available. */ -static int writeit(struct testcase *test, struct tftphdr **dpp, +static int writeit(struct testcase *test, struct tftphdr * volatile *dpp, int ct, int convert) { bfs[current].counter = ct; /* set size of data to write */ @@ -579,7 +564,7 @@ static ssize_t write_behind(struct testcase *test, int convert) if(!test->ofile) { char outfile[256]; - snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->num); + snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->testno); test->ofile=open(outfile, O_CREAT|O_RDWR, 0777); if(test->ofile == -1) { logmsg("Couldn't create and/or open file %s for upload!", outfile); @@ -1045,6 +1030,73 @@ again: return 0; } +/* Based on the testno, parse the correct server commands. */ +static int parse_servercmd(struct testcase *req) +{ + FILE *stream; + char *filename; + int error; + + filename = test2file(req->testno); + + stream=fopen(filename, "rb"); + if(!stream) { + error = errno; + logmsg("fopen() failed with error: %d %s", error, strerror(error)); + logmsg(" [1] Error opening file: %s", filename); + logmsg(" Couldn't open test file %ld", req->testno); + return 1; /* done */ + } + else { + char *orgcmd = NULL; + char *cmd = NULL; + size_t cmdsize = 0; + int num=0; + + /* get the custom server control "commands" */ + error = getpart(&orgcmd, &cmdsize, "reply", "servercmd", stream); + fclose(stream); + if(error) { + logmsg("getpart() failed with error: %d", error); + return 1; /* done */ + } + + cmd = orgcmd; + while(cmd && cmdsize) { + char *check; + if(1 == sscanf(cmd, "writedelay: %d", &num)) { + logmsg("instructed to delay %d secs between packets", num); + req->writedelay = num; + } + else { + logmsg("Unknown instruction found: %s", cmd); + } + /* try to deal with CRLF or just LF */ + check = strchr(cmd, '\r'); + if(!check) + check = strchr(cmd, '\n'); + + if(check) { + /* get to the letter following the newline */ + while((*check == '\r') || (*check == '\n')) + check++; + + if(!*check) + /* if we reached a zero, get out */ + break; + cmd = check; + } + else + break; + } + if(orgcmd) + free(orgcmd); + } + + return 0; /* OK! */ +} + + /* * Validate file access. */ @@ -1095,7 +1147,9 @@ static int validate_access(struct testcase *test, logmsg("requested test number %ld part %ld", testno, partno); - test->num = testno; + test->testno = testno; + + (void)parse_servercmd(test); file = test2file(testno); @@ -1148,6 +1202,11 @@ static void sendtftp(struct testcase *test, struct formats *pf) { int size; ssize_t n; + /* This is volatile to live through a siglongjmp */ + volatile unsigned short sendblock; /* block count */ + struct tftphdr *sdp; /* data buffer */ + struct tftphdr *sap; /* ack buffer */ + sendblock = 1; #if defined(HAVE_ALARM) && defined(SIGALRM) mysignal(SIGALRM, timer); @@ -1166,6 +1225,12 @@ static void sendtftp(struct testcase *test, struct formats *pf) #ifdef HAVE_SIGSETJMP (void) sigsetjmp(timeoutbuf, 1); #endif + if(test->writedelay) { + logmsg("Pausing %d seconds before %d bytes", test->writedelay, + size); + wait_ms(1000*test->writedelay); + } + send_data: if (swrite(peer, sdp, size + 4) != size + 4) { logmsg("write"); @@ -1216,11 +1281,16 @@ static void sendtftp(struct testcase *test, struct formats *pf) static void recvtftp(struct testcase *test, struct formats *pf) { ssize_t n, size; + /* These are volatile to live through a siglongjmp */ + volatile unsigned short recvblock; /* block count */ + struct tftphdr * volatile rdp; /* data buffer */ + struct tftphdr *rap; /* ack buffer */ + recvblock = 0; + rdp = w_init(); #if defined(HAVE_ALARM) && defined(SIGALRM) mysignal(SIGALRM, timer); #endif - rdp = w_init(); rap = &ackbuf.hdr; do { timeout = 0; @@ -1301,7 +1371,7 @@ abort: /* * Send a nak packet (error message). Error code passed in is one of the - * standard TFTP codes, or a UNIX errno offset by 100. + * standard TFTP codes, or a Unix errno offset by 100. */ static void nak(int error) { diff --git a/tests/serverhelp.pm b/tests/serverhelp.pm index b0b5b74..220fba9 100644 --- a/tests/serverhelp.pm +++ b/tests/serverhelp.pm @@ -109,8 +109,8 @@ sub servername_str { $ipver = (not $ipver) ? 'ipv4' : lc($ipver); die "unsupported IP version: '$ipver'" unless($ipver && - ($ipver =~ /^(4|6|ipv4|ipv6|-ipv4|-ipv6)$/)); - $ipver = ($ipver =~ /6$/) ? '-IPv6' : ''; + ($ipver =~ /^(4|6|ipv4|ipv6|-ipv4|-ipv6|unix)$/)); + $ipver = ($ipver =~ /6$/) ? '-IPv6' : (($ipver =~ /unix$/) ? '-unix' : ''); $idnum = 1 if(not $idnum); die "unsupported ID number: '$idnum'" unless($idnum && diff --git a/tests/sshhelp.pm b/tests/sshhelp.pm index ced9a01..914879b 100644 --- a/tests/sshhelp.pm +++ b/tests/sshhelp.pm @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -417,7 +417,7 @@ sub sshversioninfo { $error = "Error: cannot read or execute $sshbin"; } else { - my $cmd = ($sshbin =~ /$sshdexe$/) ? "$sshbin -?" : "$sshbin -V"; + my $cmd = ($sshbin =~ /$sshdexe$/) ? "\"$sshbin\" -?" : "\"$sshbin\" -V"; $error = "$cmd\n"; foreach my $tmpstr (qx($cmd 2>&1)) { if($tmpstr =~ /OpenSSH[_-](\d+)\.(\d+)(\.(\d+))*/i) { diff --git a/tests/sshserver.pl b/tests/sshserver.pl index 447305f..d8c2d6f 100755 --- a/tests/sshserver.pl +++ b/tests/sshserver.pl @@ -6,7 +6,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2011, 2013, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2014, 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 @@ -27,6 +27,7 @@ use strict; use warnings; use Cwd; +use Cwd 'abs_path'; #*************************************************************************** # Variables and subs imported from sshhelp module @@ -88,6 +89,7 @@ my $path = getcwd(); # current working directory my $logdir = $path .'/log'; # directory for log files my $username = $ENV{USER}; # default user my $pidfile; # ssh daemon pid file +my $identity = 'curl_client_key'; # default identity file my $error; my @cfgarr; @@ -369,12 +371,12 @@ if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) || # Make sure all files are gone so ssh-keygen doesn't complain unlink($hstprvkeyf, $hstpubkeyf, $cliprvkeyf, $clipubkeyf); logmsg 'generating host keys...' if($verbose); - if(system "$sshkeygen -q -t dsa -f $hstprvkeyf -C 'curl test server' -N ''") { + if(system "\"$sshkeygen\" -q -t dsa -f $hstprvkeyf -C 'curl test server' -N ''") { logmsg 'Could not generate host key'; exit 1; } logmsg 'generating client keys...' if($verbose); - if(system "$sshkeygen -q -t dsa -f $cliprvkeyf -C 'curl test client' -N ''") { + if(system "\"$sshkeygen\" -q -t dsa -f $cliprvkeyf -C 'curl test client' -N ''") { logmsg 'Could not generate client key'; exit 1; } @@ -382,6 +384,22 @@ if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) || #*************************************************************************** +# Convert paths for curl's tests running on Windows using Cygwin OpenSSH +# +my $clipubkeyf_config = abs_path("$path/$clipubkeyf"); +my $hstprvkeyf_config = abs_path("$path/$hstprvkeyf"); +my $pidfile_config = $pidfile; +my $sftpsrv_config = $sftpsrv; + +if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') { + # convert MinGW drive paths to Cygwin drive paths + $clipubkeyf_config =~ s/^\/(\w)\//\/cygdrive\/$1\//; + $hstprvkeyf_config =~ s/^\/(\w)\//\/cygdrive\/$1\//; + $pidfile_config =~ s/^\/(\w)\//\/cygdrive\/$1\//; + $sftpsrv_config = "internal-sftp"; +} + +#*************************************************************************** # ssh daemon configuration file options we might use and version support # # AFSTokenPassing : OpenSSH 1.2.1 and later [1] @@ -479,10 +497,10 @@ push @cfgarr, "AllowUsers $username"; push @cfgarr, 'DenyGroups'; push @cfgarr, 'AllowGroups'; push @cfgarr, '#'; -push @cfgarr, "AuthorizedKeysFile $path/$clipubkeyf"; -push @cfgarr, "AuthorizedKeysFile2 $path/$clipubkeyf"; -push @cfgarr, "HostKey $path/$hstprvkeyf"; -push @cfgarr, "PidFile $pidfile"; +push @cfgarr, "AuthorizedKeysFile $clipubkeyf_config"; +push @cfgarr, "AuthorizedKeysFile2 $clipubkeyf_config"; +push @cfgarr, "HostKey $hstprvkeyf_config"; +push @cfgarr, "PidFile $pidfile_config"; push @cfgarr, '#'; push @cfgarr, "Port $port"; push @cfgarr, "ListenAddress $listenaddr"; @@ -512,7 +530,7 @@ push @cfgarr, 'RhostsRSAAuthentication no'; push @cfgarr, 'RSAAuthentication no'; push @cfgarr, 'ServerKeyBits 768'; push @cfgarr, 'StrictModes no'; -push @cfgarr, "Subsystem sftp $sftpsrv"; +push @cfgarr, "Subsystem sftp \"$sftpsrv_config\""; push @cfgarr, 'SyslogFacility AUTH'; push @cfgarr, 'UseLogin no'; push @cfgarr, 'X11Forwarding no'; @@ -540,7 +558,7 @@ sub sshd_supports_opt { ($sshdid =~ /SunSSH/)) { # ssh daemon supports command line options -t -f and -o $err = grep /((Unsupported)|(Bad configuration)|(Deprecated)) option.*$option/, - qx($sshd -t -f $sshdconfig -o $option=$value 2>&1); + qx("$sshd" -t -f $sshdconfig -o $option=$value 2>&1); return !$err; } if(($sshdid =~ /OpenSSH/) && ($sshdvernum >= 299)) { @@ -551,7 +569,7 @@ sub sshd_supports_opt { return 0; } $err = grep /((Unsupported)|(Bad configuration)|(Deprecated)) option.*$option/, - qx($sshd -t -f $sshdconfig 2>&1); + qx("$sshd" -t -f $sshdconfig 2>&1); unlink $sshdconfig; return !$err; } @@ -697,7 +715,7 @@ if($error) { #*************************************************************************** # Verify that sshd actually supports our generated configuration file # -if(system "$sshd -t -f $sshdconfig > $sshdlog 2>&1") { +if(system "\"$sshd\" -t -f $sshdconfig > $sshdlog 2>&1") { logmsg "sshd configuration file $sshdconfig failed verification"; display_sshdlog(); display_sshdconfig(); @@ -739,6 +757,19 @@ if((! -e $knownhosts) || (! -s $knownhosts)) { #*************************************************************************** +# Convert paths for curl's tests running on Windows using Cygwin OpenSSH +# +my $identity_config = abs_path("$path/$identity"); +my $knownhosts_config = abs_path("$path/$knownhosts"); + +if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') { + # convert MinGW drive paths to Cygwin drive paths + $identity_config =~ s/^\/(\w)\//\/cygdrive\/$1\//; + $knownhosts_config =~ s/^\/(\w)\//\/cygdrive\/$1\//; +} + + +#*************************************************************************** # ssh client configuration file options we might use and version support # # AddressFamily : OpenSSH 3.7.0 and later @@ -834,8 +865,8 @@ push @cfgarr, '#'; push @cfgarr, "BindAddress $listenaddr"; push @cfgarr, "DynamicForward $socksport"; push @cfgarr, '#'; -push @cfgarr, "IdentityFile $path/curl_client_key"; -push @cfgarr, "UserKnownHostsFile $path/$knownhosts"; +push @cfgarr, "IdentityFile $identity_config"; +push @cfgarr, "UserKnownHostsFile $knownhosts_config"; push @cfgarr, '#'; push @cfgarr, 'BatchMode yes'; push @cfgarr, 'ChallengeResponseAuthentication no'; @@ -1025,16 +1056,16 @@ if($error) { # Start the ssh server daemon without forking it # logmsg "SCP/SFTP server listening on port $port" if($verbose); -my $rc = system "$sshd -e -D -f $sshdconfig > $sshdlog 2>&1"; +my $rc = system "\"$sshd\" -e -D -f $sshdconfig > $sshdlog 2>&1"; if($rc == -1) { - logmsg "$sshd failed with: $!"; + logmsg "\"$sshd\" failed with: $!"; } elsif($rc & 127) { - logmsg sprintf("$sshd died with signal %d, and %s coredump", + logmsg sprintf("\"$sshd\" died with signal %d, and %s coredump", ($rc & 127), ($rc & 128)?'a':'no'); } elsif($verbose && ($rc >> 8)) { - logmsg sprintf("$sshd exited with %d", $rc >> 8); + logmsg sprintf("\"$sshd\" exited with %d", $rc >> 8); } diff --git a/tests/stunnel.pem b/tests/stunnel.pem index 6a3859b..d9b9679 100644 --- a/tests/stunnel.pem +++ b/tests/stunnel.pem @@ -60,17 +60,17 @@ Certificate: Data: Version: 3 (0x2) Serial Number: - 09:c2:f9:ca:9a:d8 - Signature Algorithm: md5WithRSAEncryption + a4:17:70:09:88:8c:48:cd + Signature Algorithm: sha1WithRSAEncryption Issuer: C=SE, ST=Solna, L=Mooo, O=Haxx, OU=Coolx, CN=storbror, CN=localhost Validity - Not Before: Jan 5 11:25:13 2004 GMT - Not After : Feb 13 11:25:13 2008 GMT + Not Before: Feb 22 15:38:48 2014 GMT + Not After : Feb 20 15:38:48 2024 GMT Subject: C=SE, ST=Solna, L=Mooo, O=Haxx, OU=Coolx, CN=storbror, CN=localhost Subject Public Key Info: Public Key Algorithm: rsaEncryption - RSA Public Key: (1234 bit) - Modulus (1234 bit): + Public-Key: (1234 bit) + Modulus: 03:59:37:ea:06:ea:f2:7c:0c:0c:de:f8:5b:ce:29: 24:b8:f5:7e:31:18:cc:40:2e:12:91:2e:14:10:6f: ba:af:33:ee:c1:70:c8:11:bf:e4:4a:c6:45:fb:48: @@ -104,37 +104,37 @@ Certificate: Authority Information Access: ad dvcs - URI:https://localhost:8433/509 - Signature Algorithm: md5WithRSAEncryption - 02:47:57:18:5f:54:3f:1d:29:0a:05:7a:d1:0f:e6:b9:2c:8b: - 29:38:50:bf:c1:a1:7f:73:4a:9d:f1:1b:bf:2e:ea:87:91:dd: - ff:75:73:57:78:cf:75:52:57:0b:5b:bb:d4:77:b2:dd:e8:0c: - 06:ce:1b:c0:3d:9f:68:c0:0b:66:b8:f9:46:db:04:a9:2f:a3: - 5e:9c:c6:70:ff:1d:af:1f:17:9c:38:3d:12:aa:af:7b:72:44: - a0:44:41:6b:9a:9b:60:8c:50:94:f1:d7:a5:77:6b:d3:0e:66: - 88:a1:52:63:23:f6:66:a6:ea:f9:d0:df:4d:8a:14:f0:73:c6: - b6:b6:b6:68:4f:3d:9a:b6:31:ba:19:f3:66:9f:16:6d:87:64: - 32:53:d2:90:e5:8c:1e:f5:18:61:1a + Signature Algorithm: sha1WithRSAEncryption + 00:45:db:09:5b:08:5b:1a:ff:71:50:6c:12:ad:8e:78:32:1d: + 7d:e7:e4:d3:3e:5f:ca:20:84:aa:ff:9a:c2:b6:a9:48:93:1f: + 73:27:d1:68:05:76:36:f9:c1:53:90:ad:8a:c0:b3:12:c8:11: + 5c:2c:65:01:ac:31:d1:8e:60:6e:c6:f5:ba:9d:69:e8:f1:ac: + 4a:de:52:94:cd:06:24:45:72:64:89:0f:57:8b:26:2b:16:cf: + 0b:27:c4:e8:73:c7:d3:e5:42:38:95:57:b5:bb:83:b4:92:d4: + e0:cd:fb:c8:f5:d2:da:1d:11:fe:3c:18:20:8b:bd:22:31:1c: + 5a:82:d4:f5:71:8d:8a:e3:13:82:c5:2d:f3:9f:d0:b7:b8:4b: + d2:46:9d:8e:1a:d7:99:6e:c1:b9:a0 -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- -----BEGIN DH PARAMETERS----- MIGHAoGBAMq/KFGh2oy16WzkFs1U71Uz7dIEKvSYfc+zo439pYyVzcD8MkcC15Zb diff --git a/tests/symbol-scan.pl b/tests/symbol-scan.pl index 91b859b..89f5eef 100644 --- a/tests/symbol-scan.pl +++ b/tests/symbol-scan.pl @@ -27,13 +27,23 @@ use strict; use warnings; +use vars qw($Cpreprocessor); # # configurehelp perl module is generated by configure script # -use configurehelp qw( - $Cpreprocessor - ); +my $rc = eval { + require configurehelp; + configurehelp->import(qw( + $Cpreprocessor + )); + 1; +}; +# Set default values if configure has not generated a configurehelp.pm file. +# This is the case with cmake. +if (!$rc) { + $Cpreprocessor = 'cpp'; +} # we may get the dir root pointed out my $root=$ARGV[0] || "."; diff --git a/tests/testcurl.pdf b/tests/testcurl.pdf index dafef0ebdd158fa319117b2ce3fbaab53deaa104..993ee5c859c3f53b3403931bf40854ee58ea58dd 100644 GIT binary patch delta 338 zcmdmCvBP46qo|ODrD2-6xlxj?Wpaw8uAyOS+T^q1Qj>EagzVP#}$Won^qU^v-FOarTUyI2D*qm0Gvu}QUvn`05)d{%rnqnnu~m%ejR zYGO%dex6HWNvej6m63s=iJ_r^sey%&DcC9M1_tUtWxn|-xKwODC&|m?g2QHQj>E(-h5VkH=~=WCYQc* zQEFmIW`3SaVo9ooiIMetKxMx9DY#T@J}1e`, et al. +# Copyright (C) 1998 - 2014, 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 @@ -73,7 +73,7 @@ use vars qw($name $email $desc $confopts $runtestopts $setupfile $mktarball $timestamp $notes); # version of this script -$version='2012-11-30'; +$version='2014-11-25'; $fixed=0; # Determine if we're running from git or a canned copy of curl, @@ -258,7 +258,13 @@ sub get_host_triplet { return $triplet; } -if (open(F, "$setupfile")) { +if($name && $email && $desc) { + # having these fields set are enough to continue, skip reading the setup + # file + $infixed=4; + $fixed=4; +} +elsif (open(F, "$setupfile")) { while () { if (/(\w+)=(.*)/) { eval "\$$1=$2;"; @@ -266,7 +272,8 @@ if (open(F, "$setupfile")) { } close(F); $infixed=$fixed; -} else { +} +else { $infixed=0; # so that "additional args to configure" works properly first time... } @@ -333,6 +340,7 @@ logit "EMAIL = $email"; logit "DESC = $desc"; logit "NOTES = $notes"; logit "CONFOPTS = $confopts"; +logit "RUNTESTOPTS = ".$runtestopts; logit "CPPFLAGS = ".$ENV{CPPFLAGS}; logit "CFLAGS = ".$ENV{CFLAGS}; logit "LDFLAGS = ".$ENV{LDFLAGS}; @@ -400,40 +408,54 @@ chdir $CURLDIR; # Do the git thing, or not... if ($git) { + my $gitstat = 0; + my @commits; + # update quietly to the latest git if($nogitpull) { logit "skipping git pull (--nogitpull)"; } else { - my $gitstat = 0; - my @commits; logit "run git pull in curl"; system("git pull 2>&1"); $gitstat += $?; logit "failed to update from curl git ($?), continue anyway" if ($?); + + # Set timestamp to the UTC the git update took place. + $timestamp = scalar(gmtime)." UTC" if (!$gitstat); + } + + # get the last 5 commits for show (even if no pull was made) + @commits=`git log --pretty=oneline --abbrev-commit -5`; + logit "The most recent curl git commits:"; + for (@commits) { + chomp ($_); + logit " $_"; + } + + if (-d "ares/.git") { + chdir "ares"; + + if($nogitpull) { + logit "skipping git pull (--nogitpull) in ares"; + } else { + logit "run git pull in ares"; + system("git pull 2>&1"); + $gitstat += $?; + logit "failed to update from ares git ($?), continue anyway" if ($?); + + # Set timestamp to the UTC the git update took place. + $timestamp = scalar(gmtime)." UTC" if (!$gitstat); + } + # get the last 5 commits for show (even if no pull was made) @commits=`git log --pretty=oneline --abbrev-commit -5`; - logit "The most recent curl git commits:"; + logit "The most recent ares git commits:"; for (@commits) { chomp ($_); logit " $_"; } - if (-d "ares/.git") { - chdir "ares"; - logit "run git pull in ares"; - system("git pull 2>&1"); - $gitstat += $?; - logit "failed to update from ares git ($?), continue anyway" if ($?); - # get the last 5 commits for show (even if no pull was made) - @commits=`git log --pretty=oneline --abbrev-commit -5`; - logit "The most recent ares git commits:"; - for (@commits) { - chomp ($_); - logit " $_"; - } - chdir "$pwd/$CURLDIR"; - } - # Set timestamp to the UTC the git update took place. - $timestamp = scalar(gmtime)." UTC" if (!$gitstat); + + chdir "$pwd/$CURLDIR"; } if($nobuildconf) { diff --git a/tests/unit/Makefile.in b/tests/unit/Makefile.in index eb5f964..cd2ed53 100644 --- a/tests/unit/Makefile.in +++ b/tests/unit/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -114,9 +114,10 @@ am__EXEEXT_1 = unit1300$(EXEEXT) unit1301$(EXEEXT) unit1302$(EXEEXT) \ unit1303$(EXEEXT) unit1304$(EXEEXT) unit1305$(EXEEXT) \ unit1307$(EXEEXT) unit1308$(EXEEXT) unit1309$(EXEEXT) \ unit1330$(EXEEXT) unit1394$(EXEEXT) unit1395$(EXEEXT) \ - unit1396$(EXEEXT) + unit1396$(EXEEXT) unit1397$(EXEEXT) unit1398$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) -am__objects_1 = unit1300-first.$(OBJEXT) +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = ../libtest/unit1300-first.$(OBJEXT) am_unit1300_OBJECTS = unit1300-unit1300.$(OBJEXT) $(am__objects_1) unit1300_OBJECTS = $(am_unit1300_OBJECTS) unit1300_LDADD = $(LDADD) @@ -126,79 +127,91 @@ AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = -am__objects_2 = unit1301-first.$(OBJEXT) +am__objects_2 = ../libtest/unit1301-first.$(OBJEXT) am_unit1301_OBJECTS = unit1301-unit1301.$(OBJEXT) $(am__objects_2) unit1301_OBJECTS = $(am_unit1301_OBJECTS) unit1301_LDADD = $(LDADD) unit1301_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_3 = unit1302-first.$(OBJEXT) +am__objects_3 = ../libtest/unit1302-first.$(OBJEXT) am_unit1302_OBJECTS = unit1302-unit1302.$(OBJEXT) $(am__objects_3) unit1302_OBJECTS = $(am_unit1302_OBJECTS) unit1302_LDADD = $(LDADD) unit1302_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_4 = unit1303-first.$(OBJEXT) +am__objects_4 = ../libtest/unit1303-first.$(OBJEXT) am_unit1303_OBJECTS = unit1303-unit1303.$(OBJEXT) $(am__objects_4) unit1303_OBJECTS = $(am_unit1303_OBJECTS) unit1303_LDADD = $(LDADD) unit1303_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_5 = unit1304-first.$(OBJEXT) +am__objects_5 = ../libtest/unit1304-first.$(OBJEXT) am_unit1304_OBJECTS = unit1304-unit1304.$(OBJEXT) $(am__objects_5) unit1304_OBJECTS = $(am_unit1304_OBJECTS) unit1304_LDADD = $(LDADD) unit1304_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_6 = unit1305-first.$(OBJEXT) +am__objects_6 = ../libtest/unit1305-first.$(OBJEXT) am_unit1305_OBJECTS = unit1305-unit1305.$(OBJEXT) $(am__objects_6) unit1305_OBJECTS = $(am_unit1305_OBJECTS) unit1305_LDADD = $(LDADD) unit1305_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_7 = unit1307-first.$(OBJEXT) +am__objects_7 = ../libtest/unit1307-first.$(OBJEXT) am_unit1307_OBJECTS = unit1307-unit1307.$(OBJEXT) $(am__objects_7) unit1307_OBJECTS = $(am_unit1307_OBJECTS) unit1307_LDADD = $(LDADD) unit1307_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_8 = unit1308-first.$(OBJEXT) +am__objects_8 = ../libtest/unit1308-first.$(OBJEXT) am_unit1308_OBJECTS = unit1308-unit1308.$(OBJEXT) $(am__objects_8) unit1308_OBJECTS = $(am_unit1308_OBJECTS) unit1308_LDADD = $(LDADD) unit1308_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_9 = unit1309-first.$(OBJEXT) +am__objects_9 = ../libtest/unit1309-first.$(OBJEXT) am_unit1309_OBJECTS = unit1309-unit1309.$(OBJEXT) $(am__objects_9) unit1309_OBJECTS = $(am_unit1309_OBJECTS) unit1309_LDADD = $(LDADD) unit1309_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_10 = unit1330-first.$(OBJEXT) +am__objects_10 = ../libtest/unit1330-first.$(OBJEXT) am_unit1330_OBJECTS = unit1330-unit1330.$(OBJEXT) $(am__objects_10) unit1330_OBJECTS = $(am_unit1330_OBJECTS) unit1330_LDADD = $(LDADD) unit1330_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_11 = unit1394-first.$(OBJEXT) +am__objects_11 = ../libtest/unit1394-first.$(OBJEXT) am_unit1394_OBJECTS = unit1394-unit1394.$(OBJEXT) $(am__objects_11) unit1394_OBJECTS = $(am_unit1394_OBJECTS) unit1394_DEPENDENCIES = $(top_builddir)/lib/libcurl.la unit1394_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(unit1394_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_12 = unit1395-first.$(OBJEXT) +am__objects_12 = ../libtest/unit1395-first.$(OBJEXT) am_unit1395_OBJECTS = unit1395-unit1395.$(OBJEXT) $(am__objects_12) unit1395_OBJECTS = $(am_unit1395_OBJECTS) unit1395_LDADD = $(LDADD) unit1395_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la -am__objects_13 = unit1396-first.$(OBJEXT) +am__objects_13 = ../libtest/unit1396-first.$(OBJEXT) am_unit1396_OBJECTS = unit1396-unit1396.$(OBJEXT) $(am__objects_13) unit1396_OBJECTS = $(am_unit1396_OBJECTS) unit1396_LDADD = $(LDADD) unit1396_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ $(top_builddir)/lib/libcurlu.la +am__objects_14 = ../libtest/unit1397-first.$(OBJEXT) +am_unit1397_OBJECTS = unit1397-unit1397.$(OBJEXT) $(am__objects_14) +unit1397_OBJECTS = $(am_unit1397_OBJECTS) +unit1397_LDADD = $(LDADD) +unit1397_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ + $(top_builddir)/lib/libcurlu.la +am__objects_15 = ../libtest/unit1398-first.$(OBJEXT) +am_unit1398_OBJECTS = unit1398-unit1398.$(OBJEXT) $(am__objects_15) +unit1398_OBJECTS = $(am_unit1398_OBJECTS) +unit1398_LDADD = $(LDADD) +unit1398_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \ + $(top_builddir)/lib/libcurlu.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -237,12 +250,13 @@ SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) $(unit1302_SOURCES) \ $(unit1303_SOURCES) $(unit1304_SOURCES) $(unit1305_SOURCES) \ $(unit1307_SOURCES) $(unit1308_SOURCES) $(unit1309_SOURCES) \ $(unit1330_SOURCES) $(unit1394_SOURCES) $(unit1395_SOURCES) \ - $(unit1396_SOURCES) + $(unit1396_SOURCES) $(unit1397_SOURCES) $(unit1398_SOURCES) DIST_SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) \ $(unit1302_SOURCES) $(unit1303_SOURCES) $(unit1304_SOURCES) \ $(unit1305_SOURCES) $(unit1307_SOURCES) $(unit1308_SOURCES) \ $(unit1309_SOURCES) $(unit1330_SOURCES) $(unit1394_SOURCES) \ - $(unit1395_SOURCES) $(unit1396_SOURCES) + $(unit1395_SOURCES) $(unit1396_SOURCES) $(unit1397_SOURCES) \ + $(unit1398_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -300,6 +314,7 @@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ @@ -324,7 +339,6 @@ GREP = @GREP@ HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_NSS_INITCONTEXT = @HAVE_NSS_INITCONTEXT@ HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ IDN_ENABLED = @IDN_ENABLED@ INSTALL = @INSTALL@ @@ -333,7 +347,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ @@ -356,6 +369,7 @@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -391,11 +405,13 @@ USE_GNUTLS = @USE_GNUTLS@ USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ USE_LIBRTMP = @USE_LIBRTMP@ USE_LIBSSH2 = @USE_LIBSSH2@ +USE_NGHTTP2 = @USE_NGHTTP2@ USE_NSS = @USE_NSS@ USE_OPENLDAP = @USE_OPENLDAP@ USE_POLARSSL = @USE_POLARSSL@ USE_SCHANNEL = @USE_SCHANNEL@ USE_SSLEAY = @USE_SSLEAY@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ VERSION = @VERSION@ VERSIONNUM = @VERSIONNUM@ @@ -523,7 +539,7 @@ UNITFILES = curlcheck.h \ # These are all unit test programs UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \ - unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 + unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 unit1300_SOURCES = unit1300.c $(UNITFILES) unit1300_CPPFLAGS = $(AM_CPPFLAGS) @@ -554,6 +570,10 @@ unit1395_SOURCES = unit1395.c $(UNITFILES) unit1395_CPPFLAGS = $(AM_CPPFLAGS) unit1396_SOURCES = unit1396.c $(UNITFILES) unit1396_CPPFLAGS = $(AM_CPPFLAGS) +unit1397_SOURCES = unit1397.c $(UNITFILES) +unit1397_CPPFLAGS = $(AM_CPPFLAGS) +unit1398_SOURCES = unit1398.c $(UNITFILES) +unit1398_CPPFLAGS = $(AM_CPPFLAGS) all: all-am .SUFFIXES: @@ -598,109 +618,161 @@ clean-noinstPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list +../libtest/$(am__dirstamp): + @$(MKDIR_P) ../libtest + @: > ../libtest/$(am__dirstamp) +../libtest/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ../libtest/$(DEPDIR) + @: > ../libtest/$(DEPDIR)/$(am__dirstamp) +../libtest/unit1300-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1300$(EXEEXT): $(unit1300_OBJECTS) $(unit1300_DEPENDENCIES) $(EXTRA_unit1300_DEPENDENCIES) @rm -f unit1300$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1300_OBJECTS) $(unit1300_LDADD) $(LIBS) +../libtest/unit1301-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1301$(EXEEXT): $(unit1301_OBJECTS) $(unit1301_DEPENDENCIES) $(EXTRA_unit1301_DEPENDENCIES) @rm -f unit1301$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1301_OBJECTS) $(unit1301_LDADD) $(LIBS) +../libtest/unit1302-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1302$(EXEEXT): $(unit1302_OBJECTS) $(unit1302_DEPENDENCIES) $(EXTRA_unit1302_DEPENDENCIES) @rm -f unit1302$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1302_OBJECTS) $(unit1302_LDADD) $(LIBS) +../libtest/unit1303-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1303$(EXEEXT): $(unit1303_OBJECTS) $(unit1303_DEPENDENCIES) $(EXTRA_unit1303_DEPENDENCIES) @rm -f unit1303$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1303_OBJECTS) $(unit1303_LDADD) $(LIBS) +../libtest/unit1304-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1304$(EXEEXT): $(unit1304_OBJECTS) $(unit1304_DEPENDENCIES) $(EXTRA_unit1304_DEPENDENCIES) @rm -f unit1304$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1304_OBJECTS) $(unit1304_LDADD) $(LIBS) +../libtest/unit1305-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1305$(EXEEXT): $(unit1305_OBJECTS) $(unit1305_DEPENDENCIES) $(EXTRA_unit1305_DEPENDENCIES) @rm -f unit1305$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1305_OBJECTS) $(unit1305_LDADD) $(LIBS) +../libtest/unit1307-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1307$(EXEEXT): $(unit1307_OBJECTS) $(unit1307_DEPENDENCIES) $(EXTRA_unit1307_DEPENDENCIES) @rm -f unit1307$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1307_OBJECTS) $(unit1307_LDADD) $(LIBS) +../libtest/unit1308-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1308$(EXEEXT): $(unit1308_OBJECTS) $(unit1308_DEPENDENCIES) $(EXTRA_unit1308_DEPENDENCIES) @rm -f unit1308$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1308_OBJECTS) $(unit1308_LDADD) $(LIBS) +../libtest/unit1309-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1309$(EXEEXT): $(unit1309_OBJECTS) $(unit1309_DEPENDENCIES) $(EXTRA_unit1309_DEPENDENCIES) @rm -f unit1309$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1309_OBJECTS) $(unit1309_LDADD) $(LIBS) +../libtest/unit1330-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1330$(EXEEXT): $(unit1330_OBJECTS) $(unit1330_DEPENDENCIES) $(EXTRA_unit1330_DEPENDENCIES) @rm -f unit1330$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1330_OBJECTS) $(unit1330_LDADD) $(LIBS) +../libtest/unit1394-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1394$(EXEEXT): $(unit1394_OBJECTS) $(unit1394_DEPENDENCIES) $(EXTRA_unit1394_DEPENDENCIES) @rm -f unit1394$(EXEEXT) $(AM_V_CCLD)$(unit1394_LINK) $(unit1394_OBJECTS) $(unit1394_LDADD) $(LIBS) +../libtest/unit1395-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1395$(EXEEXT): $(unit1395_OBJECTS) $(unit1395_DEPENDENCIES) $(EXTRA_unit1395_DEPENDENCIES) @rm -f unit1395$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1395_OBJECTS) $(unit1395_LDADD) $(LIBS) +../libtest/unit1396-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) unit1396$(EXEEXT): $(unit1396_OBJECTS) $(unit1396_DEPENDENCIES) $(EXTRA_unit1396_DEPENDENCIES) @rm -f unit1396$(EXEEXT) $(AM_V_CCLD)$(LINK) $(unit1396_OBJECTS) $(unit1396_LDADD) $(LIBS) +../libtest/unit1397-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) + +unit1397$(EXEEXT): $(unit1397_OBJECTS) $(unit1397_DEPENDENCIES) $(EXTRA_unit1397_DEPENDENCIES) + @rm -f unit1397$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unit1397_OBJECTS) $(unit1397_LDADD) $(LIBS) +../libtest/unit1398-first.$(OBJEXT): ../libtest/$(am__dirstamp) \ + ../libtest/$(DEPDIR)/$(am__dirstamp) + +unit1398$(EXEEXT): $(unit1398_OBJECTS) $(unit1398_DEPENDENCIES) $(EXTRA_unit1398_DEPENDENCIES) + @rm -f unit1398$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unit1398_OBJECTS) $(unit1398_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f ../libtest/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1300-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1300-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1301-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1302-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1303-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1304-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1305-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1307-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1308-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1309-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1330-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1394-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1395-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1396-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1397-first.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1398-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1300-unit1300.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1301-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1301-unit1301.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1302-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1302-unit1302.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1303-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1303-unit1303.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1304-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1304-unit1304.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1305-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1305-unit1305.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1307-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1307-unit1307.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1308-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1308-unit1308.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1309-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1309-unit1309.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1330-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1330-unit1330.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1394-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1394-unit1394.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1395-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1395-unit1395.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1396-first.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1396-unit1396.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1397-unit1397.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1398-unit1398.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< @@ -719,19 +791,19 @@ unit1300-unit1300.obj: unit1300.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1300-unit1300.obj `if test -f 'unit1300.c'; then $(CYGPATH_W) 'unit1300.c'; else $(CYGPATH_W) '$(srcdir)/unit1300.c'; fi` -unit1300-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1300-first.o -MD -MP -MF $(DEPDIR)/unit1300-first.Tpo -c -o unit1300-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1300-first.Tpo $(DEPDIR)/unit1300-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1300-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1300-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1300-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1300-first.Tpo -c -o ../libtest/unit1300-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1300-first.Tpo ../libtest/$(DEPDIR)/unit1300-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1300-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1300-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1300-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1300-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1300-first.obj -MD -MP -MF $(DEPDIR)/unit1300-first.Tpo -c -o unit1300-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1300-first.Tpo $(DEPDIR)/unit1300-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1300-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1300-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1300-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1300-first.Tpo -c -o ../libtest/unit1300-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1300-first.Tpo ../libtest/$(DEPDIR)/unit1300-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1300-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1300-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1300_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1300-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1301-unit1301.o: unit1301.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1301-unit1301.o -MD -MP -MF $(DEPDIR)/unit1301-unit1301.Tpo -c -o unit1301-unit1301.o `test -f 'unit1301.c' || echo '$(srcdir)/'`unit1301.c @@ -747,19 +819,19 @@ unit1301-unit1301.obj: unit1301.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1301-unit1301.obj `if test -f 'unit1301.c'; then $(CYGPATH_W) 'unit1301.c'; else $(CYGPATH_W) '$(srcdir)/unit1301.c'; fi` -unit1301-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1301-first.o -MD -MP -MF $(DEPDIR)/unit1301-first.Tpo -c -o unit1301-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1301-first.Tpo $(DEPDIR)/unit1301-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1301-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1301-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1301-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1301-first.Tpo -c -o ../libtest/unit1301-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1301-first.Tpo ../libtest/$(DEPDIR)/unit1301-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1301-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1301-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1301-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1301-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1301-first.obj -MD -MP -MF $(DEPDIR)/unit1301-first.Tpo -c -o unit1301-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1301-first.Tpo $(DEPDIR)/unit1301-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1301-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1301-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1301-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1301-first.Tpo -c -o ../libtest/unit1301-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1301-first.Tpo ../libtest/$(DEPDIR)/unit1301-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1301-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1301-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1301_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1301-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1302-unit1302.o: unit1302.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1302-unit1302.o -MD -MP -MF $(DEPDIR)/unit1302-unit1302.Tpo -c -o unit1302-unit1302.o `test -f 'unit1302.c' || echo '$(srcdir)/'`unit1302.c @@ -775,19 +847,19 @@ unit1302-unit1302.obj: unit1302.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1302-unit1302.obj `if test -f 'unit1302.c'; then $(CYGPATH_W) 'unit1302.c'; else $(CYGPATH_W) '$(srcdir)/unit1302.c'; fi` -unit1302-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1302-first.o -MD -MP -MF $(DEPDIR)/unit1302-first.Tpo -c -o unit1302-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1302-first.Tpo $(DEPDIR)/unit1302-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1302-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1302-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1302-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1302-first.Tpo -c -o ../libtest/unit1302-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1302-first.Tpo ../libtest/$(DEPDIR)/unit1302-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1302-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1302-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1302-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1302-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1302-first.obj -MD -MP -MF $(DEPDIR)/unit1302-first.Tpo -c -o unit1302-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1302-first.Tpo $(DEPDIR)/unit1302-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1302-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1302-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1302-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1302-first.Tpo -c -o ../libtest/unit1302-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1302-first.Tpo ../libtest/$(DEPDIR)/unit1302-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1302-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1302-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1302_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1302-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1303-unit1303.o: unit1303.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1303-unit1303.o -MD -MP -MF $(DEPDIR)/unit1303-unit1303.Tpo -c -o unit1303-unit1303.o `test -f 'unit1303.c' || echo '$(srcdir)/'`unit1303.c @@ -803,19 +875,19 @@ unit1303-unit1303.obj: unit1303.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1303-unit1303.obj `if test -f 'unit1303.c'; then $(CYGPATH_W) 'unit1303.c'; else $(CYGPATH_W) '$(srcdir)/unit1303.c'; fi` -unit1303-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1303-first.o -MD -MP -MF $(DEPDIR)/unit1303-first.Tpo -c -o unit1303-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1303-first.Tpo $(DEPDIR)/unit1303-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1303-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1303-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1303-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1303-first.Tpo -c -o ../libtest/unit1303-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1303-first.Tpo ../libtest/$(DEPDIR)/unit1303-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1303-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1303-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1303-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1303-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1303-first.obj -MD -MP -MF $(DEPDIR)/unit1303-first.Tpo -c -o unit1303-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1303-first.Tpo $(DEPDIR)/unit1303-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1303-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1303-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1303-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1303-first.Tpo -c -o ../libtest/unit1303-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1303-first.Tpo ../libtest/$(DEPDIR)/unit1303-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1303-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1303-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1303_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1303-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1304-unit1304.o: unit1304.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1304-unit1304.o -MD -MP -MF $(DEPDIR)/unit1304-unit1304.Tpo -c -o unit1304-unit1304.o `test -f 'unit1304.c' || echo '$(srcdir)/'`unit1304.c @@ -831,19 +903,19 @@ unit1304-unit1304.obj: unit1304.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1304-unit1304.obj `if test -f 'unit1304.c'; then $(CYGPATH_W) 'unit1304.c'; else $(CYGPATH_W) '$(srcdir)/unit1304.c'; fi` -unit1304-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1304-first.o -MD -MP -MF $(DEPDIR)/unit1304-first.Tpo -c -o unit1304-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1304-first.Tpo $(DEPDIR)/unit1304-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1304-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1304-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1304-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1304-first.Tpo -c -o ../libtest/unit1304-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1304-first.Tpo ../libtest/$(DEPDIR)/unit1304-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1304-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1304-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1304-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1304-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1304-first.obj -MD -MP -MF $(DEPDIR)/unit1304-first.Tpo -c -o unit1304-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1304-first.Tpo $(DEPDIR)/unit1304-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1304-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1304-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1304-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1304-first.Tpo -c -o ../libtest/unit1304-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1304-first.Tpo ../libtest/$(DEPDIR)/unit1304-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1304-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1304-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1304_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1304-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1305-unit1305.o: unit1305.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1305-unit1305.o -MD -MP -MF $(DEPDIR)/unit1305-unit1305.Tpo -c -o unit1305-unit1305.o `test -f 'unit1305.c' || echo '$(srcdir)/'`unit1305.c @@ -859,19 +931,19 @@ unit1305-unit1305.obj: unit1305.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1305-unit1305.obj `if test -f 'unit1305.c'; then $(CYGPATH_W) 'unit1305.c'; else $(CYGPATH_W) '$(srcdir)/unit1305.c'; fi` -unit1305-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1305-first.o -MD -MP -MF $(DEPDIR)/unit1305-first.Tpo -c -o unit1305-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1305-first.Tpo $(DEPDIR)/unit1305-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1305-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1305-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1305-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1305-first.Tpo -c -o ../libtest/unit1305-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1305-first.Tpo ../libtest/$(DEPDIR)/unit1305-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1305-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1305-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1305-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1305-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1305-first.obj -MD -MP -MF $(DEPDIR)/unit1305-first.Tpo -c -o unit1305-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1305-first.Tpo $(DEPDIR)/unit1305-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1305-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1305-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1305-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1305-first.Tpo -c -o ../libtest/unit1305-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1305-first.Tpo ../libtest/$(DEPDIR)/unit1305-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1305-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1305-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1305_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1305-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1307-unit1307.o: unit1307.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1307-unit1307.o -MD -MP -MF $(DEPDIR)/unit1307-unit1307.Tpo -c -o unit1307-unit1307.o `test -f 'unit1307.c' || echo '$(srcdir)/'`unit1307.c @@ -887,19 +959,19 @@ unit1307-unit1307.obj: unit1307.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1307-unit1307.obj `if test -f 'unit1307.c'; then $(CYGPATH_W) 'unit1307.c'; else $(CYGPATH_W) '$(srcdir)/unit1307.c'; fi` -unit1307-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1307-first.o -MD -MP -MF $(DEPDIR)/unit1307-first.Tpo -c -o unit1307-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1307-first.Tpo $(DEPDIR)/unit1307-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1307-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1307-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1307-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1307-first.Tpo -c -o ../libtest/unit1307-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1307-first.Tpo ../libtest/$(DEPDIR)/unit1307-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1307-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1307-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1307-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1307-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1307-first.obj -MD -MP -MF $(DEPDIR)/unit1307-first.Tpo -c -o unit1307-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1307-first.Tpo $(DEPDIR)/unit1307-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1307-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1307-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1307-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1307-first.Tpo -c -o ../libtest/unit1307-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1307-first.Tpo ../libtest/$(DEPDIR)/unit1307-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1307-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1307-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1307_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1307-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1308-unit1308.o: unit1308.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1308-unit1308.o -MD -MP -MF $(DEPDIR)/unit1308-unit1308.Tpo -c -o unit1308-unit1308.o `test -f 'unit1308.c' || echo '$(srcdir)/'`unit1308.c @@ -915,19 +987,19 @@ unit1308-unit1308.obj: unit1308.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1308-unit1308.obj `if test -f 'unit1308.c'; then $(CYGPATH_W) 'unit1308.c'; else $(CYGPATH_W) '$(srcdir)/unit1308.c'; fi` -unit1308-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1308-first.o -MD -MP -MF $(DEPDIR)/unit1308-first.Tpo -c -o unit1308-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1308-first.Tpo $(DEPDIR)/unit1308-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1308-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1308-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1308-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1308-first.Tpo -c -o ../libtest/unit1308-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1308-first.Tpo ../libtest/$(DEPDIR)/unit1308-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1308-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1308-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1308-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1308-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1308-first.obj -MD -MP -MF $(DEPDIR)/unit1308-first.Tpo -c -o unit1308-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1308-first.Tpo $(DEPDIR)/unit1308-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1308-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1308-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1308-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1308-first.Tpo -c -o ../libtest/unit1308-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1308-first.Tpo ../libtest/$(DEPDIR)/unit1308-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1308-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1308-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1308_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1308-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1309-unit1309.o: unit1309.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1309-unit1309.o -MD -MP -MF $(DEPDIR)/unit1309-unit1309.Tpo -c -o unit1309-unit1309.o `test -f 'unit1309.c' || echo '$(srcdir)/'`unit1309.c @@ -943,19 +1015,19 @@ unit1309-unit1309.obj: unit1309.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1309-unit1309.obj `if test -f 'unit1309.c'; then $(CYGPATH_W) 'unit1309.c'; else $(CYGPATH_W) '$(srcdir)/unit1309.c'; fi` -unit1309-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1309-first.o -MD -MP -MF $(DEPDIR)/unit1309-first.Tpo -c -o unit1309-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1309-first.Tpo $(DEPDIR)/unit1309-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1309-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1309-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1309-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1309-first.Tpo -c -o ../libtest/unit1309-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1309-first.Tpo ../libtest/$(DEPDIR)/unit1309-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1309-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1309-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1309-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1309-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1309-first.obj -MD -MP -MF $(DEPDIR)/unit1309-first.Tpo -c -o unit1309-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1309-first.Tpo $(DEPDIR)/unit1309-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1309-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1309-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1309-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1309-first.Tpo -c -o ../libtest/unit1309-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1309-first.Tpo ../libtest/$(DEPDIR)/unit1309-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1309-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1309-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1309-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1330-unit1330.o: unit1330.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1330-unit1330.o -MD -MP -MF $(DEPDIR)/unit1330-unit1330.Tpo -c -o unit1330-unit1330.o `test -f 'unit1330.c' || echo '$(srcdir)/'`unit1330.c @@ -971,19 +1043,19 @@ unit1330-unit1330.obj: unit1330.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1330-unit1330.obj `if test -f 'unit1330.c'; then $(CYGPATH_W) 'unit1330.c'; else $(CYGPATH_W) '$(srcdir)/unit1330.c'; fi` -unit1330-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1330-first.o -MD -MP -MF $(DEPDIR)/unit1330-first.Tpo -c -o unit1330-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1330-first.Tpo $(DEPDIR)/unit1330-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1330-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1330-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1330-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1330-first.Tpo -c -o ../libtest/unit1330-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1330-first.Tpo ../libtest/$(DEPDIR)/unit1330-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1330-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1330-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1330-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1330-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1330-first.obj -MD -MP -MF $(DEPDIR)/unit1330-first.Tpo -c -o unit1330-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1330-first.Tpo $(DEPDIR)/unit1330-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1330-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1330-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1330-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1330-first.Tpo -c -o ../libtest/unit1330-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1330-first.Tpo ../libtest/$(DEPDIR)/unit1330-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1330-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1330-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1330-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1394-unit1394.o: unit1394.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1394-unit1394.o -MD -MP -MF $(DEPDIR)/unit1394-unit1394.Tpo -c -o unit1394-unit1394.o `test -f 'unit1394.c' || echo '$(srcdir)/'`unit1394.c @@ -999,19 +1071,19 @@ unit1394-unit1394.obj: unit1394.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1394-unit1394.obj `if test -f 'unit1394.c'; then $(CYGPATH_W) 'unit1394.c'; else $(CYGPATH_W) '$(srcdir)/unit1394.c'; fi` -unit1394-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1394-first.o -MD -MP -MF $(DEPDIR)/unit1394-first.Tpo -c -o unit1394-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1394-first.Tpo $(DEPDIR)/unit1394-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1394-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1394-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1394-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1394-first.Tpo -c -o ../libtest/unit1394-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1394-first.Tpo ../libtest/$(DEPDIR)/unit1394-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1394-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1394-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1394-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1394-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1394-first.obj -MD -MP -MF $(DEPDIR)/unit1394-first.Tpo -c -o unit1394-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1394-first.Tpo $(DEPDIR)/unit1394-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1394-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1394-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1394-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1394-first.Tpo -c -o ../libtest/unit1394-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1394-first.Tpo ../libtest/$(DEPDIR)/unit1394-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1394-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1394-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1394_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1394-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1395-unit1395.o: unit1395.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1395-unit1395.o -MD -MP -MF $(DEPDIR)/unit1395-unit1395.Tpo -c -o unit1395-unit1395.o `test -f 'unit1395.c' || echo '$(srcdir)/'`unit1395.c @@ -1027,19 +1099,19 @@ unit1395-unit1395.obj: unit1395.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1395-unit1395.obj `if test -f 'unit1395.c'; then $(CYGPATH_W) 'unit1395.c'; else $(CYGPATH_W) '$(srcdir)/unit1395.c'; fi` -unit1395-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1395-first.o -MD -MP -MF $(DEPDIR)/unit1395-first.Tpo -c -o unit1395-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1395-first.Tpo $(DEPDIR)/unit1395-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1395-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1395-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1395-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1395-first.Tpo -c -o ../libtest/unit1395-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1395-first.Tpo ../libtest/$(DEPDIR)/unit1395-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1395-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1395-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1395-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1395-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1395-first.obj -MD -MP -MF $(DEPDIR)/unit1395-first.Tpo -c -o unit1395-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1395-first.Tpo $(DEPDIR)/unit1395-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1395-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1395-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1395-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1395-first.Tpo -c -o ../libtest/unit1395-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1395-first.Tpo ../libtest/$(DEPDIR)/unit1395-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1395-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1395-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1395_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1395-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` unit1396-unit1396.o: unit1396.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1396-unit1396.o -MD -MP -MF $(DEPDIR)/unit1396-unit1396.Tpo -c -o unit1396-unit1396.o `test -f 'unit1396.c' || echo '$(srcdir)/'`unit1396.c @@ -1055,19 +1127,75 @@ unit1396-unit1396.obj: unit1396.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1396-unit1396.obj `if test -f 'unit1396.c'; then $(CYGPATH_W) 'unit1396.c'; else $(CYGPATH_W) '$(srcdir)/unit1396.c'; fi` -unit1396-first.o: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1396-first.o -MD -MP -MF $(DEPDIR)/unit1396-first.Tpo -c -o unit1396-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1396-first.Tpo $(DEPDIR)/unit1396-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1396-first.o' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1396-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1396-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1396-first.Tpo -c -o ../libtest/unit1396-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1396-first.Tpo ../libtest/$(DEPDIR)/unit1396-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1396-first.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1396-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c + +../libtest/unit1396-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1396-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1396-first.Tpo -c -o ../libtest/unit1396-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1396-first.Tpo ../libtest/$(DEPDIR)/unit1396-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1396-first.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1396-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` + +unit1397-unit1397.o: unit1397.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1397-unit1397.o -MD -MP -MF $(DEPDIR)/unit1397-unit1397.Tpo -c -o unit1397-unit1397.o `test -f 'unit1397.c' || echo '$(srcdir)/'`unit1397.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1397-unit1397.Tpo $(DEPDIR)/unit1397-unit1397.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1397.c' object='unit1397-unit1397.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1397-unit1397.o `test -f 'unit1397.c' || echo '$(srcdir)/'`unit1397.c + +unit1397-unit1397.obj: unit1397.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1397-unit1397.obj -MD -MP -MF $(DEPDIR)/unit1397-unit1397.Tpo -c -o unit1397-unit1397.obj `if test -f 'unit1397.c'; then $(CYGPATH_W) 'unit1397.c'; else $(CYGPATH_W) '$(srcdir)/unit1397.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1397-unit1397.Tpo $(DEPDIR)/unit1397-unit1397.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1397.c' object='unit1397-unit1397.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1397-unit1397.obj `if test -f 'unit1397.c'; then $(CYGPATH_W) 'unit1397.c'; else $(CYGPATH_W) '$(srcdir)/unit1397.c'; fi` + +../libtest/unit1397-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1397-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1397-first.Tpo -c -o ../libtest/unit1397-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1397-first.Tpo ../libtest/$(DEPDIR)/unit1397-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1397-first.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1397-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c + +../libtest/unit1397-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1397-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1397-first.Tpo -c -o ../libtest/unit1397-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1397-first.Tpo ../libtest/$(DEPDIR)/unit1397-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1397-first.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1397_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1397-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` + +unit1398-unit1398.o: unit1398.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1398-unit1398.o -MD -MP -MF $(DEPDIR)/unit1398-unit1398.Tpo -c -o unit1398-unit1398.o `test -f 'unit1398.c' || echo '$(srcdir)/'`unit1398.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1398-unit1398.Tpo $(DEPDIR)/unit1398-unit1398.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1398.c' object='unit1398-unit1398.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1398-unit1398.o `test -f 'unit1398.c' || echo '$(srcdir)/'`unit1398.c + +unit1398-unit1398.obj: unit1398.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1398-unit1398.obj -MD -MP -MF $(DEPDIR)/unit1398-unit1398.Tpo -c -o unit1398-unit1398.obj `if test -f 'unit1398.c'; then $(CYGPATH_W) 'unit1398.c'; else $(CYGPATH_W) '$(srcdir)/unit1398.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1398-unit1398.Tpo $(DEPDIR)/unit1398-unit1398.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1398.c' object='unit1398-unit1398.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1398-unit1398.obj `if test -f 'unit1398.c'; then $(CYGPATH_W) 'unit1398.c'; else $(CYGPATH_W) '$(srcdir)/unit1398.c'; fi` + +../libtest/unit1398-first.o: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1398-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1398-first.Tpo -c -o ../libtest/unit1398-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1398-first.Tpo ../libtest/$(DEPDIR)/unit1398-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1398-first.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1396-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1398-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c -unit1396-first.obj: ../libtest/first.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1396-first.obj -MD -MP -MF $(DEPDIR)/unit1396-first.Tpo -c -o unit1396-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1396-first.Tpo $(DEPDIR)/unit1396-first.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='unit1396-first.obj' libtool=no @AMDEPBACKSLASH@ +../libtest/unit1398-first.obj: ../libtest/first.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1398-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1398-first.Tpo -c -o ../libtest/unit1398-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1398-first.Tpo ../libtest/$(DEPDIR)/unit1398-first.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1398-first.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1396_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1396-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1398-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -1187,6 +1315,8 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f ../libtest/$(DEPDIR)/$(am__dirstamp) + -rm -f ../libtest/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1197,7 +1327,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../libtest/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1243,7 +1373,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../libtest/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc index 4c06fcf..526ec1f 100644 --- a/tests/unit/Makefile.inc +++ b/tests/unit/Makefile.inc @@ -6,7 +6,7 @@ UNITFILES = curlcheck.h \ # These are all unit test programs UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \ - unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 + unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 unit1300_SOURCES = unit1300.c $(UNITFILES) unit1300_CPPFLAGS = $(AM_CPPFLAGS) @@ -49,3 +49,10 @@ unit1395_CPPFLAGS = $(AM_CPPFLAGS) unit1396_SOURCES = unit1396.c $(UNITFILES) unit1396_CPPFLAGS = $(AM_CPPFLAGS) + +unit1397_SOURCES = unit1397.c $(UNITFILES) +unit1397_CPPFLAGS = $(AM_CPPFLAGS) + +unit1398_SOURCES = unit1398.c $(UNITFILES) +unit1398_CPPFLAGS = $(AM_CPPFLAGS) + diff --git a/tests/unit/unit1302.c b/tests/unit/unit1302.c index fc50c88..412a71f 100644 --- a/tests/unit/unit1302.c +++ b/tests/unit/unit1302.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -31,7 +31,7 @@ static struct SessionHandle *data; static CURLcode unit_setup( void ) { data = curl_easy_init(); - if (!data) + if(!data) return CURLE_OUT_OF_MEMORY; return CURLE_OK; } @@ -73,6 +73,24 @@ fail_unless(size == 8, "size should be 8"); verify_memory( output, "aWlpaQ==", 8); Curl_safefree(output); +rc = Curl_base64_encode(data, "\xff\x01\xfe\x02", 4, &output, &size); +fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); +fail_unless(size == 8, "size should be 8"); +verify_memory( output, "/wH+Ag==", 8); +Curl_safefree(output); + +rc = Curl_base64url_encode(data, "\xff\x01\xfe\x02", 4, &output, &size); +fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); +fail_unless(size == 8, "size should be 8"); +verify_memory( output, "_wH-Ag==", 8); +Curl_safefree(output); + +rc = Curl_base64url_encode(data, "iiii", 4, &output, &size); +fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); +fail_unless(size == 8, "size should be 8"); +verify_memory( output, "aWlpaQ==", 8); +Curl_safefree(output); + /* 0 length makes it do strlen() */ rc = Curl_base64_encode(data, "iiii", 0, &output, &size); fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); @@ -104,21 +122,36 @@ fail_unless(size == 1, "size should be 1"); verify_memory(decoded, "i", 2); Curl_safefree(decoded); -/* this is an illegal input */ +/* This is illegal input as the data is too short */ size = 1; /* not zero */ decoded = &anychar; /* not NULL */ rc = Curl_base64_decode("aQ", &decoded, &size); -/* return code indiferent, but output shall be as follows */ +fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, "return code should be CURLE_BAD_CONTENT_ENCODING"); +fail_unless(size == 0, "size should be 0"); +fail_if(decoded, "returned pointer should be NULL"); + +/* This is illegal input as it contains three padding characters */ +size = 1; /* not zero */ +decoded = &anychar; /* not NULL */ +rc = Curl_base64_decode("a===", &decoded, &size); +fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, "return code should be CURLE_BAD_CONTENT_ENCODING"); +fail_unless(size == 0, "size should be 0"); +fail_if(decoded, "returned pointer should be NULL"); + +/* This is illegal input as it contains a padding character mid input */ +size = 1; /* not zero */ +decoded = &anychar; /* not NULL */ +rc = Curl_base64_decode("a=Q=", &decoded, &size); +fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, "return code should be CURLE_BAD_CONTENT_ENCODING"); fail_unless(size == 0, "size should be 0"); fail_if(decoded, "returned pointer should be NULL"); -/* this is garbage input that libcurl decodes as far as possible */ -size = 0; -decoded = NULL; +/* This is garbage input as it contains an illegal base64 character */ +size = 1; /* not zero */ +decoded = &anychar; /* not NULL */ rc = Curl_base64_decode("a\x1f==", &decoded, &size); -fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); -fail_unless(size == 1, "size should be 1"); -fail_if(!decoded, "returned pointer should not be NULL"); -Curl_safefree(decoded); +fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, "return code should be CURLE_BAD_CONTENT_ENCODING"); +fail_unless(size == 0, "size should be 0"); +fail_if(decoded, "returned pointer should be NULL"); UNITTEST_STOP diff --git a/tests/unit/unit1303.c b/tests/unit/unit1303.c index 2e4f230..b48a625 100644 --- a/tests/unit/unit1303.c +++ b/tests/unit/unit1303.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -131,6 +131,8 @@ const struct timetest run[] = { /* this is the pretended start time of the transfer */ data->progress.t_startsingle.tv_sec = BASE; data->progress.t_startsingle.tv_usec = 0; +data->progress.t_startop.tv_sec = BASE; +data->progress.t_startop.tv_usec = 0; for(i=0; i < sizeof(run)/sizeof(run[0]); i++) { NOW(run[i].now_s, run[i].now_us); diff --git a/tests/unit/unit1304.c b/tests/unit/unit1304.c index 8ddd8ca..12b0273 100644 --- a/tests/unit/unit1304.c +++ b/tests/unit/unit1304.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -20,119 +20,162 @@ * ***************************************************************************/ #include "curlcheck.h" - #include "netrc.h" +#include "memdebug.h" /* LAST include file */ -static char login[LOGINSIZE]; -static char password[PASSWORDSIZE]; +static char *login; +static char *password; static char filename[64]; static CURLcode unit_setup(void) { - password[0] = 0; - login[0] = 0; + password = strdup(""); + login = strdup(""); + if (!password || !login) { + Curl_safefree(password); + Curl_safefree(login); + return CURLE_OUT_OF_MEMORY; + } return CURLE_OK; } static void unit_stop(void) { + Curl_safefree(password); + Curl_safefree(login); } UNITTEST_START int result; - static const char* filename1 = "log/netrc1304"; + static const char* const filename1 = "log/netrc1304"; memcpy(filename, filename1, strlen(filename1)); /* * Test a non existent host in our netrc file. */ - result = Curl_parsenetrc("test.example.com", login, password, filename); + result = Curl_parsenetrc("test.example.com", &login, &password, filename); fail_unless(result == 1, "Host not found should return 1"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(password[0] == 0, "password should not have been changed"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(login[0] == 0, "login should not have been changed"); /* * Test a non existent login in our netrc file. */ - memcpy(login, "me", 2); - result = Curl_parsenetrc("example.com", login, password, filename); + free(login); + login = strdup("me"); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("example.com", &login, &password, filename); fail_unless(result == 0, "Host should be found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(password[0] == 0, "password should not have been changed"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "me", 2) == 0, "login should not have been changed"); /* * Test a non existent login and host in our netrc file. */ - memcpy(login, "me", 2); - result = Curl_parsenetrc("test.example.com", login, password, filename); + free(login); + login = strdup("me"); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("test.example.com", &login, &password, filename); fail_unless(result == 1, "Host should be found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(password[0] == 0, "password should not have been changed"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "me", 2) == 0, "login should not have been changed"); /* * Test a non existent login (substring of an existing one) in our * netrc file. */ - memcpy(login, "admi", 4); - result = Curl_parsenetrc("example.com", login, password, filename); + free(login); + login = strdup("admi"); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("example.com", &login, &password, filename); fail_unless(result == 0, "Host should be found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(password[0] == 0, "password should not have been changed"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "admi", 4) == 0, "login should not have been changed"); /* * Test a non existent login (superstring of an existing one) * in our netrc file. */ - memcpy(login, "adminn", 6); - result = Curl_parsenetrc("example.com", login, password, filename); + free(login); + login = strdup("adminn"); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("example.com", &login, &password, filename); fail_unless(result == 0, "Host should be found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(password[0] == 0, "password should not have been changed"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "adminn", 6) == 0, "login should not have been changed"); /* * Test for the first existing host in our netrc file * with login[0] = 0. */ - login[0] = 0; - result = Curl_parsenetrc("example.com", login, password, filename); + free(login); + login = strdup(""); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("example.com", &login, &password, filename); fail_unless(result == 0, "Host should have been found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(strncmp(password, "passwd", 6) == 0, "password should be 'passwd'"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'"); /* * Test for the first existing host in our netrc file * with login[0] != 0. */ - password[0] = 0; - result = Curl_parsenetrc("example.com", login, password, filename); + free(password); + password = strdup(""); + abort_unless(password != NULL, "returned NULL!"); + result = Curl_parsenetrc("example.com", &login, &password, filename); fail_unless(result == 0, "Host should have been found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(strncmp(password, "passwd", 6) == 0, "password should be 'passwd'"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'"); /* * Test for the second existing host in our netrc file * with login[0] = 0. */ - password[0] = 0; - login[0] = 0; - result = Curl_parsenetrc("curl.example.com", login, password, filename); + free(password); + password = strdup(""); + abort_unless(password != NULL, "returned NULL!"); + free(login); + login = strdup(""); + abort_unless(login != NULL, "returned NULL!"); + result = Curl_parsenetrc("curl.example.com", &login, &password, filename); fail_unless(result == 0, "Host should have been found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(strncmp(password, "none", 4) == 0, "password should be 'none'"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'"); /* * Test for the second existing host in our netrc file * with login[0] != 0. */ - password[0] = 0; - result = Curl_parsenetrc("curl.example.com", login, password, filename); + free(password); + password = strdup(""); + abort_unless(password != NULL, "returned NULL!"); + result = Curl_parsenetrc("curl.example.com", &login, &password, filename); fail_unless(result == 0, "Host should have been found"); + abort_unless(password != NULL, "returned NULL!"); fail_unless(strncmp(password, "none", 4) == 0, "password should be 'none'"); + abort_unless(login != NULL, "returned NULL!"); fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'"); /* TODO: diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c index 5900c6d..91e3b0b 100644 --- a/tests/unit/unit1305.c +++ b/tests/unit/unit1305.c @@ -37,7 +37,6 @@ #include "hash.h" #include "hostip.h" -#include "curl_memory.h" #include "memdebug.h" /* LAST include file */ static struct SessionHandle *data; diff --git a/tests/unit/unit1394.c b/tests/unit/unit1394.c index d25e4f5..a3ef8fa 100644 --- a/tests/unit/unit1394.c +++ b/tests/unit/unit1394.c @@ -27,7 +27,6 @@ #include #include -#include "curl_memory.h" #include "memdebug.h" /* LAST include file */ static CURLcode unit_setup(void) diff --git a/tests/unit/unit1395.c b/tests/unit/unit1395.c index 8b0b0a0..6f9fc8c 100644 --- a/tests/unit/unit1395.c +++ b/tests/unit/unit1395.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, 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 @@ -44,7 +44,7 @@ UNITTEST_START unsigned int i; int fails=0; - struct dotdot pairs[] = { + const struct dotdot pairs[] = { { "/a/b/c/./../../g", "/a/g" }, { "mid/content=5/../6", "mid/6" }, { "/hello/../moo", "/moo" }, @@ -66,6 +66,7 @@ UNITTEST_START for(i=0; i < sizeof(pairs)/sizeof(pairs[0]); i++) { char *out = Curl_dedotdotify((char *)pairs[i].input); + abort_unless(out != NULL, "returned NULL!"); if(strcmp(out, pairs[i].output)) { fprintf(stderr, "Test %d: '%s' gave '%s' instead of '%s'\n", @@ -78,10 +79,6 @@ UNITTEST_START free(out); } - return fails; + fail_if(fails, "output mismatched"); UNITTEST_STOP - - - - diff --git a/tests/unit/unit1396.c b/tests/unit/unit1396.c index 797443d..b18d7a8 100644 --- a/tests/unit/unit1396.c +++ b/tests/unit/unit1396.c @@ -21,6 +21,8 @@ ***************************************************************************/ #include "curlcheck.h" +CURL *hnd; + static CURLcode unit_setup(void) { return CURLE_OK; @@ -28,6 +30,8 @@ static CURLcode unit_setup(void) static void unit_stop(void) { + if (hnd) + curl_easy_cleanup(hnd); } struct test { @@ -40,7 +44,7 @@ struct test { UNITTEST_START { /* unescape, this => that */ - struct test list1[]={ + const struct test list1[]={ {"%61", 3, "a", 1}, {"%61a", 4, "aa", 2}, {"%61b", 4, "ab", 2}, @@ -56,7 +60,7 @@ UNITTEST_START {NULL, 0, NULL, 0} /* end of list marker */ }; /* escape, this => that */ - struct test list2[]={ + const struct test list2[]={ {"a", 1, "a", 1}, {"/", 1, "%2F", 3}, {"a=b", 3, "a%3Db", 5}, @@ -70,16 +74,16 @@ UNITTEST_START {NULL, 0, NULL, 0} /* end of list marker */ }; int i; - CURL *hnd; hnd = curl_easy_init(); + abort_unless(hnd != NULL, "returned NULL!"); for(i=0; list1[i].in; i++) { int outlen; char *out = curl_easy_unescape(hnd, list1[i].in, list1[i].inlen, &outlen); - fail_unless(out != NULL, "returned NULL!"); + abort_unless(out != NULL, "returned NULL!"); fail_unless(outlen == list1[i].outlen, "wrong output length returned"); fail_unless(!memcmp(out, list1[i].out, list1[i].outlen), "bad output data returned"); @@ -90,10 +94,11 @@ UNITTEST_START } for(i=0; list2[i].in; i++) { + int outlen; char *out = curl_easy_escape(hnd, list2[i].in, list2[i].inlen); - int outlen = (int)strlen(out); + abort_unless(out != NULL, "returned NULL!"); - fail_unless(out != NULL, "returned NULL!"); + outlen = (int)strlen(out); fail_unless(outlen == list2[i].outlen, "wrong output length returned"); fail_unless(!memcmp(out, list2[i].out, list2[i].outlen), "bad output data returned"); @@ -102,8 +107,5 @@ UNITTEST_START curl_free(out); } - - curl_easy_cleanup(hnd); - } UNITTEST_STOP diff --git a/tests/unit/unit1397.c b/tests/unit/unit1397.c new file mode 100644 index 0000000..fd60c23 --- /dev/null +++ b/tests/unit/unit1397.c @@ -0,0 +1,51 @@ +#include "curlcheck.h" + +#include "hostcheck.h" /* from the lib dir */ + +static CURLcode unit_setup(void) +{ + return CURLE_OK; +} + +static void unit_stop( void ) +{ + /* done before shutting down and exiting */ +} + +UNITTEST_START + +/* only these backends define the tested functions */ +#if defined(USE_SSLEAY) || defined(USE_AXTLS) || defined(USE_GSKIT) + + /* here you start doing things and checking that the results are good */ + +fail_unless( Curl_cert_hostcheck("www.example.com", "www.example.com"), "good 1" ); +fail_unless( Curl_cert_hostcheck("*.example.com", "www.example.com"), "good 2" ); +fail_unless( Curl_cert_hostcheck("xxx*.example.com", "xxxwww.example.com"), "good 3" ); +fail_unless( Curl_cert_hostcheck("f*.example.com", "foo.example.com"), "good 4" ); +fail_unless( Curl_cert_hostcheck("192.168.0.0", "192.168.0.0"), "good 5" ); + +fail_if( Curl_cert_hostcheck("xxx.example.com", "www.example.com"), "bad 1" ); +fail_if( Curl_cert_hostcheck("*", "www.example.com"), "bad 2" ); +fail_if( Curl_cert_hostcheck("*.*.com", "www.example.com"), "bad 3" ); +fail_if( Curl_cert_hostcheck("*.example.com", "baa.foo.example.com"), "bad 4" ); +fail_if( Curl_cert_hostcheck("f*.example.com", "baa.example.com"), "bad 5" ); +fail_if( Curl_cert_hostcheck("*.com", "example.com"), "bad 6" ); +fail_if( Curl_cert_hostcheck("*fail.com", "example.com"), "bad 7" ); +fail_if( Curl_cert_hostcheck("*.example.", "www.example."), "bad 8" ); +fail_if( Curl_cert_hostcheck("*.example.", "www.example"), "bad 9" ); +fail_if( Curl_cert_hostcheck("", "www"), "bad 10" ); +fail_if( Curl_cert_hostcheck("*", "www"), "bad 11" ); +fail_if( Curl_cert_hostcheck("*.168.0.0", "192.168.0.0"), "bad 12" ); +fail_if( Curl_cert_hostcheck("www.example.com", "192.168.0.0"), "bad 13" ); + +#ifdef ENABLE_IPV6 +fail_if( Curl_cert_hostcheck("*::3285:a9ff:fe46:b619", "fe80::3285:a9ff:fe46:b619"), "bad 14" ); +fail_unless( Curl_cert_hostcheck("fe80::3285:a9ff:fe46:b619", "fe80::3285:a9ff:fe46:b619"), "good 6" ); +#endif + +#endif + + /* you end the test code like this: */ + +UNITTEST_STOP diff --git a/tests/unit/unit1398.c b/tests/unit/unit1398.c new file mode 100644 index 0000000..e579a62 --- /dev/null +++ b/tests/unit/unit1398.c @@ -0,0 +1,91 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, 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 http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "curlcheck.h" + +#include "curl/mprintf.h" + +static CURLcode unit_setup( void ) {return CURLE_OK;} +static void unit_stop( void ) {} + +UNITTEST_START + +int rc; +char buf[3] = {'b', 'u', 'g'}; +const char *str="bug"; +int width = 3; +char output[24]; + +/*#define curl_msnprintf snprintf */ + +/* without a trailing zero */ +rc = curl_msnprintf(output, 4, "%.*s", width, buf); +fail_unless( rc == 3 , "return code should be 3" ); +fail_unless(!strcmp(output, "bug"), "wrong output"); + +/* with a trailing zero */ +rc = curl_msnprintf(output, 4, "%.*s", width, str); +fail_unless( rc == 3 , "return code should be 3" ); +fail_unless(!strcmp(output, "bug"), "wrong output"); + +width = 2; +/* one byte less */ +rc = curl_msnprintf(output, 4, "%.*s", width, buf); +fail_unless( rc == 2 , "return code should be 2" ); +fail_unless(!strcmp(output, "bu"), "wrong output"); + +/* string with larger precision */ +rc = curl_msnprintf(output, 8, "%.8s", str); +fail_unless( rc == 3 , "return code should be 3" ); +fail_unless(!strcmp(output, "bug"), "wrong output"); + +/* longer string with precision */ +rc = curl_msnprintf(output, 8, "%.3s", "0123456789"); +fail_unless( rc == 3 , "return code should be 3" ); +fail_unless(!strcmp(output, "012"), "wrong output"); + +/* negative width */ +rc = curl_msnprintf(output, 8, "%-8s", str); +fail_unless( rc == 8 , "return code should be 8" ); +fail_unless(!strcmp(output, "bug "), "wrong output"); + +/* larger width that string length */ +rc = curl_msnprintf(output, 8, "%8s", str); +fail_unless( rc == 8 , "return code should be 8" ); +fail_unless(!strcmp(output, " bu"), "wrong output"); + +/* output a number in a limited output */ +rc = curl_msnprintf(output, 4, "%d", 10240); +/* TODO: this should return 5 to be POSIX/snprintf compliant! */ +fail_unless( rc == 4 , "return code should be 4" ); +fail_unless(!strcmp(output, "102"), "wrong output"); + +/* padded strings */ +rc = curl_msnprintf(output, 16, "%8s%8s", str, str); +fail_unless( rc == 16 , "return code should be 16" ); +fail_unless(!strcmp(output, " bug bu"), "wrong output"); + +/* padded numbers */ +rc = curl_msnprintf(output, 16, "%8d%8d", 1234, 5678); +fail_unless( rc == 16 , "return code should be 16" ); +fail_unless(!strcmp(output, " 1234 567"), "wrong output"); + +UNITTEST_STOP diff --git a/tests/valgrind.supp b/tests/valgrind.supp index 6fb9ce8..8c81327 100644 --- a/tests/valgrind.supp +++ b/tests/valgrind.supp @@ -10,7 +10,80 @@ fun:Curl_connect fun:multi_runsingle fun:curl_multi_perform + fun:easy_transfer + fun:easy_perform fun:curl_easy_perform + fun:operate_do + fun:operate + fun:main +} + +{ + libidn-idna_to_ascii-error-eventbased + Memcheck:Addr4 + fun:idna_to_ascii_4z + fun:idna_to_ascii_8z + fun:idna_to_ascii_lz + fun:fix_hostname + fun:resolve_server + fun:create_conn + fun:Curl_connect + fun:multi_runsingle + fun:multi_socket + fun:curl_multi_socket_action + fun:wait_or_timeout + fun:easy_events + fun:easy_perform + fun:curl_easy_perform_ev + fun:operate_do + fun:operate + fun:main +} + +{ + libidn-idna_to_ascii-error-inlined-functions + Memcheck:Addr4 + fun:idna_to_ascii_4z + fun:idna_to_ascii_8z + fun:idna_to_ascii_lz + fun:fix_hostname + fun:Curl_connect + fun:multi_runsingle + fun:curl_multi_perform + fun:easy_perform.part.4 + fun:operate_do + fun:operate + fun:main +} + +{ + libidn-idna_to_ascii-error-inlined-functions-alt + Memcheck:Addr4 + fun:idna_to_ascii_4z + fun:idna_to_ascii_8z + fun:idna_to_ascii_lz + fun:fix_hostname + fun:Curl_connect + fun:multi_runsingle + fun:curl_multi_perform + fun:easy_perform + fun:operate_do.isra.0 + fun:operate + fun:main +} + +{ + libidn-idna_to_ascii-error-inlined-functions-alt2 + Memcheck:Addr4 + fun:idna_to_ascii_4z + fun:idna_to_ascii_8z + fun:idna_to_ascii_lz + fun:fix_hostname + fun:Curl_connect + fun:multi_runsingle + fun:curl_multi_perform + fun:easy_perform + fun:operate_do fun:operate fun:main } diff --git a/vs/t/README b/vs/t/README deleted file mode 100644 index 69ebd27..0000000 --- a/vs/t/README +++ /dev/null @@ -1,8 +0,0 @@ -Note: - -Files located in subdirectory 'vs/t' and below are 'templates' used for -the generation of msvc IDE workspace and project files, distributed in -subdirectories 'vs/vc6' and 'vs/vc8'. - -All these template files use UNIX line endings intentionally, in order -to allow proper file generation. Don't convert these to crlf line-ends. diff --git a/vs/t/lib/vc6_libcurl_dsp.foot b/vs/t/lib/vc6_libcurl_dsp.foot deleted file mode 100644 index fd10e8e..0000000 --- a/vs/t/lib/vc6_libcurl_dsp.foot +++ /dev/null @@ -1,10 +0,0 @@ -# Begin Group "Resource Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\lib\libcurl.rc -# End Source File -# End Group -# End Target -# End Project diff --git a/vs/t/lib/vc6_libcurl_dsp.head b/vs/t/lib/vc6_libcurl_dsp.head deleted file mode 100644 index 06fb88d..0000000 --- a/vs/t/lib/vc6_libcurl_dsp.head +++ /dev/null @@ -1,147 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libcurl" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libcurl - Win32 LIB Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "vc6libcurl.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "vc6libcurl.mak" CFG="libcurl - Win32 LIB Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libcurl - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libcurl - Win32 DLL Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libcurl - Win32 LIB Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "libcurl - Win32 LIB Release" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" - -!IF "$(CFG)" == "libcurl - Win32 DLL Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "dll-debug" -# PROP BASE Intermediate_Dir "dll-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "dll-debug" -# PROP Intermediate_Dir "dll-debug/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /GZ /c -MTL=midl.exe -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"dll-debug/libcurld.dll" /implib:"dll-debug/libcurld_imp.lib" /pdbtype:con /fixed:no -# ADD LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"dll-debug/libcurld.dll" /implib:"dll-debug/libcurld_imp.lib" /pdbtype:con /fixed:no - -!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "dll-release" -# PROP BASE Intermediate_Dir "dll-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "dll-release" -# PROP Intermediate_Dir "dll-release/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /c -MTL=midl.exe -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /pdb:none /machine:I386 /out:"dll-release/libcurl.dll" /implib:"dll-release/libcurl_imp.lib" /fixed:no /release /incremental:no -# ADD LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /pdb:none /machine:I386 /out:"dll-release/libcurl.dll" /implib:"dll-release/libcurl_imp.lib" /fixed:no /release /incremental:no - -!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "lib-debug" -# PROP BASE Intermediate_Dir "lib-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "lib-debug" -# PROP Intermediate_Dir "lib-debug/obj" -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /GZ /c -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib-debug/libcurld.lib" /machine:I386 -# ADD LIB32 /nologo /out:"lib-debug/libcurld.lib" /machine:I386 - -!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "lib-release" -# PROP BASE Intermediate_Dir "lib-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "lib-release" -# PROP Intermediate_Dir "lib-release/obj" -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /c -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib-release/libcurl.lib" /machine:I386 -# ADD LIB32 /nologo /out:"lib-release/libcurl.lib" /machine:I386 - -!ENDIF - -# Begin Target - -# Name "libcurl - Win32 DLL Debug" -# Name "libcurl - Win32 DLL Release" -# Name "libcurl - Win32 LIB Debug" -# Name "libcurl - Win32 LIB Release" diff --git a/vs/t/lib/vc8_libcurl_prj.foot b/vs/t/lib/vc8_libcurl_prj.foot deleted file mode 100644 index 862ef42..0000000 --- a/vs/t/lib/vc8_libcurl_prj.foot +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/vs/t/lib/vc8_libcurl_prj.head b/vs/t/lib/vc8_libcurl_prj.head deleted file mode 100644 index 7614688..0000000 --- a/vs/t/lib/vc8_libcurl_prj.head +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs/vc6/lib/vc6libcurl.dsp b/vs/vc6/lib/vc6libcurl.dsp deleted file mode 100644 index 71c9fac..0000000 --- a/vs/vc6/lib/vc6libcurl.dsp +++ /dev/null @@ -1,1041 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libcurl" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libcurl - Win32 LIB Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "vc6libcurl.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "vc6libcurl.mak" CFG="libcurl - Win32 LIB Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libcurl - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libcurl - Win32 DLL Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libcurl - Win32 LIB Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "libcurl - Win32 LIB Release" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" - -!IF "$(CFG)" == "libcurl - Win32 DLL Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "dll-debug" -# PROP BASE Intermediate_Dir "dll-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "dll-debug" -# PROP Intermediate_Dir "dll-debug/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /FD /GZ /c -MTL=midl.exe -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"dll-debug/libcurld.dll" /implib:"dll-debug/libcurld_imp.lib" /pdbtype:con /fixed:no -# ADD LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"dll-debug/libcurld.dll" /implib:"dll-debug/libcurld_imp.lib" /pdbtype:con /fixed:no - -!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "dll-release" -# PROP BASE Intermediate_Dir "dll-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "dll-release" -# PROP Intermediate_Dir "dll-release/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /FD /c -MTL=midl.exe -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /pdb:none /machine:I386 /out:"dll-release/libcurl.dll" /implib:"dll-release/libcurl_imp.lib" /fixed:no /release /incremental:no -# ADD LINK32 wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /dll /pdb:none /machine:I386 /out:"dll-release/libcurl.dll" /implib:"dll-release/libcurl_imp.lib" /fixed:no /release /incremental:no - -!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "lib-debug" -# PROP BASE Intermediate_Dir "lib-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "lib-debug" -# PROP Intermediate_Dir "lib-debug/obj" -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /GZ /c -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib-debug/libcurld.lib" /machine:I386 -# ADD LIB32 /nologo /out:"lib-debug/libcurld.lib" /machine:I386 - -!ELSEIF "$(CFG)" == "libcurl - Win32 LIB Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "lib-release" -# PROP BASE Intermediate_Dir "lib-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "lib-release" -# PROP Intermediate_Dir "lib-release/obj" -# PROP Target_Dir "" -CPP=cl.exe -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "BUILDING_LIBCURL" /D "CURL_STATICLIB" /FD /c -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo /out:"lib-release/libcurl.lib" /machine:I386 -# ADD LIB32 /nologo /out:"lib-release/libcurl.lib" /machine:I386 - -!ENDIF - -# Begin Target - -# Name "libcurl - Win32 DLL Debug" -# Name "libcurl - Win32 DLL Release" -# Name "libcurl - Win32 LIB Debug" -# Name "libcurl - Win32 LIB Release" -# Begin Group "Source Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\lib\amigaos.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\asyn-ares.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\asyn-thread.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\axtls.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\base64.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\bundles.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\conncache.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\connect.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\content_encoding.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\cookie.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_addrinfo.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_darwinssl.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_fnmatch.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_gethostname.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_gssapi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_memrchr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_multibyte.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_core.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_msgs.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_wb.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_rtmp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_sasl.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_schannel.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_sspi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_threads.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\cyassl.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\dict.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\dotdot.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\easy.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\escape.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\file.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\fileinfo.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\formdata.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ftp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ftplistparser.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\getenv.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\getinfo.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gopher.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gskit.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gtls.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hash.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hmac.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostasyn.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostcheck.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostip4.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostip6.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostip.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostsyn.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_chunks.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_digest.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_negotiate.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_negotiate_sspi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_proxy.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\idn_win32.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\if2ip.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\imap.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\inet_ntop.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\inet_pton.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\krb4.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\krb5.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ldap.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\llist.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\md4.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\md5.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\memdebug.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\mprintf.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\multi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\netrc.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\non-ascii.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\nonblock.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\nss.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\openldap.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\parsedate.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pingpong.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pipeline.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\polarssl.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\polarssl_threadlock.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pop3.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\progress.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\qssl.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rawstr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rtsp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\security.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\select.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\sendf.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\share.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\slist.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\smtp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\socks.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\socks_gssapi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\socks_sspi.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\speedcheck.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\splay.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ssh.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\sslgen.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ssluse.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strdup.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strequal.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strerror.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtok.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtoofft.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\telnet.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\tftp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\timeval.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\transfer.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\url.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\version.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\warnless.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\wildcard.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\x509asn1.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\lib\amigaos.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\arpa_telnet.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\asyn.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\axtls.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\bundles.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\config-win32.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\conncache.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\connect.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\content_encoding.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\cookie.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_addrinfo.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_base64.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_darwinssl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_fnmatch.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_gethostname.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_gssapi.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_hmac.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ldap.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_md4.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_md5.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_memory.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_memrchr.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_multibyte.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_core.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_msgs.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_ntlm_wb.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_rtmp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_sasl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_schannel.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_setup.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_setup_once.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_sspi.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curl_threads.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\curlx.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\cyassl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\dict.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\dotdot.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\easyif.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\escape.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\file.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\fileinfo.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\formdata.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ftp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ftplistparser.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\getinfo.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gopher.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gskit.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\gtls.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hash.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostcheck.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\hostip.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_chunks.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_digest.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_negotiate.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\http_proxy.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\if2ip.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\imap.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\inet_ntop.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\inet_pton.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\krb4.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\llist.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\memdebug.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\multihandle.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\multiif.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\netrc.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\non-ascii.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\nonblock.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\nssg.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\parsedate.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pingpong.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pipeline.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\polarssl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\polarssl_threadlock.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\pop3.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\progress.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\qssl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rawstr.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rtsp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\select.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\sendf.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\setup-vms.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\share.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\slist.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\smtp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\sockaddr.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\socks.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\speedcheck.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\splay.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ssh.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\sslgen.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\ssluse.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strdup.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strequal.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strerror.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtok.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtoofft.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\telnet.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\tftp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\timeval.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\transfer.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\urldata.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\url.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\warnless.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\wildcard.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\x509asn1.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\lib\libcurl.rc -# End Source File -# End Group -# End Target -# End Project diff --git a/vs/vc6/src/vc6curltool.dsp b/vs/vc6/src/vc6curltool.dsp deleted file mode 100644 index 131b716..0000000 --- a/vs/vc6/src/vc6curltool.dsp +++ /dev/null @@ -1,498 +0,0 @@ -# Microsoft Developer Studio Project File - Name="curltool" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=curltool - Win32 using libcurl LIB Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "vc6curltool.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "vc6curltool.mak" CFG="curltool - Win32 using libcurl LIB Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "curltool - Win32 using libcurl DLL Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "curltool - Win32 using libcurl DLL Release" (based on "Win32 (x86) Console Application") -!MESSAGE "curltool - Win32 using libcurl LIB Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "curltool - Win32 using libcurl LIB Release" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "curltool - Win32 using libcurl DLL Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "dll-debug" -# PROP BASE Intermediate_Dir "dll-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "dll-debug" -# PROP Intermediate_Dir "dll-debug/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /FD /GZ /c -# ADD BASE RSC /l 0x409 /i "..\..\..\include" /d "_DEBUG" -# ADD RSC /l 0x409 /i "..\..\..\include" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 libcurld_imp.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"dll-debug/curl.exe" /pdbtype:con /libpath:"..\lib\dll-debug" /fixed:no -# ADD LINK32 libcurld_imp.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"dll-debug/curl.exe" /pdbtype:con /libpath:"..\lib\dll-debug" /fixed:no - -!ELSEIF "$(CFG)" == "curltool - Win32 using libcurl DLL Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "dll-release" -# PROP BASE Intermediate_Dir "dll-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "dll-release" -# PROP Intermediate_Dir "dll-release/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /FD /c -# ADD BASE RSC /l 0x409 /i "..\..\..\include" /d "NDEBUG" -# ADD RSC /l 0x409 /i "..\..\..\include" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 libcurl_imp.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"dll-release/curl.exe" /libpath:"..\lib\dll-release" /fixed:no -# ADD LINK32 libcurl_imp.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"dll-release/curl.exe" /libpath:"..\lib\dll-release" /fixed:no - -!ELSEIF "$(CFG)" == "curltool - Win32 using libcurl LIB Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "lib-debug" -# PROP BASE Intermediate_Dir "lib-debug/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "lib-debug" -# PROP Intermediate_Dir "lib-debug/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "CURL_STATICLIB" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "CURL_STATICLIB" /FD /GZ /c -# ADD BASE RSC /l 0x409 /i "..\..\..\include" /d "_DEBUG" -# ADD RSC /l 0x409 /i "..\..\..\include" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 libcurld.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"lib-debug/curl.exe" /pdbtype:con /libpath:"..\lib\lib-debug" /fixed:no -# ADD LINK32 libcurld.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"lib-debug/curl.exe" /pdbtype:con /libpath:"..\lib\lib-debug" /fixed:no - -!ELSEIF "$(CFG)" == "curltool - Win32 using libcurl LIB Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "lib-release" -# PROP BASE Intermediate_Dir "lib-release/obj" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "lib-release" -# PROP Intermediate_Dir "lib-release/obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /D "CURL_STATICLIB" /FD /c -# ADD CPP /nologo /MD /W3 /EHsc /O2 /I "..\..\..\lib" /I "..\..\..\include" /I "..\..\..\src" /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /D "CURL_STATICLIB" /FD /c -# ADD BASE RSC /l 0x409 /i "..\..\..\include" /d "NDEBUG" -# ADD RSC /l 0x409 /i "..\..\..\include" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 libcurl.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"lib-release/curl.exe" /libpath:"..\lib\lib-release" /fixed:no -# ADD LINK32 libcurl.lib wldap32.lib ws2_32.lib advapi32.lib kernel32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"lib-release/curl.exe" /libpath:"..\lib\lib-release" /fixed:no - -!ENDIF - -# Begin Target - -# Name "curltool - Win32 using libcurl DLL Debug" -# Name "curltool - Win32 using libcurl DLL Release" -# Name "curltool - Win32 using libcurl LIB Debug" -# Name "curltool - Win32 using libcurl LIB Release" -# Begin Group "Source Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\lib\nonblock.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rawstr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtoofft.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_binmode.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_bname.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_dbg.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_hdr.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_prg.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_rea.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_see.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_wrt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cfgable.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_convert.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_dirhie.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_doswin.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_easysrc.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_formparse.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_getparam.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_getpass.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_help.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_helpers.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_homedir.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_hugehelp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_libinfo.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_main.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_metalink.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_mfiles.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_msgs.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_operate.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_operhlp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_panykey.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_paramhlp.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_parsecfg.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_setopt.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_sleep.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_urlglob.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_util.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_vms.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_writeenv.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_writeout.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_xattr.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE="..\..\..\lib\config-win32.h" -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\nonblock.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\rawstr.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\lib\strtoofft.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_binmode.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_bname.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_dbg.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_hdr.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_prg.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_rea.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_see.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cb_wrt.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_cfgable.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_convert.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_dirhie.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_doswin.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_easysrc.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_formparse.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_getparam.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_getpass.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_help.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_helpers.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_homedir.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_hugehelp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_libinfo.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_main.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_metalink.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_mfiles.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_msgs.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_operate.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_operhlp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_panykey.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_paramhlp.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_parsecfg.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_sdecls.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_setopt.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_setup.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_sleep.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_urlglob.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_util.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_version.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_vms.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_writeenv.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_writeout.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\src\tool_xattr.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\src\curl.rc -# End Source File -# End Group -# End Target -# End Project diff --git a/vs/vc8/lib/vc8libcurl.vcproj b/vs/vc8/lib/vc8libcurl.vcproj deleted file mode 100644 index 1c9600e..0000000 --- a/vs/vc8/lib/vc8libcurl.vcproj +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt index 5eac382..757c41f 100644 --- a/winbuild/BUILD.WINDOWS.txt +++ b/winbuild/BUILD.WINDOWS.txt @@ -1,18 +1,24 @@ Building with Visual C++, prerequises ===================================== + This document describes how to compile, build and install curl and libcurl from sources using the Visual C++ build tool. To build with VC++, you will of course have to first install VC++. The minimum required version of - VC is 6 (part of Visual Studio 6). However using a more recent version like - 2008 (vc9) is strongly recommended. + VC is 6 (part of Visual Studio 6). However using a more recent version is + strongly recommended. VC++ is also part of the Windows Platform SDK. You do not have to install the full Visual Studio or Visual C++ if all you want is to build curl. - The Platform SDK can be fetched here, freely: + The latest Platform SDK can be downloaded freely from: http://msdn.microsoft.com/en-us/windows/bb980924 + If you are building with VC6 then you will also need the February 2003 + Edition of the Platform SDK which can be downloaded from: + + http://www.microsoft.com/en-us/download/details.aspx?id=12261 + If you wish to support zlib, openssl, ssh2, you will have to download them separately and copy them to the deps directory as shown below: @@ -52,10 +58,10 @@ a directory named using the options given to the nmake call. nmake /f Makefile.vc mode= where is one or many of: - VC=<6,7,8,9,10> - VC versions + VC=<6,7,8,9,10,11,12> - VC versions WITH_DEVEL= - Paths for the development files (SSL, zlib, etc.) Defaults to sibbling directory deps: ../deps - Libraries can be fetched at http://pecl2.php.net/downloads/php-windows-builds/ + Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/ Uncompress them into the deps folder. WITH_SSL= - Enable OpenSSL support, DLL or static WITH_ZLIB= - Enable zlib support, DLL or static @@ -68,4 +74,4 @@ where is one or many of: ENABLE_WINSSL= - Enable native Windows SSL support, defaults to yes GEN_PDB= - Generate Program Database (debug symbols for release build) DEBUG= - Debug builds - MACHINE= - Target architecture (default is x86) \ No newline at end of file + MACHINE= - Target architecture (default is x86) diff --git a/winbuild/Makefile.vc b/winbuild/Makefile.vc index bc42832..6dc58c4 100644 --- a/winbuild/Makefile.vc +++ b/winbuild/Makefile.vc @@ -15,7 +15,7 @@ CFGSET=true !MESSAGE Usage: nmake /f Makefile.vc mode= !MESSAGE where is one or many of: -!MESSAGE VC=<6,7,8,9,10> - VC versions +!MESSAGE VC=<6,7,8,9,10,11,12> - VC versions !MESSAGE WITH_DEVEL= - Paths for the development files (SSL, zlib, etc.) !MESSAGE Defaults to sibbling directory deps: ../deps !MESSAGE Libraries can be fetched at http://pecl2.php.net/downloads/php-windows-builds/ @@ -28,7 +28,6 @@ CFGSET=true !MESSAGE http://www.microsoft.com/downloads/details.aspx?FamilyID=AD6158D7-DDBA-416A-9109-07607425A815 !MESSAGE ENABLE_IPV6= - Enable IPv6, defaults to yes !MESSAGE ENABLE_SSPI= - Enable SSPI support, defaults to yes -!MESSAGE ENABLE_SPNEGO= - Enable Simple and Protected GSSAPI Negotiation Mechanism, defaults to yes !MESSAGE ENABLE_WINSSL= - Enable native Windows SSL support, defaults to yes !MESSAGE GEN_PDB= - Generate Program Database (debug symbols for release build) !MESSAGE DEBUG= - Debug builds @@ -86,16 +85,12 @@ USE_SSPI = true USE_SSPI = false !ENDIF -!IFNDEF ENABLE_SPNEGO -USE_SPNEGO = true -!ELSEIF "$(ENABLE_SPNEGO)"=="yes" -USE_SPNEGO = true -!ELSEIF "$(ENABLE_SPNEGO)"=="no" -USE_SPNEGO = false -!ENDIF - !IFNDEF ENABLE_WINSSL +!IFDEF WITH_SSL +USE_WINSSL = false +!ELSE USE_WINSSL = $(USE_SSPI) +!ENDIF !ELSEIF "$(ENABLE_WINSSL)"=="yes" USE_WINSSL = true !ELSEIF "$(ENABLE_WINSSL)"=="no" @@ -162,10 +157,6 @@ CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ipv6 CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-sspi !ENDIF -!IF "$(USE_SPNEGO)"=="true" -CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-spnego -!ENDIF - !IF "$(USE_WINSSL)"=="true" CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-winssl !ENDIF @@ -193,10 +184,9 @@ $(MODE): @SET USE_IDN=$(USE_IDN) @SET USE_IPV6=$(USE_IPV6) @SET USE_SSPI=$(USE_SSPI) - @SET USE_SPNEGO=$(USE_SPNEGO) @SET USE_WINSSL=$(USE_WINSSL) @$(MAKE) /NOLOGO /F MakefileBuild.vc copy_from_lib: echo copying .c... - FOR %%i IN ($(CURLX_ONES:/=\)) DO copy %%i ..\src\ + FOR %%i IN ($(CURLX_CFILES:/=\)) DO copy %%i ..\src\ diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc index 1f67010..b9e150c 100644 --- a/winbuild/MakefileBuild.vc +++ b/winbuild/MakefileBuild.vc @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1999 - 2013, Daniel Stenberg, , et al. +# Copyright (C) 1999 - 2014, 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 @@ -22,7 +22,7 @@ ########################################################################### # -# Makefile for building libcurl with MSVC 6, 7, 8, 9 and 10 +# Makefile for building libcurl with MSVC 6, 7, 8, 9, 10, 11 and 12 # # Usage: see usage message below # Should be invoked from winbuild directory @@ -50,11 +50,11 @@ ZIP = zip.exe !IF "$(VC)"=="6" CC_NODEBUG = cl.exe /O2 /DNDEBUG CC_DEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /GZ -CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL +CFLAGS = /I. /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL !ELSE CC_NODEBUG = cl.exe /O2 /DNDEBUG CC_DEBUG = cl.exe /Od /D_DEBUG /RTC1 /Z7 /LDd /W3 -CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL +CFLAGS = /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL !ENDIF LFLAGS = /nologo /machine:$(MACHINE) @@ -112,7 +112,7 @@ SSL_LIBS = libeay32.lib ssleay32.lib USE_SSL = true SSL = dll !ELSEIF "$(WITH_SSL)"=="static" -SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib +SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib crypt32.lib USE_SSL = true SSL = static !ENDIF @@ -187,17 +187,6 @@ SSPI_CFLAGS = $(SSPI_CFLAGS) /DUSE_WINDOWS_SSPI !ENDIF -!IFNDEF USE_SPNEGO -USE_SPNEGO = true -!ELSEIF "$(USE_SPNEGO)"=="yes" -USE_SPNEGO = true -!ENDIF - -!IF "$(USE_SPNEGO)"=="true" -SPNEGO_CFLAGS = $(SPNEGO_CFLAGS) /DHAVE_SPNEGO -!ENDIF - - !IFNDEF USE_WINSSL !IF "$(USE_SSL)"=="true" USE_WINSSL = false @@ -330,10 +319,6 @@ CFLAGS = $(CFLAGS) $(IPV6_CFLAGS) CFLAGS = $(CFLAGS) $(SSPI_CFLAGS) !ENDIF -!IF "$(USE_SPNEGO)"=="true" -CFLAGS = $(CFLAGS) $(SPNEGO_CFLAGS) -!ENDIF - !IF "$(GEN_PDB)"=="true" CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)" LFLAGS = $(LFLAGS) $(LFLAGS_PDB) @@ -396,7 +381,6 @@ $(TARGET): $(LIB_OBJS) $(LIB_DIROBJ) $(DISTDIR) @echo Using IDN: $(USE_IDN) @echo Using IPv6: $(USE_IPV6) @echo Using SSPI: $(USE_SSPI) - @echo Using SPNEGO: $(USE_SPNEGO) @echo Using WinSSL: $(USE_WINSSL) @echo CFLAGS: $(CFLAGS) @echo LFLAGS: $(LFLAGS) @@ -425,6 +409,7 @@ $(DIRDIST): $(LIB_DIROBJ): @if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ) + @if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls $(CURL_DIROBJ): @if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ) @@ -437,6 +422,9 @@ $(CURL_DIROBJ): {$(LIBCURL_SRC_DIR)\}.c{$(LIB_DIROBJ)\}.obj: $(CC) $(CFLAGS) /Fo"$@" $< +{$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj: + $(CC) $(CFLAGS) /Fo"$@" $< + $(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc rc $(RC_FLAGS) @@ -462,7 +450,8 @@ CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP) CURL_FROM_LIBCURL=$(CURL_DIROBJ)\tool_hugehelp.obj \ $(CURL_DIROBJ)\nonblock.obj \ $(CURL_DIROBJ)\rawstr.obj \ - $(CURL_DIROBJ)\strtoofft.obj + $(CURL_DIROBJ)\strtoofft.obj \ + $(CURL_DIROBJ)\warnless.obj $(PROGRAM_NAME): $(CURL_DIROBJ) $(CURL_FROM_LIBCURL) $(EXE_OBJS) $(CURL_LINK) $(CURL_LFLAGS) $(CURL_LIBCURL_LIBNAME) $(WIN_LIBS) $(CURL_FROM_LIBCURL) $(EXE_OBJS) @@ -479,6 +468,8 @@ $(CURL_DIROBJ)\rawstr.obj: ../lib/rawstr.c $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/rawstr.c $(CURL_DIROBJ)\strtoofft.obj: ../lib/strtoofft.c $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/strtoofft.c +$(CURL_DIROBJ)\warnless.obj: ../lib/warnless.c + $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/warnless.c $(CURL_DIROBJ)\curl.res: $(CURL_SRC_DIR)\curl.rc rc $(CURL_RC_FLAGS) diff --git a/winbuild/gen_resp_file.bat b/winbuild/gen_resp_file.bat index d08b01e..434f369 100755 --- a/winbuild/gen_resp_file.bat +++ b/winbuild/gen_resp_file.bat @@ -1,6 +1,6 @@ -@echo OFF -@del %OUTFILE% -@echo %MACRO_NAME% = \> %OUTFILE% +@echo OFF +@del %OUTFILE% +@echo %MACRO_NAME% = \> %OUTFILE% @for %%i in (%*) do @echo %DIROBJ%/%%i \>> %OUTFILE% -@echo. >> %OUTFILE% -:END +@echo. >> %OUTFILE% +:END -- 2.7.4